Timeline: refactor a bit

This commit is contained in:
ganfra 2023-06-26 18:18:48 +02:00
parent e5c86675a4
commit e2772fb292
3 changed files with 35 additions and 31 deletions

View file

@ -108,13 +108,13 @@ class RustMatrixRoom(
timelineLimit = null timelineLimit = null
) )
roomListItem.subscribe(settings) roomListItem.subscribe(settings)
innerRoom.timelineDiffFlow { initialList -> roomCoroutineScope.launch(coroutineDispatchers.computation) {
timeline.postItems(initialList) innerRoom.timelineDiffFlow { initialList ->
}.onEach { timeline.postItems(initialList)
syncUpdateFlow.value = systemClock.epochMillis() }.onEach {
timeline.postDiff(it) syncUpdateFlow.value = systemClock.epochMillis()
}.launchIn(roomCoroutineScope) timeline.postDiff(it)
roomCoroutineScope.launch { }.launchIn(this)
fetchMembers() fetchMembers()
} }
isInit.value = true isInit.value = true
@ -122,7 +122,7 @@ class RustMatrixRoom(
} }
override fun close() { override fun close() {
if(isInit.value) { if (isInit.value) {
isInit.value = false isInit.value = false
roomCoroutineScope.cancel() roomCoroutineScope.cancel()
roomListItem.unsubscribe() roomListItem.unsubscribe()
@ -360,7 +360,6 @@ class RustMatrixRoom(
} }
} }
private suspend fun fetchMembers() = withContext(coroutineDispatchers.io) { private suspend fun fetchMembers() = withContext(coroutineDispatchers.io) {
runCatching { runCatching {
innerRoom.fetchMembers() innerRoom.fetchMembers()

View file

@ -19,11 +19,9 @@ 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.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.withContext import kotlinx.coroutines.sync.withLock
import org.matrix.rustcomponents.sdk.TimelineChange import org.matrix.rustcomponents.sdk.TimelineChange
import org.matrix.rustcomponents.sdk.TimelineDiff import org.matrix.rustcomponents.sdk.TimelineDiff
import org.matrix.rustcomponents.sdk.TimelineItem import org.matrix.rustcomponents.sdk.TimelineItem
@ -31,20 +29,23 @@ import org.matrix.rustcomponents.sdk.TimelineItem
internal class MatrixTimelineDiffProcessor( internal class MatrixTimelineDiffProcessor(
private val paginationState: MutableStateFlow<MatrixTimeline.PaginationState>, private val paginationState: MutableStateFlow<MatrixTimeline.PaginationState>,
private val timelineItems: MutableStateFlow<List<MatrixTimelineItem>>, private val timelineItems: MutableStateFlow<List<MatrixTimelineItem>>,
private val coroutineScope: CoroutineScope,
private val diffDispatcher: CoroutineDispatcher,
private val timelineItemFactory: MatrixTimelineItemMapper, private val timelineItemFactory: MatrixTimelineItemMapper,
) { ) {
fun postDiff(diff: TimelineDiff) { private val mutex = Mutex()
coroutineScope.launch {
updateTimelineItems { suspend fun postItems(items: List<TimelineItem>) {
applyDiff(diff) updateTimelineItems {
} val mappedItems = items.map { it.asMatrixTimelineItem() }
when (val firstItem = timelineItems.value.firstOrNull()) { addAll(mappedItems)
is MatrixTimelineItem.Virtual -> updateBackPaginationState(firstItem.virtual) updateBackPaginationState()
else -> updateBackPaginationState(null) }
} }
suspend fun postDiff(diff: TimelineDiff) {
updateTimelineItems {
applyDiff(diff)
updateBackPaginationState()
} }
} }
@ -68,7 +69,7 @@ internal class MatrixTimelineDiffProcessor(
} }
private suspend fun updateTimelineItems(block: MutableList<MatrixTimelineItem>.() -> Unit) = private suspend fun updateTimelineItems(block: MutableList<MatrixTimelineItem>.() -> Unit) =
withContext(diffDispatcher) { mutex.withLock {
val mutableTimelineItems = timelineItems.value.toMutableList() val mutableTimelineItems = timelineItems.value.toMutableList()
block(mutableTimelineItems) block(mutableTimelineItems)
timelineItems.value = mutableTimelineItems timelineItems.value = mutableTimelineItems
@ -119,8 +120,14 @@ internal class MatrixTimelineDiffProcessor(
} }
} }
private fun List<MatrixTimelineItem>.updateBackPaginationState() {
when (val firstItem = firstOrNull()) {
is MatrixTimelineItem.Virtual -> updateBackPaginationState(firstItem.virtual)
else -> updateBackPaginationState(null)
}
}
private fun TimelineItem.asMatrixTimelineItem(): MatrixTimelineItem { private fun TimelineItem.asMatrixTimelineItem(): MatrixTimelineItem {
return timelineItemFactory.map(this) return timelineItemFactory.map(this)
} }
} }

View file

@ -66,8 +66,6 @@ class RustMatrixTimeline(
private val timelineDiffProcessor = MatrixTimelineDiffProcessor( private val timelineDiffProcessor = MatrixTimelineDiffProcessor(
paginationState = paginationState, paginationState = paginationState,
timelineItems = timelineItems, timelineItems = timelineItems,
coroutineScope = roomCoroutineScope,
diffDispatcher = coroutineDispatchers.diffUpdateDispatcher,
timelineItemFactory = timelineItemFactory, timelineItemFactory = timelineItemFactory,
) )
@ -80,11 +78,11 @@ class RustMatrixTimeline(
return timelineItems.sample(50) return timelineItems.sample(50)
} }
internal fun postItems(items: List<TimelineItem>) { internal suspend fun postItems(items: List<TimelineItem>) {
timelineItems.value = items.map(timelineItemFactory::map) timelineDiffProcessor.postItems(items)
} }
internal fun postDiff(timelineDiff: TimelineDiff) { internal suspend fun postDiff(timelineDiff: TimelineDiff) {
timelineDiffProcessor.postDiff(timelineDiff) timelineDiffProcessor.postDiff(timelineDiff)
} }