Timeline: refactor a bit
This commit is contained in:
parent
e5c86675a4
commit
e2772fb292
3 changed files with 35 additions and 31 deletions
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue