From 62a2f61751fecf06c51bc0f1d89ced3d528ca8eb Mon Sep 17 00:00:00 2001 From: Stanislav Dmitrenko <7953703+avently@users.noreply.github.com> Date: Wed, 11 Jan 2023 16:41:34 +0000 Subject: [PATCH 1/7] android: Fix non-unique chat item id in listState (#1723) * android: Fix non-unique chat item id in listState * Test * Revert "Test" This reverts commit 6625bce138d562cbfa8b9eb79af02e399c67cc20. --- .../java/chat/simplex/app/model/ChatModel.kt | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 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 2e689f24cd..c8a58a0aca 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 @@ -17,6 +17,7 @@ import chat.simplex.app.views.helpers.* import chat.simplex.app.views.onboarding.OnboardingStage import chat.simplex.app.views.usersettings.NotificationPreviewMode import chat.simplex.app.views.usersettings.NotificationsMode +import kotlinx.coroutines.* import kotlinx.datetime.* import kotlinx.serialization.* import kotlinx.serialization.descriptors.* @@ -180,10 +181,12 @@ class ChatModel(val controller: ChatController) { } // add to current chat if (chatId.value == cInfo.id) { - if (chatItems.lastOrNull()?.id == ChatItem.TEMP_LIVE_CHAT_ITEM_ID) { - chatItems.add(kotlin.math.max(0, chatItems.lastIndex), cItem) - } else { - chatItems.add(cItem) + runBlocking(Dispatchers.Main) { + if (chatItems.lastOrNull()?.id == ChatItem.TEMP_LIVE_CHAT_ITEM_ID) { + chatItems.add(kotlin.math.max(0, chatItems.lastIndex), cItem) + } else { + chatItems.add(cItem) + } } } } @@ -215,7 +218,9 @@ class ChatModel(val controller: ChatController) { chatItems[itemIndex] = cItem return false } else { - chatItems.add(cItem) + runBlocking(Dispatchers.Main) { + chatItems.add(cItem) + } return true } } else { @@ -261,7 +266,9 @@ class ChatModel(val controller: ChatController) { fun addLiveDummy(chatInfo: ChatInfo): ChatItem { val cItem = ChatItem.liveDummy(chatInfo is ChatInfo.Direct) - chatItems.add(cItem) + runBlocking(Dispatchers.Main) { + chatItems.add(cItem) + } return cItem } From e8374be19caac9c9b1a1fa9d29d922e0865711c8 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Wed, 11 Jan 2023 17:09:17 +0000 Subject: [PATCH 2/7] mobile: set defaults consistently (protected screen: iOS off/Android on, accept images: on, faster image transfer: on) (#1724) * ios: set defaults consistently (protected screen: off, accept images: on, faster image transfer: on) * android: transfer images faster by default --- .../app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt | 2 +- apps/ios/Shared/ContentView.swift | 2 +- apps/ios/Shared/Views/Helpers/AppSheet.swift | 2 +- apps/ios/Shared/Views/UserSettings/PrivacySettings.swift | 4 ++-- apps/ios/SimpleXChat/AppGroup.swift | 4 +++- 5 files changed, 8 insertions(+), 6 deletions(-) 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 82505b3d72..d9881007df 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 @@ -90,7 +90,7 @@ class AppPreferences(val context: Context) { val webrtcIceServers = mkStrPreference(SHARED_PREFS_WEBRTC_ICE_SERVERS, null) val privacyProtectScreen = mkBoolPreference(SHARED_PREFS_PRIVACY_PROTECT_SCREEN, true) val privacyAcceptImages = mkBoolPreference(SHARED_PREFS_PRIVACY_ACCEPT_IMAGES, true) - val privacyTransferImagesInline = mkBoolPreference(SHARED_PREFS_PRIVACY_TRANSFER_IMAGES_INLINE, false) + val privacyTransferImagesInline = mkBoolPreference(SHARED_PREFS_PRIVACY_TRANSFER_IMAGES_INLINE, true) val privacyLinkPreviews = mkBoolPreference(SHARED_PREFS_PRIVACY_LINK_PREVIEWS, true) private val _simplexLinkMode = mkStrPreference(SHARED_PREFS_PRIVACY_SIMPLEX_LINK_MODE, SimplexLinkMode.default.name) val simplexLinkMode: SharedPreference = SharedPreference( diff --git a/apps/ios/Shared/ContentView.swift b/apps/ios/Shared/ContentView.swift index 464a12dfa8..8f84988ccb 100644 --- a/apps/ios/Shared/ContentView.swift +++ b/apps/ios/Shared/ContentView.swift @@ -17,7 +17,7 @@ struct ContentView: View { @AppStorage(DEFAULT_SHOW_LA_NOTICE) private var prefShowLANotice = false @AppStorage(DEFAULT_LA_NOTICE_SHOWN) private var prefLANoticeShown = false @AppStorage(DEFAULT_PERFORM_LA) private var prefPerformLA = false - @AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = true + @AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = false @AppStorage(DEFAULT_NOTIFICATION_ALERT_SHOWN) private var notificationAlertShown = false @State private var showWhatsNew = false diff --git a/apps/ios/Shared/Views/Helpers/AppSheet.swift b/apps/ios/Shared/Views/Helpers/AppSheet.swift index aa8bb4fce3..0e64776ed6 100644 --- a/apps/ios/Shared/Views/Helpers/AppSheet.swift +++ b/apps/ios/Shared/Views/Helpers/AppSheet.swift @@ -35,7 +35,7 @@ private struct SheetForItem: ViewModifier where T: Identifiable, C: View { } private struct PrivacySensitive: ViewModifier { - @AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = true + @AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = false @Environment(\.scenePhase) var scenePhase func body(content: Content) -> some View { diff --git a/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift b/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift index 8b1ce05f09..5039bd84cd 100644 --- a/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift +++ b/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift @@ -13,9 +13,9 @@ struct PrivacySettings: View { @AppStorage(DEFAULT_PRIVACY_ACCEPT_IMAGES) private var autoAcceptImages = true @AppStorage(DEFAULT_PRIVACY_LINK_PREVIEWS) private var useLinkPreviews = true @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false - @AppStorage(GROUP_DEFAULT_PRIVACY_TRANSFER_IMAGES_INLINE, store: groupDefaults) private var transferImagesInline = false + @AppStorage(GROUP_DEFAULT_PRIVACY_TRANSFER_IMAGES_INLINE, store: groupDefaults) private var transferImagesInline = true @State private var simplexLinkMode = privacySimplexLinkModeDefault.get() - @AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = true + @AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = false var body: some View { VStack { diff --git a/apps/ios/SimpleXChat/AppGroup.swift b/apps/ios/SimpleXChat/AppGroup.swift index 48d61e7363..6ccf51471c 100644 --- a/apps/ios/SimpleXChat/AppGroup.swift +++ b/apps/ios/SimpleXChat/AppGroup.swift @@ -44,7 +44,9 @@ public func registerGroupDefaults() { GROUP_DEFAULT_NETWORK_TCP_KEEP_CNT: KeepAliveOpts.defaults.keepCnt, GROUP_DEFAULT_INCOGNITO: false, GROUP_DEFAULT_STORE_DB_PASSPHRASE: true, - GROUP_DEFAULT_INITIAL_RANDOM_DB_PASSPHRASE: false + GROUP_DEFAULT_INITIAL_RANDOM_DB_PASSPHRASE: false, + GROUP_DEFAULT_PRIVACY_ACCEPT_IMAGES: true, + GROUP_DEFAULT_PRIVACY_TRANSFER_IMAGES_INLINE: true ]) } From 98417dafc4c2320ebf62d18f79755e6c58d21953 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Wed, 11 Jan 2023 17:54:24 +0000 Subject: [PATCH 3/7] 4.4.1: ios 113, Android 87 --- apps/android/app/build.gradle | 4 +- apps/ios/SimpleX.xcodeproj/project.pbxproj | 48 +++++++++++----------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/apps/android/app/build.gradle b/apps/android/app/build.gradle index d0f012c6aa..5fad67c7d7 100644 --- a/apps/android/app/build.gradle +++ b/apps/android/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "chat.simplex.app" minSdk 29 targetSdk 32 - versionCode 86 - versionName "4.4.1-beta.1" + versionCode 87 + versionName "4.4.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 97ba41184c..992f8267c0 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -76,11 +76,11 @@ 5CA059ED279559F40002BEB4 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059C4279559F40002BEB4 /* ContentView.swift */; }; 5CA059EF279559F40002BEB4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5CA059C5279559F40002BEB4 /* Assets.xcassets */; }; 5CA7DFC329302AF000F7FDDE /* AppSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA7DFC229302AF000F7FDDE /* AppSheet.swift */; }; - 5CA85CFB29661DF10095AF72 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85CF629661DF00095AF72 /* libffi.a */; }; - 5CA85CFC29661DF10095AF72 /* libHSsimplex-chat-4.4.0-IXklDMWJZrrISWcSAPS4si.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85CF729661DF00095AF72 /* libHSsimplex-chat-4.4.0-IXklDMWJZrrISWcSAPS4si.a */; }; - 5CA85CFD29661DF10095AF72 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85CF829661DF00095AF72 /* libgmp.a */; }; - 5CA85CFE29661DF10095AF72 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85CF929661DF10095AF72 /* libgmpxx.a */; }; - 5CA85CFF29661DF10095AF72 /* libHSsimplex-chat-4.4.0-IXklDMWJZrrISWcSAPS4si-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85CFA29661DF10095AF72 /* libHSsimplex-chat-4.4.0-IXklDMWJZrrISWcSAPS4si-ghc8.10.7.a */; }; + 5CA85D05296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85D00296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi-ghc8.10.7.a */; }; + 5CA85D06296F151E0095AF72 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85D01296F151E0095AF72 /* libffi.a */; }; + 5CA85D07296F151E0095AF72 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85D02296F151E0095AF72 /* libgmpxx.a */; }; + 5CA85D08296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85D03296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi.a */; }; + 5CA85D09296F151E0095AF72 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85D04296F151E0095AF72 /* libgmp.a */; }; 5CADE79A29211BB900072E13 /* PreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CADE79929211BB900072E13 /* PreferencesView.swift */; }; 5CADE79C292131E900072E13 /* ContactPreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CADE79B292131E900072E13 /* ContactPreferencesView.swift */; }; 5CB0BA882826CB3A00B3292C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CB0BA862826CB3A00B3292C /* InfoPlist.strings */; }; @@ -296,11 +296,11 @@ 5CA059DB279559F40002BEB4 /* Tests_iOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOS.swift; sourceTree = ""; }; 5CA059DD279559F40002BEB4 /* Tests_iOSLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOSLaunchTests.swift; sourceTree = ""; }; 5CA7DFC229302AF000F7FDDE /* AppSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSheet.swift; sourceTree = ""; }; - 5CA85CF629661DF00095AF72 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - 5CA85CF729661DF00095AF72 /* libHSsimplex-chat-4.4.0-IXklDMWJZrrISWcSAPS4si.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.4.0-IXklDMWJZrrISWcSAPS4si.a"; sourceTree = ""; }; - 5CA85CF829661DF00095AF72 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; - 5CA85CF929661DF10095AF72 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; - 5CA85CFA29661DF10095AF72 /* libHSsimplex-chat-4.4.0-IXklDMWJZrrISWcSAPS4si-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.4.0-IXklDMWJZrrISWcSAPS4si-ghc8.10.7.a"; sourceTree = ""; }; + 5CA85D00296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi-ghc8.10.7.a"; sourceTree = ""; }; + 5CA85D01296F151E0095AF72 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; + 5CA85D02296F151E0095AF72 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; + 5CA85D03296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi.a"; sourceTree = ""; }; + 5CA85D04296F151E0095AF72 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; 5CADE79929211BB900072E13 /* PreferencesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesView.swift; sourceTree = ""; }; 5CADE79B292131E900072E13 /* ContactPreferencesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactPreferencesView.swift; sourceTree = ""; }; 5CB0BA872826CB3A00B3292C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -420,13 +420,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5CA85CFE29661DF10095AF72 /* libgmpxx.a in Frameworks */, + 5CA85D08296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi.a in Frameworks */, + 5CA85D09296F151E0095AF72 /* libgmp.a in Frameworks */, 5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */, - 5CA85CFD29661DF10095AF72 /* libgmp.a in Frameworks */, - 5CA85CFB29661DF10095AF72 /* libffi.a in Frameworks */, + 5CA85D07296F151E0095AF72 /* libgmpxx.a in Frameworks */, 5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */, - 5CA85CFC29661DF10095AF72 /* libHSsimplex-chat-4.4.0-IXklDMWJZrrISWcSAPS4si.a in Frameworks */, - 5CA85CFF29661DF10095AF72 /* libHSsimplex-chat-4.4.0-IXklDMWJZrrISWcSAPS4si-ghc8.10.7.a in Frameworks */, + 5CA85D05296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi-ghc8.10.7.a in Frameworks */, + 5CA85D06296F151E0095AF72 /* libffi.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -484,11 +484,11 @@ 5C764E5C279C70B7000C6508 /* Libraries */ = { isa = PBXGroup; children = ( - 5CA85CF629661DF00095AF72 /* libffi.a */, - 5CA85CF829661DF00095AF72 /* libgmp.a */, - 5CA85CF929661DF10095AF72 /* libgmpxx.a */, - 5CA85CFA29661DF10095AF72 /* libHSsimplex-chat-4.4.0-IXklDMWJZrrISWcSAPS4si-ghc8.10.7.a */, - 5CA85CF729661DF00095AF72 /* libHSsimplex-chat-4.4.0-IXklDMWJZrrISWcSAPS4si.a */, + 5CA85D01296F151E0095AF72 /* libffi.a */, + 5CA85D04296F151E0095AF72 /* libgmp.a */, + 5CA85D02296F151E0095AF72 /* libgmpxx.a */, + 5CA85D00296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi-ghc8.10.7.a */, + 5CA85D03296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi.a */, ); path = Libraries; sourceTree = ""; @@ -1305,7 +1305,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 112; + CURRENT_PROJECT_VERSION = 113; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -1347,7 +1347,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 112; + CURRENT_PROJECT_VERSION = 113; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -1426,7 +1426,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 112; + CURRENT_PROJECT_VERSION = 113; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GENERATE_INFOPLIST_FILE = YES; @@ -1456,7 +1456,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 112; + CURRENT_PROJECT_VERSION = 113; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GENERATE_INFOPLIST_FILE = YES; From 138cce44369b42bf51fb523de64473a9d44bd492 Mon Sep 17 00:00:00 2001 From: Stanislav Dmitrenko <7953703+avently@users.noreply.github.com> Date: Wed, 11 Jan 2023 22:48:52 +0000 Subject: [PATCH 4/7] ios: fix opening via notification returning to chat list when screen lock is enabled (#1725) * ios: Fixed broken chat push/pop logic * remove binding parameter Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> --- apps/ios/Shared/Views/ChatList/ChatListView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index f121cacb91..f35bb32aac 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -80,7 +80,7 @@ struct ChatListView: View { destination: chatView(), isActive: Binding( get: { chatModel.chatId != nil }, - set: { _, _ in chatModel.chatId = nil } + set: { _ in } ) ) { EmptyView() } ) From dcb82951ed6c8093a4a832d231d90ba6a223cfb8 Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Thu, 12 Jan 2023 16:31:27 +0400 Subject: [PATCH 5/7] core: catch errors when sending messages in loops where they haven't been previously caught (#1729) --- src/Simplex/Chat.hs | 63 +++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 161928875b..ab63e88ebf 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -391,12 +391,14 @@ processChatCommand = \case pure (fileInvitation, ciFile, ft) sendGroupFileInline :: [GroupMember] -> SharedMsgId -> FileTransferMeta -> m () sendGroupFileInline ms sharedMsgId ft@FileTransferMeta {fileInline} = - when (fileInline == Just IFMSent) . forM_ ms $ \case - m@GroupMember {activeConn = Just conn@Connection {connStatus}} -> + when (fileInline == Just IFMSent) . forM_ ms $ \m -> + processMember m `catchError` (toView . CRChatError) + where + processMember m@GroupMember {activeConn = Just conn@Connection {connStatus}} = when (connStatus == ConnReady || connStatus == ConnSndReady) $ do void . withStore' $ \db -> createSndGroupInlineFT db m conn ft sendMemberFileInline m conn ft sharedMsgId - _ -> pure () + processMember _ = pure () prepareMsg :: Maybe FileInvitation -> Maybe CITimed -> GroupMember -> m (MsgContainer, Maybe (CIQuote 'CTGroup)) prepareMsg fileInvitation_ timed_ membership = case quotedItemId_ of Nothing -> pure (MCSimple (ExtMsgContent mc fileInvitation_ (ttl' <$> timed_) (justTrue live)), Nothing) @@ -1327,13 +1329,16 @@ processChatCommand = \case asks currentUser >>= atomically . (`writeTVar` Just user') withChatLock "updateProfile" . procCmd $ do forM_ contacts $ \ct -> do - let mergedProfile = userProfileToSend user Nothing $ Just ct - ct' = updateMergedPreferences user' ct - mergedProfile' = userProfileToSend user' Nothing $ Just ct' - when (mergedProfile' /= mergedProfile) $ do - void (sendDirectContactMessage ct' $ XInfo mergedProfile') `catchError` (toView . CRChatError) - when (directOrUsed ct') $ createSndFeatureItems user' ct ct' + processContact user' ct `catchError` (toView . CRChatError) pure $ CRUserProfileUpdated (fromLocalProfile p) p' + where + processContact user' ct = do + let mergedProfile = userProfileToSend user Nothing $ Just ct + ct' = updateMergedPreferences user' ct + mergedProfile' = userProfileToSend user' Nothing $ Just ct' + when (mergedProfile' /= mergedProfile) $ do + void $ sendDirectContactMessage ct' (XInfo mergedProfile') + when (directOrUsed ct') $ createSndFeatureItems user' ct ct' updateContactPrefs :: User -> Contact -> Preferences -> m ChatResponse updateContactPrefs user@User {userId} ct@Contact {activeConn = Connection {customUserProfileId}, userPreferences = contactUserPrefs} contactUserPrefs' | contactUserPrefs == contactUserPrefs' = pure $ CRContactPrefsUpdated ct ct @@ -2158,9 +2163,12 @@ processAgentMessage (Just user@User {userId}) corrId agentConnId agentMessage = showToast ("#" <> gName) $ "member " <> localDisplayName (m :: GroupMember) <> " is connected" intros <- withStore' $ \db -> createIntroductions db members m void . sendGroupMessage gInfo members . XGrpMemNew $ memberInfo m - forM_ intros $ \intro@GroupMemberIntro {introId} -> do - void $ sendDirectMessage conn (XGrpMemIntro . memberInfo $ reMember intro) (GroupId groupId) - withStore' $ \db -> updateIntroStatus db introId GMIntroSent + forM_ intros $ \intro -> + processIntro intro `catchError` (toView . CRChatError) + where + processIntro intro@GroupMemberIntro {introId} = do + void $ sendDirectMessage conn (XGrpMemIntro . memberInfo $ reMember intro) (GroupId groupId) + withStore' $ \db -> updateIntroStatus db introId GMIntroSent _ -> do -- TODO send probe and decide whether to use existing contact connection or the new contact connection -- TODO notify member who forwarded introduction - question - where it is stored? There is via_contact but probably there should be via_member in group_members table @@ -3356,31 +3364,36 @@ sendGroupMessage GroupInfo {groupId} members chatMsgEvent = sendGroupMessage' :: (MsgEncodingI e, ChatMonad m) => [GroupMember] -> ChatMsgEvent e -> Int64 -> Maybe Int64 -> m () -> m SndMessage sendGroupMessage' members chatMsgEvent groupId introId_ postDeliver = do - msg@SndMessage {msgId, msgBody} <- createSndMessage chatMsgEvent (GroupId groupId) + msg <- createSndMessage chatMsgEvent (GroupId groupId) -- TODO collect failed deliveries into a single error - forM_ (filter memberCurrent members) $ \m@GroupMember {groupMemberId} -> - case memberConn m of + forM_ (filter memberCurrent members) $ \m -> + messageMember m msg `catchError` (toView . CRChatError) + pure msg + where + messageMember m@GroupMember {groupMemberId} SndMessage {msgId, msgBody} = case memberConn m of Nothing -> withStore' $ \db -> createPendingGroupMessage db groupMemberId msgId introId_ Just conn@Connection {connStatus} | connDisabled conn || connStatus == ConnDeleted -> pure () | connStatus == ConnSndReady || connStatus == ConnReady -> do let tag = toCMEventTag chatMsgEvent - (deliverMessage conn tag msgBody msgId >> postDeliver) `catchError` const (pure ()) + deliverMessage conn tag msgBody msgId >> postDeliver | otherwise -> withStore' $ \db -> createPendingGroupMessage db groupMemberId msgId introId_ - pure msg sendPendingGroupMessages :: ChatMonad m => GroupMember -> Connection -> m () sendPendingGroupMessages GroupMember {groupMemberId, localDisplayName} conn = do pendingMessages <- withStore' $ \db -> getPendingGroupMessages db groupMemberId -- TODO ensure order - pending messages interleave with user input messages - forM_ pendingMessages $ \PendingGroupMessage {msgId, cmEventTag = ACMEventTag _ tag, msgBody, introId_} -> do - void $ deliverMessage conn tag msgBody msgId - withStore' $ \db -> deletePendingGroupMessage db groupMemberId msgId - case tag of - XGrpMemFwd_ -> case introId_ of - Just introId -> withStore' $ \db -> updateIntroStatus db introId GMIntroInvForwarded - _ -> throwChatError $ CEGroupMemberIntroNotFound localDisplayName - _ -> pure () + forM_ pendingMessages $ \pgm -> + processPendingMessage pgm `catchError` (toView . CRChatError) + where + processPendingMessage PendingGroupMessage {msgId, cmEventTag = ACMEventTag _ tag, msgBody, introId_} = do + void $ deliverMessage conn tag msgBody msgId + withStore' $ \db -> deletePendingGroupMessage db groupMemberId msgId + case tag of + XGrpMemFwd_ -> case introId_ of + Just introId -> withStore' $ \db -> updateIntroStatus db introId GMIntroInvForwarded + _ -> throwChatError $ CEGroupMemberIntroNotFound localDisplayName + _ -> pure () saveRcvMSG :: ChatMonad m => Connection -> ConnOrGroupId -> MsgMeta -> MsgBody -> CommandId -> m RcvMessage saveRcvMSG Connection {connId} connOrGroupId agentMsgMeta msgBody agentAckCmdId = do From 4c960bdc4492ab0140afb994a2d8176aeff254ba Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Thu, 12 Jan 2023 16:46:28 +0400 Subject: [PATCH 6/7] 4.4.2 --- package.yaml | 2 +- simplex-chat.cabal | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.yaml b/package.yaml index 725f901fb4..24c5724539 100644 --- a/package.yaml +++ b/package.yaml @@ -1,5 +1,5 @@ name: simplex-chat -version: 4.4.1 +version: 4.4.2 #synopsis: #description: homepage: https://github.com/simplex-chat/simplex-chat#readme diff --git a/simplex-chat.cabal b/simplex-chat.cabal index 93c734e06a..a7a4606e33 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -5,7 +5,7 @@ cabal-version: 1.12 -- see: https://github.com/sol/hpack name: simplex-chat -version: 4.4.1 +version: 4.4.2 category: Web, System, Services, Cryptography homepage: https://github.com/simplex-chat/simplex-chat#readme author: simplex.chat From e73f5c40cf3bbbdd0715d3106962c24e455cb673 Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Thu, 12 Jan 2023 18:38:58 +0400 Subject: [PATCH 7/7] 4.4.2: ios 114, Android 88 --- apps/android/app/build.gradle | 4 +- apps/ios/SimpleX.xcodeproj/project.pbxproj | 56 +++++++++++----------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/apps/android/app/build.gradle b/apps/android/app/build.gradle index 5fad67c7d7..f22eb963b7 100644 --- a/apps/android/app/build.gradle +++ b/apps/android/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "chat.simplex.app" minSdk 29 targetSdk 32 - versionCode 87 - versionName "4.4.1" + versionCode 88 + versionName "4.4.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 992f8267c0..70eee66a75 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -76,11 +76,6 @@ 5CA059ED279559F40002BEB4 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059C4279559F40002BEB4 /* ContentView.swift */; }; 5CA059EF279559F40002BEB4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5CA059C5279559F40002BEB4 /* Assets.xcassets */; }; 5CA7DFC329302AF000F7FDDE /* AppSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA7DFC229302AF000F7FDDE /* AppSheet.swift */; }; - 5CA85D05296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85D00296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi-ghc8.10.7.a */; }; - 5CA85D06296F151E0095AF72 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85D01296F151E0095AF72 /* libffi.a */; }; - 5CA85D07296F151E0095AF72 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85D02296F151E0095AF72 /* libgmpxx.a */; }; - 5CA85D08296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85D03296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi.a */; }; - 5CA85D09296F151E0095AF72 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA85D04296F151E0095AF72 /* libgmp.a */; }; 5CADE79A29211BB900072E13 /* PreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CADE79929211BB900072E13 /* PreferencesView.swift */; }; 5CADE79C292131E900072E13 /* ContactPreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CADE79B292131E900072E13 /* ContactPreferencesView.swift */; }; 5CB0BA882826CB3A00B3292C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CB0BA862826CB3A00B3292C /* InfoPlist.strings */; }; @@ -139,6 +134,11 @@ 5CFE0921282EEAF60002594B /* ZoomableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFE0920282EEAF60002594B /* ZoomableScrollView.swift */; }; 5CFE0922282EEAF60002594B /* ZoomableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFE0920282EEAF60002594B /* ZoomableScrollView.swift */; }; 6407BA83295DA85D0082BA18 /* CIInvalidJSONView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6407BA82295DA85D0082BA18 /* CIInvalidJSONView.swift */; }; + 6407BA8929704D910082BA18 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6407BA8429704D910082BA18 /* libgmpxx.a */; }; + 6407BA8A29704D910082BA18 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6407BA8529704D910082BA18 /* libgmp.a */; }; + 6407BA8B29704D910082BA18 /* libHSsimplex-chat-4.4.2-4Gu4VKBxHYB3XfShhkyX2x.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6407BA8629704D910082BA18 /* libHSsimplex-chat-4.4.2-4Gu4VKBxHYB3XfShhkyX2x.a */; }; + 6407BA8C29704D910082BA18 /* libHSsimplex-chat-4.4.2-4Gu4VKBxHYB3XfShhkyX2x-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6407BA8729704D910082BA18 /* libHSsimplex-chat-4.4.2-4Gu4VKBxHYB3XfShhkyX2x-ghc8.10.7.a */; }; + 6407BA8D29704D910082BA18 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6407BA8829704D910082BA18 /* libffi.a */; }; 6432857C2925443C00FBE5C8 /* GroupPreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6432857B2925443C00FBE5C8 /* GroupPreferencesView.swift */; }; 6440CA00288857A10062C672 /* CIEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6440C9FF288857A10062C672 /* CIEventView.swift */; }; 6440CA03288AECA70062C672 /* AddGroupMembersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6440CA02288AECA70062C672 /* AddGroupMembersView.swift */; }; @@ -296,11 +296,6 @@ 5CA059DB279559F40002BEB4 /* Tests_iOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOS.swift; sourceTree = ""; }; 5CA059DD279559F40002BEB4 /* Tests_iOSLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOSLaunchTests.swift; sourceTree = ""; }; 5CA7DFC229302AF000F7FDDE /* AppSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSheet.swift; sourceTree = ""; }; - 5CA85D00296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi-ghc8.10.7.a"; sourceTree = ""; }; - 5CA85D01296F151E0095AF72 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - 5CA85D02296F151E0095AF72 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; - 5CA85D03296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi.a"; sourceTree = ""; }; - 5CA85D04296F151E0095AF72 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; 5CADE79929211BB900072E13 /* PreferencesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesView.swift; sourceTree = ""; }; 5CADE79B292131E900072E13 /* ContactPreferencesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactPreferencesView.swift; sourceTree = ""; }; 5CB0BA872826CB3A00B3292C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -363,6 +358,11 @@ 5CFA59CF286477B400863A68 /* ChatArchiveView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatArchiveView.swift; sourceTree = ""; }; 5CFE0920282EEAF60002594B /* ZoomableScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ZoomableScrollView.swift; path = Shared/Views/ZoomableScrollView.swift; sourceTree = SOURCE_ROOT; }; 6407BA82295DA85D0082BA18 /* CIInvalidJSONView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIInvalidJSONView.swift; sourceTree = ""; }; + 6407BA8429704D910082BA18 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; + 6407BA8529704D910082BA18 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; + 6407BA8629704D910082BA18 /* libHSsimplex-chat-4.4.2-4Gu4VKBxHYB3XfShhkyX2x.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.4.2-4Gu4VKBxHYB3XfShhkyX2x.a"; sourceTree = ""; }; + 6407BA8729704D910082BA18 /* libHSsimplex-chat-4.4.2-4Gu4VKBxHYB3XfShhkyX2x-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.4.2-4Gu4VKBxHYB3XfShhkyX2x-ghc8.10.7.a"; sourceTree = ""; }; + 6407BA8829704D910082BA18 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; 6432857B2925443C00FBE5C8 /* GroupPreferencesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupPreferencesView.swift; sourceTree = ""; }; 6440C9FF288857A10062C672 /* CIEventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIEventView.swift; sourceTree = ""; }; 6440CA02288AECA70062C672 /* AddGroupMembersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddGroupMembersView.swift; sourceTree = ""; }; @@ -420,13 +420,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5CA85D08296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi.a in Frameworks */, - 5CA85D09296F151E0095AF72 /* libgmp.a in Frameworks */, + 6407BA8929704D910082BA18 /* libgmpxx.a in Frameworks */, 5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */, - 5CA85D07296F151E0095AF72 /* libgmpxx.a in Frameworks */, + 6407BA8B29704D910082BA18 /* libHSsimplex-chat-4.4.2-4Gu4VKBxHYB3XfShhkyX2x.a in Frameworks */, + 6407BA8A29704D910082BA18 /* libgmp.a in Frameworks */, + 6407BA8D29704D910082BA18 /* libffi.a in Frameworks */, 5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */, - 5CA85D05296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi-ghc8.10.7.a in Frameworks */, - 5CA85D06296F151E0095AF72 /* libffi.a in Frameworks */, + 6407BA8C29704D910082BA18 /* libHSsimplex-chat-4.4.2-4Gu4VKBxHYB3XfShhkyX2x-ghc8.10.7.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -484,11 +484,11 @@ 5C764E5C279C70B7000C6508 /* Libraries */ = { isa = PBXGroup; children = ( - 5CA85D01296F151E0095AF72 /* libffi.a */, - 5CA85D04296F151E0095AF72 /* libgmp.a */, - 5CA85D02296F151E0095AF72 /* libgmpxx.a */, - 5CA85D00296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi-ghc8.10.7.a */, - 5CA85D03296F151E0095AF72 /* libHSsimplex-chat-4.4.1-5apk6NMi0TsBQXmy6Jpqfi.a */, + 6407BA8829704D910082BA18 /* libffi.a */, + 6407BA8529704D910082BA18 /* libgmp.a */, + 6407BA8429704D910082BA18 /* libgmpxx.a */, + 6407BA8729704D910082BA18 /* libHSsimplex-chat-4.4.2-4Gu4VKBxHYB3XfShhkyX2x-ghc8.10.7.a */, + 6407BA8629704D910082BA18 /* libHSsimplex-chat-4.4.2-4Gu4VKBxHYB3XfShhkyX2x.a */, ); path = Libraries; sourceTree = ""; @@ -1305,7 +1305,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 113; + CURRENT_PROJECT_VERSION = 114; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -1326,7 +1326,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 4.4.1; + MARKETING_VERSION = 4.4.2; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app; PRODUCT_NAME = SimpleX; SDKROOT = iphoneos; @@ -1347,7 +1347,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 113; + CURRENT_PROJECT_VERSION = 114; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -1368,7 +1368,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 4.4.1; + MARKETING_VERSION = 4.4.2; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app; PRODUCT_NAME = SimpleX; SDKROOT = iphoneos; @@ -1426,7 +1426,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 113; + CURRENT_PROJECT_VERSION = 114; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GENERATE_INFOPLIST_FILE = YES; @@ -1439,7 +1439,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 4.4.1; + MARKETING_VERSION = 4.4.2; PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -1456,7 +1456,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 113; + CURRENT_PROJECT_VERSION = 114; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GENERATE_INFOPLIST_FILE = YES; @@ -1469,7 +1469,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 4.4.1; + MARKETING_VERSION = 4.4.2; PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos;