fixing push notifications being skipped
- reworking the isEventRead logic to always check if the new event exists locally, there's a race condition between eventFastLane and syncs where we end up mark unseen events as read if our last local message in a room is from ourselves - this may also fix some events being instantly marked as read when being received
This commit is contained in:
parent
ecf356f6eb
commit
e2d8c73761
@ -34,27 +34,29 @@ internal fun isEventRead(realmConfiguration: RealmConfiguration,
|
|||||||
if (LocalEcho.isLocalEchoId(eventId)) {
|
if (LocalEcho.isLocalEchoId(eventId)) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// If we don't know if the event has been read, we assume it's not
|
|
||||||
var isEventRead = false
|
|
||||||
|
|
||||||
Realm.getInstance(realmConfiguration).use { realm ->
|
return Realm.getInstance(realmConfiguration).use { realm ->
|
||||||
val latestEvent = TimelineEventEntity.latestEvent(realm, roomId, true)
|
|
||||||
// If latest event is from you we are sure the event is read
|
|
||||||
if (latestEvent?.root?.sender == userId) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
val eventToCheck = TimelineEventEntity.where(realm, roomId, eventId).findFirst()
|
val eventToCheck = TimelineEventEntity.where(realm, roomId, eventId).findFirst()
|
||||||
isEventRead = when {
|
when {
|
||||||
eventToCheck == null -> false
|
// The event doesn't exist locally, let's assume it hasn't been read
|
||||||
eventToCheck.root?.sender == userId -> true
|
eventToCheck == null -> false
|
||||||
else -> {
|
eventToCheck.root?.sender == userId -> true
|
||||||
val readReceipt = ReadReceiptEntity.where(realm, roomId, userId).findFirst() ?: return@use
|
// If new event exists and the latest event is from ourselves we can infer the event is read
|
||||||
val readReceiptEvent = TimelineEventEntity.where(realm, roomId, readReceipt.eventId).findFirst() ?: return@use
|
latestEventIsFromSelf(realm, roomId, userId) -> true
|
||||||
readReceiptEvent.isMoreRecentThan(eventToCheck)
|
eventToCheck.isBeforeLatestReadReceipt(realm, roomId, userId) -> true
|
||||||
}
|
else -> false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return isEventRead
|
}
|
||||||
|
|
||||||
|
private fun latestEventIsFromSelf(realm: Realm, roomId: String, userId: String) = TimelineEventEntity.latestEvent(realm, roomId, true)
|
||||||
|
?.root?.sender == userId
|
||||||
|
|
||||||
|
private fun TimelineEventEntity.isBeforeLatestReadReceipt(realm: Realm, roomId: String, userId: String): Boolean {
|
||||||
|
return ReadReceiptEntity.where(realm, roomId, userId).findFirst()?.let { readReceipt ->
|
||||||
|
val readReceiptEvent = TimelineEventEntity.where(realm, roomId, readReceipt.eventId).findFirst()
|
||||||
|
readReceiptEvent?.isMoreRecentThan(this)
|
||||||
|
} ?: false
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user