레이아웃 코드는 제외한다.
특정 사용자가 메시지를 보낼때를 생각해서 클래스를 만들자!
// 메시지 저장 클래스
public class Message implements Serializable {
private String uid; // 사용자 고유 id
private String content; // 사용자가 보낸 메시지
private String date; // 사용자가 보낸 메시지의 시간
private Boolean confirmed = false; // 문자열인지 사진인지 확인 여부
public Message() {
}
public Message(String uid, String content, String date, Boolean confirmed) {
this.uid = uid;
this.content = content;
this.date = date;
this.confirmed = confirmed;
}
//....
}
// 채팅 방 사용자들과, 메시지 저장 클래스
public class ChatRoom implements Serializable {
// 사용자가 참여했는지 여부를 알려줌
public Map<String, Boolean> users = new HashMap<>();
// 해당 채팅방의 메시지
public Map<String, Message> messages = new HashMap<>();
public ChatRoom() {
}
}
// 대화방을 Chatroom/chatrooms 경로로 설정한다.
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("ChatRoom").child("chatRooms");로그인이 되어있는 사용자와 채팅하고 싶은 사용자의 uid를 가져와서 ChatRoom 클래스에 저장하자!
// 상대 사용자 uid
User user = userArrayList.get(index);
// 로그인 되어있는 사용자 uid
FirebaseAuth mAuth = FirebaseAuth.getInstance();
String myUid = mAuth.getCurrentUser().getUid();
// chatroom객체 안에 로그인한 유저와 선택된 유저가 대화 중이라는 값을 넣는다.
chatRoom = new ChatRoom();
HashMap<String, Boolean> hashUser = new HashMap<>();
hashUser.put(myUid, true);
hashUser.put(user.getUid(), true);
chatRoom.users = hashUser;
// ChatRoom/chatRooms경로안의 users라는 경로가 존재 할시, 상대방의 uid의 정보가 포함된 정보들을 가져온다.
myRef.orderByChild("users/" + user.getUid()).equalTo(true)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
// 대화를 한번이라도 했거나, 로그인한 사용자가 아무나 대화를 시도 했다면 대화한 유저들을 검색한다.
if (snapshot.getValue() != null) {
for (DataSnapshot data : snapshot.getChildren()){
ChatRoom chatRoom1 = data.getValue(ChatRoom.class);
if (chatRoom1.users.get(myUid) != null) {
// 접속한 자신과 선택된 유저가 대화한 데이터가 있다면, 채팅방 생성하지 않고 이동만 한다.
goToChatRoom(user.getUid());
return;
}
}
}
// 만약 한번도 대화한적이 없는 유저이거나, 접속한 유저와 대화한적이 없다면 채팅방을 생성하고 이동한다.
myRef.push().setValue(chatRoom);
goToChatRoom(user.getUid());
}
@Override
public void onCancelled(@NonNull DatabaseError error) { }
});
// 상대방의 uid를 담은 opponent, 채팅방의 고유 키값 chatKey를 담아 보낸다.
// 유저 검색에서는 채팅방 고유 키값을 찾을 수 없기에 값은 없다.
private void goToChatRoom(ChatRoom chatRoom, String opponent){
Intent intent = new Intent(context, MainActivity.class);
intent.putExtra("opponent", opponent);
intent.putExtra("chatKey", "");
context.startActivity(intent);
((UserSearchActivity)context).finish();
}
