Performance : do not trigger back pagination when opening room.
This commit is contained in:
parent
ef12408b6e
commit
5e6bcbd7ac
2 changed files with 27 additions and 12 deletions
|
|
@ -81,7 +81,6 @@ import timber.log.Timber
|
|||
import uniffi.matrix_sdk_ui.LiveBackPaginationStatus
|
||||
import java.io.File
|
||||
import java.util.Date
|
||||
import java.util.concurrent.atomic.AtomicBoolean
|
||||
import org.matrix.rustcomponents.sdk.Timeline as InnerTimeline
|
||||
|
||||
private const val PAGINATION_SIZE = 50
|
||||
|
|
@ -99,7 +98,7 @@ class RustTimeline(
|
|||
onNewSyncedEvent: () -> Unit,
|
||||
) : Timeline {
|
||||
private val initLatch = CompletableDeferred<Unit>()
|
||||
private val isInit = AtomicBoolean(false)
|
||||
private val isInit = MutableStateFlow(false)
|
||||
|
||||
private val _timelineItems: MutableStateFlow<List<MatrixTimelineItem>> =
|
||||
MutableStateFlow(emptyList())
|
||||
|
|
@ -208,7 +207,7 @@ class RustTimeline(
|
|||
}
|
||||
|
||||
private fun canPaginate(direction: Timeline.PaginationDirection): Boolean {
|
||||
if (!isInit.get()) return false
|
||||
if (!isInit.value) return false
|
||||
return when (direction) {
|
||||
Timeline.PaginationDirection.BACKWARDS -> backPaginationStatus.value.canPaginate
|
||||
Timeline.PaginationDirection.FORWARDS -> forwardPaginationStatus.value.canPaginate
|
||||
|
|
@ -226,20 +225,25 @@ class RustTimeline(
|
|||
_timelineItems,
|
||||
backPaginationStatus.map { it.hasMoreToLoad }.distinctUntilChanged(),
|
||||
forwardPaginationStatus.map { it.hasMoreToLoad }.distinctUntilChanged(),
|
||||
) { timelineItems, hasMoreToLoadBackward, hasMoreToLoadForward ->
|
||||
isInit,
|
||||
) { timelineItems, hasMoreToLoadBackward, hasMoreToLoadForward, isInit ->
|
||||
withContext(dispatcher) {
|
||||
timelineItems
|
||||
.let { items -> encryptedHistoryPostProcessor.process(items) }
|
||||
.let { items ->
|
||||
.process { items -> encryptedHistoryPostProcessor.process(items) }
|
||||
.process { items ->
|
||||
roomBeginningPostProcessor.process(
|
||||
items = items,
|
||||
isDm = matrixRoom.isDm,
|
||||
hasMoreToLoadBackwards = hasMoreToLoadBackward
|
||||
)
|
||||
}
|
||||
.let { items -> loadingIndicatorsPostProcessor.process(items, hasMoreToLoadBackward, hasMoreToLoadForward) }
|
||||
.process(predicate = isInit) { items ->
|
||||
loadingIndicatorsPostProcessor.process(items, hasMoreToLoadBackward, hasMoreToLoadForward)
|
||||
}
|
||||
// Keep lastForwardIndicatorsPostProcessor last
|
||||
.let { items -> lastForwardIndicatorsPostProcessor.process(items) }
|
||||
.process(predicate = isInit) { items ->
|
||||
lastForwardIndicatorsPostProcessor.process(items)
|
||||
}
|
||||
}
|
||||
}.onStart {
|
||||
timelineItemsSubscriber.subscribeIfNeeded()
|
||||
|
|
@ -545,3 +549,14 @@ class RustTimeline(
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun List<MatrixTimelineItem>.process(
|
||||
predicate: Boolean = true,
|
||||
processor: suspend (List<MatrixTimelineItem>) -> List<MatrixTimelineItem>
|
||||
): List<MatrixTimelineItem> {
|
||||
return if (predicate) {
|
||||
processor(this)
|
||||
} else {
|
||||
this
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ import kotlinx.coroutines.CoroutineScope
|
|||
import kotlinx.coroutines.cancelChildren
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import kotlinx.coroutines.ensureActive
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.sync.Mutex
|
||||
|
|
@ -32,7 +33,6 @@ import org.matrix.rustcomponents.sdk.TimelineChange
|
|||
import org.matrix.rustcomponents.sdk.TimelineDiff
|
||||
import org.matrix.rustcomponents.sdk.TimelineItem
|
||||
import uniffi.matrix_sdk_ui.EventItemOrigin
|
||||
import java.util.concurrent.atomic.AtomicBoolean
|
||||
|
||||
private const val INITIAL_MAX_SIZE = 50
|
||||
|
||||
|
|
@ -47,7 +47,7 @@ internal class TimelineItemsSubscriber(
|
|||
private val timeline: Timeline,
|
||||
private val timelineDiffProcessor: MatrixTimelineDiffProcessor,
|
||||
private val initLatch: CompletableDeferred<Unit>,
|
||||
private val isInit: AtomicBoolean,
|
||||
private val isInit: MutableStateFlow<Boolean>,
|
||||
private val onNewSyncedEvent: () -> Unit,
|
||||
) {
|
||||
private var subscriptionCount = 0
|
||||
|
|
@ -94,13 +94,13 @@ internal class TimelineItemsSubscriber(
|
|||
ensureActive()
|
||||
timelineDiffProcessor.postItems(it)
|
||||
}
|
||||
isInit.set(true)
|
||||
isInit.value = true
|
||||
initLatch.complete(Unit)
|
||||
}
|
||||
|
||||
private suspend fun postDiffs(diffs: List<TimelineDiff>) {
|
||||
val diffsToProcess = diffs.toMutableList()
|
||||
if (!isInit.get()) {
|
||||
if (!isInit.value) {
|
||||
val resetDiff = diffsToProcess.firstOrNull { it.change() == TimelineChange.RESET }
|
||||
if (resetDiff != null) {
|
||||
// Keep using the postItems logic so we can post the timelineItems asap.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue