From 95ecbb722554bcfaff29a1d4ddde7ebc722b2452 Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 3 Mar 2025 16:25:15 +0100 Subject: [PATCH] change(room directory) : move the the room directory entry from room list filter to start chat screen. --- .../android/appnav/LoggedInFlowNode.kt | 8 +-- .../createroom/api/CreateRoomEntryPoint.kt | 1 + .../createroom/CreateRoomNavigator.kt | 4 ++ .../createroom/impl/CreateRoomFlowNode.kt | 3 + .../impl/root/CreateRoomRootNode.kt | 3 +- .../impl/root/CreateRoomRootPresenter.kt | 8 +++ .../impl/root/CreateRoomRootState.kt | 1 + .../impl/root/CreateRoomRootStateProvider.kt | 5 ++ .../impl/root/CreateRoomRootView.kt | 13 ++++ .../impl/src/main/res/values/localazy.xml | 1 + .../impl/FakeCreateRoomNavigator.kt | 7 ++- .../impl/root/CreateRoomRootPresenterTest.kt | 22 +++++++ .../impl/root/CreateRoomRootViewTest.kt | 19 +++++- .../roomlist/api/RoomListEntryPoint.kt | 1 - .../features/roomlist/impl/RoomListNode.kt | 5 -- .../features/roomlist/impl/RoomListView.kt | 3 - .../impl/search/RoomListSearchPresenter.kt | 5 -- .../impl/search/RoomListSearchState.kt | 5 +- .../search/RoomListSearchStateProvider.kt | 3 - .../impl/search/RoomListSearchView.kt | 45 -------------- .../roomlist/impl/RoomListViewTest.kt | 2 - .../search/RoomListSearchPresenterTest.kt | 20 ------ .../impl/search/RoomListSearchViewTest.kt | 62 ------------------- tools/localazy/config.json | 3 +- 24 files changed, 91 insertions(+), 158 deletions(-) delete mode 100644 features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchViewTest.kt diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index f78f3aa668..6526248ef8 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -262,10 +262,6 @@ class LoggedInFlowNode @AssistedInject constructor( plugins().forEach { it.onOpenBugReport() } } - override fun onRoomDirectorySearchClick() { - backstack.push(NavTarget.RoomDirectorySearch) - } - override fun onLogoutForNativeSlidingSyncMigrationNeeded() { backstack.push(NavTarget.LogoutForNativeSlidingSyncMigrationNeeded) } @@ -360,6 +356,10 @@ class LoggedInFlowNode @AssistedInject constructor( override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) { backstack.replace(NavTarget.Room(roomIdOrAlias = roomIdOrAlias, serverNames = serverNames)) } + + override fun onOpenRoomDirectory() { + backstack.push(NavTarget.RoomDirectorySearch) + } } createRoomEntryPoint diff --git a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt b/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt index c15db6dabd..3b35d0a3e1 100644 --- a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt +++ b/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt @@ -22,5 +22,6 @@ interface CreateRoomEntryPoint : FeatureEntryPoint { interface Callback : Plugin { fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) + fun onOpenRoomDirectory() } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/CreateRoomNavigator.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/CreateRoomNavigator.kt index a63c99d06f..69eac7d369 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/CreateRoomNavigator.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/CreateRoomNavigator.kt @@ -21,15 +21,19 @@ interface CreateRoomNavigator : Plugin { fun onCreateNewRoom() fun onShowJoinRoomByAddress() fun onDismissJoinRoomByAddress() + fun onOpenRoomDirectory() } class DefaultCreateRoomNavigator( private val backstack: BackStack, private val overlay: Overlay, private val openRoom: (RoomIdOrAlias, List) -> Unit, + private val openRoomDirectory: () -> Unit, ) : CreateRoomNavigator { override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) = openRoom(roomIdOrAlias, serverNames) + override fun onOpenRoomDirectory() = openRoomDirectory() + override fun onCreateNewRoom() { backstack.push(NavTarget.NewRoom) } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt index b58ebc083e..b8b755a0b3 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt @@ -60,6 +60,9 @@ class CreateRoomFlowNode @AssistedInject constructor( overlay = overlay, openRoom = { roomIdOrAlias, viaServers -> plugins().forEach { it.onOpenRoom(roomIdOrAlias, viaServers) } + }, + openRoomDirectory = { + plugins().forEach { it.onOpenRoomDirectory() } } ) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootNode.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootNode.kt index 8ee982906c..f76a5d5c61 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootNode.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootNode.kt @@ -55,7 +55,8 @@ class CreateRoomRootNode @AssistedInject constructor( navigator.onOpenRoom(roomIdOrAlias = it.toRoomIdOrAlias(), serverNames = emptyList()) }, onJoinByAddressClick = navigator::onShowJoinRoomByAddress, - onInviteFriendsClick = { invitePeople(activity) } + onInviteFriendsClick = { invitePeople(activity) }, + onRoomDirectorySearchClick = navigator::onOpenRoomDirectory ) } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt index 63880209e0..c05ed770f9 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt @@ -9,6 +9,8 @@ package io.element.android.features.createroom.impl.root import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -20,6 +22,8 @@ import io.element.android.features.createroom.impl.userlist.UserListPresenterArg import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.featureflag.api.FeatureFlagService +import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.usersearch.api.UserRepository import kotlinx.coroutines.launch @@ -31,6 +35,7 @@ class CreateRoomRootPresenter @Inject constructor( userListDataStore: UserListDataStore, private val startDMAction: StartDMAction, private val buildMeta: BuildMeta, + private val featureFlagService: FeatureFlagService, ) : Presenter { private val presenter = presenterFactory.create( UserListPresenterArgs( @@ -47,6 +52,8 @@ class CreateRoomRootPresenter @Inject constructor( val localCoroutineScope = rememberCoroutineScope() val startDmActionState: MutableState> = remember { mutableStateOf(AsyncAction.Uninitialized) } + val isRoomDirectorySearchEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags.RoomDirectorySearch).collectAsState(initial = false) + fun handleEvents(event: CreateRoomRootEvents) { when (event) { is CreateRoomRootEvents.StartDM -> localCoroutineScope.launch { @@ -64,6 +71,7 @@ class CreateRoomRootPresenter @Inject constructor( applicationName = buildMeta.applicationName, userListState = userListState, startDmAction = startDmActionState.value, + isRoomDirectorySearchEnabled = isRoomDirectorySearchEnabled, eventSink = ::handleEvents, ) } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt index 8e1c66b7df..7a6d651db3 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt @@ -15,5 +15,6 @@ data class CreateRoomRootState( val applicationName: String, val userListState: UserListState, val startDmAction: AsyncAction, + val isRoomDirectorySearchEnabled: Boolean, val eventSink: (CreateRoomRootEvents) -> Unit, ) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt index a3ce8a35a9..38a3af46ed 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt @@ -53,6 +53,9 @@ open class CreateRoomRootStateProvider : PreviewParameterProvider = AsyncAction.Uninitialized, + isRoomDirectorySearchEnabled: Boolean = false, eventSink: (CreateRoomRootEvents) -> Unit = {}, ) = CreateRoomRootState( applicationName = applicationName, userListState = userListState, startDmAction = startDmAction, + isRoomDirectorySearchEnabled = isRoomDirectorySearchEnabled, eventSink = eventSink, ) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt index 6f008d7283..af3675484a 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt @@ -56,6 +56,7 @@ fun CreateRoomRootView( onOpenDM: (RoomId) -> Unit, onInviteFriendsClick: () -> Unit, onJoinByAddressClick: () -> Unit, + onRoomDirectorySearchClick: () -> Unit, modifier: Modifier = Modifier, ) { Scaffold( @@ -91,6 +92,7 @@ fun CreateRoomRootView( onNewRoomClick = onNewRoomClick, onInvitePeopleClick = onInviteFriendsClick, onJoinByAddressClick = onJoinByAddressClick, + onRoomDirectorySearchClick = onRoomDirectorySearchClick, onDmClick = onOpenDM, ) } @@ -156,6 +158,7 @@ private fun CreateRoomActionButtonsList( onNewRoomClick: () -> Unit, onInvitePeopleClick: () -> Unit, onJoinByAddressClick: () -> Unit, + onRoomDirectorySearchClick: () -> Unit, onDmClick: (RoomId) -> Unit, ) { LazyColumn { @@ -166,6 +169,15 @@ private fun CreateRoomActionButtonsList( onClick = onNewRoomClick, ) } + if (state.isRoomDirectorySearchEnabled) { + item { + CreateRoomActionButton( + iconRes = CompoundDrawables.ic_compound_list_bulleted, + text = stringResource(id = R.string.screen_room_directory_search_title), + onClick = onRoomDirectorySearchClick, + ) + } + } item { CreateRoomActionButton( iconRes = CompoundDrawables.ic_compound_share_android, @@ -242,5 +254,6 @@ internal fun CreateRoomRootViewPreview(@PreviewParameter(CreateRoomRootStateProv onOpenDM = {}, onJoinByAddressClick = {}, onInviteFriendsClick = {}, + onRoomDirectorySearchClick = {}, ) } diff --git a/features/createroom/impl/src/main/res/values/localazy.xml b/features/createroom/impl/src/main/res/values/localazy.xml index 71208bf9e9..d011a1d87b 100644 --- a/features/createroom/impl/src/main/res/values/localazy.xml +++ b/features/createroom/impl/src/main/res/values/localazy.xml @@ -19,6 +19,7 @@ You can change this anytime in room settings." "Room visibility" "Create a room" "Topic (optional)" + "Room directory" "An error occurred when trying to start a chat" "Join room by address" "Not a valid address" diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/FakeCreateRoomNavigator.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/FakeCreateRoomNavigator.kt index b173865b61..28dcdd409d 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/FakeCreateRoomNavigator.kt +++ b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/FakeCreateRoomNavigator.kt @@ -15,7 +15,8 @@ class FakeCreateRoomNavigator( private val createNewRoomLambda: () -> Unit = {}, private val showJoinRoomByAddressLambda: () -> Unit = {}, private val dismissJoinRoomByAddressLambda: () -> Unit = {}, - ) : CreateRoomNavigator { + private val openRoomDirectoryLambda: () -> Unit = {}, +) : CreateRoomNavigator { override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) { openRoomLambda(roomIdOrAlias, serverNames) } @@ -31,4 +32,8 @@ class FakeCreateRoomNavigator( override fun onDismissJoinRoomByAddress() { dismissJoinRoomByAddressLambda() } + + override fun onOpenRoomDirectory() { + openRoomDirectoryLambda() + } } diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenterTest.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenterTest.kt index 0eaae1a3df..2d81580319 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenterTest.kt +++ b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenterTest.kt @@ -19,6 +19,8 @@ import io.element.android.features.createroom.impl.userlist.FakeUserListPresente import io.element.android.features.createroom.impl.userlist.UserListDataStore import io.element.android.features.createroom.test.FakeStartDMAction import io.element.android.libraries.architecture.AsyncAction +import io.element.android.libraries.featureflag.api.FeatureFlags +import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.user.MatrixUser @@ -163,14 +165,34 @@ class CreateRoomRootPresenterTest { } } + @Test + fun `present - room directory search`() = runTest { + val presenter = createCreateRoomRootPresenter(isRoomDirectorySearchEnabled = true) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + skipItems(1) + awaitItem().let { state -> + assertThat(state.isRoomDirectorySearchEnabled).isTrue() + } + } + } + private fun createCreateRoomRootPresenter( startDMAction: StartDMAction = FakeStartDMAction(), + isRoomDirectorySearchEnabled: Boolean = false, ): CreateRoomRootPresenter { + val featureFlagService = FakeFeatureFlagService( + initialState = mapOf( + FeatureFlags.RoomDirectorySearch.key to isRoomDirectorySearchEnabled, + ), + ) return CreateRoomRootPresenter( presenterFactory = FakeUserListPresenterFactory(FakeUserListPresenter()), userRepository = FakeUserRepository(), userListDataStore = UserListDataStore(), startDMAction = startDMAction, + featureFlagService = featureFlagService, buildMeta = aBuildMeta(), ) } diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootViewTest.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootViewTest.kt index e446a13417..239248a57c 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootViewTest.kt +++ b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootViewTest.kt @@ -116,6 +116,21 @@ class CreateRoomRootViewTest { rule.clickOn(R.string.screen_start_chat_join_room_by_address_action) } } + + @Test + fun `clicking on room directory invokes the expected callback`() { + val eventsRecorder = EventsRecorder(expectEvents = false) + ensureCalledOnce { + rule.setCreateRoomRootView( + aCreateRoomRootState( + eventSink = eventsRecorder, + isRoomDirectorySearchEnabled = true + ), + onRoomDirectorySearchClick = it + ) + rule.clickOn(R.string.screen_room_directory_search_title) + } + } } private fun AndroidComposeTestRule.setCreateRoomRootView( @@ -125,6 +140,7 @@ private fun AndroidComposeTestRule.setCreat onOpenDM: (RoomId) -> Unit = EnsureNeverCalledWithParam(), onInviteFriendsClick: () -> Unit = EnsureNeverCalled(), onJoinRoomByAddressClick: () -> Unit = EnsureNeverCalled(), + onRoomDirectorySearchClick: () -> Unit = EnsureNeverCalled(), ) { setContent { CreateRoomRootView( @@ -133,7 +149,8 @@ private fun AndroidComposeTestRule.setCreat onNewRoomClick = onNewRoomClick, onOpenDM = onOpenDM, onInviteFriendsClick = onInviteFriendsClick, - onJoinByAddressClick = onJoinRoomByAddressClick + onJoinByAddressClick = onJoinRoomByAddressClick, + onRoomDirectorySearchClick = onRoomDirectorySearchClick, ) } } diff --git a/features/roomlist/api/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt b/features/roomlist/api/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt index 97325fc247..44a44f26cb 100644 --- a/features/roomlist/api/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt +++ b/features/roomlist/api/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt @@ -28,7 +28,6 @@ interface RoomListEntryPoint : FeatureEntryPoint { fun onSessionConfirmRecoveryKeyClick() fun onRoomSettingsClick(roomId: RoomId) fun onReportBugClick() - fun onRoomDirectorySearchClick() fun onLogoutForNativeSlidingSyncMigrationNeeded() } } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt index f507fe64d6..9228e847b4 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt @@ -82,10 +82,6 @@ class RoomListNode @AssistedInject constructor( } } - private fun onRoomDirectorySearchClick() { - plugins().forEach { it.onRoomDirectorySearchClick() } - } - @Composable override fun View(modifier: Modifier) { val state = presenter.present() @@ -100,7 +96,6 @@ class RoomListNode @AssistedInject constructor( onConfirmRecoveryKeyClick = this::onSessionConfirmRecoveryKeyClick, onRoomSettingsClick = this::onRoomSettingsClick, onMenuActionClick = { onMenuActionClick(activity, it) }, - onRoomDirectorySearchClick = this::onRoomDirectorySearchClick, modifier = modifier, ) { acceptDeclineInviteView.Render( diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt index 877442ef1b..8a5ade09d2 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt @@ -49,7 +49,6 @@ fun RoomListView( onCreateRoomClick: () -> Unit, onRoomSettingsClick: (roomId: RoomId) -> Unit, onMenuActionClick: (RoomListMenuAction) -> Unit, - onRoomDirectorySearchClick: () -> Unit, modifier: Modifier = Modifier, acceptDeclineInviteView: @Composable () -> Unit, ) { @@ -83,7 +82,6 @@ fun RoomListView( state = state.searchState, eventSink = state.eventSink, onRoomClick = onRoomClick, - onRoomDirectorySearchClick = onRoomDirectorySearchClick, modifier = Modifier .statusBarsPadding() .padding(top = topPadding) @@ -177,7 +175,6 @@ internal fun RoomListViewPreview(@PreviewParameter(RoomListStateProvider::class) onCreateRoomClick = {}, onRoomSettingsClick = {}, onMenuActionClick = {}, - onRoomDirectorySearchClick = {}, acceptDeclineInviteView = {}, ) } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenter.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenter.kt index 62b5fa524f..7a6ec51259 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenter.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenter.kt @@ -15,14 +15,11 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.featureflag.api.FeatureFlagService -import io.element.android.libraries.featureflag.api.FeatureFlags import kotlinx.collections.immutable.persistentListOf import javax.inject.Inject class RoomListSearchPresenter @Inject constructor( private val dataSource: RoomListSearchDataSource, - private val featureFlagService: FeatureFlagService, ) : Presenter { @Composable override fun present(): RoomListSearchState { @@ -57,14 +54,12 @@ class RoomListSearchPresenter @Inject constructor( } } - val isRoomDirectorySearchEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags.RoomDirectorySearch).collectAsState(initial = false) val searchResults by dataSource.roomSummaries.collectAsState(initial = persistentListOf()) return RoomListSearchState( isSearchActive = isSearchActive, query = searchQuery, results = searchResults, - isRoomDirectorySearchEnabled = isRoomDirectorySearchEnabled, eventSink = ::handleEvents ) } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchState.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchState.kt index 85ce456e47..e6bac06ca5 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchState.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchState.kt @@ -14,8 +14,5 @@ data class RoomListSearchState( val isSearchActive: Boolean, val query: String, val results: ImmutableList, - val isRoomDirectorySearchEnabled: Boolean, val eventSink: (RoomListSearchEvents) -> Unit -) { - val displayRoomDirectorySearch = query.isEmpty() && isRoomDirectorySearchEnabled -} +) diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchStateProvider.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchStateProvider.kt index 9136f5867c..640adc7306 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchStateProvider.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchStateProvider.kt @@ -17,7 +17,6 @@ class RoomListSearchStateProvider : PreviewParameterProvider get() = sequenceOf( aRoomListSearchState(), - aRoomListSearchState(isRoomDirectorySearchEnabled = true), aRoomListSearchState( isSearchActive = true, query = "Test", @@ -30,12 +29,10 @@ fun aRoomListSearchState( isSearchActive: Boolean = false, query: String = "", results: ImmutableList = persistentListOf(), - isRoomDirectorySearchEnabled: Boolean = false, eventSink: (RoomListSearchEvents) -> Unit = { }, ) = RoomListSearchState( isSearchActive = isSearchActive, query = query, results = results, - isRoomDirectorySearchEnabled = isRoomDirectorySearchEnabled, eventSink = eventSink, ) diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt index d81f544276..90b4fba44c 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt @@ -12,12 +12,9 @@ import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.ExperimentalMaterial3Api @@ -26,7 +23,6 @@ import androidx.compose.material3.TextFieldDefaults import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.focus.FocusRequester @@ -38,22 +34,18 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import io.element.android.compound.tokens.generated.CompoundIcons -import io.element.android.features.roomlist.impl.R import io.element.android.features.roomlist.impl.RoomListEvents import io.element.android.features.roomlist.impl.components.RoomSummaryRow import io.element.android.features.roomlist.impl.contentType import io.element.android.features.roomlist.impl.model.RoomListRoomSummary import io.element.android.libraries.designsystem.components.button.BackButton -import io.element.android.libraries.designsystem.components.button.SuperButton import io.element.android.libraries.designsystem.modifiers.applyIf import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.designsystem.theme.components.ButtonSize import io.element.android.libraries.designsystem.theme.components.FilledTextField import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.designsystem.theme.components.Scaffold -import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.TopAppBar import io.element.android.libraries.designsystem.utils.copy import io.element.android.libraries.matrix.api.core.RoomId @@ -64,7 +56,6 @@ internal fun RoomListSearchView( state: RoomListSearchState, eventSink: (RoomListEvents) -> Unit, onRoomClick: (RoomId) -> Unit, - onRoomDirectorySearchClick: () -> Unit, modifier: Modifier = Modifier, ) { BackHandler(enabled = state.isSearchActive) { @@ -91,7 +82,6 @@ internal fun RoomListSearchView( state = state, onRoomClick = onRoomClick, eventSink = eventSink, - onRoomDirectorySearchClick = onRoomDirectorySearchClick, ) } } @@ -104,7 +94,6 @@ private fun RoomListSearchContent( state: RoomListSearchState, eventSink: (RoomListEvents) -> Unit, onRoomClick: (RoomId) -> Unit, - onRoomDirectorySearchClick: () -> Unit, ) { val borderColor = MaterialTheme.colorScheme.tertiary val strokeWidth = 1.dp @@ -175,14 +164,6 @@ private fun RoomListSearchContent( .padding(padding) .consumeWindowInsets(padding) ) { - if (state.displayRoomDirectorySearch) { - RoomDirectorySearchButton( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 24.dp, horizontal = 16.dp), - onClick = onRoomDirectorySearchClick - ) - } LazyColumn( modifier = Modifier.weight(1f), ) { @@ -201,31 +182,6 @@ private fun RoomListSearchContent( } } -@Composable -private fun RoomDirectorySearchButton( - onClick: () -> Unit, - modifier: Modifier = Modifier -) { - SuperButton( - onClick = onClick, - modifier = modifier, - buttonSize = ButtonSize.Large, - ) { - Row( - verticalAlignment = Alignment.CenterVertically - ) { - Icon( - imageVector = CompoundIcons.ListBulleted(), - contentDescription = null, - ) - Spacer(modifier = Modifier.width(8.dp)) - Text( - text = stringResource(R.string.screen_roomlist_room_directory_button_title), - ) - } - } -} - @PreviewsDayNight @Composable internal fun RoomListSearchContentPreview(@PreviewParameter(RoomListSearchStateProvider::class) state: RoomListSearchState) = ElementPreview { @@ -233,6 +189,5 @@ internal fun RoomListSearchContentPreview(@PreviewParameter(RoomListSearchStateP state = state, onRoomClick = {}, eventSink = {}, - onRoomDirectorySearchClick = {}, ) } diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListViewTest.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListViewTest.kt index 1810aedd2d..780af7c98c 100644 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListViewTest.kt +++ b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListViewTest.kt @@ -240,7 +240,6 @@ private fun AndroidComposeTestRule.setRoomL onCreateRoomClick: () -> Unit = EnsureNeverCalled(), onRoomSettingsClick: (RoomId) -> Unit = EnsureNeverCalledWithParam(), onMenuActionClick: (RoomListMenuAction) -> Unit = EnsureNeverCalledWithParam(), - onRoomDirectorySearchClick: () -> Unit = EnsureNeverCalled(), ) { setContent { RoomListView( @@ -252,7 +251,6 @@ private fun AndroidComposeTestRule.setRoomL onCreateRoomClick = onCreateRoomClick, onRoomSettingsClick = onRoomSettingsClick, onMenuActionClick = onMenuActionClick, - onRoomDirectorySearchClick = onRoomDirectorySearchClick, acceptDeclineInviteView = { }, ) } diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenterTest.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenterTest.kt index 82fef23508..5d69d21c1e 100644 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenterTest.kt +++ b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenterTest.kt @@ -14,9 +14,6 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.roomlist.impl.datasource.aRoomListRoomSummaryFactory import io.element.android.libraries.dateformatter.test.FakeDateFormatter import io.element.android.libraries.eventformatter.test.FakeRoomLastMessageFormatter -import io.element.android.libraries.featureflag.api.FeatureFlagService -import io.element.android.libraries.featureflag.api.FeatureFlags -import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.roomlist.RoomListFilter import io.element.android.libraries.matrix.api.roomlist.RoomListService import io.element.android.libraries.matrix.test.room.aRoomSummary @@ -118,26 +115,10 @@ class RoomListSearchPresenterTest { } } } - - @Test - fun `present - room directory search`() = runTest { - val featureFlagService = FakeFeatureFlagService() - featureFlagService.setFeatureEnabled(FeatureFlags.RoomDirectorySearch, true) - val presenter = createRoomListSearchPresenter(featureFlagService = featureFlagService) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { - skipItems(1) - awaitItem().let { state -> - assertThat(state.isRoomDirectorySearchEnabled).isTrue() - } - } - } } fun TestScope.createRoomListSearchPresenter( roomListService: RoomListService = FakeRoomListService(), - featureFlagService: FeatureFlagService = FakeFeatureFlagService(), ): RoomListSearchPresenter { return RoomListSearchPresenter( dataSource = RoomListSearchDataSource( @@ -148,6 +129,5 @@ fun TestScope.createRoomListSearchPresenter( ), coroutineDispatchers = testCoroutineDispatchers(), ), - featureFlagService = featureFlagService, ) } diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchViewTest.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchViewTest.kt deleted file mode 100644 index e901e7703c..0000000000 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchViewTest.kt +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.roomlist.impl.search - -import androidx.activity.ComponentActivity -import androidx.compose.ui.test.junit4.AndroidComposeTestRule -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import androidx.test.ext.junit.runners.AndroidJUnit4 -import io.element.android.features.roomlist.impl.R -import io.element.android.features.roomlist.impl.RoomListEvents -import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.tests.testutils.EnsureNeverCalled -import io.element.android.tests.testutils.EnsureNeverCalledWithParam -import io.element.android.tests.testutils.EventsRecorder -import io.element.android.tests.testutils.clickOn -import io.element.android.tests.testutils.ensureCalledOnce -import org.junit.Rule -import org.junit.Test -import org.junit.rules.TestRule -import org.junit.runner.RunWith - -@RunWith(AndroidJUnit4::class) -class RoomListSearchViewTest { - @get:Rule val rule = createAndroidComposeRule() - - @Test - fun `clicking on 'Browse all rooms' invokes the expected callback`() { - val eventsRecorder = EventsRecorder(expectEvents = false) - ensureCalledOnce { - rule.setRoomListSearchView( - aRoomListSearchState( - isSearchActive = true, - isRoomDirectorySearchEnabled = true, - eventSink = eventsRecorder, - ), - onRoomDirectorySearchClick = it, - ) - rule.clickOn(R.string.screen_roomlist_room_directory_button_title) - } - } -} - -private fun AndroidComposeTestRule.setRoomListSearchView( - state: RoomListSearchState, - eventSink: (RoomListEvents) -> Unit = EventsRecorder(expectEvents = false), - onRoomClick: (RoomId) -> Unit = EnsureNeverCalledWithParam(), - onRoomDirectorySearchClick: () -> Unit = EnsureNeverCalled(), -) { - setContent { - RoomListSearchView( - state = state, - eventSink = eventSink, - onRoomClick = onRoomClick, - onRoomDirectorySearchClick = onRoomDirectorySearchClick, - ) - } -} diff --git a/tools/localazy/config.json b/tools/localazy/config.json index 20a53fdcf0..99dea3aa7c 100644 --- a/tools/localazy/config.json +++ b/tools/localazy/config.json @@ -65,7 +65,8 @@ "screen_create_room_.*", "screen\\.create_room\\..*", "screen_start_chat_.*", - "screen\\.start_chat\\..*" + "screen\\.start_chat\\..*", + "screen_room_directory_search_title*" ] }, {