From fed958bc28f6a02eca272d95108aa94112d2ed11 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 7 Jul 2023 15:24:43 +0200 Subject: [PATCH] Update rust sdk to 0.1.29 (new back pagination status api) --- .../impl/timeline/TimelineStateProvider.kt | 7 ----- .../messages/impl/timeline/TimelineView.kt | 21 ++++++++----- .../components/TimelineItemVirtualRow.kt | 5 ++- .../factories/TimelineItemsFactory.kt | 2 +- .../virtual/TimelineItemVirtualFactory.kt | 12 ++----- .../model/virtual/TimelineItemLoadingModel.kt | 21 ------------- .../virtual/TimelineItemTimelineStartModel.kt | 21 ------------- .../TimelineItemUnknownVirtualModel.kt | 21 ------------- gradle/libs.versions.toml | 2 +- .../item/virtual/VirtualTimelineItem.kt | 3 -- .../matrix/impl/room/RustMatrixRoom.kt | 7 +++++ .../timeline/MatrixTimelineDiffProcessor.kt | 31 ------------------- ...eDiffFlow.kt => RoomTimelineExtensions.kt} | 12 +++++++ .../impl/timeline/RustMatrixTimeline.kt | 28 ++++++++++++++++- .../item/virtual/VirtualTimelineItemMapper.kt | 2 -- 15 files changed, 67 insertions(+), 128 deletions(-) delete mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemLoadingModel.kt delete mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemTimelineStartModel.kt delete mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemUnknownVirtualModel.kt rename libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/{TimelineDiffFlow.kt => RoomTimelineExtensions.kt} (75%) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt index c3264f7a54..e96d7ac0f3 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt @@ -23,7 +23,6 @@ import io.element.android.features.messages.impl.timeline.model.TimelineItemReac import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEventContent import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemStateEventContent import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent -import io.element.android.features.messages.impl.timeline.model.virtual.TimelineItemLoadingModel import io.element.android.features.messages.impl.timeline.model.virtual.aTimelineItemDaySeparatorModel import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize @@ -93,15 +92,9 @@ internal fun aTimelineItemList(content: TimelineItemEventContent): ImmutableList aGroupedEvents(), // A day separator aTimelineItemDaySeparator(), - // Loading - aTimelineItemLoading(), ) } -fun aTimelineItemLoading(): TimelineItem.Virtual { - return TimelineItem.Virtual("virtual_loading", TimelineItemLoadingModel) -} - fun aTimelineItemDaySeparator(): TimelineItem.Virtual { return TimelineItem.Virtual("virtual_day", aTimelineItemDaySeparatorModel("Today")) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt index cda5eff6db..bb33981a64 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt @@ -32,7 +32,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons @@ -59,6 +59,7 @@ import io.element.android.features.messages.impl.timeline.components.TimelineIte import io.element.android.features.messages.impl.timeline.components.TimelineItemStateEventRow import io.element.android.features.messages.impl.timeline.components.TimelineItemVirtualRow import io.element.android.features.messages.impl.timeline.components.group.GroupHeaderView +import io.element.android.features.messages.impl.timeline.components.virtual.TimelineLoadingMoreIndicator import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEventContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEventContentProvider @@ -114,11 +115,11 @@ fun TimelineView( reverseLayout = true, contentPadding = PaddingValues(vertical = 8.dp), ) { - itemsIndexed( + items( items = state.timelineItems, - contentType = { _, timelineItem -> timelineItem.contentType() }, - key = { _, timelineItem -> timelineItem.identifier() }, - ) { index, timelineItem -> + contentType = { timelineItem -> timelineItem.contentType() }, + key = { timelineItem -> timelineItem.identifier() }, + ) { timelineItem -> TimelineItemRow( timelineItem = timelineItem, highlightedItem = state.highlightedEventId?.value, @@ -132,8 +133,14 @@ fun TimelineView( onTimestampClicked = onTimestampClicked, onSwipeToReply = onSwipeToReply, ) - if (index == state.timelineItems.lastIndex) { - onReachedLoadMore() + } + if (state.paginationState.canBackPaginate) { + // Do not use key parameter to avoid wrong positioning + item(contentType = "TimelineLoadingMoreIndicator") { + TimelineLoadingMoreIndicator() + LaunchedEffect(Unit) { + onReachedLoadMore() + } } } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemVirtualRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemVirtualRow.kt index 13a6610ffe..820560c2a2 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemVirtualRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemVirtualRow.kt @@ -22,7 +22,7 @@ import io.element.android.features.messages.impl.timeline.components.virtual.Tim import io.element.android.features.messages.impl.timeline.components.virtual.TimelineLoadingMoreIndicator import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.virtual.TimelineItemDaySeparatorModel -import io.element.android.features.messages.impl.timeline.model.virtual.TimelineItemLoadingModel +import io.element.android.features.messages.impl.timeline.model.virtual.TimelineItemReadMarkerModel @Composable fun TimelineItemVirtualRow( @@ -30,8 +30,7 @@ fun TimelineItemVirtualRow( modifier: Modifier = Modifier ) { when (virtual.model) { - is TimelineItemLoadingModel -> TimelineLoadingMoreIndicator(modifier) is TimelineItemDaySeparatorModel -> TimelineItemDaySeparatorView(virtual.model, modifier) - else -> return + TimelineItemReadMarkerModel -> return } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt index 5061e9a9e7..87a91f7ec2 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt @@ -106,7 +106,7 @@ class TimelineItemsFactory @Inject constructor( val timelineItemState = when (val currentTimelineItem = timelineItems[index]) { is MatrixTimelineItem.Event -> eventItemFactory.create(currentTimelineItem, index, timelineItems) - is MatrixTimelineItem.Virtual -> virtualItemFactory.create(currentTimelineItem, index, timelineItems) + is MatrixTimelineItem.Virtual -> virtualItemFactory.create(currentTimelineItem, index) MatrixTimelineItem.Other -> null } timelineItemsCache[index] = timelineItemState diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/virtual/TimelineItemVirtualFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/virtual/TimelineItemVirtualFactory.kt index 100917a05f..8aae552880 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/virtual/TimelineItemVirtualFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/virtual/TimelineItemVirtualFactory.kt @@ -17,9 +17,7 @@ package io.element.android.features.messages.impl.timeline.factories.virtual import io.element.android.features.messages.impl.timeline.model.TimelineItem -import io.element.android.features.messages.impl.timeline.model.virtual.TimelineItemLoadingModel import io.element.android.features.messages.impl.timeline.model.virtual.TimelineItemReadMarkerModel -import io.element.android.features.messages.impl.timeline.model.virtual.TimelineItemUnknownVirtualModel import io.element.android.features.messages.impl.timeline.model.virtual.TimelineItemVirtualModel import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem import io.element.android.libraries.matrix.api.timeline.item.virtual.VirtualTimelineItem @@ -30,23 +28,19 @@ class TimelineItemVirtualFactory @Inject constructor( ) { fun create( - currentTimelineItem: MatrixTimelineItem.Virtual, + virtualTimelineItem: MatrixTimelineItem.Virtual, index: Int, - timelineItems: List, ): TimelineItem.Virtual { return TimelineItem.Virtual( id = "virtual_item_$index", - model = currentTimelineItem.computeModel(index) + model = virtualTimelineItem.computeModel() ) } - private fun MatrixTimelineItem.Virtual.computeModel(index: Int): TimelineItemVirtualModel { + private fun MatrixTimelineItem.Virtual.computeModel(): TimelineItemVirtualModel { return when (val inner = virtual) { is VirtualTimelineItem.DayDivider -> daySeparatorFactory.create(inner) is VirtualTimelineItem.ReadMarker -> TimelineItemReadMarkerModel - is VirtualTimelineItem.LoadingIndicator -> TimelineItemLoadingModel - is VirtualTimelineItem.TimelineStart -> TimelineItemReadMarkerModel - else -> TimelineItemUnknownVirtualModel } } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemLoadingModel.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemLoadingModel.kt deleted file mode 100644 index 9cc7280b07..0000000000 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemLoadingModel.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2023 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.element.android.features.messages.impl.timeline.model.virtual - -object TimelineItemLoadingModel : TimelineItemVirtualModel { - override val type: String = "TimelineItemLoadingModel" -} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemTimelineStartModel.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemTimelineStartModel.kt deleted file mode 100644 index 8c1afea886..0000000000 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemTimelineStartModel.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2023 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.element.android.features.messages.impl.timeline.model.virtual - -object TimelineItemTimelineStartModel : TimelineItemVirtualModel { - override val type: String = "TimelineItemTimelineStartModel" -} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemUnknownVirtualModel.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemUnknownVirtualModel.kt deleted file mode 100644 index 8b4fe44744..0000000000 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemUnknownVirtualModel.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2023 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.element.android.features.messages.impl.timeline.model.virtual - -object TimelineItemUnknownVirtualModel : TimelineItemVirtualModel { - override val type: String = "TimelineItemUnknownVirtualModel" -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9038c7a72a..c71e609a21 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -145,7 +145,7 @@ jsoup = { module = "org.jsoup:jsoup", version.ref = "jsoup" } appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } molecule-runtime = { module = "app.cash.molecule:molecule-runtime", version.ref = "molecule" } timber = "com.jakewharton.timber:timber:5.0.1" -matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.1.28" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.1.29" sqldelight-driver-android = { module = "com.squareup.sqldelight:android-driver", version.ref = "sqldelight" } sqldelight-driver-jvm = { module = "com.squareup.sqldelight:sqlite-driver", version.ref = "sqldelight" } sqldelight-coroutines = { module = "com.squareup.sqldelight:coroutines-extensions", version.ref = "sqldelight" } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/virtual/VirtualTimelineItem.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/virtual/VirtualTimelineItem.kt index 9a700ac98b..ed761a3d43 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/virtual/VirtualTimelineItem.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/virtual/VirtualTimelineItem.kt @@ -24,7 +24,4 @@ sealed interface VirtualTimelineItem { object ReadMarker : VirtualTimelineItem - object LoadingIndicator : VirtualTimelineItem - - object TimelineStart : VirtualTimelineItem } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt index 10d9763c1f..378e9ae372 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt @@ -39,6 +39,7 @@ import io.element.android.libraries.matrix.impl.core.toProgressWatcher import io.element.android.libraries.matrix.impl.room.location.toInner import io.element.android.libraries.matrix.impl.media.map import io.element.android.libraries.matrix.impl.timeline.RustMatrixTimeline +import io.element.android.libraries.matrix.impl.timeline.backPaginationStatusFlow import io.element.android.libraries.matrix.impl.timeline.timelineDiffFlow import io.element.android.services.toolbox.api.systemclock.SystemClock import kotlinx.coroutines.CoroutineScope @@ -111,6 +112,12 @@ class RustMatrixRoom( _syncUpdateFlow.value = systemClock.epochMillis() _timeline.postDiff(it) }.launchIn(this) + + innerRoom.backPaginationStatusFlow() + .onEach { + _timeline.postPaginationStatus(it) + }.launchIn(this) + fetchMembers() } isInit.value = true diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineDiffProcessor.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineDiffProcessor.kt index f85db5a347..dd0198cf18 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineDiffProcessor.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineDiffProcessor.kt @@ -16,9 +16,7 @@ package io.element.android.libraries.matrix.impl.timeline -import io.element.android.libraries.matrix.api.timeline.MatrixTimeline import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem -import io.element.android.libraries.matrix.api.timeline.item.virtual.VirtualTimelineItem import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.sync.Mutex @@ -28,7 +26,6 @@ import org.matrix.rustcomponents.sdk.TimelineDiff import org.matrix.rustcomponents.sdk.TimelineItem internal class MatrixTimelineDiffProcessor( - private val paginationState: MutableStateFlow, private val timelineItems: MutableStateFlow>, private val timelineItemFactory: MatrixTimelineItemMapper, ) { @@ -40,7 +37,6 @@ internal class MatrixTimelineDiffProcessor( updateTimelineItems { val mappedItems = items.map { it.asMatrixTimelineItem() } addAll(mappedItems) - updateBackPaginationState() } initLatch.complete(Unit) } @@ -50,29 +46,9 @@ internal class MatrixTimelineDiffProcessor( initLatch.await() updateTimelineItems { applyDiff(diff) - updateBackPaginationState() } } - private fun updateBackPaginationState(virtualItem: VirtualTimelineItem?) { - val currentPaginationState = paginationState.value - val newPaginationState = when (virtualItem) { - VirtualTimelineItem.LoadingIndicator -> currentPaginationState.copy( - isBackPaginating = true, - canBackPaginate = true - ) - VirtualTimelineItem.TimelineStart -> currentPaginationState.copy( - isBackPaginating = false, - canBackPaginate = false - ) - else -> currentPaginationState.copy( - isBackPaginating = false, - canBackPaginate = true - ) - } - paginationState.value = newPaginationState - } - private suspend fun updateTimelineItems(block: MutableList.() -> Unit) = mutex.withLock { val mutableTimelineItems = timelineItems.value.toMutableList() @@ -125,13 +101,6 @@ internal class MatrixTimelineDiffProcessor( } } - private fun List.updateBackPaginationState() { - when (val firstItem = firstOrNull()) { - is MatrixTimelineItem.Virtual -> updateBackPaginationState(firstItem.virtual) - else -> updateBackPaginationState(null) - } - } - private fun TimelineItem.asMatrixTimelineItem(): MatrixTimelineItem { return timelineItemFactory.map(this) } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineDiffFlow.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt similarity index 75% rename from libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineDiffFlow.kt rename to libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt index ac75b9d074..d6febb32dc 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineDiffFlow.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt @@ -21,6 +21,8 @@ import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.trySendBlocking import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.buffer +import org.matrix.rustcomponents.sdk.BackPaginationStatus +import org.matrix.rustcomponents.sdk.BackPaginationStatusListener import org.matrix.rustcomponents.sdk.Room import org.matrix.rustcomponents.sdk.TimelineDiff import org.matrix.rustcomponents.sdk.TimelineItem @@ -37,3 +39,13 @@ internal fun Room.timelineDiffFlow(onInitialList: suspend (List) - onInitialList(result.items) result.itemsStream }.buffer(Channel.UNLIMITED) + +internal fun Room.backPaginationStatusFlow(): Flow = + mxCallbackFlow { + val listener = object : BackPaginationStatusListener { + override fun onUpdate(status: BackPaginationStatus) { + trySendBlocking(status) + } + } + subscribeToBackPaginationStatus(listener) + }.buffer(Channel.UNLIMITED) 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 866dbf984b..c7335ba10b 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 @@ -31,8 +31,10 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.getAndUpdate import kotlinx.coroutines.flow.sample import kotlinx.coroutines.withContext +import org.matrix.rustcomponents.sdk.BackPaginationStatus import org.matrix.rustcomponents.sdk.PaginationOptions import org.matrix.rustcomponents.sdk.Room import org.matrix.rustcomponents.sdk.TimelineDiff @@ -65,7 +67,6 @@ class RustMatrixTimeline( ) private val timelineDiffProcessor = MatrixTimelineDiffProcessor( - paginationState = _paginationState, timelineItems = _timelineItems, timelineItemFactory = timelineItemFactory, ) @@ -83,6 +84,31 @@ class RustMatrixTimeline( timelineDiffProcessor.postDiff(timelineDiff) } + internal fun postPaginationStatus(status: BackPaginationStatus) { + _paginationState.getAndUpdate { currentPaginationState -> + when (status) { + BackPaginationStatus.IDLE -> { + currentPaginationState.copy( + isBackPaginating = false, + canBackPaginate = true + ) + } + BackPaginationStatus.PAGINATING -> { + currentPaginationState.copy( + isBackPaginating = true, + canBackPaginate = true + ) + } + BackPaginationStatus.TIMELINE_START_REACHED -> { + currentPaginationState.copy( + isBackPaginating = false, + canBackPaginate = false + ) + } + } + } + } + override suspend fun fetchDetailsForEvent(eventId: EventId): Result = withContext(coroutineDispatchers.io) { runCatching { innerRoom.fetchDetailsForEvent(eventId.value) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/virtual/VirtualTimelineItemMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/virtual/VirtualTimelineItemMapper.kt index 8e2dd9304f..c2b6a8c863 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/virtual/VirtualTimelineItemMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/virtual/VirtualTimelineItemMapper.kt @@ -24,9 +24,7 @@ class VirtualTimelineItemMapper { fun map(virtualTimelineItem: RustVirtualTimelineItem): VirtualTimelineItem { return when (virtualTimelineItem) { is RustVirtualTimelineItem.DayDivider -> VirtualTimelineItem.DayDivider(virtualTimelineItem.ts.toLong()) - RustVirtualTimelineItem.LoadingIndicator -> VirtualTimelineItem.LoadingIndicator RustVirtualTimelineItem.ReadMarker -> VirtualTimelineItem.ReadMarker - RustVirtualTimelineItem.TimelineStart -> VirtualTimelineItem.TimelineStart } } }