diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt index 2879389f12..37787f1b2b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt @@ -80,6 +80,7 @@ internal class RoomSummaryUpdater @Inject constructor( membership: Membership? = null, roomSummary: RoomSyncSummary? = null, unreadNotifications: RoomSyncUnreadNotifications? = null, + unreadCount: Int? = null, updateMembers: Boolean = false, inviterId: String? = null) { val roomSummaryEntity = RoomSummaryEntity.getOrCreate(realm, roomId) @@ -97,6 +98,7 @@ internal class RoomSummaryUpdater @Inject constructor( } roomSummaryEntity.highlightCount = unreadNotifications?.highlightCount ?: 0 roomSummaryEntity.notificationCount = unreadNotifications?.notificationCount ?: 0 + roomSummaryEntity.unreadCount = unreadCount ?: 0 if (membership != null) { roomSummaryEntity.membership = membership @@ -132,16 +134,18 @@ internal class RoomSummaryUpdater @Inject constructor( roomSummaryEntity.lastActivityTime = lastActivityFromEvent } + // If unreadCount == null, the server likely just doesn't support MSC 2654, so we need to check manually either way + val hasUnreadEvents = unreadCount == null || unreadCount > 0 roomSummaryEntity.hasUnreadMessages = roomSummaryEntity.notificationCount > 0 - // avoid this call if we are sure there are unread events - || !isEventRead(realm.configuration, userId, roomId, latestPreviewableEvent?.eventId) + // avoid this call if we are sure there are (no) unread events + || (hasUnreadEvents && !isEventRead(realm.configuration, userId, roomId, latestPreviewableEvent?.eventId)) roomSummaryEntity.hasUnreadContentMessages = roomSummaryEntity.notificationCount > 0 - // avoid this call if we are sure there are unread events - || (latestPreviewableContentEvent != null + // avoid this call if we are sure there are (no) unread events + || (hasUnreadEvents && latestPreviewableContentEvent != null && !isEventRead(realm.configuration, userId, roomId, latestPreviewableContentEvent.eventId)) roomSummaryEntity.hasUnreadOriginalContentMessages = roomSummaryEntity.notificationCount > 0 - // avoid this call if we are sure there are unread events - || (latestPreviewableOriginalContentEvent != null + // avoid this call if we are sure there are (no) unread events + || (hasUnreadEvents && latestPreviewableOriginalContentEvent != null && !isEventRead(realm.configuration, userId, roomId, latestPreviewableOriginalContentEvent.eventId)) roomSummaryEntity.displayName = roomDisplayNameResolver.resolve(realm, roomId) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt index 830e666c95..448bee9531 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt @@ -252,6 +252,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle Membership.JOIN, roomSync.summary, roomSync.unreadNotifications, + roomSync.unreadCount, updateMembers = hasRoomMember ) return roomEntity diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSync.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSync.kt index 9aed0d37d6..7383a8a1b8 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSync.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSync.kt @@ -46,6 +46,11 @@ internal data class RoomSync( */ @Json(name = "unread_notifications") val unreadNotifications: RoomSyncUnreadNotifications? = null, + /** + * The unread count for the room. + */ + @Json(name = "org.matrix.msc2654.unread_count") val unreadCount: Int? = null, + /** * The room summary */