From 3de4e8c91e74458804e00b10a49d02a5111336ed Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 20 Mar 2024 15:35:54 +0100 Subject: [PATCH] Room directory search : branch entry point --- .../android/appnav/LoggedInFlowNode.kt | 18 +++++++++++ .../roomlist/api/RoomListEntryPoint.kt | 1 + .../features/roomlist/impl/RoomListNode.kt | 5 +++ .../features/roomlist/impl/RoomListView.kt | 3 ++ .../impl/search/RoomListSearchView.kt | 31 ++++++++++++++++++- 5 files changed, 57 insertions(+), 1 deletion(-) 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 e4290d5bdf..9a96a01d27 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -53,6 +53,7 @@ import io.element.android.features.lockscreen.api.LockScreenService import io.element.android.features.networkmonitor.api.NetworkMonitor import io.element.android.features.networkmonitor.api.NetworkStatus import io.element.android.features.preferences.api.PreferencesEntryPoint +import io.element.android.features.roomdirectory.api.RoomDirectoryEntryPoint import io.element.android.features.roomlist.api.RoomListEntryPoint import io.element.android.features.securebackup.api.SecureBackupEntryPoint import io.element.android.features.verifysession.api.VerifySessionEntryPoint @@ -97,6 +98,7 @@ class LoggedInFlowNode @AssistedInject constructor( private val ftueState: FtueState, private val lockScreenEntryPoint: LockScreenEntryPoint, private val lockScreenStateService: LockScreenService, + private val roomDirectoryEntryPoint: RoomDirectoryEntryPoint, private val matrixClient: MatrixClient, snackbarDispatcher: SnackbarDispatcher, ) : BaseFlowNode( @@ -225,6 +227,9 @@ class LoggedInFlowNode @AssistedInject constructor( @Parcelize data object Ftue : NavTarget + + @Parcelize + data object RoomDirectorySearch : NavTarget } override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { @@ -270,6 +275,10 @@ class LoggedInFlowNode @AssistedInject constructor( override fun onReportBugClicked() { plugins().forEach { it.onOpenBugReport() } } + + override fun onRoomDirectorySearchClicked() { + backstack.push(NavTarget.RoomDirectorySearch) + } } roomListEntryPoint .nodeBuilder(this, buildContext) @@ -377,6 +386,15 @@ class LoggedInFlowNode @AssistedInject constructor( }) .build() } + NavTarget.RoomDirectorySearch -> { + roomDirectoryEntryPoint.nodeBuilder(this, buildContext) + .callback(object : RoomDirectoryEntryPoint.Callback { + override fun onRoomJoined(roomId: RoomId) { + coroutineScope.launch { attachRoom(roomId) } + } + }) + .build() + } } } 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 0404ce18fc..c3b2ff36a2 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 @@ -38,5 +38,6 @@ interface RoomListEntryPoint : FeatureEntryPoint { fun onInvitesClicked() fun onRoomSettingsClicked(roomId: RoomId) fun onReportBugClicked() + fun onRoomDirectorySearchClicked() } } 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 5dec53e158..a9740bcfcb 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 @@ -91,6 +91,10 @@ class RoomListNode @AssistedInject constructor( } } + private fun onRoomDirectorySearchClicked() { + plugins().forEach { it.onRoomDirectorySearchClicked() } + } + @Composable override fun View(modifier: Modifier) { val state = presenter.present() @@ -105,6 +109,7 @@ class RoomListNode @AssistedInject constructor( onInvitesClicked = this::onInvitesClicked, onRoomSettingsClicked = this::onRoomSettingsClicked, onMenuActionClicked = { onMenuActionClicked(activity, it) }, + onRoomDirectorySearchClicked = this::onRoomDirectorySearchClicked, modifier = modifier, ) } 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 23a105f143..e0a3fc5201 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 @@ -59,6 +59,7 @@ fun RoomListView( onInvitesClicked: () -> Unit, onRoomSettingsClicked: (roomId: RoomId) -> Unit, onMenuActionClicked: (RoomListMenuAction) -> Unit, + onRoomDirectorySearchClicked: () -> Unit, modifier: Modifier = Modifier, ) { ConnectivityIndicatorContainer( @@ -99,6 +100,7 @@ fun RoomListView( state = state.searchState, onRoomClicked = onRoomClicked, onRoomLongClicked = { onRoomLongClicked(it) }, + onRoomDirectorySearchClicked = onRoomDirectorySearchClicked, modifier = Modifier .statusBarsPadding() .padding(top = topPadding) @@ -197,5 +199,6 @@ internal fun RoomListViewPreview(@PreviewParameter(RoomListStateProvider::class) onInvitesClicked = {}, onRoomSettingsClicked = {}, onMenuActionClicked = {}, + onRoomDirectorySearchClicked = {}, ) } 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 eff6449449..e8c68cebf0 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 @@ -26,6 +26,8 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.QrCode import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.TextFieldDefaults @@ -50,8 +52,10 @@ import io.element.android.libraries.designsystem.components.button.BackButton 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.Button 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.IconSource import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.TextField import io.element.android.libraries.designsystem.theme.components.TopAppBar @@ -64,6 +68,7 @@ internal fun RoomListSearchView( state: RoomListSearchState, onRoomClicked: (RoomId) -> Unit, onRoomLongClicked: (RoomListRoomSummary) -> Unit, + onRoomDirectorySearchClicked: () -> Unit, modifier: Modifier = Modifier, ) { BackHandler(enabled = state.isSearchActive) { @@ -87,6 +92,7 @@ internal fun RoomListSearchView( state = state, onRoomClicked = onRoomClicked, onRoomLongClicked = onRoomLongClicked, + onRoomDirectorySearchClicked = onRoomDirectorySearchClicked, ) } } @@ -99,6 +105,7 @@ private fun RoomListSearchContent( state: RoomListSearchState, onRoomClicked: (RoomId) -> Unit, onRoomLongClicked: (RoomListRoomSummary) -> Unit, + onRoomDirectorySearchClicked: () -> Unit, ) { val borderColor = MaterialTheme.colorScheme.tertiary val strokeWidth = 1.dp @@ -169,6 +176,14 @@ private fun RoomListSearchContent( .padding(padding) .consumeWindowInsets(padding) ) { + if(state.query.isEmpty()){ + RoomDirectorySearchButton( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 24.dp, horizontal = 16.dp), + onClick = onRoomDirectorySearchClicked + ) + } LazyColumn( modifier = Modifier.weight(1f), ) { @@ -187,12 +202,26 @@ private fun RoomListSearchContent( } } +@Composable +private fun RoomDirectorySearchButton( + onClick: () -> Unit, + modifier: Modifier = Modifier +) { + Button( + text = "Room directory", + leadingIcon = IconSource.Vector(CompoundIcons.ListBulleted()), + onClick = onClick, + modifier = modifier, + ) +} + @PreviewsDayNight @Composable internal fun RoomListSearchResultContentPreview(@PreviewParameter(RoomListSearchStateProvider::class) state: RoomListSearchState) = ElementPreview { RoomListSearchContent( state = state, onRoomClicked = {}, - onRoomLongClicked = {} + onRoomLongClicked = {}, + onRoomDirectorySearchClicked = {}, ) }