From 2ae69314860a98c866f47a56f1c79a3312d4105d Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 16 Apr 2024 21:18:54 +0200 Subject: [PATCH] Timeline : expose new pagination status api --- .../impl/timeline/RoomTimelineExtensions.kt | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) 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 f8109259d5..400ff8fffd 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 @@ -27,13 +27,14 @@ 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.BackPaginationStatusListener +import org.matrix.rustcomponents.sdk.PaginationStatusListener +import org.matrix.rustcomponents.sdk.TaskHandle 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.BackPaginationStatus +import uniffi.matrix_sdk_ui.PaginationStatus internal fun Timeline.timelineDiffFlow(onInitialList: suspend (List) -> Unit): Flow> = callbackFlow { @@ -58,17 +59,28 @@ internal fun Timeline.timelineDiffFlow(onInitialList: suspend (List = - mxCallbackFlow { - val listener = object : BackPaginationStatusListener { - override fun onUpdate(status: BackPaginationStatus) { +internal fun Timeline.backPaginationStatusFlow(): Flow = + paginationStatusFlow { listener -> + subscribeToBackPaginationStatus(listener) + } + +internal fun Timeline.forwardPaginationStatusFlow(): Flow = + paginationStatusFlow { listener -> + subscribeToForwardPaginationStatus(listener) + } + +private fun paginationStatusFlow(subscriber: suspend (PaginationStatusListener)->TaskHandle): Flow{ + return mxCallbackFlow { + val listener = object : PaginationStatusListener { + override fun onUpdate(status: PaginationStatus) { trySendBlocking(status) } } tryOrNull { - subscribeToBackPaginationStatus(listener) + subscriber(listener) } }.buffer(Channel.UNLIMITED) +} internal suspend fun Timeline.runWithTimelineListenerRegistered(action: suspend () -> Unit) { val result = addListener(NoOpTimelineListener)