From 15ddefe86b0577e18aff2082280bb2201e32464d Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Tue, 31 May 2022 20:55:19 +0400 Subject: [PATCH 1/5] mobile: close modal views (#715) --- .../java/chat/simplex/app/MainActivity.kt | 5 +++- apps/ios/Shared/ContentView.swift | 27 ++++++++++--------- apps/ios/Shared/Model/ChatModel.swift | 1 + apps/ios/Shared/Views/Chat/ChatInfoView.swift | 7 +++-- apps/ios/Shared/Views/Chat/ChatView.swift | 7 +++-- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/apps/android/app/src/main/java/chat/simplex/app/MainActivity.kt b/apps/android/app/src/main/java/chat/simplex/app/MainActivity.kt index 829839ec78..a724d0fdaf 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/MainActivity.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/MainActivity.kt @@ -100,6 +100,7 @@ class MainActivity: FragmentActivity(), LifecycleEventObserver { userAuthorized.value = true } else { userAuthorized.value = false + ModalManager.shared.closeModals() authenticate( generalGetString(R.string.auth_unlock), generalGetString(R.string.auth_log_in_using_credential), @@ -241,7 +242,9 @@ fun MainPage( // this with LaunchedEffect(userAuthorized.value) fixes bottom sheet visibly collapsing after authentication var chatsAccessAuthorized by remember { mutableStateOf(false) } LaunchedEffect(userAuthorized.value) { - delay(500L) + if (chatModel.controller.appPrefs.performLA.get()) { + delay(500L) + } chatsAccessAuthorized = userAuthorized.value == true } var showAdvertiseLAAlert by remember { mutableStateOf(false) } diff --git a/apps/ios/Shared/ContentView.swift b/apps/ios/Shared/ContentView.swift index f9ba1bbaaf..bb5ab76aaa 100644 --- a/apps/ios/Shared/ContentView.swift +++ b/apps/ios/Shared/ContentView.swift @@ -70,18 +70,21 @@ struct ContentView: View { if !prefPerformLA { userAuthorized = true } else { - userAuthorized = false - authenticate(reason: NSLocalizedString("Unlock", comment: "authentication reason")) { laResult in - switch (laResult) { - case .success: - userAuthorized = true - case .failed: - laFailed = true - AlertManager.shared.showAlert(laFailedAlert()) - case .unavailable: - userAuthorized = true - prefPerformLA = false - AlertManager.shared.showAlert(laUnavailableTurningOffAlert()) + chatModel.showChatInfo = false + DispatchQueue.main.async() { + userAuthorized = false + authenticate(reason: NSLocalizedString("Unlock", comment: "authentication reason")) { laResult in + switch (laResult) { + case .success: + userAuthorized = true + case .failed: + laFailed = true + AlertManager.shared.showAlert(laFailedAlert()) + case .unavailable: + userAuthorized = true + prefPerformLA = false + AlertManager.shared.showAlert(laUnavailableTurningOffAlert()) + } } } } diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index 4d4ae6ad91..ebb3f6731d 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -14,6 +14,7 @@ import WebKit final class ChatModel: ObservableObject { @Published var onboardingStage: OnboardingStage? @Published var currentUser: User? + @Published var showChatInfo: Bool = false // TODO comprehensively close modal views on authentication // list of chat "previews" @Published var chats: [Chat] = [] // current chat diff --git a/apps/ios/Shared/Views/Chat/ChatInfoView.swift b/apps/ios/Shared/Views/Chat/ChatInfoView.swift index b7bd7ef587..18e253b89f 100644 --- a/apps/ios/Shared/Views/Chat/ChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/ChatInfoView.swift @@ -12,7 +12,6 @@ struct ChatInfoView: View { @EnvironmentObject var chatModel: ChatModel @ObservedObject var alertManager = AlertManager.shared @ObservedObject var chat: Chat - @Binding var showChatInfo: Bool @State var alert: ChatInfoViewAlert? = nil @State var deletingContact: Contact? @@ -99,7 +98,7 @@ struct ChatInfoView: View { try await apiDeleteChat(type: .direct, id: contact.apiId) DispatchQueue.main.async { chatModel.removeChat(contact.id) - showChatInfo = false + chatModel.showChatInfo = false } } catch let error { logger.error("ChatInfoView.deleteContactAlert apiDeleteChat error: \(error.localizedDescription)") @@ -118,7 +117,7 @@ struct ChatInfoView: View { Task { await clearChat(chat) DispatchQueue.main.async { - showChatInfo = false + chatModel.showChatInfo = false } } }, @@ -130,6 +129,6 @@ struct ChatInfoView: View { struct ChatInfoView_Previews: PreviewProvider { static var previews: some View { @State var showChatInfo = true - return ChatInfoView(chat: Chat(chatInfo: ChatInfo.sampleData.direct, chatItems: []), showChatInfo: $showChatInfo) + return ChatInfoView(chat: Chat(chatInfo: ChatInfo.sampleData.direct, chatItems: [])) } } diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 48d581d2c8..b93252b538 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -18,7 +18,6 @@ struct ChatView: View { @State private var composeState = ComposeState() @State private var deletingItem: ChatItem? = nil @FocusState private var keyboardVisible: Bool - @State private var showChatInfo = false @State private var showDeleteMessage = false var body: some View { @@ -98,12 +97,12 @@ struct ChatView: View { } ToolbarItem(placement: .principal) { Button { - showChatInfo = true + chatModel.showChatInfo = true } label: { ChatInfoToolbar(chat: chat) } - .sheet(isPresented: $showChatInfo) { - ChatInfoView(chat: chat, showChatInfo: $showChatInfo) + .sheet(isPresented: $chatModel.showChatInfo) { + ChatInfoView(chat: chat) } } ToolbarItem(placement: .navigationBarTrailing) { From 82a4a8c6f8b4e053b335260fafa4275799a9897a Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Tue, 31 May 2022 21:30:20 +0400 Subject: [PATCH 2/5] mobile: update version 2.2 (ios - 50, android - 36) --- apps/android/app/build.gradle | 2 +- apps/ios/SimpleX.xcodeproj/project.pbxproj | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/android/app/build.gradle b/apps/android/app/build.gradle index 410b5d966d..d0b5c8a8d8 100644 --- a/apps/android/app/build.gradle +++ b/apps/android/app/build.gradle @@ -11,7 +11,7 @@ android { applicationId "chat.simplex.app" minSdk 29 targetSdk 32 - versionCode 35 + versionCode 36 versionName "2.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 1ec19cdf6f..b591ceff75 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -966,7 +966,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 49; + CURRENT_PROJECT_VERSION = 50; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -1009,7 +1009,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 49; + CURRENT_PROJECT_VERSION = 50; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -1091,7 +1091,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 49; + CURRENT_PROJECT_VERSION = 50; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GENERATE_INFOPLIST_FILE = YES; @@ -1131,7 +1131,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 49; + CURRENT_PROJECT_VERSION = 50; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GENERATE_INFOPLIST_FILE = YES; From 4db7e88ed8f9c677a718ef4e33ae5f2446814d38 Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Wed, 1 Jun 2022 18:58:06 +0400 Subject: [PATCH 3/5] terminal: version 2.2.0 --- package.yaml | 2 +- simplex-chat.cabal | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.yaml b/package.yaml index 709e8fa765..9e097678fa 100644 --- a/package.yaml +++ b/package.yaml @@ -1,5 +1,5 @@ name: simplex-chat -version: 2.1.0 +version: 2.2.0 #synopsis: #description: homepage: https://github.com/simplex-chat/simplex-chat#readme diff --git a/simplex-chat.cabal b/simplex-chat.cabal index fd4b1c0a24..588beb8ca0 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: 2.1.0 +version: 2.2.0 category: Web, System, Services, Cryptography homepage: https://github.com/simplex-chat/simplex-chat#readme author: simplex.chat From cd1af400bbdac028aae56185cb47c61b0f31ab45 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Thu, 2 Jun 2022 12:10:41 +0100 Subject: [PATCH 4/5] ios: remove callkit (#720) * ios: remove callkit * remove CallKit import --- apps/ios/Shared/Model/SimpleXAPI.swift | 3 +- .../Shared/Views/Call/ActiveCallView.swift | 6 +- .../Shared/Views/Call/CallController.swift | 214 +++++++++--------- 3 files changed, 112 insertions(+), 111 deletions(-) diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index e44e40ec5e..8d3b8701cd 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -11,7 +11,6 @@ import UIKit import Dispatch import BackgroundTasks import SwiftUI -import CallKit private var chatController: chat_ctrl? @@ -680,7 +679,7 @@ func processReceivedMsg(_ res: ChatResponse) { } withCall(contact) { call in m.callCommand = .end - CallController.shared.reportCallRemoteEnded(call: call) +// CallController.shared.reportCallRemoteEnded(call: call) } default: logger.debug("unsupported event: \(res.responseType)") diff --git a/apps/ios/Shared/Views/Call/ActiveCallView.swift b/apps/ios/Shared/Views/Call/ActiveCallView.swift index f61105997c..5c46356401 100644 --- a/apps/ios/Shared/Views/Call/ActiveCallView.swift +++ b/apps/ios/Shared/Views/Call/ActiveCallView.swift @@ -93,9 +93,9 @@ struct ActiveCallView: View { case let .connection(state): if let callStatus = WebRTCCallStatus.init(rawValue: state.connectionState), case .connected = callStatus { - if case .outgoing = call.direction { - CallController.shared.reportOutgoingCall(call: call, connectedAt: nil) - } +// if case .outgoing = call.direction { +// CallController.shared.reportOutgoingCall(call: call, connectedAt: nil) +// } call.callState = .connected // CallKit doesn't work well with WKWebView // This is a hack to enable microphone in WKWebView after CallKit takes over it diff --git a/apps/ios/Shared/Views/Call/CallController.swift b/apps/ios/Shared/Views/Call/CallController.swift index ff8339b9b2..3421d0d105 100644 --- a/apps/ios/Shared/Views/Call/CallController.swift +++ b/apps/ios/Shared/Views/Call/CallController.swift @@ -7,90 +7,91 @@ // import Foundation -import CallKit +//import CallKit import AVFoundation -class CallController: NSObject, CXProviderDelegate, ObservableObject { +//class CallController: NSObject, CXProviderDelegate, ObservableObject { +class CallController: NSObject, ObservableObject { static let useCallKit = false static let shared = CallController() - private let provider = CXProvider(configuration: CallController.configuration) - private let controller = CXCallController() +// private let provider = CXProvider(configuration: CallController.configuration) +// private let controller = CXCallController() private let callManager = CallManager() @Published var activeCallInvitation: CallInvitation? // PKPushRegistry will be used from notification service extension // let registry = PKPushRegistry(queue: nil) - static let configuration: CXProviderConfiguration = { - let configuration = CXProviderConfiguration() - configuration.supportsVideo = true - configuration.supportedHandleTypes = [.generic] - configuration.includesCallsInRecents = true // TODO disable or add option - configuration.maximumCallsPerCallGroup = 1 - return configuration - }() +// static let configuration: CXProviderConfiguration = { +// let configuration = CXProviderConfiguration() +// configuration.supportsVideo = true +// configuration.supportedHandleTypes = [.generic] +// configuration.includesCallsInRecents = true // TODO disable or add option +// configuration.maximumCallsPerCallGroup = 1 +// return configuration +// }() override init() { super.init() - self.provider.setDelegate(self, queue: nil) +// self.provider.setDelegate(self, queue: nil) // self.registry.delegate = self // self.registry.desiredPushTypes = [.voIP] } - func providerDidReset(_ provider: CXProvider) { - } +// func providerDidReset(_ provider: CXProvider) { +// } - func provider(_ provider: CXProvider, perform action: CXStartCallAction) { - logger.debug("CallController.provider CXStartCallAction") - if callManager.startOutgoingCall(callUUID: action.callUUID) { - action.fulfill() - provider.reportOutgoingCall(with: action.callUUID, startedConnectingAt: nil) - } else { - action.fail() - } - } - - func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) { - logger.debug("CallController.provider CXAnswerCallAction") - if callManager.answerIncomingCall(callUUID: action.callUUID) { - action.fulfill() - } else { - action.fail() - } - } - - func provider(_ provider: CXProvider, perform action: CXEndCallAction) { - logger.debug("CallController.provider CXEndCallAction") - callManager.endCall(callUUID: action.callUUID) { ok in - if ok { - action.fulfill() - } else { - action.fail() - } - } - } - - func provider(_ provider: CXProvider, timedOutPerforming action: CXAction) { - print("timed out", #function) - action.fulfill() - } - - func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) { - print("received", #function) -// do { -// try audioSession.setCategory(.playAndRecord, mode: .voiceChat, options: .mixWithOthers) -// logger.debug("audioSession category set") -// try audioSession.setActive(true) -// logger.debug("audioSession activated") -// } catch { -// print(error) -// logger.error("failed activating audio session") +// func provider(_ provider: CXProvider, perform action: CXStartCallAction) { +// logger.debug("CallController.provider CXStartCallAction") +// if callManager.startOutgoingCall(callUUID: action.callUUID) { +// action.fulfill() +// provider.reportOutgoingCall(with: action.callUUID, startedConnectingAt: nil) +// } else { +// action.fail() // } - } +// } - func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) { - print("received", #function) - } +// func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) { +// logger.debug("CallController.provider CXAnswerCallAction") +// if callManager.answerIncomingCall(callUUID: action.callUUID) { +// action.fulfill() +// } else { +// action.fail() +// } +// } + +// func provider(_ provider: CXProvider, perform action: CXEndCallAction) { +// logger.debug("CallController.provider CXEndCallAction") +// callManager.endCall(callUUID: action.callUUID) { ok in +// if ok { +// action.fulfill() +// } else { +// action.fail() +// } +// } +// } + +// func provider(_ provider: CXProvider, timedOutPerforming action: CXAction) { +// print("timed out", #function) +// action.fulfill() +// } + +// func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) { +// print("received", #function) +//// do { +//// try audioSession.setCategory(.playAndRecord, mode: .voiceChat, options: .mixWithOthers) +//// logger.debug("audioSession category set") +//// try audioSession.setActive(true) +//// logger.debug("audioSession activated") +//// } catch { +//// print(error) +//// logger.error("failed activating audio session") +//// } +// } + +// func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) { +// print("received", #function) +// } // func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) { // @@ -121,48 +122,49 @@ class CallController: NSObject, CXProviderDelegate, ObservableObject { func reportNewIncomingCall(invitation: CallInvitation, completion: @escaping (Error?) -> Void) { logger.debug("CallController.reportNewIncomingCall") if !UserDefaults.standard.bool(forKey: DEFAULT_EXPERIMENTAL_CALLS) { return } - if CallController.useCallKit, let uuid = invitation.callkitUUID { - let update = CXCallUpdate() - update.remoteHandle = CXHandle(type: .generic, value: invitation.contact.displayName) - update.hasVideo = invitation.peerMedia == .video - provider.reportNewIncomingCall(with: uuid, update: update, completion: completion) - } else { +// if CallController.useCallKit, let uuid = invitation.callkitUUID { +// let update = CXCallUpdate() +// update.remoteHandle = CXHandle(type: .generic, value: invitation.contact.displayName) +// update.hasVideo = invitation.peerMedia == .video +// provider.reportNewIncomingCall(with: uuid, update: update, completion: completion) +// } else { NtfManager.shared.notifyCallInvitation(invitation) if invitation.callTs.timeIntervalSinceNow >= -180 { activeCallInvitation = invitation } - } +// } } - func reportOutgoingCall(call: Call, connectedAt dateConnected: Date?) { - if CallController.useCallKit, let uuid = call.callkitUUID { - provider.reportOutgoingCall(with: uuid, connectedAt: dateConnected) - } - } +// func reportOutgoingCall(call: Call, connectedAt dateConnected: Date?) { +// if CallController.useCallKit, let uuid = call.callkitUUID { +// provider.reportOutgoingCall(with: uuid, connectedAt: dateConnected) +// } +// } func reportCallRemoteEnded(invitation: CallInvitation) { - if CallController.useCallKit, let uuid = invitation.callkitUUID { - provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded) - } else if invitation.contact.id == activeCallInvitation?.contact.id { +// if CallController.useCallKit, let uuid = invitation.callkitUUID { +// provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded) +// } else if invitation.contact.id == activeCallInvitation?.contact.id { activeCallInvitation = nil - } +// } } - func reportCallRemoteEnded(call: Call) { - if CallController.useCallKit, let uuid = call.callkitUUID { - provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded) - } - } +// func reportCallRemoteEnded(call: Call) { +// if CallController.useCallKit, let uuid = call.callkitUUID { +// provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded) +// } +// } func startCall(_ contact: Contact, _ media: CallMediaType) { logger.debug("CallController.startCall") let uuid = callManager.newOutgoingCall(contact, media) - if CallController.useCallKit { - let handle = CXHandle(type: .generic, value: contact.displayName) - let action = CXStartCallAction(call: uuid, handle: handle) - action.isVideo = media == .video - requestTransaction(with: action) - } else if callManager.startOutgoingCall(callUUID: uuid) { +// if CallController.useCallKit { +// let handle = CXHandle(type: .generic, value: contact.displayName) +// let action = CXStartCallAction(call: uuid, handle: handle) +// action.isVideo = media == .video +// requestTransaction(with: action) +// } else if callManager.startOutgoingCall(callUUID: uuid) { + if callManager.startOutgoingCall(callUUID: uuid) { logger.debug("CallController.startCall: call started") } else { logger.error("CallController.startCall: no active call") @@ -177,9 +179,9 @@ class CallController: NSObject, CXProviderDelegate, ObservableObject { } func endCall(callUUID: UUID) { - if CallController.useCallKit { - requestTransaction(with: CXEndCallAction(call: callUUID)) - } else { +// if CallController.useCallKit { +// requestTransaction(with: CXEndCallAction(call: callUUID)) +// } else { callManager.endCall(callUUID: callUUID) { ok in if ok { logger.debug("CallController.endCall: call ended") @@ -187,7 +189,7 @@ class CallController: NSObject, CXProviderDelegate, ObservableObject { logger.error("CallController.endCall: no actove call pr call invitation to end") } } - } +// } } func endCall(invitation: CallInvitation) { @@ -204,15 +206,15 @@ class CallController: NSObject, CXProviderDelegate, ObservableObject { callManager.endCall(call: call, completed: completed) } - private func requestTransaction(with action: CXAction) { - let t = CXTransaction() - t.addAction(action) - controller.request(t) { error in - if let error = error { - logger.error("CallController.requestTransaction error requesting transaction: \(error.localizedDescription)") - } else { - logger.debug("CallController.requestTransaction requested transaction successfully") - } - } - } +// private func requestTransaction(with action: CXAction) { +// let t = CXTransaction() +// t.addAction(action) +// controller.request(t) { error in +// if let error = error { +// logger.error("CallController.requestTransaction error requesting transaction: \(error.localizedDescription)") +// } else { +// logger.debug("CallController.requestTransaction requested transaction successfully") +// } +// } +// } } From 87c0c9de913c9866598076a10279b30eb94364b9 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Thu, 2 Jun 2022 12:37:27 +0100 Subject: [PATCH 5/5] ios: update build to 51 --- apps/ios/SimpleX.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index b591ceff75..7727b7f391 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -966,7 +966,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 50; + CURRENT_PROJECT_VERSION = 51; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -1009,7 +1009,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 50; + CURRENT_PROJECT_VERSION = 51; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -1091,7 +1091,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 50; + CURRENT_PROJECT_VERSION = 51; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GENERATE_INFOPLIST_FILE = YES; @@ -1131,7 +1131,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 50; + CURRENT_PROJECT_VERSION = 51; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GENERATE_INFOPLIST_FILE = YES;