From c78acfda33d9deee32860926393e6195f12c1983 Mon Sep 17 00:00:00 2001
From: JRoberts <8711996+jr-simplex@users.noreply.github.com>
Date: Fri, 4 Nov 2022 15:33:29 +0400
Subject: [PATCH] mobile: group link ux on joining side (#1294)
---
.../java/chat/simplex/app/model/ChatModel.kt | 8 +++--
.../java/chat/simplex/app/model/SimpleXAPI.kt | 6 ++--
.../newchat/ContactConnectionInfoView.kt | 29 +++++++------------
.../app/src/main/res/values-de/strings.xml | 22 +++++++-------
.../app/src/main/res/values-ru/strings.xml | 2 ++
.../app/src/main/res/values/strings.xml | 2 ++
apps/ios/Shared/Model/SimpleXAPI.swift | 6 ++--
.../ChatList/ContactConnectionInfo.swift | 24 ++++++++-------
apps/ios/SimpleXChat/ChatTypes.swift | 15 ++++++++--
9 files changed, 66 insertions(+), 48 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 37906db46b..cee7e368ea 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
@@ -919,6 +919,7 @@ class PendingContactConnection(
val pccAgentConnId: String,
val pccConnStatus: ConnStatus,
val viaContactUri: Boolean,
+ val groupLinkId: String? = null,
val customUserProfileId: Long? = null,
val connReqInv: String? = null,
override val localAlias: String,
@@ -957,8 +958,11 @@ class PendingContactConnection(
return if (initiated == null) "" else generalGetString(
if (initiated && !viaContactUri)
if (incognito) R.string.description_you_shared_one_time_link_incognito else R.string.description_you_shared_one_time_link
- else if (viaContactUri )
- if (incognito) R.string.description_via_contact_address_link_incognito else R.string.description_via_contact_address_link
+ else if (viaContactUri)
+ if (groupLinkId != null)
+ if (incognito) R.string.description_via_group_link_incognito else R.string.description_via_group_link
+ else
+ if (incognito) R.string.description_via_contact_address_link_incognito else R.string.description_via_contact_address_link
else
if (incognito) R.string.description_via_one_time_link_incognito else R.string.description_via_one_time_link
)
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 970061df84..2a4a003608 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
@@ -952,11 +952,11 @@ open class ChatController(var ctrl: ChatCtrl?, val ntfManager: NtfManager, val a
is CR.ContactConnected -> {
if (!r.contact.viaGroupLink) {
chatModel.updateContact(r.contact)
- chatModel.dismissConnReqView(r.contact.activeConn.id)
- chatModel.removeChat(r.contact.activeConn.id)
chatModel.updateNetworkStatus(r.contact.id, Chat.NetworkStatus.Connected())
ntfManager.notifyContactConnected(r.contact)
}
+ chatModel.dismissConnReqView(r.contact.activeConn.id)
+ chatModel.removeChat(r.contact.activeConn.id)
}
is CR.ContactConnecting -> {
if (!r.contact.viaGroupLink) {
@@ -1038,6 +1038,8 @@ open class ChatController(var ctrl: ChatCtrl?, val ntfManager: NtfManager, val a
chatModel.addChat(Chat(chatInfo = ChatInfo.Group(r.groupInfo), chatItems = listOf()))
// TODO NtfManager.shared.notifyGroupInvitation
}
+ is CR.UserAcceptedGroupSent ->
+ chatModel.updateGroup(r.groupInfo)
is CR.JoinedGroupMemberConnecting ->
chatModel.upsertGroupMember(r.groupInfo, r.member)
is CR.DeletedMemberUser -> // TODO update user member
diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/newchat/ContactConnectionInfoView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/newchat/ContactConnectionInfoView.kt
index dd6ec2b590..f68287ff92 100644
--- a/apps/android/app/src/main/java/chat/simplex/app/views/newchat/ContactConnectionInfoView.kt
+++ b/apps/android/app/src/main/java/chat/simplex/app/views/newchat/ContactConnectionInfoView.kt
@@ -46,10 +46,7 @@ fun ContactConnectionInfoView(
}
ContactConnectionInfoLayout(
connReq = connReqInvitation,
- contactConnection.localAlias,
- contactConnection.initiated,
- contactConnection.viaContactUri,
- contactConnection.incognito,
+ contactConnection,
focusAlias,
deleteConnection = { deleteContactConnectionAlert(contactConnection, chatModel, close) },
onLocalAliasChanged = { setContactAlias(contactConnection, it, chatModel) },
@@ -71,10 +68,7 @@ fun ContactConnectionInfoView(
@Composable
private fun ContactConnectionInfoLayout(
connReq: String?,
- localAlias: String,
- connectionInitiated: Boolean,
- connectionViaContactUri: Boolean,
- connectionIncognito: Boolean,
+ contactConnection: PendingContactConnection,
focusAlias: Boolean,
deleteConnection: () -> Unit,
onLocalAliasChanged: (String) -> Unit,
@@ -86,23 +80,25 @@ private fun ContactConnectionInfoLayout(
) {
AppBarTitle(
stringResource(
- if (connectionInitiated) R.string.you_invited_your_contact
+ if (contactConnection.initiated) R.string.you_invited_your_contact
else R.string.you_accepted_connection
)
)
- Row(Modifier.padding(bottom = DEFAULT_PADDING)) {
- LocalAliasEditor(localAlias, center = false, leadingIcon = true, focus = focusAlias, updateValue = onLocalAliasChanged)
+ if (contactConnection.groupLinkId == null) {
+ Row(Modifier.padding(bottom = DEFAULT_PADDING)) {
+ LocalAliasEditor(contactConnection.localAlias, center = false, leadingIcon = true, focus = focusAlias, updateValue = onLocalAliasChanged)
+ }
}
Text(
stringResource(
- if (connectionViaContactUri) R.string.you_will_be_connected_when_your_connection_request_is_accepted
+ if (contactConnection.viaContactUri) R.string.you_will_be_connected_when_your_connection_request_is_accepted
else R.string.you_will_be_connected_when_your_contacts_device_is_online
),
Modifier.padding(start = DEFAULT_PADDING, end = DEFAULT_PADDING, bottom = DEFAULT_PADDING)
)
SectionView {
- if (!connReq.isNullOrEmpty() && connectionInitiated) {
- ShowQrButton(connectionIncognito, showQr)
+ if (!connReq.isNullOrEmpty() && contactConnection.initiated) {
+ ShowQrButton(contactConnection.incognito, showQr)
SectionDivider()
}
DeleteButton(deleteConnection)
@@ -148,11 +144,8 @@ private fun setContactAlias(contactConnection: PendingContactConnection, localAl
private fun PreviewContactConnectionInfoView() {
SimpleXTheme {
ContactConnectionInfoLayout(
- localAlias = "",
connReq = "https://simplex.chat/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23MCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%3D",
- connectionInitiated = true,
- connectionViaContactUri = true,
- connectionIncognito = false,
+ PendingContactConnection.getSampleData(),
focusAlias = false,
deleteConnection = {},
onLocalAliasChanged = {},
diff --git a/apps/android/app/src/main/res/values-de/strings.xml b/apps/android/app/src/main/res/values-de/strings.xml
index 5f2ac9dece..d52ed1bcb6 100644
--- a/apps/android/app/src/main/res/values-de/strings.xml
+++ b/apps/android/app/src/main/res/values-de/strings.xml
@@ -26,16 +26,18 @@
Unzulässiges Nachrichtenformat
- Verbindung %1$d
- Verbindung hergestellt
- Für eine Verbindung eingeladen
- verbinde …
- Sie haben einen Einmal-Link geteilt
- Sie haben Inkognito einen Einmal-Link geteilt
- Über einen Kontaktadressen Link
- Inkognito über einen Kontaktadressen Link
- Über einen Einmal-Link
- Inkognito über einen Einmal-Link
+ verbindung %1$d
+ verbindung hergestellt
+ für eine Verbindung eingeladen
+ verbinde…
+ sie haben einen Einmal-Link geteilt
+ sie haben Inkognito einen Einmal-Link geteilt
+ ***via group link
+ ***incognito via group link
+ über einen Kontaktadressen Link
+ inkognito über einen Kontaktadressen Link
+ über einen Einmal-Link
+ inkognito über einen Einmal-Link
Fehler beim Speichern der SMP-Server
diff --git a/apps/android/app/src/main/res/values-ru/strings.xml b/apps/android/app/src/main/res/values-ru/strings.xml
index 3578758694..b74bc6c110 100644
--- a/apps/android/app/src/main/res/values-ru/strings.xml
+++ b/apps/android/app/src/main/res/values-ru/strings.xml
@@ -32,6 +32,8 @@
соединяется…
вы создали одноразовую ссылку
вы создали одноразовую ссылку инкогнито
+ через ссылку группы
+ инкогнито через ссылку группы
через ссылку-контакт
инкогнито через ссылку-контакт
через одноразовую ссылку
diff --git a/apps/android/app/src/main/res/values/strings.xml b/apps/android/app/src/main/res/values/strings.xml
index ef21cc670e..45c8a61a7d 100644
--- a/apps/android/app/src/main/res/values/strings.xml
+++ b/apps/android/app/src/main/res/values/strings.xml
@@ -32,6 +32,8 @@
connecting…
you shared one-time link
you shared one-time link incognito
+ via group link
+ incognito via group link
via contact address link
incognito via contact address link
via one-time link
diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift
index 7077141aa1..ce53f60fbb 100644
--- a/apps/ios/Shared/Model/SimpleXAPI.swift
+++ b/apps/ios/Shared/Model/SimpleXAPI.swift
@@ -893,11 +893,11 @@ func processReceivedMsg(_ res: ChatResponse) async {
case let .contactConnected(contact, _):
if !contact.viaGroupLink {
m.updateContact(contact)
- m.dismissConnReqView(contact.activeConn.id)
- m.removeChat(contact.activeConn.id)
m.updateNetworkStatus(contact.id, .connected)
NtfManager.shared.notifyContactConnected(contact)
}
+ m.dismissConnReqView(contact.activeConn.id)
+ m.removeChat(contact.activeConn.id)
case let .contactConnecting(contact):
if !contact.viaGroupLink {
m.updateContact(contact)
@@ -991,6 +991,8 @@ func processReceivedMsg(_ res: ChatResponse) async {
chatItems: []
))
// NtfManager.shared.notifyContactRequest(contactRequest) // TODO notifyGroupInvitation?
+ case let .userAcceptedGroupSent(groupInfo):
+ m.updateGroup(groupInfo)
case let .joinedGroupMemberConnecting(groupInfo, _, member):
_ = m.upsertGroupMember(groupInfo, member)
case let .deletedMemberUser(groupInfo, _): // TODO update user member
diff --git a/apps/ios/Shared/Views/ChatList/ContactConnectionInfo.swift b/apps/ios/Shared/Views/ChatList/ContactConnectionInfo.swift
index 669e483ec8..bf311b1719 100644
--- a/apps/ios/Shared/Views/ChatList/ContactConnectionInfo.swift
+++ b/apps/ios/Shared/Views/ChatList/ContactConnectionInfo.swift
@@ -46,17 +46,19 @@ struct ContactConnectionInfo: View {
.onTapGesture { aliasTextFieldFocused = false }
Section {
- HStack(spacing: 20) {
- Image(systemName: "pencil")
- .foregroundColor(.secondary)
- .padding(.leading, 6)
- .onTapGesture { aliasTextFieldFocused = true }
- TextField("Set contact name…", text: $localAlias)
- .autocapitalization(.none)
- .autocorrectionDisabled(true)
- .focused($aliasTextFieldFocused)
- .submitLabel(.done)
- .onSubmit(setConnectionAlias)
+ if contactConnection.groupLinkId == nil {
+ HStack(spacing: 20) {
+ Image(systemName: "pencil")
+ .foregroundColor(.secondary)
+ .padding(.leading, 6)
+ .onTapGesture { aliasTextFieldFocused = true }
+ TextField("Set contact name…", text: $localAlias)
+ .autocapitalization(.none)
+ .autocorrectionDisabled(true)
+ .focused($aliasTextFieldFocused)
+ .submitLabel(.done)
+ .onSubmit(setConnectionAlias)
+ }
}
if contactConnection.initiated,
diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift
index 9db33c4b42..8745c4f6c8 100644
--- a/apps/ios/SimpleXChat/ChatTypes.swift
+++ b/apps/ios/SimpleXChat/ChatTypes.swift
@@ -433,6 +433,7 @@ public struct PendingContactConnection: Decodable, NamedChat {
var pccAgentConnId: String
var pccConnStatus: ConnStatus
public var viaContactUri: Bool
+ public var groupLinkId: String?
public var customUserProfileId: Int64?
public var connReqInv: String?
public var localAlias: String
@@ -477,10 +478,18 @@ public struct PendingContactConnection: Decodable, NamedChat {
desc = NSLocalizedString("you shared one-time link", comment: "chat list item description")
}
} else if viaContactUri {
- if incognito {
- desc = NSLocalizedString("incognito via contact address link", comment: "chat list item description")
+ if groupLinkId != nil {
+ if incognito {
+ desc = NSLocalizedString("incognito via group link", comment: "chat list item description")
+ } else {
+ desc = NSLocalizedString("via group link", comment: "chat list item description")
+ }
} else {
- desc = NSLocalizedString("via contact address link", comment: "chat list item description")
+ if incognito {
+ desc = NSLocalizedString("incognito via contact address link", comment: "chat list item description")
+ } else {
+ desc = NSLocalizedString("via contact address link", comment: "chat list item description")
+ }
}
} else {
if incognito {