Как прослушивать изменения firestore в реальном времени?
Я реализую чат приложение , для этого мне нужно обрабатывать сообщения сразу при отправке , но я сталкиваюсь со следующей проблемой
Вот код слушателя сообщений
private fun listenMessage() {
database
.collection(KEY_COLLECTION_USERS)
.document(preferenceManager.getString(KEY_USER_ID)!!)
.collection(KEY_COLLECTION_CHAT)
.addSnapshotListener { value, error ->
if (error != null) {
return@addSnapshotListener
} else {
if (value == null) {
return@addSnapshotListener
} else {
for (documentChange in value.documentChanges) {
if (documentChange.type == DocumentChange.Type.ADDED) {
var doc = documentChange.document
if (doc.getString(KEY_MESSAGE_RECEIVER_ID) == receiverUser.uid) {
var text = doc.getString(KEY_MESSAGE).toString()
var id = doc.getString(KEY_MESSAGE_ID).toString()
var receiverId =
doc.getString(KEY_MESSAGE_RECEIVER_ID).toString()
var date = doc.getTimestamp(KEY_MESSAGE_DATE)!!.toDate()
var isChecked = doc.getBoolean(KEY_MESSAGE_ISCHECKED)!!
var type = doc.getString(KEY_TYPE_MESSAGE).toString()
var message =
Message(text, id, receiverId, date, isChecked, type)
if (message !in messages) {
messages.add(message)
}
}
}
}
messages.sortBy { it -> it.date }
var messages_test = ArrayList(messages)
userChatAdpater.updateList(messages_test)
if (messages.size != 0) {
mBinding.rvUserChat.smoothScrollToPosition(messages.size - 1)
}
}
}
}
database
.collection(KEY_COLLECTION_USERS)
.document(receiverUser.uid)
.collection(KEY_COLLECTION_CHAT)
.addSnapshotListener { value, error ->
if (error != null) {
return@addSnapshotListener
} else {
if (value == null) {
return@addSnapshotListener
} else {
for (documentChange in value.documentChanges) {
documentChange.document.reference.update(KEY_MESSAGE_ISCHECKED, true)
if (documentChange.type == DocumentChange.Type.ADDED) {
var doc = documentChange.document
if (doc.getString(KEY_MESSAGE_RECEIVER_ID) == preferenceManager.getString(
KEY_USER_ID
)
) {
var text = doc.getString(KEY_MESSAGE).toString()
var id = doc.getString(KEY_MESSAGE_ID).toString()
var receiverId =
doc.getString(KEY_MESSAGE_RECEIVER_ID).toString()
var date = doc.getDate(KEY_MESSAGE_DATE)!!
var isChecked = doc.getBoolean(KEY_MESSAGE_ISCHECKED)!!
var type = doc.getString(KEY_TYPE_MESSAGE).toString()
var message =
Message(text, id, receiverId, date, isChecked, type)
if (message !in messages) {
messages.add(message)
}
}
}
}
messages.sortBy { it -> it.date }
var messages_test = ArrayList(messages)
userChatAdpater.updateList(messages_test)
if (messages.size != 0) {
mBinding.rvUserChat.smoothScrollToPosition(messages.size - 1)
}
}
}
}
}
При попадании на экран чата , все сообщения подгружаются нормально
date -> {Value@24360} "# com.google.firestore.v1.Value@f6d54b4d
timestamp_value {
nanos: 926000000
seconds: 1661083055
}
Но при отправке сообщения происходит следующее
date -> {Value@24661} "# com.google.firestore.v1.Value@5340a934
map_value {
fields {
key: "__type__"
value {
string_value: "server_timestamp"
}
}
fields {
key: "__local_write_time__"
value {
timestamp_value {
nanos: 576000000
seconds: 1661089684
}
}
}
}"
Из-за этого в date записывается null
Но я не знаю другого способа реализации прослушивателя сообщений
Время генерируется благодаря @ServerTimestamp