diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/DynamicRoomList.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/DynamicRoomList.kt index 02833762e2..8cb43af24c 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/DynamicRoomList.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/DynamicRoomList.kt @@ -28,29 +28,7 @@ import kotlinx.coroutines.flow.onEach * It lets load rooms on demand and filter them. */ interface DynamicRoomList : RoomList { - sealed interface Filter { - /** - * No filter applied. - */ - data object All : Filter - - /** - * Filter only the left rooms. - */ - data object AllNonLeft : Filter - - /** - * Filter all rooms. - */ - data object None : Filter - - /** - * Filter rooms by normalized room name. - */ - data class NormalizedMatchRoomName(val pattern: String) : Filter - } - - val currentFilter: StateFlow + val currentFilter: StateFlow val loadedPages: StateFlow val pageSize: Int @@ -68,7 +46,7 @@ interface DynamicRoomList : RoomList { * Update the filter to apply to the list. * @param filter the filter to apply. */ - suspend fun updateFilter(filter: Filter) + suspend fun updateFilter(filter: RoomListFilter) } /** diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListFilter.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListFilter.kt new file mode 100644 index 0000000000..99ba4531e2 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListFilter.kt @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.api.roomlist + +sealed interface RoomListFilter { + companion object { + fun all(vararg filters: RoomListFilter): RoomListFilter { + return All(filters.toList()) + } + + fun any(vararg filters: RoomListFilter): RoomListFilter { + return Any(filters.toList()) + } + } + + data class All( + val filters: List + ) : RoomListFilter + + data class Any( + val filters: List + ) : RoomListFilter + + data object NonLeft : RoomListFilter + + data object Unread : RoomListFilter + + sealed interface Category : RoomListFilter { + data object Group : Category + data object People : Category + } + + data object None : RoomListFilter + + data class NormalizedMatchRoomName( + val pattern: String + ) : RoomListFilter + + data class FuzzyMatchRoomName( + val pattern: String + ) : RoomListFilter +} 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 c8d4dfd507..f0d9c7e2a4 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 @@ -18,6 +18,7 @@ package io.element.android.libraries.matrix.impl.roomlist import io.element.android.libraries.matrix.api.roomlist.DynamicRoomList 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.RoomSummary import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope @@ -28,7 +29,6 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch -import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind import org.matrix.rustcomponents.sdk.RoomListLoadingState import org.matrix.rustcomponents.sdk.RoomList as InnerRoomList import org.matrix.rustcomponents.sdk.RoomListService as InnerRoomListService @@ -44,7 +44,7 @@ internal class RoomListFactory( */ fun createRoomList( pageSize: Int, - initialFilter: DynamicRoomList.Filter = DynamicRoomList.Filter.All, + initialFilter: RoomListFilter = RoomListFilter.all(), innerProvider: suspend () -> InnerRoomList ): DynamicRoomList { val loadingStateFlow: MutableStateFlow = MutableStateFlow(RoomList.LoadingState.NotLoaded) @@ -91,7 +91,7 @@ internal class RoomListFactory( private class RustDynamicRoomList( override val summaries: MutableStateFlow>, override val loadingState: MutableStateFlow, - override val currentFilter: MutableStateFlow, + override val currentFilter: MutableStateFlow, override val loadedPages: MutableStateFlow, private val dynamicEvents: MutableSharedFlow, private val processor: RoomSummaryListProcessor, @@ -101,7 +101,7 @@ private class RustDynamicRoomList( processor.rebuildRoomSummaries() } - override suspend fun updateFilter(filter: DynamicRoomList.Filter) { + override suspend fun updateFilter(filter: RoomListFilter) { currentFilter.emit(filter) val filterEvent = RoomListDynamicEvents.SetFilter(filter.toRustFilter()) dynamicEvents.emit(filterEvent) @@ -124,12 +124,3 @@ private fun RoomListLoadingState.toLoadingState(): RoomList.LoadingState { RoomListLoadingState.NotLoaded -> RoomList.LoadingState.NotLoaded } } - -private fun DynamicRoomList.Filter.toRustFilter(): RoomListEntriesDynamicFilterKind { - return when (this) { - DynamicRoomList.Filter.All -> RoomListEntriesDynamicFilterKind.All - is DynamicRoomList.Filter.NormalizedMatchRoomName -> RoomListEntriesDynamicFilterKind.NormalizedMatchRoomName(this.pattern) - DynamicRoomList.Filter.None -> RoomListEntriesDynamicFilterKind.None - DynamicRoomList.Filter.AllNonLeft -> RoomListEntriesDynamicFilterKind.AllNonLeft - } -} diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFilter.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFilter.kt new file mode 100644 index 0000000000..c28da59ea4 --- /dev/null +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFilter.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.impl.roomlist + +import io.element.android.libraries.matrix.api.roomlist.RoomListFilter +import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind +import org.matrix.rustcomponents.sdk.RoomListFilterCategory + +fun RoomListFilter.toRustFilter(): RoomListEntriesDynamicFilterKind { + return when (this) { + is RoomListFilter.All -> RoomListEntriesDynamicFilterKind.All(filters.map { it.toRustFilter() }) + is RoomListFilter.Any -> RoomListEntriesDynamicFilterKind.Any(filters.map { it.toRustFilter() }) + RoomListFilter.Category.Group -> RoomListEntriesDynamicFilterKind.Category(RoomListFilterCategory.GROUP) + RoomListFilter.Category.People -> RoomListEntriesDynamicFilterKind.Category(RoomListFilterCategory.PEOPLE) + is RoomListFilter.FuzzyMatchRoomName -> RoomListEntriesDynamicFilterKind.FuzzyMatchRoomName(pattern) + RoomListFilter.NonLeft -> RoomListEntriesDynamicFilterKind.NonLeft + RoomListFilter.None -> RoomListEntriesDynamicFilterKind.None + is RoomListFilter.NormalizedMatchRoomName -> RoomListEntriesDynamicFilterKind.NormalizedMatchRoomName(pattern) + RoomListFilter.Unread -> RoomListEntriesDynamicFilterKind.Unread + } +} 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 77d3a4e1fe..4fef34b571 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 @@ -18,6 +18,7 @@ package io.element.android.libraries.matrix.impl.roomlist import io.element.android.libraries.matrix.api.roomlist.DynamicRoomList 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.CoroutineScope @@ -45,7 +46,7 @@ internal class RustRoomListService( ) : RoomListService { override val allRooms: DynamicRoomList = roomListFactory.createRoomList( pageSize = DEFAULT_PAGE_SIZE, - initialFilter = DynamicRoomList.Filter.AllNonLeft, + initialFilter = RoomListFilter.all(RoomListFilter.NonLeft), ) { innerRoomListService.allRooms() }