Browse Source

RoomList: update LoadingState and fix a crash

jonny/proxy
ganfra 1 year ago
parent
commit
19e2c104af
  1. 10
      libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomSummaryDataSource.kt
  2. 4
      libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncService.kt
  3. 41
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomSummaryDataSource.kt
  4. 4
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt
  5. 6
      libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/sync/FakeSyncService.kt

10
libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomSummaryDataSource.kt

@ -20,14 +20,12 @@ import kotlinx.coroutines.flow.StateFlow
interface RoomSummaryDataSource { interface RoomSummaryDataSource {
enum class LoadingState { sealed class LoadingState {
NotLoaded, object NotLoaded : LoadingState()
PreLoaded, data class Loaded(val numberOfRooms: Int): LoadingState()
PartiallyLoaded,
FullyLoaded,
} }
fun loadingState(): StateFlow<LoadingState> fun allRoomsLoadingState(): StateFlow<LoadingState>
fun allRooms(): StateFlow<List<RoomSummary>> fun allRooms(): StateFlow<List<RoomSummary>>
fun inviteRooms(): StateFlow<List<RoomSummary>> fun inviteRooms(): StateFlow<List<RoomSummary>>
fun updateRoomListVisibleRange(range: IntRange) fun updateRoomListVisibleRange(range: IntRange)

4
libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncService.kt

@ -22,12 +22,12 @@ interface SyncService {
/** /**
* Tries to start the sync. If already syncing it has no effect. * Tries to start the sync. If already syncing it has no effect.
*/ */
fun startSync() fun startSync(): Result<Unit>
/** /**
* Tries to stop the sync. If service is not syncing it has no effect. * Tries to stop the sync. If service is not syncing it has no effect.
*/ */
fun stopSync() fun stopSync(): Result<Unit>
/** /**
* Flow of [SyncState]. Will be updated as soon as the current [SyncState] changes. * Flow of [SyncState]. Will be updated as soon as the current [SyncState] changes.

41
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomSummaryDataSource.kt

@ -20,13 +20,18 @@ import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.matrix.api.room.RoomSummary import io.element.android.libraries.matrix.api.room.RoomSummary
import io.element.android.libraries.matrix.api.room.RoomSummaryDataSource import io.element.android.libraries.matrix.api.room.RoomSummaryDataSource
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
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.map
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.matrix.rustcomponents.sdk.RoomList
import org.matrix.rustcomponents.sdk.RoomListEntriesUpdate
import org.matrix.rustcomponents.sdk.RoomListException import org.matrix.rustcomponents.sdk.RoomListException
import org.matrix.rustcomponents.sdk.RoomListInput import org.matrix.rustcomponents.sdk.RoomListInput
import org.matrix.rustcomponents.sdk.RoomListLoadingState
import org.matrix.rustcomponents.sdk.RoomListRange import org.matrix.rustcomponents.sdk.RoomListRange
import org.matrix.rustcomponents.sdk.RoomListService import org.matrix.rustcomponents.sdk.RoomListService
import timber.log.Timber import timber.log.Timber
@ -41,16 +46,20 @@ internal class RustRoomSummaryDataSource(
private val allRooms = MutableStateFlow<List<RoomSummary>>(emptyList()) private val allRooms = MutableStateFlow<List<RoomSummary>>(emptyList())
private val inviteRooms = MutableStateFlow<List<RoomSummary>>(emptyList()) private val inviteRooms = MutableStateFlow<List<RoomSummary>>(emptyList())
private val loadingState = MutableStateFlow(RoomSummaryDataSource.LoadingState.NotLoaded) private val allRoomsLoadingState: MutableStateFlow<RoomSummaryDataSource.LoadingState> = MutableStateFlow(RoomSummaryDataSource.LoadingState.NotLoaded)
private val allRoomsListProcessor = RoomSummaryListProcessor(allRooms, roomListService, roomSummaryDetailsFactory) private val allRoomsListProcessor = RoomSummaryListProcessor(allRooms, roomListService, roomSummaryDetailsFactory)
init { init {
sessionCoroutineScope.launch(coroutineDispatchers.computation) { sessionCoroutineScope.launch(coroutineDispatchers.computation) {
roomListService.allRooms().entriesFlow { roomListEntries -> val allRooms = roomListService.allRooms()
allRoomsListProcessor.postEntries(roomListEntries) allRooms.observeEntriesWithProcessor(allRoomsListProcessor)
}.onEach { update -> .launchIn(this)
allRoomsListProcessor.postUpdate(update)
}.launchIn(this) allRooms.loadingStateFlow()
.map { it.toRoomSummaryDataSourceLoadingState() }
.onEach {
allRoomsLoadingState.value = it
}.launchIn(this)
} }
} }
@ -62,8 +71,8 @@ internal class RustRoomSummaryDataSource(
return inviteRooms return inviteRooms
} }
override fun loadingState(): StateFlow<RoomSummaryDataSource.LoadingState> { override fun allRoomsLoadingState(): StateFlow<RoomSummaryDataSource.LoadingState> {
return loadingState return allRoomsLoadingState
} }
override fun updateRoomListVisibleRange(range: IntRange) { override fun updateRoomListVisibleRange(range: IntRange) {
@ -80,3 +89,19 @@ internal class RustRoomSummaryDataSource(
} }
} }
} }
private fun RoomListLoadingState.toRoomSummaryDataSourceLoadingState(): RoomSummaryDataSource.LoadingState {
return when (this) {
is RoomListLoadingState.Loaded -> RoomSummaryDataSource.LoadingState.Loaded(maximumNumberOfRooms?.toInt() ?: 0)
is RoomListLoadingState.NotLoaded -> RoomSummaryDataSource.LoadingState.NotLoaded
}
}
fun RoomList.observeEntriesWithProcessor(processor: RoomSummaryListProcessor): Flow<RoomListEntriesUpdate> {
return entriesFlow { roomListEntries ->
processor.postEntries(roomListEntries)
}.onEach { update ->
processor.postUpdate(update)
}
}

4
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt

@ -33,13 +33,13 @@ class RustSyncService(
sessionCoroutineScope: CoroutineScope sessionCoroutineScope: CoroutineScope
) : SyncService { ) : SyncService {
override fun startSync() { override fun startSync() = runCatching {
if (!roomListService.isSyncing()) { if (!roomListService.isSyncing()) {
roomListService.sync() roomListService.sync()
} }
} }
override fun stopSync() { override fun stopSync() = runCatching {
if (roomListService.isSyncing()) { if (roomListService.isSyncing()) {
roomListService.stopSync() roomListService.stopSync()
} }

6
libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/sync/FakeSyncService.kt

@ -29,12 +29,14 @@ class FakeSyncService : SyncService {
syncStateFlow.value = SyncState.InError syncStateFlow.value = SyncState.InError
} }
override fun startSync() { override fun startSync(): Result<Unit> {
syncStateFlow.value = SyncState.Syncing syncStateFlow.value = SyncState.Syncing
return Result.success(Unit)
} }
override fun stopSync() { override fun stopSync(): Result<Unit> {
syncStateFlow.value = SyncState.Terminated syncStateFlow.value = SyncState.Terminated
return Result.success(Unit)
} }
override val syncState: StateFlow<SyncState> = syncStateFlow override val syncState: StateFlow<SyncState> = syncStateFlow

Loading…
Cancel
Save