작성
·
208
0
하루 꼬박 강의 몇번반복해도...
sendMessage() 메서드 실행시 첫줄의
mChatMemeberRef = mFirebaseDb.getReference("chat_members").child(mChatId);
이게 작동을 안하는것 같습니다. RealTimeBase를 조회해도
users
밖에없네요... 뭐가 문제일까요??
아래에 수업해주신 ChatActivity 소스코드 입니다.
public class ChatActivity extends AppCompatActivity {
private String mChatId;
@BindView(R.id.senderBtn)
ImageView mSenderButton;
@BindView(R.id.edtContent)
EditText mMessageText;
private FirebaseDatabase mFirebaseDb;
private FirebaseUser mFirebaseUser;
private DatabaseReference mChatRef;
private DatabaseReference mChatMemberRef;
private DatabaseReference mChatMessageRef;
private DatabaseReference mUserRef;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_chat);
ButterKnife.bind(this);
mChatId = getIntent().getStringExtra("chat_id");mFirebaseDb = FirebaseDatabase.getInstance();
mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
mUserRef = mFirebaseDb.getReference("users");
}
@OnClick(R.id.senderBtn)
public void onSendEvent(View v) {
if (mChatId != null) {
sendMessage();
Log.d("sendMessgae","센드메시지 실행");
} else {
createChat();
Log.d("createChat","크리트 채팅 실행");
}
}
private void sendMessage() {
//메세지 키 생성
mChatMessageRef = mFirebaseDb.getReference("chat_messages").child(mChatId);
// chat_message > {chat_id} > {message_id} > messageInfo
String messageId = mChatMessageRef.push().getKey();
Log.d("chat_messages", messageId);
String messageText = mMessageText.getText().toString();
if (messageText.isEmpty()) { return;
}
final TextMessage textMessage = new TextMessage();
textMessage.setMessageText(messageText);
textMessage.setMessageDate(new Date());
textMessage.setChatId(mChatId);
textMessage.setMessageId(messageId);
textMessage.setMessageType(Message.MessageType.TEXT);
textMessage.setReadUserList(Arrays.asList(new String[]{mFirebaseUser.getUid()}));
String[] uids = getIntent().getStringArrayExtra("uids");
if (uids != null) {
textMessage.setUnreadCount(uids.length - 1);
}
mMessageText.setText("");
mChatMemberRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(final DataSnapshot dataSnapshot) {
//unreadCount 셋팅하기 위한 대화 상대의 수 가져온다.
long memberCount = dataSnapshot.getChildrenCount();
textMessage.setUnreadCount((int) memberCount - 1);
mChatMemberRef.child(textMessage.getMessageId()).setValue(textMessage, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
Iterator<DataSnapshot> memberIterator = dataSnapshot.getChildren().iterator();
while (memberIterator.hasNext()) {
User chatMember = memberIterator.next().getValue(User.class);
mUserRef.child(chatMember.getUid())
.child("chats")
.child(mChatId)
.child("lastMessage")
.setValue(textMessage);
if (!chatMember.getUid().equals(mFirebaseUser.getUid())) {
mUserRef.child(chatMember.getUid())
.child("chats")
.child(mChatId)
.child("totalUnreadCount")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
long totalUnreadCount = dataSnapshot.getValue(long.class);
dataSnapshot.getRef().setValue(totalUnreadCount+1);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private boolean isSentMessage = false;
private void createChat() {
//<방생성>
//0. 방 정보 설정 <-- 기존 방이어야 가능함
//1. 대화 상대가 내가 선택한 사람 추가//2. 각 상대별 chats에 방추가
//3. 에너지 정보 중 읽은 사람에 내 정보 추가
//4. 첫 메세지 전송
final Chat chat = new Chat();
mChatRef = mFirebaseDb.getReference("users").child(mFirebaseUser.getUid()).child("chats");
mChatId = mChatRef.push().getKey();
mChatMemberRef = mFirebaseDb.getReference("chat_members").child(mChatId);
// mChatId = mChatRef.push() --> users >> uid >> chats >> chat_id 가져옴
chat.setChatId(mChatId);
chat.setCreateDate(new Date());
//1:1 채팅
String uid = getIntent().getStringExtra("uid");
//1:n 채팅
String[] uids = getIntent().getStringArrayExtra("uids");
if (uid != null) {
//1:1
uids = new String[]{uid};
}
List<String> uidList = new ArrayList<>(Arrays.asList(uids));
uidList.add(mFirebaseUser.getUid());
// 방타이틀 == 나를제외한 사용자이름 출력
final StringBuffer titleBuffer = new StringBuffer();
for (String userId : uidList) {
// 유저의 uid >> userInfo
mUserRef.child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(final DataSnapshot dataSnapshot) {
User member = dataSnapshot.getValue(User.class);
mChatMemberRef.child(member.getUid())
.setValue(member, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
// USERS >> chats >> {chat_id} >> chatinfo
dataSnapshot.getRef().child("chats").child(mChatId).setValue(chat);
if (!isSentMessage) {
Log.d("센드메세지","센드메세지 실행");
sendMessage();
isSentMessage = true;
}
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
}
답변