From 1907745b1f34ed54fd484b630bd77bd42b7007eb Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 7 Jul 2023 10:51:43 +0200 Subject: [PATCH] Room: add extension method awaitAllRoomsAreLoaded with Timeout --- .../matrix/api/room/RoomSummaryDataSource.kt | 19 ++++++++++++++++++- .../libraries/matrix/impl/RustMatrixClient.kt | 9 ++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomSummaryDataSource.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomSummaryDataSource.kt index d8e67a40c3..e6c7b34056 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomSummaryDataSource.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomSummaryDataSource.kt @@ -16,13 +16,18 @@ package io.element.android.libraries.matrix.api.room +import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.withTimeout +import timber.log.Timber +import kotlin.time.Duration interface RoomSummaryDataSource { sealed class LoadingState { object NotLoaded : LoadingState() - data class Loaded(val numberOfRooms: Int): LoadingState() + data class Loaded(val numberOfRooms: Int) : LoadingState() } fun updateAllRoomsVisibleRange(range: IntRange) @@ -30,3 +35,15 @@ interface RoomSummaryDataSource { fun allRooms(): StateFlow> fun inviteRooms(): StateFlow> } + +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") + } +} diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index 85aef441d2..7a2f7ea6b8 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -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.RoomMembershipObserver 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.SyncState 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.Dispatchers import kotlinx.coroutines.cancel -import kotlinx.coroutines.delay import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.withContext @@ -131,11 +130,11 @@ class RustMatrixClient constructor( } override suspend fun getRoom(roomId: RoomId): MatrixRoom? { + // Check if already in memory... var cachedPairOfRoom = pairOfRoom(roomId) if (cachedPairOfRoom == null) { - roomSummaryDataSource.allRoomsLoadingState().firstOrNull { - it is RoomSummaryDataSource.LoadingState.Loaded - } + //... otherwise, lets wait for the SS to load all rooms and check again. + roomSummaryDataSource.awaitAllRoomsAreLoaded() cachedPairOfRoom = pairOfRoom(roomId) } if (cachedPairOfRoom == null) return null