Don't use flow chunk for now as it leads to errors
This commit is contained in:
parent
2179867b61
commit
a824a68650
2 changed files with 14 additions and 13 deletions
|
|
@ -1,7 +1,6 @@
|
||||||
package io.element.android.x.matrix.room
|
package io.element.android.x.matrix.room
|
||||||
|
|
||||||
import io.element.android.x.core.coroutine.CoroutineDispatchers
|
import io.element.android.x.core.coroutine.CoroutineDispatchers
|
||||||
import io.element.android.x.core.data.flow.chunk
|
|
||||||
import io.element.android.x.matrix.sync.roomListDiff
|
import io.element.android.x.matrix.sync.roomListDiff
|
||||||
import io.element.android.x.matrix.sync.state
|
import io.element.android.x.matrix.sync.state
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
|
|
@ -25,7 +24,6 @@ internal class RustRoomSummaryDataSource(
|
||||||
) : RoomSummaryDataSource, Closeable {
|
) : RoomSummaryDataSource, Closeable {
|
||||||
|
|
||||||
private val singleDispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
|
private val singleDispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
|
||||||
|
|
||||||
private val coroutineScope = CoroutineScope(SupervisorJob() + singleDispatcher)
|
private val coroutineScope = CoroutineScope(SupervisorJob() + singleDispatcher)
|
||||||
|
|
||||||
private val roomSummaries = MutableStateFlow<List<RoomSummary>>(emptyList())
|
private val roomSummaries = MutableStateFlow<List<RoomSummary>>(emptyList())
|
||||||
|
|
@ -41,12 +39,9 @@ internal class RustRoomSummaryDataSource(
|
||||||
}
|
}
|
||||||
|
|
||||||
slidingSyncView.roomListDiff()
|
slidingSyncView.roomListDiff()
|
||||||
.chunk(30)
|
|
||||||
.onEach { diffs ->
|
.onEach { diffs ->
|
||||||
updateRoomSummaries {
|
updateRoomSummaries {
|
||||||
diffs.forEach {
|
applyDiff(diffs)
|
||||||
applyDiff(it)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}.collect()
|
}.collect()
|
||||||
|
|
||||||
|
|
@ -72,7 +67,7 @@ internal class RustRoomSummaryDataSource(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun roomSummaries(): Flow<List<RoomSummary>> {
|
override fun roomSummaries(): Flow<List<RoomSummary>> {
|
||||||
return roomSummaries.sample(100)
|
return roomSummaries.sample(50)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun didReceiveSyncUpdate(summary: UpdateSummary) {
|
private fun didReceiveSyncUpdate(summary: UpdateSummary) {
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ class MatrixTimeline(
|
||||||
fun timelineItems(): Flow<List<MatrixTimelineItem>> {
|
fun timelineItems(): Flow<List<MatrixTimelineItem>> {
|
||||||
return diffFlow().combine(timelineItems) { _, _ ->
|
return diffFlow().combine(timelineItems) { _, _ ->
|
||||||
timelineItems.value
|
timelineItems.value
|
||||||
}
|
}.sample(50)
|
||||||
}
|
}
|
||||||
|
|
||||||
val hasMoreToLoad: Boolean
|
val hasMoreToLoad: Boolean
|
||||||
|
|
@ -43,50 +43,56 @@ class MatrixTimeline(
|
||||||
|
|
||||||
private fun diffFlow(): Flow<Unit> {
|
private fun diffFlow(): Flow<Unit> {
|
||||||
return room.timelineDiff()
|
return room.timelineDiff()
|
||||||
.chunk(30)
|
|
||||||
.onEach { timelineDiffs ->
|
.onEach { timelineDiffs ->
|
||||||
|
//Timber.v("Apply ${timelineDiffs.size} diffs on thread: ${Thread.currentThread()}")
|
||||||
updateTimelineItems {
|
updateTimelineItems {
|
||||||
timelineDiffs.onEach {
|
applyDiff(timelineDiffs)
|
||||||
applyDiff(it)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}.map { }
|
}.map { }
|
||||||
|
.flowOn(coroutineDispatchers.computation)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun MutableList<MatrixTimelineItem>.applyDiff(diff: TimelineDiff) {
|
private fun MutableList<MatrixTimelineItem>.applyDiff(diff: TimelineDiff) {
|
||||||
Timber.v("ApplyDiff: ${diff.change()} for list with size: $size")
|
|
||||||
when (diff.change()) {
|
when (diff.change()) {
|
||||||
TimelineChange.PUSH -> {
|
TimelineChange.PUSH -> {
|
||||||
|
Timber.v("Apply push on list with size: $size")
|
||||||
val item = diff.push()?.asMatrixTimelineItem() ?: return
|
val item = diff.push()?.asMatrixTimelineItem() ?: return
|
||||||
add(item)
|
add(item)
|
||||||
}
|
}
|
||||||
TimelineChange.UPDATE_AT -> {
|
TimelineChange.UPDATE_AT -> {
|
||||||
val updateAtData = diff.updateAt() ?: return
|
val updateAtData = diff.updateAt() ?: return
|
||||||
|
Timber.v("Apply $updateAtData on list with size: $size")
|
||||||
val item = updateAtData.item.asMatrixTimelineItem()
|
val item = updateAtData.item.asMatrixTimelineItem()
|
||||||
set(updateAtData.index.toInt(), item)
|
set(updateAtData.index.toInt(), item)
|
||||||
}
|
}
|
||||||
TimelineChange.INSERT_AT -> {
|
TimelineChange.INSERT_AT -> {
|
||||||
val insertAtData = diff.insertAt() ?: return
|
val insertAtData = diff.insertAt() ?: return
|
||||||
|
Timber.v("Apply $insertAtData on list with size: $size")
|
||||||
val item = insertAtData.item.asMatrixTimelineItem()
|
val item = insertAtData.item.asMatrixTimelineItem()
|
||||||
add(insertAtData.index.toInt(), item)
|
add(insertAtData.index.toInt(), item)
|
||||||
}
|
}
|
||||||
TimelineChange.MOVE -> {
|
TimelineChange.MOVE -> {
|
||||||
val moveData = diff.move() ?: return
|
val moveData = diff.move() ?: return
|
||||||
|
Timber.v("Apply $moveData on list with size: $size")
|
||||||
Collections.swap(this, moveData.oldIndex.toInt(), moveData.newIndex.toInt())
|
Collections.swap(this, moveData.oldIndex.toInt(), moveData.newIndex.toInt())
|
||||||
}
|
}
|
||||||
TimelineChange.REMOVE_AT -> {
|
TimelineChange.REMOVE_AT -> {
|
||||||
val removeAtData = diff.removeAt() ?: return
|
val removeAtData = diff.removeAt() ?: return
|
||||||
|
Timber.v("Apply $removeAtData on list with size: $size")
|
||||||
removeAt(removeAtData.toInt())
|
removeAt(removeAtData.toInt())
|
||||||
}
|
}
|
||||||
TimelineChange.REPLACE -> {
|
TimelineChange.REPLACE -> {
|
||||||
|
Timber.v("Apply REPLACE on list with size: $size")
|
||||||
clear()
|
clear()
|
||||||
val items = diff.replace()?.map { it.asMatrixTimelineItem() } ?: return
|
val items = diff.replace()?.map { it.asMatrixTimelineItem() } ?: return
|
||||||
addAll(items)
|
addAll(items)
|
||||||
}
|
}
|
||||||
TimelineChange.POP -> {
|
TimelineChange.POP -> {
|
||||||
|
Timber.v("Apply POP on list with size: $size")
|
||||||
removeLast()
|
removeLast()
|
||||||
}
|
}
|
||||||
TimelineChange.CLEAR -> {
|
TimelineChange.CLEAR -> {
|
||||||
|
Timber.v("Apply CLEAR on list with size: $size")
|
||||||
clear()
|
clear()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue