Fix slidingSync being slow

This commit is contained in:
ganfra 2023-02-07 19:48:20 +01:00
parent e5bd96049e
commit 4ff6f56471
2 changed files with 12 additions and 18 deletions

View file

@ -83,7 +83,7 @@ internal class RustMatrixClient internal constructor(
} }
private val visibleRoomsView = SlidingSyncViewBuilder() private val visibleRoomsView = SlidingSyncViewBuilder()
.timelineLimit(limit = 10u) .timelineLimit(limit = 1u)
.requiredState( .requiredState(
requiredState = listOf( requiredState = listOf(
RequiredState(key = "m.room.avatar", value = ""), RequiredState(key = "m.room.avatar", value = ""),
@ -121,10 +121,13 @@ internal class RustMatrixClient internal constructor(
init { init {
client.setDelegate(clientDelegate) client.setDelegate(clientDelegate)
roomSummaryDataSource.init()
slidingSync.setObserver(slidingSyncObserverProxy)
} }
private fun onRestartSync() { private fun onRestartSync() {
slidingSyncObserverToken = slidingSync.sync() stopSync()
startSync()
} }
override fun getRoom(roomId: RoomId): MatrixRoom? { override fun getRoom(roomId: RoomId): MatrixRoom? {
@ -139,28 +142,26 @@ internal class RustMatrixClient internal constructor(
) )
} }
override fun roomSummaryDataSource(): RoomSummaryDataSource = roomSummaryDataSource
override fun mediaResolver(): MediaResolver = mediaResolver
override fun startSync() { override fun startSync() {
if (client.isSoftLogout()) return
if (isSyncing.compareAndSet(false, true)) { if (isSyncing.compareAndSet(false, true)) {
roomSummaryDataSource.startSync()
slidingSync.setObserver(slidingSyncObserverProxy)
slidingSyncObserverToken = slidingSync.sync() slidingSyncObserverToken = slidingSync.sync()
} }
} }
override fun stopSync() { override fun stopSync() {
if (isSyncing.compareAndSet(true, false)) { if (isSyncing.compareAndSet(true, false)) {
roomSummaryDataSource.stopSync()
slidingSync.setObserver(null)
slidingSyncObserverToken?.cancel() slidingSyncObserverToken?.cancel()
} }
} }
override fun roomSummaryDataSource(): RoomSummaryDataSource = roomSummaryDataSource
override fun mediaResolver(): MediaResolver = mediaResolver
override fun close() { override fun close() {
stopSync() stopSync()
slidingSync.setObserver(null)
roomSummaryDataSource.close() roomSummaryDataSource.close()
client.setDelegate(null) client.setDelegate(null)
} }

View file

@ -20,16 +20,13 @@ import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.matrix.sync.roomListDiff import io.element.android.libraries.matrix.sync.roomListDiff
import io.element.android.libraries.matrix.sync.state import io.element.android.libraries.matrix.sync.state
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
import kotlinx.coroutines.cancelChildren
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.sample
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.matrix.rustcomponents.sdk.RoomListEntry import org.matrix.rustcomponents.sdk.RoomListEntry
@ -62,7 +59,7 @@ internal class RustRoomSummaryDataSource(
private val roomSummaries = MutableStateFlow<List<RoomSummary>>(emptyList()) private val roomSummaries = MutableStateFlow<List<RoomSummary>>(emptyList())
private val state = MutableStateFlow(SlidingSyncState.COLD) private val state = MutableStateFlow(SlidingSyncState.COLD)
fun startSync() { fun init() {
coroutineScope.launch { coroutineScope.launch {
updateRoomSummaries { updateRoomSummaries {
addAll( addAll(
@ -91,10 +88,6 @@ internal class RustRoomSummaryDataSource(
}.launchIn(coroutineScope) }.launchIn(coroutineScope)
} }
fun stopSync() {
coroutineScope.coroutineContext.cancelChildren()
}
override fun close() { override fun close() {
coroutineScope.cancel() coroutineScope.cancel()
} }