Make global search use a Joined filter for room results (#7695)

Before this, global search returned also invites, which wasn't planned.
This commit is contained in:
Jorge Martin Espinosa
2026-09-11 17:36:38 +02:00
committed by GitHub
parent d2c49bf4af
commit 8cd3750cde
6 changed files with 29 additions and 4 deletions
@@ -31,6 +31,7 @@ import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.libraries.matrix.api.permalink.PermalinkParser
import io.element.android.libraries.matrix.api.room.RoomInfo import io.element.android.libraries.matrix.api.room.RoomInfo
import io.element.android.libraries.matrix.api.roomlist.LatestEventValue import io.element.android.libraries.matrix.api.roomlist.LatestEventValue
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter
import io.element.android.libraries.matrix.api.search.MessageSearch import io.element.android.libraries.matrix.api.search.MessageSearch
import io.element.android.libraries.matrix.api.search.MessageSearchPaginationState import io.element.android.libraries.matrix.api.search.MessageSearchPaginationState
import io.element.android.libraries.matrix.api.search.MessageSearchResult import io.element.android.libraries.matrix.api.search.MessageSearchResult
@@ -94,7 +95,14 @@ class GlobalSearchPresenter(
AsyncData.Uninitialized AsyncData.Uninitialized
} }
launch { roomListSearchDataSource.setSearchQuery(queryState.text.toString()) } // Apply the query to the room list search, looking only for joined rooms matching the query
launch {
roomListSearchDataSource.setSearchQuery(
searchQuery = queryState.text.toString(),
additionalFilters = RoomListFilter.Joined,
)
}
// Apply the query to the message search too
launch { launch {
currentMessageSearch.setQuery(queryState.text.toString()) currentMessageSearch.setQuery(queryState.text.toString())
.onFailure { Timber.e(it, "Could not set query for message search") } .onFailure { Timber.e(it, "Could not set query for message search") }
@@ -60,11 +60,15 @@ class RoomListSearchDataSource(
roomList.updateVisibleRange(visibleRange) roomList.updateVisibleRange(visibleRange)
} }
suspend fun setSearchQuery(searchQuery: String) = coroutineScope { suspend fun setSearchQuery(searchQuery: String, additionalFilters: RoomListFilter?) = coroutineScope {
val filter = if (searchQuery.isBlank()) { val filter = if (searchQuery.isBlank()) {
RoomListFilter.None RoomListFilter.None
} else { } else {
RoomListFilter.NormalizedMatchRoomName(searchQuery) if (additionalFilters != null) {
RoomListFilter.all(additionalFilters, RoomListFilter.NormalizedMatchRoomName(searchQuery))
} else {
RoomListFilter.NormalizedMatchRoomName(searchQuery)
}
} }
roomList.updateFilter(filter) roomList.updateFilter(filter)
} }
@@ -39,7 +39,7 @@ class RoomListSearchPresenter(
val dataSource = remember { dataSourceFactory.create(coroutineScope) } val dataSource = remember { dataSourceFactory.create(coroutineScope) }
LaunchedEffect(searchQuery.text) { LaunchedEffect(searchQuery.text) {
dataSource.setSearchQuery(searchQuery.text.toString()) dataSource.setSearchQuery(searchQuery = searchQuery.text.toString(), additionalFilters = null)
} }
fun handleEvent(event: RoomListSearchEvent) { fun handleEvent(event: RoomListSearchEvent) {
@@ -23,6 +23,9 @@ import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.libraries.matrix.api.permalink.PermalinkParser
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter.Joined
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter.NormalizedMatchRoomName
import io.element.android.libraries.matrix.api.roomlist.RoomListService import io.element.android.libraries.matrix.api.roomlist.RoomListService
import io.element.android.libraries.matrix.api.search.MessageSearchService import io.element.android.libraries.matrix.api.search.MessageSearchService
import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.FakeMatrixClient
@@ -142,6 +145,9 @@ class GlobalSearchPresenterTest {
testScheduler.advanceUntilIdle() testScheduler.advanceUntilIdle()
roomList.summaries.emit(listOf(aRoomSummary())) roomList.summaries.emit(listOf(aRoomSummary()))
// The filter is updated to include the search query and only search joined rooms
assertThat(roomList.currentFilter.value).isEqualTo(RoomListFilter.all(Joined, NormalizedMatchRoomName("A query")))
// Wait for the presenter to emit a loading state before the success state // Wait for the presenter to emit a loading state before the success state
consumeItemsUntilPredicate { it.results is AsyncData.Loading } consumeItemsUntilPredicate { it.results is AsyncData.Loading }
@@ -67,6 +67,11 @@ sealed interface RoomListFilter {
*/ */
data object Invite : RoomListFilter data object Invite : RoomListFilter
/**
* A filter that matches rooms with Joined membership.
*/
data object Joined : RoomListFilter
/** /**
* A filter that matches either Group,People rooms or Space. * A filter that matches either Group,People rooms or Space.
*/ */
@@ -16,6 +16,7 @@ import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.Deduplicat
import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.Favourite import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.Favourite
import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.Identifiers import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.Identifiers
import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.Invite import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.Invite
import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.Joined
import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.NonLeft import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.NonLeft
import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.NonSpace import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.NonSpace
import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.None import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind.None
@@ -73,6 +74,7 @@ internal object RoomListFilterMapper {
is RoomListFilter.NormalizedMatchRoomName -> NormalizedMatchRoomName( is RoomListFilter.NormalizedMatchRoomName -> NormalizedMatchRoomName(
pattern = filter.pattern pattern = filter.pattern
) )
RoomListFilter.Joined -> Joined
RoomListFilter.Invite -> Invite RoomListFilter.Invite -> Invite
} }
} }