Merge pull request #5132 from vector-im/feature/adm/missing-notifications

Fixing google play variant push notifications being skipped
This commit is contained in:
Benoit Marty 2022-02-02 18:42:51 +01:00 committed by GitHub
commit 17a0c17dde
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 17 deletions

1
changelog.d/5038.bugfix Normal file
View file

@ -0,0 +1 @@
Fixing missing/intermittent notifications on the google play variant when wifi is enabled

View file

@ -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 {
// The event doesn't exist locally, let's assume it hasn't been read
eventToCheck == null -> false eventToCheck == null -> false
eventToCheck.root?.sender == userId -> true eventToCheck.root?.sender == userId -> true
else -> { // If new event exists and the latest event is from ourselves we can infer the event is read
val readReceipt = ReadReceiptEntity.where(realm, roomId, userId).findFirst() ?: return@use latestEventIsFromSelf(realm, roomId, userId) -> true
val readReceiptEvent = TimelineEventEntity.where(realm, roomId, readReceipt.eventId).findFirst() ?: return@use eventToCheck.isBeforeLatestReadReceipt(realm, roomId, userId) -> true
readReceiptEvent.isMoreRecentThan(eventToCheck) 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
} }
/** /**