diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index 0539269ac7..8c838557ed 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -50,6 +50,10 @@ class ItemsModel: ObservableObject { var reversedChatItems: [ChatItem] = [] { willSet { publisher.send() } } + var itemAdded = false { + willSet { publisher.send() } + } + init() { publisher .throttle(for: 0.25, scheduler: DispatchQueue.main, latest: true) @@ -389,6 +393,7 @@ final class ChatModel: ObservableObject { ci.meta.itemStatus = status } im.reversedChatItems.insert(ci, at: hasLiveDummy ? 1 : 0) + im.itemAdded = true } return true } @@ -483,6 +488,7 @@ final class ChatModel: ObservableObject { let cItem = ChatItem.liveDummy(chatInfo.chatType) withAnimation { im.reversedChatItems.insert(cItem, at: 0) + im.itemAdded = true } return cItem } @@ -842,7 +848,13 @@ final class ChatModel: ObservableObject { } i += 1 } - return UnreadChatItemCounts(isNearBottom: totalBelow < 16, unreadBelow: unreadBelow) + return UnreadChatItemCounts( + // TODO these thresholds account for the fact that items are still "visible" while + // covered by compose area, they should be replaced with the actual height in pixels below the screen. + isNearBottom: totalBelow < 15, + isReallyNearBottom: totalBelow < 2, + unreadBelow: unreadBelow + ) } func topItemInView(itemsInView: Set) -> ChatItem? { @@ -881,6 +893,7 @@ struct NTFContactRequest { struct UnreadChatItemCounts: Equatable { var isNearBottom: Bool + var isReallyNearBottom: Bool var unreadBelow: Int } diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 83b7c2ab4b..11b6f9aba3 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -162,7 +162,6 @@ struct ChatView: View { VideoPlayerView.players.removeAll() stopAudioPlayer() if chatModel.chatId == cInfo.id && !presentationMode.wrappedValue.isPresented { - chatModel.chatId = nil DispatchQueue.main.asyncAfter(deadline: .now() + 0.35) { if chatModel.chatId == nil { chatModel.chatItemStatuses = [:] @@ -189,7 +188,7 @@ struct ChatView: View { } label: { ChatInfoToolbar(chat: chat) } - .appSheet(isPresented: $showChatInfoSheet) { + .appSheet(isPresented: $showChatInfoSheet, onDismiss: { theme = buildTheme() }) { ChatInfoView( chat: chat, contact: contact, @@ -390,14 +389,22 @@ struct ChatView: View { : voiceNoFrame ? (g.size.width - 32) : (g.size.width - 32) * 0.84 - return chatItemView(ci, maxWidth) - .onAppear { - floatingButtonModel.appeared(viewId: ci.viewId) - } - .onDisappear { - floatingButtonModel.disappeared(viewId: ci.viewId) - } - .id(ci.id) // Required to trigger `onAppear` on iOS15 + return ChatItemWithMenu( + chat: $chat, + chatItem: ci, + maxWidth: maxWidth, + composeState: $composeState, + selectedMember: $selectedMember, + revealedChatItem: $revealedChatItem, + selectedChatItems: $selectedChatItems + ) + .onAppear { + floatingButtonModel.appeared(viewId: ci.viewId) + } + .onDisappear { + floatingButtonModel.disappeared(viewId: ci.viewId) + } + .id(ci.id) // Required to trigger `onAppear` on iOS15 } loadPage: { loadChatItems(cInfo) } @@ -411,11 +418,20 @@ struct ChatView: View { chat = c showChatInfoSheet = false loadChat(chat: c) + scrollModel.scrollToBottom() } } .onChange(of: im.reversedChatItems) { _ in floatingButtonModel.chatItemsChanged() } + .onChange(of: im.itemAdded) { added in + if added { + im.itemAdded = false + if floatingButtonModel.unreadChatItemCounts.isReallyNearBottom { + scrollModel.scrollToBottom() + } + } + } } } @@ -448,19 +464,19 @@ struct ChatView: View { init() { unreadChatItemCounts = UnreadChatItemCounts( isNearBottom: true, + isReallyNearBottom: true, unreadBelow: 0 ) events .receive(on: DispatchQueue.global(qos: .background)) .scan(Set()) { itemsInView, event in - return switch event { - case let .appeared(viewId): - itemsInView.union([viewId]) - case let .disappeared(viewId): - itemsInView.subtracting([viewId]) - case .chatItemsChanged: - itemsInView + var updated = itemsInView + switch event { + case let .appeared(viewId): updated.insert(viewId) + case let .disappeared(viewId): updated.remove(viewId) + case .chatItemsChanged: () } + return updated } .map { ChatModel.shared.unreadChatItemCounts(itemsInView: $0) } .removeDuplicates() @@ -668,22 +684,10 @@ struct ChatView: View { VoiceItemState.chatView = [:] } - @ViewBuilder private func chatItemView(_ ci: ChatItem, _ maxWidth: CGFloat) -> some View { - ChatItemWithMenu( - chat: chat, - chatItem: ci, - maxWidth: maxWidth, - composeState: $composeState, - selectedMember: $selectedMember, - revealedChatItem: $revealedChatItem, - selectedChatItems: $selectedChatItems - ) - } - private struct ChatItemWithMenu: View { @EnvironmentObject var m: ChatModel @EnvironmentObject var theme: AppTheme - @ObservedObject var chat: Chat + @Binding @ObservedObject var chat: Chat let chatItem: ChatItem let maxWidth: CGFloat @Binding var composeState: ComposeState diff --git a/apps/ios/Shared/Views/Chat/ReverseList.swift b/apps/ios/Shared/Views/Chat/ReverseList.swift index 9430dc04cf..97638a21c7 100644 --- a/apps/ios/Shared/Views/Chat/ReverseList.swift +++ b/apps/ios/Shared/Views/Chat/ReverseList.swift @@ -11,7 +11,6 @@ import Combine /// A List, which displays it's items in reverse order - from bottom to top struct ReverseList: UIViewControllerRepresentable { - let items: Array @Binding var scrollState: ReverseListScrollModel.State diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index 059a287620..41539b0759 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -40,7 +40,9 @@ struct ChatListView: View { NavStackCompat( isActive: Binding( get: { chatModel.chatId != nil }, - set: { _ in } + set: { active in + if !active { chatModel.chatId = nil } + } ), destination: chatView ) { chatListView } diff --git a/apps/ios/Shared/Views/Helpers/NavStackCompat.swift b/apps/ios/Shared/Views/Helpers/NavStackCompat.swift index 6e3b89c9b8..e9383fc073 100644 --- a/apps/ios/Shared/Views/Helpers/NavStackCompat.swift +++ b/apps/ios/Shared/Views/Helpers/NavStackCompat.swift @@ -17,7 +17,9 @@ struct NavStackCompat : View { if #available(iOS 16, *) { NavigationStack(path: Binding( get: { isActive.wrappedValue ? [true] : [] }, - set: { _ in } + set: { path in + if path.isEmpty { isActive.wrappedValue = false } + } )) { ZStack { NavigationLink(value: true) { EmptyView() } diff --git a/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift b/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift index 13c8bad611..bcca763a75 100644 --- a/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift +++ b/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift @@ -61,18 +61,39 @@ struct NewChatSheet: View { @State private var searchShowingSimplexLink = false @State private var searchChatFilteredBySimplexLink: String? = nil @Binding var alert: SomeAlert? - + + // Sheet height management + @State private var isAddContactActive = false + @State private var isScanPasteLinkActive = false + @State private var isLargeSheet = false + @State private var allowSmallSheet = true + + @AppStorage(GROUP_DEFAULT_ONE_HAND_UI, store: groupDefaults) private var oneHandUI = true + var body: some View { - NavigationView { - viewBody() + let showArchive = !filterContactTypes(chats: chatModel.chats, contactTypes: [.chatDeleted]).isEmpty + let v = NavigationView { + viewBody(showArchive) .navigationTitle("New message") .navigationBarTitleDisplayMode(.large) .navigationBarHidden(searchMode) .modifier(ThemedBackground(grouped: true)) } + if #available(iOS 16.0, *), oneHandUI { + let sheetHeight: CGFloat = showArchive ? 575 : 500 + v.presentationDetents( + allowSmallSheet ? [.height(sheetHeight), .large] : [.large], + selection: Binding( + get: { isLargeSheet || !allowSmallSheet ? .large : .height(sheetHeight) }, + set: { isLargeSheet = $0 == .large } + ) + ) + } else { + v + } } - - @ViewBuilder private func viewBody() -> some View { + + @ViewBuilder private func viewBody(_ showArchive: Bool) -> some View { List { HStack { ContactsListSearchBar( @@ -90,21 +111,25 @@ struct NewChatSheet: View { if (searchText.isEmpty) { Section { - NavigationLink { + NavigationLink(isActive: $isAddContactActive) { NewChatView(selection: .invite, parentAlert: $alert) .navigationTitle("New chat") .modifier(ThemedBackground(grouped: true)) .navigationBarTitleDisplayMode(.large) } label: { - Label("Add contact", systemImage: "link.badge.plus") + navigateOnTap(Label("Add contact", systemImage: "link.badge.plus")) { + isAddContactActive = true + } } - NavigationLink { + NavigationLink(isActive: $isScanPasteLinkActive) { NewChatView(selection: .connect, showQRCodeScanner: true, parentAlert: $alert) .navigationTitle("New chat") .modifier(ThemedBackground(grouped: true)) .navigationBarTitleDisplayMode(.large) } label: { - Label("Scan / Paste link", systemImage: "qrcode") + navigateOnTap(Label("Scan / Paste link", systemImage: "qrcode")) { + isScanPasteLinkActive = true + } } NavigationLink { AddGroupView() @@ -116,7 +141,7 @@ struct NewChatSheet: View { } } - if (!filterContactTypes(chats: chatModel.chats, contactTypes: [.chatDeleted]).isEmpty) { + if (showArchive) { Section { NavigationLink { DeletedChats() @@ -140,6 +165,22 @@ struct NewChatSheet: View { } } + /// Extends label's tap area to match `.insetGrouped` list row insets + private func navigateOnTap(_ label: L, setActive: @escaping () -> Void) -> some View { + label + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.leading, 16).padding(.vertical, 8).padding(.trailing, 32) + .contentShape(Rectangle()) + .onTapGesture { + isLargeSheet = true + DispatchQueue.main.async { + allowSmallSheet = false + setActive() + } + } + .padding(.leading, -16).padding(.vertical, -8).padding(.trailing, -32) + } + func newChatActionButton(_ icon: String, color: Color/* = .secondary*/, content: @escaping () -> Content) -> some View { ZStack(alignment: .leading) { Image(systemName: icon) diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index d4616ded5f..3f75c1a74e 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -224,11 +224,11 @@ E5DCF9712C590272007928CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF96F2C590272007928CC /* Localizable.strings */; }; E5DCF9842C5902CE007928CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF9822C5902CE007928CC /* Localizable.strings */; }; E5DCF9982C5906FF007928CC /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF9962C5906FF007928CC /* InfoPlist.strings */; }; - E5E2183F2C655B410013B4C6 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E2183A2C655B410013B4C6 /* libgmp.a */; }; - E5E218402C655B410013B4C6 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E2183B2C655B410013B4C6 /* libgmpxx.a */; }; - E5E218412C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E2183C2C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8.a */; }; - E5E218422C655B410013B4C6 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E2183D2C655B410013B4C6 /* libffi.a */; }; - E5E218432C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E2183E2C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8-ghc9.6.3.a */; }; + E5E218492C6813750013B4C6 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E218442C6813750013B4C6 /* libgmpxx.a */; }; + E5E2184A2C6813750013B4C6 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E218452C6813750013B4C6 /* libffi.a */; }; + E5E2184B2C6813750013B4C6 /* libHSsimplex-chat-6.0.0.7-JAEd2ymO3CfCyjlINhbKkf-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E218462C6813750013B4C6 /* libHSsimplex-chat-6.0.0.7-JAEd2ymO3CfCyjlINhbKkf-ghc9.6.3.a */; }; + E5E2184C2C6813750013B4C6 /* libHSsimplex-chat-6.0.0.7-JAEd2ymO3CfCyjlINhbKkf.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E218472C6813750013B4C6 /* libHSsimplex-chat-6.0.0.7-JAEd2ymO3CfCyjlINhbKkf.a */; }; + E5E2184D2C6813750013B4C6 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E218482C6813750013B4C6 /* libgmp.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -614,11 +614,11 @@ E5DCF9A62C590731007928CC /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/InfoPlist.strings; sourceTree = ""; }; E5DCF9A72C590732007928CC /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/InfoPlist.strings; sourceTree = ""; }; E5DCF9A82C590732007928CC /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = ""; }; - E5E2183A2C655B410013B4C6 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; - E5E2183B2C655B410013B4C6 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; - E5E2183C2C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8.a"; sourceTree = ""; }; - E5E2183D2C655B410013B4C6 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - E5E2183E2C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8-ghc9.6.3.a"; sourceTree = ""; }; + E5E218442C6813750013B4C6 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; + E5E218452C6813750013B4C6 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; + E5E218462C6813750013B4C6 /* libHSsimplex-chat-6.0.0.7-JAEd2ymO3CfCyjlINhbKkf-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.0.0.7-JAEd2ymO3CfCyjlINhbKkf-ghc9.6.3.a"; sourceTree = ""; }; + E5E218472C6813750013B4C6 /* libHSsimplex-chat-6.0.0.7-JAEd2ymO3CfCyjlINhbKkf.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.0.0.7-JAEd2ymO3CfCyjlINhbKkf.a"; sourceTree = ""; }; + E5E218482C6813750013B4C6 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -657,13 +657,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E5E218412C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8.a in Frameworks */, - E5E218432C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8-ghc9.6.3.a in Frameworks */, - E5E218402C655B410013B4C6 /* libgmpxx.a in Frameworks */, + E5E218492C6813750013B4C6 /* libgmpxx.a in Frameworks */, 5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */, - E5E218422C655B410013B4C6 /* libffi.a in Frameworks */, - E5E2183F2C655B410013B4C6 /* libgmp.a in Frameworks */, + E5E2184D2C6813750013B4C6 /* libgmp.a in Frameworks */, + E5E2184C2C6813750013B4C6 /* libHSsimplex-chat-6.0.0.7-JAEd2ymO3CfCyjlINhbKkf.a in Frameworks */, 5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */, + E5E2184B2C6813750013B4C6 /* libHSsimplex-chat-6.0.0.7-JAEd2ymO3CfCyjlINhbKkf-ghc9.6.3.a in Frameworks */, + E5E2184A2C6813750013B4C6 /* libffi.a in Frameworks */, CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -741,11 +741,11 @@ 5C764E5C279C70B7000C6508 /* Libraries */ = { isa = PBXGroup; children = ( - E5E2183D2C655B410013B4C6 /* libffi.a */, - E5E2183A2C655B410013B4C6 /* libgmp.a */, - E5E2183B2C655B410013B4C6 /* libgmpxx.a */, - E5E2183E2C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8-ghc9.6.3.a */, - E5E2183C2C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8.a */, + E5E218452C6813750013B4C6 /* libffi.a */, + E5E218482C6813750013B4C6 /* libgmp.a */, + E5E218442C6813750013B4C6 /* libgmpxx.a */, + E5E218462C6813750013B4C6 /* libHSsimplex-chat-6.0.0.7-JAEd2ymO3CfCyjlINhbKkf-ghc9.6.3.a */, + E5E218472C6813750013B4C6 /* libHSsimplex-chat-6.0.0.7-JAEd2ymO3CfCyjlINhbKkf.a */, ); path = Libraries; sourceTree = ""; @@ -1893,7 +1893,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 231; + CURRENT_PROJECT_VERSION = 232; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -1942,7 +1942,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 231; + CURRENT_PROJECT_VERSION = 232; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -1983,7 +1983,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 231; + CURRENT_PROJECT_VERSION = 232; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -2003,7 +2003,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 231; + CURRENT_PROJECT_VERSION = 232; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -2028,7 +2028,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 231; + CURRENT_PROJECT_VERSION = 232; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GCC_OPTIMIZATION_LEVEL = s; @@ -2065,7 +2065,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 231; + CURRENT_PROJECT_VERSION = 232; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_CODE_COVERAGE = NO; @@ -2102,7 +2102,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 231; + CURRENT_PROJECT_VERSION = 232; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2153,7 +2153,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 231; + CURRENT_PROJECT_VERSION = 232; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2204,7 +2204,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 231; + CURRENT_PROJECT_VERSION = 232; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -2238,7 +2238,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 231; + CURRENT_PROJECT_VERSION = 232; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; diff --git a/apps/multiplatform/gradle.properties b/apps/multiplatform/gradle.properties index 12b3b1bc91..144a39cd46 100644 --- a/apps/multiplatform/gradle.properties +++ b/apps/multiplatform/gradle.properties @@ -26,11 +26,11 @@ android.enableJetifier=true kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.jvm.target=11 -android.version_name=6.0-beta.4 -android.version_code=229 +android.version_name=6.0 +android.version_code=230 -desktop.version_name=6.0-beta.4 -desktop.version_code=60 +desktop.version_name=6.0 +desktop.version_code=61 kotlin.version=1.9.23 gradle.plugin.version=8.2.0