From 449c331879766323f066cd928379df47102e64f2 Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 12 Dec 2023 14:23:50 +0100 Subject: [PATCH] Timeline: exposes simple request for backward pagination --- .../libraries/matrix/api/timeline/MatrixTimeline.kt | 1 + .../matrix/impl/timeline/AsyncMatrixTimeline.kt | 4 ++++ .../libraries/matrix/impl/timeline/RustMatrixTimeline.kt | 9 +++++++++ .../libraries/matrix/test/timeline/FakeMatrixTimeline.kt | 5 ++++- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/MatrixTimeline.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/MatrixTimeline.kt index f2a81ea32e..7a43d1079f 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/MatrixTimeline.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/MatrixTimeline.kt @@ -33,6 +33,7 @@ interface MatrixTimeline : AutoCloseable { val paginationState: StateFlow val timelineItems: Flow> + suspend fun paginateBackwards(requestSize: Int): Result suspend fun paginateBackwards(requestSize: Int, untilNumberOfItems: Int): Result suspend fun fetchDetailsForEvent(eventId: EventId): Result suspend fun sendReadReceipt(eventId: EventId): Result diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/AsyncMatrixTimeline.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/AsyncMatrixTimeline.kt index 15959476b1..5f7636eaa9 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/AsyncMatrixTimeline.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/AsyncMatrixTimeline.kt @@ -77,6 +77,10 @@ class AsyncMatrixTimeline( override val paginationState: StateFlow = _paginationState override val timelineItems: Flow> = _timelineItems + override suspend fun paginateBackwards(requestSize: Int): Result { + return timeline.await().paginateBackwards(requestSize) + } + override suspend fun paginateBackwards(requestSize: Int, untilNumberOfItems: Int): Result { return timeline.await().paginateBackwards(requestSize, untilNumberOfItems) } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustMatrixTimeline.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustMatrixTimeline.kt index 244b73c247..b25ca8bb89 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustMatrixTimeline.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustMatrixTimeline.kt @@ -188,6 +188,14 @@ class RustMatrixTimeline( } } + override suspend fun paginateBackwards(requestSize: Int): Result { + val paginationOptions = PaginationOptions.SimpleRequest( + eventLimit = requestSize.toUShort(), + waitForToken = true, + ) + return paginateBackwards(paginationOptions) + } + override suspend fun paginateBackwards(requestSize: Int, untilNumberOfItems: Int): Result { val paginationOptions = PaginationOptions.UntilNumItems( eventLimit = requestSize.toUShort(), @@ -198,6 +206,7 @@ class RustMatrixTimeline( } private suspend fun paginateBackwards(paginationOptions: PaginationOptions): Result = withContext(dispatcher) { + initLatch.await() runCatching { if (!canBackPaginate()) throw TimelineException.CannotPaginate Timber.v("Start back paginating for room ${matrixRoom.roomId} ") diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeMatrixTimeline.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeMatrixTimeline.kt index 21325d7a83..51b504cb9f 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeMatrixTimeline.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeMatrixTimeline.kt @@ -56,7 +56,10 @@ class FakeMatrixTimeline( override val timelineItems: Flow> = _timelineItems - override suspend fun paginateBackwards(requestSize: Int, untilNumberOfItems: Int): Result { + override suspend fun paginateBackwards(requestSize: Int) = paginateBackwards() + override suspend fun paginateBackwards(requestSize: Int, untilNumberOfItems: Int) = paginateBackwards() + + private suspend fun paginateBackwards(): Result { updatePaginationState { copy(isBackPaginating = true) }