레이아웃 코드는 제외한다.
private FirebaseAuth mAuth;
DatabaseReference myRef;
String opponent;
String chatKey;
@Override
protected void onCreate(Bundle savedInstanceState) {
//...
opponent = getIntent().getStringExtra("opponent");
chatKey = getIntent().getStringExtra("chatKey");
mAuth = FirebaseAuth.getInstance();
myRef = FirebaseDatabase.getInstance().getReference("ChatRoom").child("chatRooms");
}
void chatReset(){
myRef.orderByChild("users/" + opponent).equalTo(true) // ChatRoom/chatRooms 경로 중 Intent로 받은 상대방 uid와 일치하는 모든 채팅방을 찾는다.
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot child : snapshot.getChildren()) {
ChatRoom chatRoom1 = child.getValue(ChatRoom.class);
if(chatRoom1.users.get(mAuth.getCurrentUser().getUid()) != null){ // 모든 채팅방 중 접속한 자신의 uid와 일치하는 채팅방을 찾음
chatKey = child.getKey(); // 찾은 채팅방의 고유 키 값을 넣는다.
chatRoom(); // 고유 키 값을 넣은 후 채팅을 시작할 수 있다.
break;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
if(chatKey.isEmpty()){
chatReset(); // 유저 검색 후 채팅방의 고유 키 값이 없으니, 키값을 먼저 찾자.
}else{
chatRoom(); // 채팅방 리스크에서는 고유 키값이 있으니 바로 채팅을 시작하자.
}
private void chatRoom(){
// 채팅방의 고유 키 값의 경로 안에서 messages의 경로에 채팅이 추가 될 경우
// 이미 추가된 메시지의 경우도 불러온다!!
myRef.child(chatKey).child("messages").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
// 메시지를 만든다.
Message message = snapshot.getValue(Message.class);
messageArrayList.add(message);
adapter.notifyDataSetChanged();
// RecyclerView 화면을 가장 하단으로 이동
recyclerView.scrollToPosition(messageArrayList.size() - 1);
}
//...
});
}
이제 내용을 입력하고 버튼을 누르면 채팅을 보내도록 해볼까?!!!??
// TODO: 채팅 보내기
private void sendMessage(String content){
//메시지에 인증된 사용자의 id와 작성된 메시지, 작성된 날짜를 넣자!!
Message message = new Message(mAuth.getCurrentUser().getUid(), content,getDateTimeString(), false);
myRef.child(chatKey).child("messages")
.push().setValue(message);
}
Adapter에서는 내가 보낸 메시지는 우측 정렬을 하고,
상대방이 보낸 메시지는 좌측 정렬을 하도록 설정하자!!!

