From 8f5fb64ba547eaf844921d23fcc9280e075a67dc Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 27 Jun 2023 10:47:14 +0200 Subject: [PATCH] RoomList/Timeline: makes sure initial values are set before computing diff/update --- .../libraries/matrix/impl/room/RoomSummaryListProcessor.kt | 5 +++++ .../matrix/impl/timeline/MatrixTimelineDiffProcessor.kt | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSummaryListProcessor.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSummaryListProcessor.kt index 5ddb53421c..1c166960f6 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSummaryListProcessor.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSummaryListProcessor.kt @@ -17,6 +17,7 @@ package io.element.android.libraries.matrix.impl.room import io.element.android.libraries.matrix.api.room.RoomSummary +import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock @@ -33,6 +34,7 @@ class RoomSummaryListProcessor( ) { private val roomSummariesByIdentifier = HashMap() + private val initLatch = CompletableDeferred() private val mutex = Mutex() suspend fun postEntries(entries: List) { @@ -40,9 +42,12 @@ class RoomSummaryListProcessor( Timber.v("Update rooms from postEntries (with ${entries.size} items) on ${Thread.currentThread()}") addAll(entries.map(::buildSummaryForRoomListEntry)) } + initLatch.complete(Unit) } suspend fun postUpdate(update: RoomListEntriesUpdate) { + // Makes sure to process first entries before update. + initLatch.await() updateRoomSummaries { Timber.v("Update rooms from postUpdate ($update) on ${Thread.currentThread()}") applyUpdate(update) 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 02b34757da..f85db5a347 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 @@ -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.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 import kotlinx.coroutines.sync.withLock @@ -32,6 +33,7 @@ internal class MatrixTimelineDiffProcessor( private val timelineItemFactory: MatrixTimelineItemMapper, ) { + private val initLatch = CompletableDeferred() private val mutex = Mutex() suspend fun postItems(items: List) { @@ -40,9 +42,12 @@ internal class MatrixTimelineDiffProcessor( addAll(mappedItems) updateBackPaginationState() } + initLatch.complete(Unit) } suspend fun postDiff(diff: TimelineDiff) { + // Makes sure to process first items before diff. + initLatch.await() updateTimelineItems { applyDiff(diff) updateBackPaginationState()