Fix issues with read marker and jumpToBottom

This commit is contained in:
Ganard 2020-01-31 16:36:26 +01:00
parent ec6d78bf96
commit 37230b0614
3 changed files with 24 additions and 22 deletions

View File

@ -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.ChunkEntity
import im.vector.matrix.android.internal.database.model.ReadMarkerEntity 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.ReadReceiptEntity
import im.vector.matrix.android.internal.database.model.TimelineEventEntity
import io.realm.Realm import io.realm.Realm
internal fun isEventRead(monarchy: Monarchy, internal fun isEventRead(monarchy: Monarchy,
@ -37,15 +38,14 @@ internal fun isEventRead(monarchy: Monarchy,
monarchy.doWithRealm { realm -> monarchy.doWithRealm { realm ->
val liveChunk = ChunkEntity.findLastLiveChunkFromRoom(realm, roomId) ?: return@doWithRealm val liveChunk = ChunkEntity.findLastLiveChunkFromRoom(realm, roomId) ?: return@doWithRealm
val eventToCheck = liveChunk.timelineEvents.find(eventId) val eventToCheck = liveChunk.timelineEvents.find(eventId)
isEventRead = if (eventToCheck == null || eventToCheck.root?.sender == userId) {
isEventRead = if (eventToCheck?.root?.sender == userId) {
true true
} else { } else {
val readReceipt = ReadReceiptEntity.where(realm, roomId, userId).findFirst() val readReceipt = ReadReceiptEntity.where(realm, roomId, userId).findFirst()
?: return@doWithRealm ?: return@doWithRealm
val readReceiptIndex = liveChunk.timelineEvents.find(readReceipt.eventId)?.displayIndex val readReceiptIndex = liveChunk.timelineEvents.find(readReceipt.eventId)?.displayIndex
?: Int.MIN_VALUE ?: Int.MIN_VALUE
val eventToCheckIndex = eventToCheck?.displayIndex ?: Int.MAX_VALUE val eventToCheckIndex = eventToCheck.displayIndex
eventToCheckIndex <= readReceiptIndex eventToCheckIndex <= readReceiptIndex
} }
@ -61,13 +61,17 @@ internal fun isReadMarkerMoreRecent(monarchy: Monarchy,
return false return false
} }
return Realm.getInstance(monarchy.realmConfiguration).use { realm -> return Realm.getInstance(monarchy.realmConfiguration).use { realm ->
val liveChunk = ChunkEntity.findLastLiveChunkFromRoom(realm, roomId) ?: return false val eventToCheck = TimelineEventEntity.where(realm, roomId = roomId, eventId = eventId).findFirst()
val eventToCheck = liveChunk.timelineEvents.find(eventId) val eventToCheckChunk = eventToCheck?.chunk?.firstOrNull()
val readMarker = ReadMarkerEntity.where(realm, roomId).findFirst() ?: return false val readMarker = ReadMarkerEntity.where(realm, roomId).findFirst() ?: return false
val readMarkerIndex = liveChunk.timelineEvents.find(readMarker.eventId)?.displayIndex val readMarkerEvent = TimelineEventEntity.where(realm, roomId = roomId, eventId = readMarker.eventId).findFirst()
?: Int.MIN_VALUE val readMarkerChunk = readMarkerEvent?.chunk?.firstOrNull()
val eventToCheckIndex = eventToCheck?.displayIndex ?: Int.MAX_VALUE if (eventToCheckChunk == readMarkerChunk) {
eventToCheckIndex <= readMarkerIndex val readMarkerIndex = readMarkerEvent?.displayIndex ?: Int.MIN_VALUE
val eventToCheckIndex = eventToCheck?.displayIndex ?: Int.MAX_VALUE
eventToCheckIndex <= readMarkerIndex
} else {
eventToCheckChunk?.isLastForward == false
}
} }
} }

View File

@ -58,8 +58,7 @@ internal class DefaultSetReadMarkersTask @Inject constructor(
private val roomFullyReadHandler: RoomFullyReadHandler, private val roomFullyReadHandler: RoomFullyReadHandler,
private val readReceiptHandler: ReadReceiptHandler, private val readReceiptHandler: ReadReceiptHandler,
@UserId private val userId: String, @UserId private val userId: String,
private val eventBus: EventBus, private val eventBus: EventBus
private val networkConnectivityChecker: NetworkConnectivityChecker
) : SetReadMarkersTask { ) : SetReadMarkersTask {
override suspend fun execute(params: SetReadMarkersTask.Params) { override suspend fun execute(params: SetReadMarkersTask.Params) {
@ -93,13 +92,14 @@ internal class DefaultSetReadMarkersTask @Inject constructor(
} }
val shouldUpdateRoomSummary = readReceiptEventId != null && readReceiptEventId == latestSyncedEventId val shouldUpdateRoomSummary = readReceiptEventId != null && readReceiptEventId == latestSyncedEventId
updateDatabase(params.roomId, markers, shouldUpdateRoomSummary) if (markers.isNotEmpty() || shouldUpdateRoomSummary) {
if (markers.isEmpty()) { updateDatabase(params.roomId, markers, shouldUpdateRoomSummary)
return
} }
executeRequest<Unit>(eventBus) { if (markers.isNotEmpty()) {
isRetryable = true executeRequest<Unit>(eventBus) {
apiCall = roomAPI.sendReadMarker(params.roomId, markers) isRetryable = true
apiCall = roomAPI.sendReadMarker(params.roomId, markers)
}
} }
} }

View File

@ -309,11 +309,10 @@ class RoomDetailFragment @Inject constructor(
roomDetailViewModel.observeViewEvents { roomDetailViewModel.observeViewEvents {
when (it) { when (it) {
is RoomDetailViewEvents.Failure -> showErrorInSnackbar(it.throwable) is RoomDetailViewEvents.Failure -> showErrorInSnackbar(it.throwable)
is RoomDetailViewEvents.OnNewTimelineEvents -> scrollOnNewMessageCallback.addNewTimelineEventIds(it.eventIds) is RoomDetailViewEvents.OnNewTimelineEvents -> scrollOnNewMessageCallback.addNewTimelineEventIds(it.eventIds)
}.exhaustive }.exhaustive
} }
} }
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
@ -348,9 +347,8 @@ class RoomDetailFragment @Inject constructor(
jumpToBottomView.visibility = View.INVISIBLE jumpToBottomView.visibility = View.INVISIBLE
if (!roomDetailViewModel.timeline.isLive) { if (!roomDetailViewModel.timeline.isLive) {
roomDetailViewModel.timeline.restartWithEventId(null) roomDetailViewModel.timeline.restartWithEventId(null)
} else {
layoutManager.scrollToPosition(0)
} }
layoutManager.scrollToPosition(0)
} }
jumpToBottomViewVisibilityManager = JumpToBottomViewVisibilityManager( jumpToBottomViewVisibilityManager = JumpToBottomViewVisibilityManager(