From 0ad3bc9993e9b4a5ca95ababe35dc99fff1b911e Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Wed, 7 Dec 2022 19:07:31 +0400 Subject: [PATCH] android: show open direct chat button for direct contacts (#1521) --- .../java/chat/simplex/app/model/ChatModel.kt | 11 ++--- .../java/chat/simplex/app/model/SimpleXAPI.kt | 4 +- .../views/chat/group/GroupMemberInfoView.kt | 47 +++++++++++++------ 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt b/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt index 87a15394c..aa8bc0f63 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt @@ -101,7 +101,7 @@ class ChatModel(val controller: ChatController) { fun updateContactConnection(contactConnection: PendingContactConnection) = updateChat(ChatInfo.ContactConnection(contactConnection)) - fun updateContact(contact: Contact) = updateChat(ChatInfo.Direct(contact), addMissing = !contact.isIndirectContact && !contact.viaGroupLink) + fun updateContact(contact: Contact) = updateChat(ChatInfo.Direct(contact), addMissing = contact.directContact) fun updateGroup(groupInfo: GroupInfo) = updateChat(ChatInfo.Group(groupInfo)) @@ -551,6 +551,7 @@ data class Contact( val profile: LocalProfile, val activeConn: Connection, val viaGroup: Long? = null, + val contactUsed: Boolean, val chatSettings: ChatSettings, val userPreferences: ChatPreferences, val mergedPreferences: ContactUserPreferences, @@ -571,11 +572,8 @@ data class Contact( override val image get() = profile.image override val localAlias get() = profile.localAlias - val isIndirectContact: Boolean get() = - activeConn.connLevel > 0 || viaGroup != null - - val viaGroupLink: Boolean get() = - activeConn.viaGroupLink + val directContact: Boolean get() = + (activeConn.connLevel == 0 && !activeConn.viaGroupLink) || contactUsed val contactConnIncognito = activeConn.customUserProfileId != null @@ -586,6 +584,7 @@ data class Contact( localDisplayName = "alice", profile = LocalProfile.sampleData, activeConn = Connection.sampleData, + contactUsed = true, chatSettings = ChatSettings(true), userPreferences = ChatPreferences.sampleData, mergedPreferences = ContactUserPreferences.sampleData, diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt index 35cc77f5a..e1274c000 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt @@ -993,7 +993,7 @@ open class ChatController(var ctrl: ChatCtrl?, val ntfManager: NtfManager, val a chatModel.removeChat(r.connection.id) } is CR.ContactConnected -> { - if (!r.contact.viaGroupLink) { + if (r.contact.directContact) { chatModel.updateContact(r.contact) chatModel.dismissConnReqView(r.contact.activeConn.id) chatModel.removeChat(r.contact.activeConn.id) @@ -1002,7 +1002,7 @@ open class ChatController(var ctrl: ChatCtrl?, val ntfManager: NtfManager, val a } } is CR.ContactConnecting -> { - if (!r.contact.viaGroupLink) { + if (r.contact.directContact) { chatModel.updateContact(r.contact) chatModel.dismissConnReqView(r.contact.activeConn.id) chatModel.removeChat(r.contact.activeConn.id) diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chat/group/GroupMemberInfoView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chat/group/GroupMemberInfoView.kt index b97ca1ff6..0fe15b084 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/chat/group/GroupMemberInfoView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/chat/group/GroupMemberInfoView.kt @@ -49,20 +49,26 @@ fun GroupMemberInfoView( connStats, newRole, developerTools, - openDirectChat = { + getContactChat = { chatModel.getContactChat(it) }, + knownDirectChat = { withApi { - val oldChat = chatModel.getContactChat(member.memberContactId ?: return@withApi) - if (oldChat != null) { - openChat(oldChat.chatInfo, chatModel) - } else { - var newChat = chatModel.controller.apiGetChat(ChatType.Direct, member.memberContactId) ?: return@withApi + chatModel.chatItems.clear() + chatModel.chatItems.addAll(it.chatItems) + chatModel.chatId.value = it.chatInfo.id + closeAll() + } + }, + newDirectChat = { + withApi { + val c = chatModel.controller.apiGetChat(ChatType.Direct, it) + if (c != null) { // TODO it's not correct to blindly set network status to connected - we should manage network status in model / backend - newChat = newChat.copy(serverInfo = Chat.ServerInfo(networkStatus = Chat.NetworkStatus.Connected())) + val newChat = c.copy(serverInfo = Chat.ServerInfo(networkStatus = Chat.NetworkStatus.Connected())) chatModel.addChat(newChat) chatModel.chatItems.clear() chatModel.chatId.value = newChat.id + closeAll() } - closeAll() } }, removeMember = { removeMemberDialog(groupInfo, member, chatModel, close) }, @@ -114,7 +120,9 @@ fun GroupMemberInfoLayout( connStats: ConnectionStats?, newRole: MutableState, developerTools: Boolean, - openDirectChat: () -> Unit, + getContactChat: (Long) -> Chat?, + knownDirectChat: (Chat) -> Unit, + newDirectChat: (Long) -> Unit, removeMember: () -> Unit, onRoleSelected: (GroupMemberRole) -> Unit, switchMemberAddress: () -> Unit, @@ -133,11 +141,20 @@ fun GroupMemberInfoLayout( } SectionSpacer() - if (member.memberContactId != null && groupInfo.fullGroupPreferences.directMessages.enable == GroupFeatureEnabled.ON) { - SectionView { - OpenChatButton(openDirectChat) + val contactId = member.memberContactId + if (contactId != null) { + val chat = getContactChat(contactId) + if (chat != null && chat.chatInfo is ChatInfo.Direct && chat.chatInfo.contact.directContact) { + SectionView { + OpenChatButton(onClick = { knownDirectChat(chat) }) + } + SectionSpacer() + } else if (groupInfo.fullGroupPreferences.directMessages.on) { + SectionView { + OpenChatButton(onClick = { newDirectChat(contactId) }) + } + SectionSpacer() } - SectionSpacer() } SectionView(title = stringResource(R.string.member_info_section_title_member)) { @@ -302,7 +319,9 @@ fun PreviewGroupMemberInfoLayout() { connStats = null, newRole = remember { mutableStateOf(GroupMemberRole.Member) }, developerTools = false, - openDirectChat = {}, + getContactChat = { Chat.sampleData }, + knownDirectChat = {}, + newDirectChat = {}, removeMember = {}, onRoleSelected = {}, switchMemberAddress = {},