Fix issues with read marker and jumpToBottom
This commit is contained in:
parent
ec6d78bf96
commit
37230b0614
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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(
|
||||||
|
Loading…
Reference in New Issue
Block a user