Skip to content

Commit 16d5be3

Browse files
authored
Fix pinned events banner reappearing when loading (#3519)
* Fix pinned events banner reappearing when loading. Make the `RustTimelineItem.timelineItems` property a `SharedFlow` so we don't always incorrectly load an empty state by default.
1 parent a1612a3 commit 16d5be3

File tree

4 files changed

+14
-11
lines changed

4 files changed

+14
-11
lines changed

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenter.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import io.element.android.libraries.matrix.api.room.MatrixRoom
2424
import kotlinx.collections.immutable.ImmutableList
2525
import kotlinx.collections.immutable.toImmutableList
2626
import kotlinx.coroutines.ExperimentalCoroutinesApi
27-
import kotlinx.coroutines.FlowPreview
2827
import kotlinx.coroutines.flow.flatMapLatest
2928
import kotlinx.coroutines.flow.flowOf
3029
import kotlinx.coroutines.flow.launchIn
@@ -106,7 +105,7 @@ class PinnedMessagesBannerPresenter @Inject constructor(
106105
}
107106
}
108107

109-
@OptIn(FlowPreview::class, ExperimentalCoroutinesApi::class)
108+
@OptIn(ExperimentalCoroutinesApi::class)
110109
@Composable
111110
private fun PinnedMessagesBannerItemsEffect(
112111
onItemsChange: (AsyncData<ImmutableList<PinnedMessagesBannerItem>>) -> Unit,

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ import io.element.android.libraries.matrix.api.room.roomMembers
4141
import io.element.android.libraries.ui.strings.CommonStrings
4242
import kotlinx.collections.immutable.ImmutableList
4343
import kotlinx.coroutines.CoroutineScope
44-
import kotlinx.coroutines.FlowPreview
4544
import kotlinx.coroutines.flow.combine
4645
import kotlinx.coroutines.flow.flowOf
4746
import kotlinx.coroutines.flow.launchIn
@@ -161,7 +160,6 @@ class PinnedMessagesListPresenter @AssistedInject constructor(
161160
}
162161
}
163162

164-
@OptIn(FlowPreview::class)
165163
@Composable
166164
private fun PinnedMessagesListEffect(onItemsChange: (AsyncData<ImmutableList<TimelineItem>>) -> Unit) {
167165
val updatedOnItemsChange by rememberUpdatedState(onItemsChange)

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineDiffProcessor.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
1111
import io.element.android.libraries.matrix.api.timeline.item.event.RoomMembershipContent
1212
import kotlinx.coroutines.flow.Flow
1313
import kotlinx.coroutines.flow.MutableSharedFlow
14-
import kotlinx.coroutines.flow.MutableStateFlow
14+
import kotlinx.coroutines.flow.first
1515
import kotlinx.coroutines.sync.Mutex
1616
import kotlinx.coroutines.sync.withLock
1717
import org.matrix.rustcomponents.sdk.TimelineChange
@@ -20,7 +20,7 @@ import org.matrix.rustcomponents.sdk.TimelineItem
2020
import timber.log.Timber
2121

2222
internal class MatrixTimelineDiffProcessor(
23-
private val timelineItems: MutableStateFlow<List<MatrixTimelineItem>>,
23+
private val timelineItems: MutableSharedFlow<List<MatrixTimelineItem>>,
2424
private val timelineItemFactory: MatrixTimelineItemMapper,
2525
) {
2626
private val mutex = Mutex()
@@ -47,9 +47,13 @@ internal class MatrixTimelineDiffProcessor(
4747

4848
private suspend fun updateTimelineItems(block: MutableList<MatrixTimelineItem>.() -> Unit) =
4949
mutex.withLock {
50-
val mutableTimelineItems = timelineItems.value.toMutableList()
50+
val mutableTimelineItems = if (timelineItems.replayCache.isNotEmpty()) {
51+
timelineItems.first().toMutableList()
52+
} else {
53+
mutableListOf()
54+
}
5155
block(mutableTimelineItems)
52-
timelineItems.value = mutableTimelineItems
56+
timelineItems.tryEmit(mutableTimelineItems)
5357
}
5458

5559
private fun MutableList<MatrixTimelineItem>.applyDiff(diff: TimelineDiff) {

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,12 @@ import kotlinx.coroutines.CoroutineScope
4949
import kotlinx.coroutines.NonCancellable
5050
import kotlinx.coroutines.cancel
5151
import kotlinx.coroutines.flow.Flow
52+
import kotlinx.coroutines.flow.MutableSharedFlow
5253
import kotlinx.coroutines.flow.MutableStateFlow
5354
import kotlinx.coroutines.flow.StateFlow
5455
import kotlinx.coroutines.flow.combine
5556
import kotlinx.coroutines.flow.distinctUntilChanged
57+
import kotlinx.coroutines.flow.first
5658
import kotlinx.coroutines.flow.getAndUpdate
5759
import kotlinx.coroutines.flow.launchIn
5860
import kotlinx.coroutines.flow.map
@@ -88,8 +90,8 @@ class RustTimeline(
8890
private val initLatch = CompletableDeferred<Unit>()
8991
private val isTimelineInitialized = MutableStateFlow(false)
9092

91-
private val _timelineItems: MutableStateFlow<List<MatrixTimelineItem>> =
92-
MutableStateFlow(emptyList())
93+
private val _timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> =
94+
MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE)
9395

9496
private val timelineEventContentMapper = TimelineEventContentMapper()
9597
private val inReplyToMapper = InReplyToMapper(timelineEventContentMapper)
@@ -522,7 +524,7 @@ class RustTimeline(
522524
}
523525

524526
override suspend fun loadReplyDetails(eventId: EventId): InReplyTo = withContext(dispatcher) {
525-
val timelineItem = _timelineItems.value.firstOrNull { timelineItem ->
527+
val timelineItem = _timelineItems.first().firstOrNull { timelineItem ->
526528
timelineItem is MatrixTimelineItem.Event && timelineItem.eventId == eventId
527529
} as? MatrixTimelineItem.Event
528530

0 commit comments

Comments
 (0)