diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index 19fa1d910c..7077141aa1 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -549,13 +549,14 @@ func apiChatUnread(type: ChatType, id: Int64, unreadChat: Bool) async throws { } func receiveFile(fileId: Int64) async { - if let chatItem = await apiReceiveFile(fileId: fileId) { + let inline = privacyTransferImagesInlineGroupDefault.get() + if let chatItem = await apiReceiveFile(fileId: fileId, inline: inline) { DispatchQueue.main.async { chatItemSimpleUpdate(chatItem) } } } -func apiReceiveFile(fileId: Int64) async -> AChatItem? { - let r = await chatSendCmd(.receiveFile(fileId: fileId)) +func apiReceiveFile(fileId: Int64, inline: Bool) async -> AChatItem? { + let r = await chatSendCmd(.receiveFile(fileId: fileId, inline: inline)) let am = AlertManager.shared if case let .rcvFileAccepted(chatItem) = r { return chatItem } if case .rcvFileAcceptedSndCancelled = r { diff --git a/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift b/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift index 3dc6f705a4..4f3e328207 100644 --- a/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift +++ b/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift @@ -12,6 +12,8 @@ import SimpleXChat 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 + @State private var transferImagesInline = false var body: some View { VStack { @@ -22,7 +24,17 @@ struct PrivacySettings: View { Section("Chats") { settingsRow("photo") { Toggle("Auto-accept images", isOn: $autoAcceptImages) - .onChange(of: autoAcceptImages) { privacyAcceptImagesGroupDefault.set($0) } + .onChange(of: autoAcceptImages) { + privacyAcceptImagesGroupDefault.set($0) + } + } + if developerTools { + settingsRow("photo.on.rectangle") { + Toggle("Transfer images faster (BETA)", isOn: $transferImagesInline) + .onChange(of: transferImagesInline) { + privacyTransferImagesInlineGroupDefault.set($0) + } + } } settingsRow("network") { Toggle("Send link previews", isOn: $useLinkPreviews) @@ -30,6 +42,9 @@ struct PrivacySettings: View { } } } + .onAppear { + transferImagesInline = privacyTransferImagesInlineGroupDefault.get() + } } } diff --git a/apps/ios/SimpleX NSE/NotificationService.swift b/apps/ios/SimpleX NSE/NotificationService.swift index 0555244999..ef0939ccc3 100644 --- a/apps/ios/SimpleX NSE/NotificationService.swift +++ b/apps/ios/SimpleX NSE/NotificationService.swift @@ -220,7 +220,8 @@ func receivedMsgNtf(_ res: ChatResponse) async -> (String, UNMutableNotification if let file = cItem.file, file.fileSize <= maxImageSize, privacyAcceptImagesGroupDefault.get() { - cItem = apiReceiveFile(fileId: file.fileId)?.chatItem ?? cItem + let inline = privacyTransferImagesInlineGroupDefault.get() + cItem = apiReceiveFile(fileId: file.fileId, inline: inline)?.chatItem ?? cItem } } return cItem.isCall() ? nil : (aChatItem.chatId, createMessageReceivedNtf(cInfo, cItem)) @@ -274,8 +275,8 @@ func apiGetNtfMessage(nonce: String, encNtfInfo: String) -> NtfMessages? { return nil } -func apiReceiveFile(fileId: Int64) -> AChatItem? { - let r = sendSimpleXCmd(.receiveFile(fileId: fileId)) +func apiReceiveFile(fileId: Int64, inline: Bool) -> AChatItem? { + let r = sendSimpleXCmd(.receiveFile(fileId: fileId, inline: inline)) if case let .rcvFileAccepted(chatItem) = r { return chatItem } logger.error("receiveFile error: \(responseError(r))") return nil diff --git a/apps/ios/SimpleXChat/APITypes.swift b/apps/ios/SimpleXChat/APITypes.swift index 8375890cbb..a74241b445 100644 --- a/apps/ios/SimpleXChat/APITypes.swift +++ b/apps/ios/SimpleXChat/APITypes.swift @@ -82,7 +82,7 @@ public enum ChatCommand { case apiCallStatus(contact: Contact, callStatus: WebRTCCallStatus) case apiChatRead(type: ChatType, id: Int64, itemRange: (Int64, Int64)) case apiChatUnread(type: ChatType, id: Int64, unreadChat: Bool) - case receiveFile(fileId: Int64) + case receiveFile(fileId: Int64, inline: Bool) case string(String) public var cmdString: String { @@ -159,7 +159,7 @@ public enum ChatCommand { case let .apiCallStatus(contact, callStatus): return "/_call status @\(contact.apiId) \(callStatus.rawValue)" case let .apiChatRead(type, id, itemRange: (from, to)): return "/_read chat \(ref(type, id)) from=\(from) to=\(to)" case let .apiChatUnread(type, id, unreadChat): return "/_unread chat \(ref(type, id)) \(onOff(unreadChat))" - case let .receiveFile(fileId): return "/freceive \(fileId)" + case let .receiveFile(fileId, inline): return "/freceive \(fileId) inline=\(onOff(inline))" case let .string(str): return str } } diff --git a/apps/ios/SimpleXChat/AppGroup.swift b/apps/ios/SimpleXChat/AppGroup.swift index c44ed18af9..99c30228c0 100644 --- a/apps/ios/SimpleXChat/AppGroup.swift +++ b/apps/ios/SimpleXChat/AppGroup.swift @@ -14,6 +14,7 @@ let GROUP_DEFAULT_DB_CONTAINER = "dbContainer" public let GROUP_DEFAULT_CHAT_LAST_START = "chatLastStart" let GROUP_DEFAULT_NTF_PREVIEW_MODE = "ntfPreviewMode" let GROUP_DEFAULT_PRIVACY_ACCEPT_IMAGES = "privacyAcceptImages" +let GROUP_DEFAULT_PRIVACY_TRANSFER_IMAGES_INLINE = "privacyTransferImagesInline" let GROUP_DEFAULT_NTF_BADGE_COUNT = "ntgBadgeCount" let GROUP_DEFAULT_NETWORK_USE_ONION_HOSTS = "networkUseOnionHosts" let GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT = "networkTCPConnectTimeout" @@ -92,6 +93,8 @@ public let incognitoGroupDefault = BoolDefault(defaults: groupDefaults, forKey: public let privacyAcceptImagesGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_ACCEPT_IMAGES) +public let privacyTransferImagesInlineGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_TRANSFER_IMAGES_INLINE) + public let ntfBadgeCountGroupDefault = IntDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_NTF_BADGE_COUNT) public let networkUseOnionHostsGroupDefault = EnumDefault(