mirror of
https://github.com/Novaloop-AG/element-x-android.git
synced 2026-11-04 20:01:55 +00:00
RoomList/Timeline: makes sure initial values are set before computing diff/update
This commit is contained in:
+5
@@ -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)
|
||||||
|
|||||||
+5
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user