From 32e7fd72d37cf0615180feddf12cb2807825f4f9 Mon Sep 17 00:00:00 2001 From: Stanislav Dmitrenko <7953703+avently@users.noreply.github.com> Date: Tue, 13 Aug 2024 18:15:54 +0000 Subject: [PATCH] android, desktop: searching in different screens using the same data (#4673) * android, desktop: searching in different screens using the same data * don't filter if not needed --- .../chat/simplex/common/model/ChatModel.kt | 17 ++++++++++++----- .../views/chat/group/AddGroupMembersView.kt | 3 ++- .../views/chat/group/GroupChatInfoView.kt | 7 ++++++- .../common/views/chatlist/ChatListView.kt | 17 ++++++----------- .../common/views/chatlist/ShareListView.kt | 8 ++------ .../common/views/newchat/NewChatSheet.kt | 7 +------ .../views/usersettings/UserProfilesView.kt | 2 +- 7 files changed, 30 insertions(+), 31 deletions(-) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index 927fa4d543..628481477d 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -884,6 +884,11 @@ interface NamedChat { val localAlias: String val chatViewName: String get() = localAlias.ifEmpty { displayName + (if (fullName == "" || fullName == displayName) "" else " / $fullName") } + + fun anyNameContains(searchAnyCase: String): Boolean { + val s = searchAnyCase.trim().lowercase() + return chatViewName.lowercase().contains(s) || displayName.lowercase().contains(s) || fullName.lowercase().contains(s) + } } interface SomeChat { @@ -1487,21 +1492,23 @@ data class GroupMember ( val memberContactId: Long? = null, val memberContactProfileId: Long, var activeConn: Connection? = null -) { +): NamedChat { val id: String get() = "#$groupId @$groupMemberId" - val displayName: String + override val displayName: String get() { val p = memberProfile val name = p.localAlias.ifEmpty { p.displayName } return pastMember(name) } - val fullName: String get() = memberProfile.fullName - val image: String? get() = memberProfile.image + override val fullName: String get() = memberProfile.fullName + override val image: String? get() = memberProfile.image val contactLink: String? = memberProfile.contactLink val verified get() = activeConn?.connectionCode != null val blocked get() = blockedByAdmin || !memberSettings.showMessages - val chatViewName: String + override val localAlias: String = memberProfile.localAlias + + override val chatViewName: String get() { val p = memberProfile val name = p.localAlias.ifEmpty { p.displayName + (if (p.fullName == "" || p.fullName == p.displayName) "" else " / ${p.fullName}") } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/AddGroupMembersView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/AddGroupMembersView.kt index 42fbec35cd..a7562ff3b5 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/AddGroupMembersView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/AddGroupMembersView.kt @@ -89,7 +89,8 @@ fun getContactsToAdd(chatModel: ChatModel, search: String): List { .map { it.chatInfo } .filterIsInstance() .map { it.contact } - .filter { c -> c.sendMsgEnabled && !c.nextSendGrpInv && c.contactId !in memberContactIds && c.chatViewName.lowercase().contains(s) } + .filter { c -> c.sendMsgEnabled && !c.nextSendGrpInv && c.contactId !in memberContactIds && c.anyNameContains(s) + } .sortedBy { it.displayName.lowercase() } .toList() } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt index 97b6cb91a7..6e39e8756e 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt @@ -278,7 +278,12 @@ fun GroupChatInfoLayout( scope.launch { listState.scrollToItem(0) } } val searchText = rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue()) } - val filteredMembers = remember(members) { derivedStateOf { members.filter { it.chatViewName.lowercase().contains(searchText.value.text.trim().lowercase()) } } } + val filteredMembers = remember(members) { + derivedStateOf { + val s = searchText.value.text.trim().lowercase() + if (s.isEmpty()) members else members.filter { m -> m.anyNameContains(s) } + } + } // LALAL strange scrolling LazyColumnWithScrollBar( Modifier diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt index 5862c73a4d..b1c353d420 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt @@ -701,7 +701,7 @@ private fun ChatList(chatModel: ChatModel, searchText: MutableState, searchChatFilteredBySimplexLink: State, @@ -722,18 +722,16 @@ private fun filteredChats( if (s.isEmpty()) { chat.id == chatModel.chatId.value || filtered(chat) } else { - (viewNameContains(cInfo, s) || - cInfo.contact.profile.displayName.lowercase().contains(s) || - cInfo.contact.fullName.lowercase().contains(s)) + cInfo.anyNameContains(s) }) is ChatInfo.Group -> if (s.isEmpty()) { chat.id == chatModel.chatId.value || filtered(chat) || cInfo.groupInfo.membership.memberStatus == GroupMemberStatus.MemInvited } else { - viewNameContains(cInfo, s) + cInfo.anyNameContains(s) } - is ChatInfo.Local -> s.isEmpty() || viewNameContains(cInfo, s) - is ChatInfo.ContactRequest -> s.isEmpty() || viewNameContains(cInfo, s) - is ChatInfo.ContactConnection -> (s.isNotEmpty() && cInfo.contactConnection.localAlias.lowercase().contains(s)) || (s.isEmpty() && chat.id == chatModel.chatId.value) + is ChatInfo.Local -> s.isEmpty() || cInfo.anyNameContains(s) + is ChatInfo.ContactRequest -> s.isEmpty() || cInfo.anyNameContains(s) + is ChatInfo.ContactConnection -> (s.isNotEmpty() && cInfo.anyNameContains(s)) || (s.isEmpty() && chat.id == chatModel.chatId.value) is ChatInfo.InvalidJSON -> chat.id == chatModel.chatId.value } } @@ -745,6 +743,3 @@ private fun filtered(chat: Chat): Boolean = (chat.chatInfo.chatSettings?.favorite ?: false) || chat.chatStats.unreadChat || (chat.chatInfo.ntfsEnabled && chat.chatStats.unreadCount > 0) - -private fun viewNameContains(cInfo: ChatInfo, s: String): Boolean = - cInfo.chatViewName.lowercase().contains(s.lowercase()) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt index 6dfac75126..cdf1766a25 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt @@ -203,12 +203,8 @@ private fun ShareList( val oneHandUI = remember { appPrefs.oneHandUI.state } val chats by remember(search) { derivedStateOf { - val sorted = chatModel.chats.value.toList().sortedByDescending { it.chatInfo is ChatInfo.Local } - if (search.isEmpty()) { - sorted.filter { it.chatInfo.ready } - } else { - sorted.filter { it.chatInfo.ready && it.chatInfo.chatViewName.lowercase().contains(search.lowercase()) } - } + val sorted = chatModel.chats.value.toList().filter { it.chatInfo.ready }.sortedByDescending { it.chatInfo is ChatInfo.Local } + filteredChats(false, mutableStateOf(false), mutableStateOf(null), search, sorted) } } LazyColumnWithScrollBar( diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt index 742a26a48e..759c090bc7 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt @@ -491,9 +491,7 @@ private fun filterChat(chat: Chat, searchText: String, showUnreadAndFavorites: B val cInfo = chat.chatInfo if (searchText.isNotEmpty()) { - meetsPredicate = viewNameContains(cInfo, s) || - if (cInfo is ChatInfo.Direct) (cInfo.contact.profile.displayName.lowercase().contains(s) || - cInfo.contact.fullName.lowercase().contains(s)) else false + meetsPredicate = cInfo.anyNameContains(s) } if (showUnreadAndFavorites) { @@ -503,9 +501,6 @@ private fun filterChat(chat: Chat, searchText: String, showUnreadAndFavorites: B return meetsPredicate } -private fun viewNameContains(cInfo: ChatInfo, s: String): Boolean = - cInfo.chatViewName.lowercase().contains(s.lowercase()) - private val chatsByTypeComparator = Comparator { chat1, chat2 -> val chat1Type = chatContactType(chat1) val chat2Type = chatContactType(chat2) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserProfilesView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserProfilesView.kt index 862fb052e1..78a7637a14 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserProfilesView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserProfilesView.kt @@ -307,7 +307,7 @@ private fun filteredUsers(m: ChatModel, searchTextOrPassword: String): List - if ((u.user.activeUser || !u.user.hidden) && (s == "" || u.user.chatViewName.lowercase().contains(lower))) { + if ((u.user.activeUser || !u.user.hidden) && (s == "" || u.user.anyNameContains(lower))) { true } else { correctPassword(u.user, s)