Возникли проблемы с логами c для следующего метода, возможно, кто-нибудь может мне помочь. Когда пользователь отправляет другому пользователю сообщение, сообщение появляется в ChatsFragment
, как и положено пользователю, отправившему сообщение, но другой пользователь его не получает / не видит. Сообщения появляются только в том случае, если вы отправили первое сообщение.
Я бы хотел сделать так, чтобы другой пользователь получал сообщение, даже если он не отвечает на него. Разве оператор else if
в ChatsFragment
не должен учитывать то, что я собираюсь делать? Если пользователь, который в настоящее время вошел в систему, является id
(получателем), тогда он также должен отображать сообщение в их ChatsFragment
, даже если они еще не ответили на него? Или мне что-то не хватает?
Структура JSON выглядит так:
Для отправки сообщения я использую этот метод в MessageActivity
:
MessageActivity
private void sendMessage(String sender, final String receiver, String message) {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Chats");
Date date = Calendar.getInstance().getTime();
String formattedDate = DateFormat.getDateInstance(DateFormat.FULL).format(date);
String time = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
time = LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm"));
}
String messageId = reference.push().getKey();
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("sender", sender);
hashMap.put("receiver", receiver);
hashMap.put("message", message);
hashMap.put("isseen", false);
hashMap.put("date", formattedDate);
hashMap.put("time", time);
hashMap.put("timestamp", ServerValue.TIMESTAMP);
hashMap.put("messageId", messageId);
if (messageId != null)
reference.child(messageId).setValue(hashMap);
final DatabaseReference chatref = FirebaseDatabase.getInstance().getReference("Chatlist").child(mFirebaseUser.getUid()).child(mId);
chatref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (!dataSnapshot.exists()) {
chatref.child("id").setValue(mId);
chatref.child("sender").setValue(mFirebaseUser.getUid());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
И чтобы добавить сообщение в ChatFragment
, я использую следующий метод, который работает для добавления чата, если вы являются теми, кто инициирует разговор, но, как я сказал ранее, другой пользователь его не получает:
ChatsFragment
private void chatList() {
mUsers = new ArrayList<>();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
mUsers.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
User user = snapshot.getValue(User.class);
for (Chatlist chatlist : mUsersList) {
if (mFirebaseUser != null && user != null) {
if (!user.getId().equals(mFirebaseUser.getUid()) && user.getId().equals(chatlist.id)) {
mUsers.add(user);
} else if (mFirebaseUser.getUid().equals(chatlist.id)) {
mUsers.add(user);
}
}
}
}
mUserAdapterChat = new UserAdapterChat(getContext(), mUsers, true);
mUserAdapterChat.notifyDataSetChanged();
mRecyclerView.setAdapter(mUserAdapterChat);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}