Move some package on core + try some stuff around sync/roomlist

This commit is contained in:
ganfra 2022-11-10 12:39:37 +01:00
parent 6cf010db44
commit 1ec8b3a994
18 changed files with 106 additions and 43 deletions

View file

@ -1,7 +1,7 @@
package io.element.android.x.matrix
import android.content.Context
import io.element.android.x.core.data.CoroutineDispatchers
import io.element.android.x.core.coroutine.CoroutineDispatchers
import io.element.android.x.matrix.session.SessionStore
import io.element.android.x.matrix.util.logError
import kotlinx.coroutines.CoroutineScope

View file

@ -1,6 +1,6 @@
package io.element.android.x.matrix
import io.element.android.x.core.data.CoroutineDispatchers
import io.element.android.x.core.coroutine.CoroutineDispatchers
import io.element.android.x.matrix.core.UserId
import io.element.android.x.matrix.media.MediaResolver
import io.element.android.x.matrix.media.RustMediaResolver
@ -14,6 +14,7 @@ import kotlinx.coroutines.withContext
import org.matrix.rustcomponents.sdk.*
import timber.log.Timber
import java.io.Closeable
import java.util.concurrent.atomic.AtomicBoolean
class MatrixClient internal constructor(
private val client: Client,
@ -67,6 +68,7 @@ class MatrixClient internal constructor(
private var slidingSyncObserverToken: StoppableSpawn? = null
private val mediaResolver = RustMediaResolver(this)
private val isSyncing = AtomicBoolean(false)
init {
client.setDelegate(clientDelegate)
@ -84,15 +86,19 @@ class MatrixClient internal constructor(
}
fun startSync() {
roomSummaryDataSource.startSync()
slidingSync.setObserver(slidingSyncObserverProxy)
slidingSyncObserverToken = slidingSync.sync()
if (isSyncing.compareAndSet(false, true)) {
roomSummaryDataSource.startSync()
slidingSync.setObserver(slidingSyncObserverProxy)
slidingSyncObserverToken = slidingSync.sync()
}
}
fun stopSync() {
roomSummaryDataSource.stopSync()
slidingSync.setObserver(null)
slidingSyncObserverToken?.cancel()
if (isSyncing.compareAndSet(true, false)) {
roomSummaryDataSource.stopSync()
slidingSync.setObserver(null)
slidingSyncObserverToken?.cancel()
}
}
fun roomSummaryDataSource(): RoomSummaryDataSource = roomSummaryDataSource

View file

@ -1,6 +1,6 @@
package io.element.android.x.matrix.room
import io.element.android.x.core.data.CoroutineDispatchers
import io.element.android.x.core.coroutine.CoroutineDispatchers
import io.element.android.x.matrix.core.RoomId
import io.element.android.x.matrix.core.UserId
import io.element.android.x.matrix.timeline.MatrixTimeline

View file

@ -1,19 +1,16 @@
package io.element.android.x.matrix.room
import io.element.android.x.core.data.CoroutineDispatchers
import io.element.android.x.core.coroutine.CoroutineDispatchers
import io.element.android.x.core.data.flow.chunk
import io.element.android.x.matrix.room.message.RoomMessageFactory
import io.element.android.x.matrix.sync.roomListDiff
import io.element.android.x.matrix.sync.state
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel
import kotlinx.coroutines.cancelChildren
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import org.matrix.rustcomponents.sdk.*
import timber.log.Timber
import java.io.Closeable
import java.util.*
import java.util.concurrent.Executors
interface RoomSummaryDataSource {
fun roomSummaries(): Flow<List<RoomSummary>>
@ -27,33 +24,43 @@ internal class RustRoomSummaryDataSource(
private val roomSummaryDetailsFactory: RoomSummaryDetailsFactory = RoomSummaryDetailsFactory()
) : RoomSummaryDataSource, Closeable {
private val coroutineScope = CoroutineScope(SupervisorJob() + coroutineDispatchers.io)
private val singleDispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
private val coroutineScope = CoroutineScope(SupervisorJob() + singleDispatcher)
private val roomSummaries = MutableStateFlow<List<RoomSummary>>(emptyList())
private val state = MutableStateFlow(SlidingSyncState.COLD)
fun startSync() {
coroutineScope.launch {
updateRoomSummaries {
clear()
addAll(
slidingSyncView.currentRoomsList().map(::buildSummaryForRoomListEntry)
)
}
fun startSync(){
slidingSyncView.roomListDiff()
.chunk(100)
.onEach { diffs ->
updateRoomSummaries {
diffs.forEach {
applyDiff(it)
slidingSyncView.roomListDiff()
.chunk(30)
.onEach { diffs ->
updateRoomSummaries {
diffs.forEach {
applyDiff(it)
}
}
}
}.launchIn(coroutineScope)
}.collect()
slidingSyncView.state()
.onEach { slidingSyncState ->
Timber.v("New sliding sync state: $slidingSyncState")
state.value = slidingSyncState
}.launchIn(coroutineScope)
slidingSyncView.state()
.onEach { slidingSyncState ->
Timber.v("New sliding sync state: $slidingSyncState")
state.value = slidingSyncState
}.collect()
slidingSyncUpdateFlow
.onEach {
didReceiveSyncUpdate(it)
}.launchIn(coroutineScope)
slidingSyncUpdateFlow
.onEach {
didReceiveSyncUpdate(it)
}.collect()
}
}
fun stopSync() {

View file

@ -1,6 +1,6 @@
package io.element.android.x.matrix.timeline
import io.element.android.x.core.data.CoroutineDispatchers
import io.element.android.x.core.coroutine.CoroutineDispatchers
import io.element.android.x.core.data.flow.chunk
import io.element.android.x.matrix.core.EventId
import io.element.android.x.matrix.room.MatrixRoom