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.room.RoomInfo
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.MessageSearchPaginationState
import io.element.android.libraries.matrix.api.search.MessageSearchResult
@@ -94,7 +95,14 @@ class GlobalSearchPresenter(
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 {
currentMessageSearch.setQuery(queryState.text.toString())
.onFailure { Timber.e(it, "Could not set query for message search") }
@@ -60,11 +60,15 @@ class RoomListSearchDataSource(
roomList.updateVisibleRange(visibleRange)
}
suspend fun setSearchQuery(searchQuery: String) = coroutineScope {
suspend fun setSearchQuery(searchQuery: String, additionalFilters: RoomListFilter?) = coroutineScope {
val filter = if (searchQuery.isBlank()) {
RoomListFilter.None
} else {
RoomListFilter.NormalizedMatchRoomName(searchQuery)
if (additionalFilters != null) {
RoomListFilter.all(additionalFilters, RoomListFilter.NormalizedMatchRoomName(searchQuery))
} else {
RoomListFilter.NormalizedMatchRoomName(searchQuery)
}
}
roomList.updateFilter(filter)
}
@@ -39,7 +39,7 @@ class RoomListSearchPresenter(
val dataSource = remember { dataSourceFactory.create(coroutineScope) }
LaunchedEffect(searchQuery.text) {
dataSource.setSearchQuery(searchQuery.text.toString())
dataSource.setSearchQuery(searchQuery = searchQuery.text.toString(), additionalFilters = null)
}
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.matrix.api.MatrixClient
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.search.MessageSearchService
import io.element.android.libraries.matrix.test.FakeMatrixClient
@@ -142,6 +145,9 @@ class GlobalSearchPresenterTest {
testScheduler.advanceUntilIdle()
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
consumeItemsUntilPredicate { it.results is AsyncData.Loading }