From 92a37f15d4b4def2de216049552181a1374da9b8 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 4 Nov 2021 13:11:45 +0100 Subject: [PATCH] Timeline: fix hasReachedEnd --- .../session/room/timeline/LoadTimelineStrategy.kt | 9 ++++++--- .../sdk/internal/session/room/timeline/TimelineChunk.kt | 9 ++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt index 975ef4e56d..3f4d751f6d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt @@ -111,8 +111,7 @@ internal class LoadTimelineStrategy( } override fun onNewTimelineEvents(roomId: String, eventIds: List) { - super.onNewTimelineEvents(roomId, eventIds) - if (mode == Mode.Live && roomId == this@LoadTimelineStrategy.roomId) { + if (roomId == this@LoadTimelineStrategy.roomId && hasReachedLastForward()) { dependencies.onNewTimelineEvents(eventIds) } } @@ -178,7 +177,7 @@ internal class LoadTimelineStrategy( } private fun buildSendingEvents(): List { - return if (timelineChunk?.hasReachedLastForward().orFalse()) { + return if (hasReachedLastForward()) { sendingEventsDataSource.buildSendingEvents() } else { emptyList() @@ -195,6 +194,10 @@ internal class LoadTimelineStrategy( } } + private fun hasReachedLastForward(): Boolean{ + return timelineChunk?.hasReachedLastForward().orFalse() + } + private fun RealmResults.createTimelineChunk(): TimelineChunk? { return firstOrNull()?.let { return TimelineChunk( diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt index 3e46681358..fcea10250b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt @@ -28,10 +28,12 @@ import org.matrix.android.sdk.api.session.room.timeline.Timeline import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper import org.matrix.android.sdk.internal.database.model.ChunkEntity +import org.matrix.android.sdk.internal.database.model.ChunkEntityFields import org.matrix.android.sdk.internal.database.model.TimelineEventEntity import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields import timber.log.Timber import java.util.Collections +import java.util.concurrent.atomic.AtomicBoolean /** * This is the value used to fetch on server. It's better to make constant as otherwise we can have weird chunks with disparate and small chunk of data. @@ -54,8 +56,13 @@ internal class TimelineChunk constructor(private val chunkEntity: ChunkEntity, private val initialEventId: String?, private val onBuiltEvents: () -> Unit) { + private val isLastForward = AtomicBoolean(chunkEntity.isLastForward) + private val chunkObjectListener = RealmObjectChangeListener { _, changeSet -> Timber.v("on chunk (${chunkEntity.identifier()}) changed: ${changeSet?.changedFields?.joinToString(",")}") + if(changeSet?.isFieldChanged(ChunkEntityFields.IS_LAST_FORWARD).orFalse()){ + isLastForward.set(chunkEntity.isLastForward) + } } private val timelineEventCollectionListener = OrderedRealmCollectionChangeListener { results: RealmResults, changeSet: OrderedCollectionChangeSet -> @@ -77,7 +84,7 @@ internal class TimelineChunk constructor(private val chunkEntity: ChunkEntity, } fun hasReachedLastForward(): Boolean { - return if (chunkEntity.isLastForward) { + return if (isLastForward.get()) { true } else { nextChunk?.hasReachedLastForward().orFalse()