From f512298d10f6f01126f1edd90a62cbf105eae314 Mon Sep 17 00:00:00 2001 From: Stanislav Dmitrenko <7953703+avently@users.noreply.github.com> Date: Mon, 5 Sep 2022 17:22:28 +0300 Subject: [PATCH] Search in a list of chats (#1009) Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> --- .../app/views/chatlist/ChatListView.kt | 89 ++++++++++++------- 1 file changed, 56 insertions(+), 33 deletions(-) diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatListView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatListView.kt index 1698cd2ca6..7ea1ce4df6 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatListView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatListView.kt @@ -1,5 +1,6 @@ package chat.simplex.app.views.chatlist +import androidx.activity.compose.BackHandler import androidx.compose.foundation.* import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn @@ -7,18 +8,20 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.* import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Report -import androidx.compose.material.icons.filled.TheaterComedy +import androidx.compose.material.icons.filled.* import androidx.compose.material.icons.outlined.* import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.unit.dp import chat.simplex.app.R -import chat.simplex.app.model.ChatModel +import chat.simplex.app.model.* import chat.simplex.app.ui.theme.Indigo import chat.simplex.app.views.helpers.* import chat.simplex.app.views.newchat.NewChatSheet @@ -70,8 +73,9 @@ fun ChatListView(chatModel: ChatModel, setPerformLA: (Boolean) -> Unit, stopped: LaunchedEffect(chatModel.clearOverlays.value) { if (chatModel.clearOverlays.value && scaffoldCtrl.expanded.value) scaffoldCtrl.collapse() } + var searchInList by rememberSaveable { mutableStateOf("") } BottomSheetScaffold( - topBar = { ChatListToolbar(chatModel, scaffoldCtrl, stopped) }, + topBar = { ChatListToolbar(chatModel, scaffoldCtrl, stopped) { searchInList = it.trim() } }, scaffoldState = scaffoldCtrl.state, drawerContent = { SettingsView(chatModel, setPerformLA) }, sheetPeekHeight = 0.dp, @@ -85,7 +89,7 @@ fun ChatListView(chatModel: ChatModel, setPerformLA: (Boolean) -> Unit, stopped: .background(MaterialTheme.colors.background) ) { if (chatModel.chats.isNotEmpty()) { - ChatList(chatModel) + ChatList(chatModel, search = searchInList) } else { MakeConnection(chatModel) } @@ -103,9 +107,45 @@ fun ChatListView(chatModel: ChatModel, setPerformLA: (Boolean) -> Unit, stopped: } @Composable -fun ChatListToolbar(chatModel: ChatModel, scaffoldCtrl: ScaffoldController, stopped: Boolean) { +fun ChatListToolbar(chatModel: ChatModel, scaffoldCtrl: ScaffoldController, stopped: Boolean, onSearchValueChanged: (String) -> Unit) { + var showSearch by rememberSaveable { mutableStateOf(false) } + val hideSearchOnBack = { onSearchValueChanged(""); showSearch = false } + if (showSearch) { + BackHandler(onBack = hideSearchOnBack) + } + val barButtons = arrayListOf<@Composable RowScope.() -> Unit>() + if (chatModel.chats.size >= 8) { + barButtons.add { + IconButton({ showSearch = true }) { + Icon(Icons.Outlined.Search, stringResource(android.R.string.search_go).capitalize(Locale.current), tint = MaterialTheme.colors.primary) + } + } + } + if (!stopped) { + barButtons.add { + IconButton(onClick = { scaffoldCtrl.toggleSheet() }) { + Icon( + Icons.Outlined.AddCircle, + stringResource(R.string.add_contact), + tint = MaterialTheme.colors.primary, + ) + } + } + } else { + barButtons.add { + IconButton(onClick = { AlertManager.shared.showAlertMsg(generalGetString(R.string.chat_is_stopped_indication), + generalGetString(R.string.you_can_start_chat_via_setting_or_by_restarting_the_app)) }) { + Icon( + Icons.Filled.Report, + generalGetString(R.string.chat_is_stopped_indication), + tint = Color.Red, + ) + } + } + } + DefaultTopAppBar( - navigationButton = { NavigationButtonMenu { scaffoldCtrl.toggleDrawer() } }, + navigationButton = { if (showSearch) NavigationButtonBack(hideSearchOnBack) else NavigationButtonMenu { scaffoldCtrl.toggleDrawer() } }, title = { Row(verticalAlignment = Alignment.CenterVertically) { Text( @@ -124,40 +164,23 @@ fun ChatListToolbar(chatModel: ChatModel, scaffoldCtrl: ScaffoldController, stop } }, onTitleClick = null, - showSearch = false, - onSearchValueChanged = {}, - buttons = listOf{ - if (!stopped) { - IconButton(onClick = { scaffoldCtrl.toggleSheet() }) { - Icon( - Icons.Outlined.AddCircle, - stringResource(R.string.add_contact), - tint = MaterialTheme.colors.primary, - modifier = Modifier.padding(10.dp).size(26.dp) - ) - } - } else { - IconButton(onClick = { AlertManager.shared.showAlertMsg(generalGetString(R.string.chat_is_stopped_indication), - generalGetString(R.string.you_can_start_chat_via_setting_or_by_restarting_the_app)) }) { - Icon( - Icons.Filled.Report, - generalGetString(R.string.chat_is_stopped_indication), - tint = Color.Red, - modifier = Modifier.padding(10.dp) - ) - } - } - } + showSearch = showSearch, + onSearchValueChanged = onSearchValueChanged, + buttons = barButtons ) Divider() } @Composable -fun ChatList(chatModel: ChatModel) { +fun ChatList(chatModel: ChatModel, search: String) { + val filter: (Chat) -> Boolean = { chat: Chat -> + chat.chatInfo.chatViewName.lowercase().contains(search.lowercase()) + } + val chats by remember(search) { derivedStateOf { if (search.isEmpty()) chatModel.chats else chatModel.chats.filter(filter) } } LazyColumn( modifier = Modifier.fillMaxWidth() ) { - items(chatModel.chats) { chat -> + items(chats) { chat -> ChatListNavLinkView(chat, chatModel) } }