RoomList/Timeline: makes sure initial values are set before computing diff/update
This commit is contained in:
parent
208850c0f5
commit
c64608e03e
2 changed files with 10 additions and 0 deletions
|
|
@ -17,6 +17,7 @@
|
||||||
package io.element.android.libraries.matrix.impl.room
|
package io.element.android.libraries.matrix.impl.room
|
||||||
|
|
||||||
import io.element.android.libraries.matrix.api.room.RoomSummary
|
import io.element.android.libraries.matrix.api.room.RoomSummary
|
||||||
|
import kotlinx.coroutines.CompletableDeferred
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
|
|
@ -33,6 +34,7 @@ class RoomSummaryListProcessor(
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private val roomSummariesByIdentifier = HashMap<String, RoomSummary>()
|
private val roomSummariesByIdentifier = HashMap<String, RoomSummary>()
|
||||||
|
private val initLatch = CompletableDeferred<Unit>()
|
||||||
private val mutex = Mutex()
|
private val mutex = Mutex()
|
||||||
|
|
||||||
suspend fun postEntries(entries: List<RoomListEntry>) {
|
suspend fun postEntries(entries: List<RoomListEntry>) {
|
||||||
|
|
@ -40,9 +42,12 @@ class RoomSummaryListProcessor(
|
||||||
Timber.v("Update rooms from postEntries (with ${entries.size} items) on ${Thread.currentThread()}")
|
Timber.v("Update rooms from postEntries (with ${entries.size} items) on ${Thread.currentThread()}")
|
||||||
addAll(entries.map(::buildSummaryForRoomListEntry))
|
addAll(entries.map(::buildSummaryForRoomListEntry))
|
||||||
}
|
}
|
||||||
|
initLatch.complete(Unit)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun postUpdate(update: RoomListEntriesUpdate) {
|
suspend fun postUpdate(update: RoomListEntriesUpdate) {
|
||||||
|
// Makes sure to process first entries before update.
|
||||||
|
initLatch.await()
|
||||||
updateRoomSummaries {
|
updateRoomSummaries {
|
||||||
Timber.v("Update rooms from postUpdate ($update) on ${Thread.currentThread()}")
|
Timber.v("Update rooms from postUpdate ($update) on ${Thread.currentThread()}")
|
||||||
applyUpdate(update)
|
applyUpdate(update)
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,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.MatrixTimeline
|
||||||
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
|
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.virtual.VirtualTimelineItem
|
import io.element.android.libraries.matrix.api.timeline.item.virtual.VirtualTimelineItem
|
||||||
|
import kotlinx.coroutines.CompletableDeferred
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
|
|
@ -32,6 +33,7 @@ internal class MatrixTimelineDiffProcessor(
|
||||||
private val timelineItemFactory: MatrixTimelineItemMapper,
|
private val timelineItemFactory: MatrixTimelineItemMapper,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
private val initLatch = CompletableDeferred<Unit>()
|
||||||
private val mutex = Mutex()
|
private val mutex = Mutex()
|
||||||
|
|
||||||
suspend fun postItems(items: List<TimelineItem>) {
|
suspend fun postItems(items: List<TimelineItem>) {
|
||||||
|
|
@ -40,9 +42,12 @@ internal class MatrixTimelineDiffProcessor(
|
||||||
addAll(mappedItems)
|
addAll(mappedItems)
|
||||||
updateBackPaginationState()
|
updateBackPaginationState()
|
||||||
}
|
}
|
||||||
|
initLatch.complete(Unit)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun postDiff(diff: TimelineDiff) {
|
suspend fun postDiff(diff: TimelineDiff) {
|
||||||
|
// Makes sure to process first items before diff.
|
||||||
|
initLatch.await()
|
||||||
updateTimelineItems {
|
updateTimelineItems {
|
||||||
applyDiff(diff)
|
applyDiff(diff)
|
||||||
updateBackPaginationState()
|
updateBackPaginationState()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue