diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadQueries.kt index 50215fe4ea..c0e8708df2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadQueries.kt @@ -33,7 +33,8 @@ internal fun isEventRead( roomId: String?, eventId: String?, eventTs: Long? = null, - ignoreSenderId: Boolean = false + ignoreSenderId: Boolean = false, + handleAsUnreadForNonZeroUnreadCount: Boolean = false ): Boolean { if (userId.isNullOrBlank() || roomId.isNullOrBlank() || eventId.isNullOrBlank()) { return false @@ -43,6 +44,15 @@ internal fun isEventRead( } return Realm.getInstance(realmConfiguration).use { realm -> + // For SetReadMarkersTask, in case the message is somehow still marked as unread even though the receipt is on bottom, + // we want to handle it as if it where unread. + // This scenario can happen after sending a message, but not updating the read receipt manually. + if (handleAsUnreadForNonZeroUnreadCount) { + val roomSummary = RoomSummaryEntity.where(realm, roomId).findFirst() + if (roomSummary?.hasUnreadMessages.orFalse()) { + return false + } + } val eventToCheck = TimelineEventEntity.where(realm, roomId, eventId).findFirst() when { // The event doesn't exist locally, let's assume it hasn't been read unless we know all unread events diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/read/SetReadMarkersTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/read/SetReadMarkersTask.kt index 11578b08f0..2cfd92de2c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/read/SetReadMarkersTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/read/SetReadMarkersTask.kt @@ -92,7 +92,7 @@ internal class DefaultSetReadMarkersTask @Inject constructor( rmDimber.i { "Did not set to $fullyReadEventId" } } if (readReceiptEventId != null && - !isEventRead(monarchy.realmConfiguration, userId, params.roomId, readReceiptEventId, ignoreSenderId = true)) { + !isEventRead(monarchy.realmConfiguration, userId, params.roomId, readReceiptEventId, ignoreSenderId = true, handleAsUnreadForNonZeroUnreadCount = true)) { if (LocalEcho.isLocalEchoId(readReceiptEventId)) { Timber.w("Can't set read receipt for local event $readReceiptEventId") } else {