From 1d2d1e6df715769525c102e01e07bb71588067b4 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Fri, 25 Feb 2022 20:26:56 +0000 Subject: [PATCH] process subscription summaries in ios/android (#374) --- .../java/chat/simplex/app/model/ChatModel.kt | 14 +++++ .../java/chat/simplex/app/model/SimpleXAPI.kt | 53 ++++++++++++------- apps/ios/.gitignore | 2 + apps/ios/Shared/Model/ChatModel.swift | 10 ++++ apps/ios/Shared/Model/SimpleXAPI.swift | 42 +++++++++++---- .../MyPlayground.playground/Contents.swift | 32 ----------- .../contents.xcplayground | 4 -- .../timeline.xctimeline | 11 ---- cabal.project | 2 +- sha256map.nix | 2 +- stack.yaml | 2 +- 11 files changed, 97 insertions(+), 77 deletions(-) delete mode 100644 apps/ios/Shared/MyPlayground.playground/Contents.swift delete mode 100644 apps/ios/Shared/MyPlayground.playground/contents.xcplayground delete mode 100644 apps/ios/Shared/MyPlayground.playground/timeline.xctimeline 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 37bb174d68..89d3c2146b 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 @@ -9,10 +9,12 @@ import androidx.compose.ui.text.font.* import androidx.compose.ui.text.style.TextDecoration import chat.simplex.app.SimplexApp import chat.simplex.app.ui.theme.* +import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.datetime.* import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +@DelicateCoroutinesApi class ChatModel(val controller: ChatController, val alertManager: SimplexApp.AlertManager) { var currentUser = mutableStateOf(null) var userCreated = mutableStateOf(null) @@ -328,6 +330,12 @@ class Contact( } } +@Serializable +class ContactSubStatus( + val contact: Contact, + val contactError: ChatError? = null +) + @Serializable class Connection(val connStatus: String) { companion object { @@ -409,6 +417,12 @@ class GroupMember ( } } +@Serializable +class MemberSubError ( + val member: GroupMember, + val memberError: ChatError +) + @Serializable class UserContactRequest ( val contactRequestId: Long, 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 a3380eb861..c8f09cfe90 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 @@ -243,28 +243,18 @@ open class ChatController(val ctrl: ChatCtrl, val alertManager: SimplexApp.Alert chatModel.updateChatInfo(cInfo) } } - is CR.ContactSubscribed -> { - chatModel.updateContact(r.contact) - chatModel.updateNetworkStatus(r.contact, Chat.NetworkStatus.Connected()) - } + is CR.ContactSubscribed -> processContactSubscribed(r.contact) is CR.ContactDisconnected -> { chatModel.updateContact(r.contact) chatModel.updateNetworkStatus(r.contact, Chat.NetworkStatus.Disconnected()) } - is CR.ContactSubError -> { - chatModel.updateContact(r.contact) - val e = r.chatError - val err: String = - if (e is ChatError.ChatErrorAgent) { - val a = e.agentError - when { - a is AgentErrorType.BROKER && a.brokerErr is BrokerErrorType.NETWORK -> "network" - a is AgentErrorType.SMP && a.smpErr is SMPErrorType.AUTH -> "contact deleted" - else -> e.string - } - } - else e.string - chatModel.updateNetworkStatus(r.contact, Chat.NetworkStatus.Error(err)) + is CR.ContactSubError -> processContactSubError(r.contact, r.chatError) + is CR.ContactSubSummary -> { + for (sub in r.contactSubscriptions) { + val err = sub.contactError + if (err == null) processContactSubscribed(sub.contact) + else processContactSubError(sub.contact, sub.contactError) + } } is CR.NewChatItem -> { val cInfo = r.chatItem.chatInfo @@ -283,6 +273,27 @@ open class ChatController(val ctrl: ChatCtrl, val alertManager: SimplexApp.Alert // } } } + + fun processContactSubscribed(contact: Contact) { + chatModel.updateContact(contact) + chatModel.updateNetworkStatus(contact, Chat.NetworkStatus.Connected()) + } + + fun processContactSubError(contact: Contact, chatError: ChatError) { + chatModel.updateContact(contact) + val e = chatError + val err: String = + if (e is ChatError.ChatErrorAgent) { + val a = e.agentError + when { + a is AgentErrorType.BROKER && a.brokerErr is BrokerErrorType.NETWORK -> "network" + a is AgentErrorType.SMP && a.smpErr is SMPErrorType.AUTH -> "contact deleted" + else -> e.string + } + } + else e.string + chatModel.updateNetworkStatus(contact, Chat.NetworkStatus.Error(err)) + } } // ChatCommand @@ -403,7 +414,9 @@ sealed class CR { @Serializable @SerialName("contactSubscribed") class ContactSubscribed(val contact: Contact): CR() @Serializable @SerialName("contactDisconnected") class ContactDisconnected(val contact: Contact): CR() @Serializable @SerialName("contactSubError") class ContactSubError(val contact: Contact, val chatError: ChatError): CR() + @Serializable @SerialName("contactSubSummary") class ContactSubSummary(val contactSubscriptions: List): CR() @Serializable @SerialName("groupSubscribed") class GroupSubscribed(val group: GroupInfo): CR() + @Serializable @SerialName("memberSubErrors") class MemberSubErrors(val memberSubErrors: List): CR() @Serializable @SerialName("groupEmpty") class GroupEmpty(val group: GroupInfo): CR() @Serializable @SerialName("userContactLinkSubscribed") class UserContactLinkSubscribed: CR() @Serializable @SerialName("newChatItem") class NewChatItem(val chatItem: AChatItem): CR() @@ -437,7 +450,9 @@ sealed class CR { is ContactSubscribed -> "contactSubscribed" is ContactDisconnected -> "contactDisconnected" is ContactSubError -> "contactSubError" + is ContactSubSummary -> "contactSubSummary" is GroupSubscribed -> "groupSubscribed" + is MemberSubErrors -> "memberSubErrors" is GroupEmpty -> "groupEmpty" is UserContactLinkSubscribed -> "userContactLinkSubscribed" is NewChatItem -> "newChatItem" @@ -472,7 +487,9 @@ sealed class CR { is ContactSubscribed -> json.encodeToString(contact) is ContactDisconnected -> json.encodeToString(contact) is ContactSubError -> "error:\n${chatError.string}\ncontact:\n${json.encodeToString(contact)}" + is ContactSubSummary -> json.encodeToString(contactSubscriptions) is GroupSubscribed -> json.encodeToString(group) + is MemberSubErrors -> json.encodeToString(memberSubErrors) is GroupEmpty -> json.encodeToString(group) is UserContactLinkSubscribed -> noDetails() is NewChatItem -> json.encodeToString(chatItem) diff --git a/apps/ios/.gitignore b/apps/ios/.gitignore index 5137305d86..99ef9f7530 100644 --- a/apps/ios/.gitignore +++ b/apps/ios/.gitignore @@ -65,3 +65,5 @@ fastlane/test_output iOSInjectionProject/ Libraries/ + +Shared/MyPlayground.playground/* diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index f57f2fbbe1..c8d37b3b65 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -426,6 +426,11 @@ struct Contact: Identifiable, Decodable, NamedChat { ) } +struct ContactSubStatus: Decodable { + var contact: Contact + var contactError: ChatError? +} + struct Connection: Decodable { var connStatus: String @@ -503,6 +508,11 @@ struct GroupMember: Decodable { ) } +struct MemberSubError: Decodable { + var member: GroupMember + var memberError: ChatError +} + struct AChatItem: Decodable { var chatInfo: ChatInfo var chatItem: ChatItem diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index 170806424c..9fd56cb3c0 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -114,7 +114,9 @@ enum ChatResponse: Decodable, Error { case contactSubscribed(contact: Contact) case contactDisconnected(contact: Contact) case contactSubError(contact: Contact, chatError: ChatError) + case contactSubSummary(contactSubscriptions: [ContactSubStatus]) case groupSubscribed(groupInfo: GroupInfo) + case memberSubErrors(memberSubErrors: [MemberSubError]) case groupEmpty(groupInfo: GroupInfo) case userContactLinkSubscribed case newChatItem(chatItem: AChatItem) @@ -148,7 +150,9 @@ enum ChatResponse: Decodable, Error { case .contactSubscribed: return "contactSubscribed" case .contactDisconnected: return "contactDisconnected" case .contactSubError: return "contactSubError" + case .contactSubSummary: return "contactSubSummary" case .groupSubscribed: return "groupSubscribed" + case .memberSubErrors: return "memberSubErrors" case .groupEmpty: return "groupEmpty" case .userContactLinkSubscribed: return "userContactLinkSubscribed" case .newChatItem: return "newChatItem" @@ -185,7 +189,9 @@ enum ChatResponse: Decodable, Error { case let .contactSubscribed(contact): return String(describing: contact) case let .contactDisconnected(contact): return String(describing: contact) case let .contactSubError(contact, chatError): return "contact:\n\(String(describing: contact))\nerror:\n\(String(describing: chatError))" + case let .contactSubSummary(contactSubscriptions): return String(describing: contactSubscriptions) case let .groupSubscribed(groupInfo): return String(describing: groupInfo) + case let .memberSubErrors(memberSubErrors): return String(describing: memberSubErrors) case let .groupEmpty(groupInfo): return String(describing: groupInfo) case .userContactLinkSubscribed: return noDetails case let .newChatItem(chatItem): return String(describing: chatItem) @@ -475,20 +481,20 @@ func processReceivedMsg(_ res: ChatResponse) { chatModel.updateChatInfo(cInfo) } case let .contactSubscribed(contact): - chatModel.updateContact(contact) - chatModel.updateNetworkStatus(contact, .connected) + processContactSubscribed(contact) case let .contactDisconnected(contact): chatModel.updateContact(contact) chatModel.updateNetworkStatus(contact, .disconnected) case let .contactSubError(contact, chatError): - chatModel.updateContact(contact) - var err: String - switch chatError { - case .errorAgent(agentError: .BROKER(brokerErr: .NETWORK)): err = "network" - case .errorAgent(agentError: .SMP(smpErr: .AUTH)): err = "contact deleted" - default: err = String(describing: chatError) + processContactSubError(contact, chatError) + case let .contactSubSummary(contactSubscriptions): + for sub in contactSubscriptions { + if let err = sub.contactError { + processContactSubError(sub.contact, err) + } else { + processContactSubscribed(sub.contact) + } } - chatModel.updateNetworkStatus(contact, .error(err)) case let .newChatItem(aChatItem): let cInfo = aChatItem.chatInfo let cItem = aChatItem.chatItem @@ -506,6 +512,24 @@ func processReceivedMsg(_ res: ChatResponse) { } } +func processContactSubscribed(_ contact: Contact) { + let m = ChatModel.shared + m.updateContact(contact) + m.updateNetworkStatus(contact, .connected) +} + +func processContactSubError(_ contact: Contact, _ chatError: ChatError) { + let m = ChatModel.shared + m.updateContact(contact) + var err: String + switch chatError { + case .errorAgent(agentError: .BROKER(brokerErr: .NETWORK)): err = "network" + case .errorAgent(agentError: .SMP(smpErr: .AUTH)): err = "contact deleted" + default: err = String(describing: chatError) + } + m.updateNetworkStatus(contact, .error(err)) +} + private struct UserResponse: Decodable { var user: User? var error: String? diff --git a/apps/ios/Shared/MyPlayground.playground/Contents.swift b/apps/ios/Shared/MyPlayground.playground/Contents.swift deleted file mode 100644 index eb0b6af432..0000000000 --- a/apps/ios/Shared/MyPlayground.playground/Contents.swift +++ /dev/null @@ -1,32 +0,0 @@ -import Foundation - -var greeting = "Hello, playground" - -let jsonEncoder = JSONEncoder() - -//jsonDecoder.decode(Test.self, from: "{\"name\":\"hello\",\"id\":1}".data(using: .utf8)!) - - -var a = [1, 2, 3] - -a.removeAll(where: { $0 == 1} ) - -print(a) - -let input = "This is a test with the привет 🙂 URL https://www.hackingwithswift.com to be detected." -let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) -let matches = detector.matches(in: input, options: [], range: NSRange(location: 0, length: input.count)) - -print(matches) - -for match in matches { - guard let range = Range(match.range, in: input) else { continue } - let url = input[range] - print(url) -} - -let r = try! NSRegularExpression(pattern: "^\\+?[0-9\\.\\(\\)\\-]{7,20}$") - -print(r.firstMatch(in: "+44(0)7448-736-790", options: [], range: NSRange(location: 0, length: "+44(0)7448-736-790".count)) == nil) - -let action: NtfAction? = NtfAction(rawValue: "NTF_ACT_ACCEPT") diff --git a/apps/ios/Shared/MyPlayground.playground/contents.xcplayground b/apps/ios/Shared/MyPlayground.playground/contents.xcplayground deleted file mode 100644 index cf026f2286..0000000000 --- a/apps/ios/Shared/MyPlayground.playground/contents.xcplayground +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/ios/Shared/MyPlayground.playground/timeline.xctimeline b/apps/ios/Shared/MyPlayground.playground/timeline.xctimeline deleted file mode 100644 index f62b952eff..0000000000 --- a/apps/ios/Shared/MyPlayground.playground/timeline.xctimeline +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - diff --git a/cabal.project b/cabal.project index ef06aecb91..0ae6c0efd7 100644 --- a/cabal.project +++ b/cabal.project @@ -3,7 +3,7 @@ packages: . source-repository-package type: git location: git://github.com/simplex-chat/simplexmq.git - tag: 7d1fdadef0541e0587d4966bc95c2930bf0f95ff + tag: d1e6147adfbd46f5e3e996cc6365d8f3f0f7669c source-repository-package type: git diff --git a/sha256map.nix b/sha256map.nix index dfa6a93e5d..8b428b97eb 100644 --- a/sha256map.nix +++ b/sha256map.nix @@ -1,5 +1,5 @@ { - "git://github.com/simplex-chat/simplexmq.git"."7d1fdadef0541e0587d4966bc95c2930bf0f95ff" = "1hzyswxjpilkdalyr9i5swi2djlv3wf8nwfv7k06m5ajmi1zb4i3"; + "git://github.com/simplex-chat/simplexmq.git"."d1e6147adfbd46f5e3e996cc6365d8f3f0f7669c" = "11wny0ivhrrp36757i074ml18k6nv7hq6a5dvv4rg3npqf19y3r7"; "git://github.com/simplex-chat/aeson.git"."3eb66f9a68f103b5f1489382aad89f5712a64db7" = "0kilkx59fl6c3qy3kjczqvm8c3f4n3p0bdk9biyflf51ljnzp4yp"; "git://github.com/simplex-chat/haskell-terminal.git"."f708b00009b54890172068f168bf98508ffcd495" = "0zmq7lmfsk8m340g47g5963yba7i88n4afa6z93sg9px5jv1mijj"; "git://github.com/zw3rk/android-support.git"."3c3a5ab0b8b137a072c98d3d0937cbdc96918ddb" = "1r6jyxbim3dsvrmakqfyxbd6ms6miaghpbwyl0sr6dzwpgaprz97"; diff --git a/stack.yaml b/stack.yaml index 4c86f489fb..131d1766de 100644 --- a/stack.yaml +++ b/stack.yaml @@ -48,7 +48,7 @@ extra-deps: # - simplexmq-1.0.0@sha256:34b2004728ae396e3ae449cd090ba7410781e2b3cefc59259915f4ca5daa9ea8,8561 # - ../simplexmq - github: simplex-chat/simplexmq - commit: 7d1fdadef0541e0587d4966bc95c2930bf0f95ff + commit: d1e6147adfbd46f5e3e996cc6365d8f3f0f7669c # - terminal-0.2.0.0@sha256:de6770ecaae3197c66ac1f0db5a80cf5a5b1d3b64a66a05b50f442de5ad39570,2977 - github: simplex-chat/aeson commit: 3eb66f9a68f103b5f1489382aad89f5712a64db7