RoomDirectory : continue implementing the search

This commit is contained in:
ganfra 2024-03-25 11:17:19 +01:00
parent 01e6b46323
commit 4c5ae6ae4b
13 changed files with 190 additions and 247 deletions

View file

@ -26,6 +26,7 @@ import io.element.android.libraries.matrix.api.encryption.EncryptionService
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
import io.element.android.libraries.matrix.api.roomdirectory.RoomDirectoryService
import io.element.android.libraries.matrix.api.roomlist.RoomListService
import io.element.android.libraries.matrix.api.verification.SessionVerificationService
import kotlinx.coroutines.CoroutineScope
@ -68,4 +69,9 @@ object SessionMatrixModule {
fun provideSessionCoroutineScope(matrixClient: MatrixClient): CoroutineScope {
return matrixClient.sessionCoroutineScope
}
@Provides
fun providesRoomDirectoryService(matrixClient: MatrixClient): RoomDirectoryService {
return matrixClient.roomDirectoryService()
}
}

View file

@ -17,26 +17,28 @@
package io.element.android.libraries.matrix.impl.roomdirectory
import io.element.android.libraries.matrix.api.roomdirectory.RoomDescription
import io.element.android.libraries.matrix.api.roomdirectory.RoomDirectorySearch
import io.element.android.libraries.matrix.api.roomdirectory.RoomDirectoryList
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlin.time.Duration.Companion.milliseconds
import org.matrix.rustcomponents.sdk.RoomDirectorySearch as InnerRoomDirectorySearch
class RustRoomDirectorySearch(
class RustRoomDirectoryList(
private val inner: InnerRoomDirectorySearch,
private val sessionCoroutineScope: CoroutineScope,
private val sessionDispatcher: CoroutineDispatcher,
) : RoomDirectorySearch {
) : RoomDirectoryList {
private val _results: MutableStateFlow<List<RoomDescription>> =
MutableStateFlow(emptyList())
private val _items = MutableSharedFlow<List<RoomDescription>>()
private val processor = RoomDirectorySearchProcessor(_results, sessionDispatcher, RoomDescriptionMapper())
private val processor = RoomDirectorySearchProcessor(_items, sessionDispatcher, RoomDescriptionMapper())
init {
sessionCoroutineScope.launch(sessionDispatcher) {
@ -49,8 +51,8 @@ class RustRoomDirectorySearch(
}
}
override suspend fun updateQuery(query: String?, batchSize: Int) {
inner.search(query, batchSize.toUInt())
override suspend fun filter(filter: String?, batchSize: Int) {
inner.search(filter, batchSize.toUInt())
}
override suspend fun loadMore() {
@ -61,5 +63,6 @@ class RustRoomDirectorySearch(
return !inner.isAtLastPage()
}
override val results: SharedFlow<List<RoomDescription>> = _results
@OptIn(FlowPreview::class)
override val items: Flow<List<RoomDescription>> = _items.debounce(200.milliseconds)
}

View file

@ -16,7 +16,7 @@
package io.element.android.libraries.matrix.impl.roomdirectory
import io.element.android.libraries.matrix.api.roomdirectory.RoomDirectorySearch
import io.element.android.libraries.matrix.api.roomdirectory.RoomDirectoryList
import io.element.android.libraries.matrix.api.roomdirectory.RoomDirectoryService
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
@ -28,8 +28,8 @@ class RustRoomDirectoryService(
private val sessionDispatcher: CoroutineDispatcher,
) : RoomDirectoryService {
override fun search(): RoomDirectorySearch {
return RustRoomDirectorySearch(client.roomDirectorySearch(), sessionCoroutineScope, sessionDispatcher)
override fun createRoomDirectoryList(): RoomDirectoryList {
return RustRoomDirectoryList(client.roomDirectorySearch(), sessionCoroutineScope, sessionDispatcher)
}
}