diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomList.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomList.kt index 9b42fbc70b..0132e35092 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomList.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomList.kt @@ -28,11 +28,21 @@ import kotlin.time.Duration * Can be retrieved from [RoomListService] methods. */ interface RoomList { + /** + * The loading state of the room list. + */ sealed interface LoadingState { data object NotLoaded : LoadingState data class Loaded(val numberOfRooms: Int) : LoadingState } + /** + * The source of the room list data. + * All: all rooms except invites. + * Invites: only invites. + * + * To apply some dynamic filtering on top of that, use [DynamicRoomList]. + */ enum class Source { All, Invites, 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 34d479e394..a98596d227 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 @@ -197,10 +197,10 @@ class RustMatrixClient( RustRoomListService( innerRoomListService = innerRoomListService, sessionCoroutineScope = sessionCoroutineScope, + sessionDispatcher = sessionDispatcher, roomListFactory = RoomListFactory( innerRoomListService = innerRoomListService, - defaultCoroutineScope = sessionCoroutineScope, - defaultCoroutineContext = sessionDispatcher, + sessionCoroutineScope = sessionCoroutineScope, ), ) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFactory.kt index 1c77c5c5c5..421a1296a8 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFactory.kt @@ -29,15 +29,14 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import org.matrix.rustcomponents.sdk.RoomListLoadingState +import org.matrix.rustcomponents.sdk.RoomListService import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext import org.matrix.rustcomponents.sdk.RoomList as InnerRoomList -import org.matrix.rustcomponents.sdk.RoomListService as InnerRoomListService internal class RoomListFactory( - private val innerRoomListService: InnerRoomListService, - private val defaultCoroutineScope: CoroutineScope, - private val defaultCoroutineContext: CoroutineContext = EmptyCoroutineContext, + private val innerRoomListService: RoomListService, + private val sessionCoroutineScope: CoroutineScope, private val roomSummaryDetailsFactory: RoomSummaryDetailsFactory = RoomSummaryDetailsFactory(), ) { /** @@ -45,8 +44,8 @@ internal class RoomListFactory( */ fun createRoomList( pageSize: Int, - coroutineScope: CoroutineScope = defaultCoroutineScope, - coroutineContext: CoroutineContext = defaultCoroutineContext, + coroutineScope: CoroutineScope = sessionCoroutineScope, + coroutineContext: CoroutineContext = EmptyCoroutineContext, initialFilter: RoomListFilter = RoomListFilter.all(), innerProvider: suspend () -> InnerRoomList ): DynamicRoomList { diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListService.kt index 0c48dc2a2f..413c38be6e 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListService.kt @@ -21,6 +21,7 @@ import io.element.android.libraries.matrix.api.roomlist.RoomList import io.element.android.libraries.matrix.api.roomlist.RoomListFilter import io.element.android.libraries.matrix.api.roomlist.RoomListService import io.element.android.libraries.matrix.api.roomlist.loadAllIncrementally +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -42,6 +43,7 @@ private const val DEFAULT_PAGE_SIZE = 20 internal class RustRoomListService( private val innerRoomListService: InnerRustRoomListService, private val sessionCoroutineScope: CoroutineScope, + private val sessionDispatcher: CoroutineDispatcher, private val roomListFactory: RoomListFactory, ) : RoomListService { override fun createRoomList( @@ -54,6 +56,7 @@ internal class RustRoomListService( pageSize = pageSize, initialFilter = initialFilter, coroutineScope = coroutineScope, + coroutineContext = sessionDispatcher, ) { when (source) { RoomList.Source.All -> innerRoomListService.allRooms() @@ -64,6 +67,7 @@ internal class RustRoomListService( override val allRooms: DynamicRoomList = roomListFactory.createRoomList( pageSize = DEFAULT_PAGE_SIZE, + coroutineContext = sessionDispatcher, initialFilter = RoomListFilter.all(RoomListFilter.NonLeft), ) { innerRoomListService.allRooms() @@ -71,6 +75,7 @@ internal class RustRoomListService( override val invites: RoomList = roomListFactory.createRoomList( pageSize = Int.MAX_VALUE, + coroutineContext = sessionDispatcher, ) { innerRoomListService.invites() }