From 37230b061455a0a13e3d65f24e533b3600288966 Mon Sep 17 00:00:00 2001 From: Ganard Date: Fri, 31 Jan 2020 16:36:26 +0100 Subject: [PATCH] Fix issues with read marker and jumpToBottom --- .../internal/database/query/ReadQueries.kt | 24 +++++++++++-------- .../session/room/read/SetReadMarkersTask.kt | 16 ++++++------- .../home/room/detail/RoomDetailFragment.kt | 6 ++--- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/ReadQueries.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/ReadQueries.kt index bf638654d5..1b83577a8c 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/ReadQueries.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/ReadQueries.kt @@ -20,6 +20,7 @@ import im.vector.matrix.android.api.session.events.model.LocalEcho import im.vector.matrix.android.internal.database.model.ChunkEntity import im.vector.matrix.android.internal.database.model.ReadMarkerEntity import im.vector.matrix.android.internal.database.model.ReadReceiptEntity +import im.vector.matrix.android.internal.database.model.TimelineEventEntity import io.realm.Realm internal fun isEventRead(monarchy: Monarchy, @@ -37,15 +38,14 @@ internal fun isEventRead(monarchy: Monarchy, monarchy.doWithRealm { realm -> val liveChunk = ChunkEntity.findLastLiveChunkFromRoom(realm, roomId) ?: return@doWithRealm val eventToCheck = liveChunk.timelineEvents.find(eventId) - - isEventRead = if (eventToCheck?.root?.sender == userId) { + isEventRead = if (eventToCheck == null || eventToCheck.root?.sender == userId) { true } else { val readReceipt = ReadReceiptEntity.where(realm, roomId, userId).findFirst() ?: return@doWithRealm val readReceiptIndex = liveChunk.timelineEvents.find(readReceipt.eventId)?.displayIndex ?: Int.MIN_VALUE - val eventToCheckIndex = eventToCheck?.displayIndex ?: Int.MAX_VALUE + val eventToCheckIndex = eventToCheck.displayIndex eventToCheckIndex <= readReceiptIndex } @@ -61,13 +61,17 @@ internal fun isReadMarkerMoreRecent(monarchy: Monarchy, return false } return Realm.getInstance(monarchy.realmConfiguration).use { realm -> - val liveChunk = ChunkEntity.findLastLiveChunkFromRoom(realm, roomId) ?: return false - val eventToCheck = liveChunk.timelineEvents.find(eventId) - + val eventToCheck = TimelineEventEntity.where(realm, roomId = roomId, eventId = eventId).findFirst() + val eventToCheckChunk = eventToCheck?.chunk?.firstOrNull() val readMarker = ReadMarkerEntity.where(realm, roomId).findFirst() ?: return false - val readMarkerIndex = liveChunk.timelineEvents.find(readMarker.eventId)?.displayIndex - ?: Int.MIN_VALUE - val eventToCheckIndex = eventToCheck?.displayIndex ?: Int.MAX_VALUE - eventToCheckIndex <= readMarkerIndex + val readMarkerEvent = TimelineEventEntity.where(realm, roomId = roomId, eventId = readMarker.eventId).findFirst() + val readMarkerChunk = readMarkerEvent?.chunk?.firstOrNull() + if (eventToCheckChunk == readMarkerChunk) { + val readMarkerIndex = readMarkerEvent?.displayIndex ?: Int.MIN_VALUE + val eventToCheckIndex = eventToCheck?.displayIndex ?: Int.MAX_VALUE + eventToCheckIndex <= readMarkerIndex + } else { + eventToCheckChunk?.isLastForward == false + } } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/read/SetReadMarkersTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/read/SetReadMarkersTask.kt index c6422f5920..4e013f358c 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/read/SetReadMarkersTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/read/SetReadMarkersTask.kt @@ -58,8 +58,7 @@ internal class DefaultSetReadMarkersTask @Inject constructor( private val roomFullyReadHandler: RoomFullyReadHandler, private val readReceiptHandler: ReadReceiptHandler, @UserId private val userId: String, - private val eventBus: EventBus, - private val networkConnectivityChecker: NetworkConnectivityChecker + private val eventBus: EventBus ) : SetReadMarkersTask { override suspend fun execute(params: SetReadMarkersTask.Params) { @@ -93,13 +92,14 @@ internal class DefaultSetReadMarkersTask @Inject constructor( } val shouldUpdateRoomSummary = readReceiptEventId != null && readReceiptEventId == latestSyncedEventId - updateDatabase(params.roomId, markers, shouldUpdateRoomSummary) - if (markers.isEmpty()) { - return + if (markers.isNotEmpty() || shouldUpdateRoomSummary) { + updateDatabase(params.roomId, markers, shouldUpdateRoomSummary) } - executeRequest(eventBus) { - isRetryable = true - apiCall = roomAPI.sendReadMarker(params.roomId, markers) + if (markers.isNotEmpty()) { + executeRequest(eventBus) { + isRetryable = true + apiCall = roomAPI.sendReadMarker(params.roomId, markers) + } } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt index e3f57fc25e..950b865a36 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt @@ -309,11 +309,10 @@ class RoomDetailFragment @Inject constructor( roomDetailViewModel.observeViewEvents { when (it) { - is RoomDetailViewEvents.Failure -> showErrorInSnackbar(it.throwable) + is RoomDetailViewEvents.Failure -> showErrorInSnackbar(it.throwable) is RoomDetailViewEvents.OnNewTimelineEvents -> scrollOnNewMessageCallback.addNewTimelineEventIds(it.eventIds) }.exhaustive } - } override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -348,9 +347,8 @@ class RoomDetailFragment @Inject constructor( jumpToBottomView.visibility = View.INVISIBLE if (!roomDetailViewModel.timeline.isLive) { roomDetailViewModel.timeline.restartWithEventId(null) - } else { - layoutManager.scrollToPosition(0) } + layoutManager.scrollToPosition(0) } jumpToBottomViewVisibilityManager = JumpToBottomViewVisibilityManager(