Room: add extension method awaitAllRoomsAreLoaded with Timeout

This commit is contained in:
ganfra 2023-07-07 10:51:43 +02:00
parent ec4855cfdf
commit 1907745b1f
2 changed files with 22 additions and 6 deletions

View file

@ -16,13 +16,18 @@
package io.element.android.libraries.matrix.api.room package io.element.android.libraries.matrix.api.room
import kotlinx.coroutines.TimeoutCancellationException
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.withTimeout
import timber.log.Timber
import kotlin.time.Duration
interface RoomSummaryDataSource { interface RoomSummaryDataSource {
sealed class LoadingState { sealed class LoadingState {
object NotLoaded : LoadingState() object NotLoaded : LoadingState()
data class Loaded(val numberOfRooms: Int): LoadingState() data class Loaded(val numberOfRooms: Int) : LoadingState()
} }
fun updateAllRoomsVisibleRange(range: IntRange) fun updateAllRoomsVisibleRange(range: IntRange)
@ -30,3 +35,15 @@ interface RoomSummaryDataSource {
fun allRooms(): StateFlow<List<RoomSummary>> fun allRooms(): StateFlow<List<RoomSummary>>
fun inviteRooms(): StateFlow<List<RoomSummary>> fun inviteRooms(): StateFlow<List<RoomSummary>>
} }
suspend fun RoomSummaryDataSource.awaitAllRoomsAreLoaded(timeout: Duration = Duration.INFINITE) {
try {
withTimeout(timeout) {
allRoomsLoadingState().firstOrNull {
it is RoomSummaryDataSource.LoadingState.Loaded
}
}
} catch (timeoutException: TimeoutCancellationException) {
Timber.v("AwaitAllRooms: no response after $timeout")
}
}

View file

@ -33,6 +33,7 @@ import io.element.android.libraries.matrix.api.pusher.PushersService
import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.MatrixRoom
import io.element.android.libraries.matrix.api.room.RoomMembershipObserver import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
import io.element.android.libraries.matrix.api.room.RoomSummaryDataSource import io.element.android.libraries.matrix.api.room.RoomSummaryDataSource
import io.element.android.libraries.matrix.api.room.awaitAllRoomsAreLoaded
import io.element.android.libraries.matrix.api.sync.SyncService import io.element.android.libraries.matrix.api.sync.SyncService
import io.element.android.libraries.matrix.api.sync.SyncState import io.element.android.libraries.matrix.api.sync.SyncState
import io.element.android.libraries.matrix.api.user.MatrixSearchUserResults import io.element.android.libraries.matrix.api.user.MatrixSearchUserResults
@ -55,10 +56,8 @@ import io.element.android.services.toolbox.api.systemclock.SystemClock
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -131,11 +130,11 @@ class RustMatrixClient constructor(
} }
override suspend fun getRoom(roomId: RoomId): MatrixRoom? { override suspend fun getRoom(roomId: RoomId): MatrixRoom? {
// Check if already in memory...
var cachedPairOfRoom = pairOfRoom(roomId) var cachedPairOfRoom = pairOfRoom(roomId)
if (cachedPairOfRoom == null) { if (cachedPairOfRoom == null) {
roomSummaryDataSource.allRoomsLoadingState().firstOrNull { //... otherwise, lets wait for the SS to load all rooms and check again.
it is RoomSummaryDataSource.LoadingState.Loaded roomSummaryDataSource.awaitAllRoomsAreLoaded()
}
cachedPairOfRoom = pairOfRoom(roomId) cachedPairOfRoom = pairOfRoom(roomId)
} }
if (cachedPairOfRoom == null) return null if (cachedPairOfRoom == null) return null