From 01ad7abe3210dbce3a9cf28f1a723e229e9c5906 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 7 Jun 2024 11:22:04 +0200 Subject: [PATCH] Timeline : use the new LiveBackPaginationStatus api --- .../impl/timeline/RoomTimelineExtensions.kt | 16 ++++++++++++++++ .../matrix/impl/timeline/RustTimeline.kt | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt index 381bfd8c95..2ce9d4d435 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt @@ -25,11 +25,27 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.buffer import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.catch +import org.matrix.rustcomponents.sdk.PaginationStatusListener import org.matrix.rustcomponents.sdk.Timeline import org.matrix.rustcomponents.sdk.TimelineDiff import org.matrix.rustcomponents.sdk.TimelineItem import org.matrix.rustcomponents.sdk.TimelineListener import timber.log.Timber +import uniffi.matrix_sdk_ui.LiveBackPaginationStatus + +internal fun Timeline.liveBackPaginationStatus(): Flow = callbackFlow { + val listener = object : PaginationStatusListener { + override fun onUpdate(status: LiveBackPaginationStatus) { + trySend(status) + } + } + val result = subscribeToBackPaginationStatus(listener) + awaitClose { + result.cancelAndDestroy() + } +}.catch { + Timber.d(it, "liveBackPaginationStatus() failed") +}.buffer(Channel.UNLIMITED) internal fun Timeline.timelineDiffFlow(onInitialList: suspend (List) -> Unit): Flow> = callbackFlow { diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt index d15565a3f4..0a7e67bcf6 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt @@ -79,6 +79,7 @@ import org.matrix.rustcomponents.sdk.messageEventContentFromMarkdown import org.matrix.rustcomponents.sdk.use import timber.log.Timber import uniffi.matrix_sdk_ui.EventItemOrigin +import uniffi.matrix_sdk_ui.LiveBackPaginationStatus import java.io.File import java.util.Date import java.util.concurrent.atomic.AtomicBoolean @@ -154,6 +155,21 @@ class RustTimeline( launch { fetchMembers() } + + if (isLive) { + // When timeline is live, we need to listen to the back pagination status as + // sdk can automatically paginate backwards. + inner.liveBackPaginationStatus() + .onEach { backPaginationStatus -> + updatePaginationStatus(Timeline.PaginationDirection.BACKWARDS) { + when (backPaginationStatus) { + is LiveBackPaginationStatus.Idle -> it.copy(isPaginating = false, hasMoreToLoad = !backPaginationStatus.hitStartOfTimeline) + is LiveBackPaginationStatus.Paginating -> it.copy(isPaginating = true, hasMoreToLoad = true) + } + } + } + .launchIn(this) + } } }