Timeline : use the new LiveBackPaginationStatus api
This commit is contained in:
parent
30ddfe893f
commit
01ad7abe32
2 changed files with 32 additions and 0 deletions
|
|
@ -25,11 +25,27 @@ import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.buffer
|
import kotlinx.coroutines.flow.buffer
|
||||||
import kotlinx.coroutines.flow.callbackFlow
|
import kotlinx.coroutines.flow.callbackFlow
|
||||||
import kotlinx.coroutines.flow.catch
|
import kotlinx.coroutines.flow.catch
|
||||||
|
import org.matrix.rustcomponents.sdk.PaginationStatusListener
|
||||||
import org.matrix.rustcomponents.sdk.Timeline
|
import org.matrix.rustcomponents.sdk.Timeline
|
||||||
import org.matrix.rustcomponents.sdk.TimelineDiff
|
import org.matrix.rustcomponents.sdk.TimelineDiff
|
||||||
import org.matrix.rustcomponents.sdk.TimelineItem
|
import org.matrix.rustcomponents.sdk.TimelineItem
|
||||||
import org.matrix.rustcomponents.sdk.TimelineListener
|
import org.matrix.rustcomponents.sdk.TimelineListener
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
import uniffi.matrix_sdk_ui.LiveBackPaginationStatus
|
||||||
|
|
||||||
|
internal fun Timeline.liveBackPaginationStatus(): Flow<LiveBackPaginationStatus> = 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<TimelineItem>) -> Unit): Flow<List<TimelineDiff>> =
|
internal fun Timeline.timelineDiffFlow(onInitialList: suspend (List<TimelineItem>) -> Unit): Flow<List<TimelineDiff>> =
|
||||||
callbackFlow {
|
callbackFlow {
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,7 @@ import org.matrix.rustcomponents.sdk.messageEventContentFromMarkdown
|
||||||
import org.matrix.rustcomponents.sdk.use
|
import org.matrix.rustcomponents.sdk.use
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import uniffi.matrix_sdk_ui.EventItemOrigin
|
import uniffi.matrix_sdk_ui.EventItemOrigin
|
||||||
|
import uniffi.matrix_sdk_ui.LiveBackPaginationStatus
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
import java.util.concurrent.atomic.AtomicBoolean
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
|
|
@ -154,6 +155,21 @@ class RustTimeline(
|
||||||
launch {
|
launch {
|
||||||
fetchMembers()
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue