From f16d8842b220c19f50482fd54c21077579156709 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Sun, 10 Jul 2022 14:28:00 +0100 Subject: [PATCH] iOS: accept images in NSE if enabled, reorder chats when coming from background (#800) * ios: automatically accept images in NSE, if enabled in settings * remove unnecessary TODOs * reorder chat when coming from background --- apps/ios/Shared/Model/ChatModel.swift | 23 +++++++++++----- apps/ios/Shared/Model/SimpleXAPI.swift | 2 +- apps/ios/Shared/SimpleXApp.swift | 1 + apps/ios/Shared/Views/Chat/ChatView.swift | 2 +- .../Views/UserSettings/PrivacySettings.swift | 2 ++ .../Views/UserSettings/SettingsView.swift | 4 +++ .../ios/SimpleX NSE/NotificationService.swift | 27 ++++++++++--------- apps/ios/SimpleXChat/AppGroup.swift | 22 +++++++++++++++ 8 files changed, 62 insertions(+), 21 deletions(-) diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index f56f1423e..e5b231d7e 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -58,9 +58,9 @@ final class ChatModel: ObservableObject { chats.firstIndex(where: { $0.id == id }) } - func addChat(_ chat: Chat) { + func addChat(_ chat: Chat, at position: Int = 0) { withAnimation { - chats.insert(chat, at: 0) + chats.insert(chat, at: position) } } @@ -104,13 +104,22 @@ final class ChatModel: ObservableObject { } func updateChats(with newChats: [ChatData]) { - for c in newChats { - if let chat = getChat(c.id) { + for i in 0.. AChatItem { let r = await chatSendCmd(.receiveFile(fileId: fileId)) - if case .rcvFileAccepted(let chatItem) = r { return chatItem } + if case let .rcvFileAccepted(chatItem) = r { return chatItem } throw r } diff --git a/apps/ios/Shared/SimpleXApp.swift b/apps/ios/Shared/SimpleXApp.swift index 5347851a7..990ac478a 100644 --- a/apps/ios/Shared/SimpleXApp.swift +++ b/apps/ios/Shared/SimpleXApp.swift @@ -25,6 +25,7 @@ struct SimpleXApp: App { init() { hs_init(0, nil) UserDefaults.standard.register(defaults: appDefaults) + setGroupDefaults() setDbContainer() BGManager.shared.register() NtfManager.shared.registerCategories() diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index bafe83336..cdf1dcd53 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -59,7 +59,7 @@ struct ChatView: View { } markAllRead() } - .onChange(of: chatModel.chatItems.count) { _ in + .onChange(of: chatModel.chatItems.last?.id) { _ in scrollToBottom(proxy) } .onChange(of: keyboardVisible) { _ in diff --git a/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift b/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift index 33794cfbd..3dc6f705a 100644 --- a/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift +++ b/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift @@ -7,6 +7,7 @@ // import SwiftUI +import SimpleXChat struct PrivacySettings: View { @AppStorage(DEFAULT_PRIVACY_ACCEPT_IMAGES) private var autoAcceptImages = true @@ -21,6 +22,7 @@ struct PrivacySettings: View { Section("Chats") { settingsRow("photo") { Toggle("Auto-accept images", isOn: $autoAcceptImages) + .onChange(of: autoAcceptImages) { privacyAcceptImagesGroupDefault.set($0) } } settingsRow("network") { Toggle("Send link previews", isOn: $useLinkPreviews) diff --git a/apps/ios/Shared/Views/UserSettings/SettingsView.swift b/apps/ios/Shared/Views/UserSettings/SettingsView.swift index ab2b8836f..d074589c1 100644 --- a/apps/ios/Shared/Views/UserSettings/SettingsView.swift +++ b/apps/ios/Shared/Views/UserSettings/SettingsView.swift @@ -43,6 +43,10 @@ private var indent: CGFloat = 36 let chatArchiveTimeDefault = DateDefault(defaults: UserDefaults.standard, forKey: DEFAULT_CHAT_ARCHIVE_TIME) +func setGroupDefaults() { + privacyAcceptImagesGroupDefault.set(UserDefaults.standard.bool(forKey: DEFAULT_PRIVACY_ACCEPT_IMAGES)) +} + struct SettingsView: View { @Environment(\.colorScheme) var colorScheme @EnvironmentObject var chatModel: ChatModel diff --git a/apps/ios/SimpleX NSE/NotificationService.swift b/apps/ios/SimpleX NSE/NotificationService.swift index 0f93abd8b..05c24064e 100644 --- a/apps/ios/SimpleX NSE/NotificationService.swift +++ b/apps/ios/SimpleX NSE/NotificationService.swift @@ -111,27 +111,23 @@ func receiveMessageForNotification() -> UNNotificationContent? { if let res = recvSimpleXMsg() { logger.debug("NotificationService receiveMessages: \(res.responseType)") switch res { - // case let .newContactConnection(connection): - // case let .contactConnectionDeleted(connection): case let .contactConnected(contact): return createContactConnectedNtf(contact) // case let .contactConnecting(contact): // TODO profile update case let .receivedContactRequest(contactRequest): return createContactRequestNtf(contactRequest) - // case let .contactUpdated(toContact): - // TODO profile updated case let .newChatItem(aChatItem): let cInfo = aChatItem.chatInfo - let cItem = aChatItem.chatItem + var cItem = aChatItem.chatItem + if case .image = cItem.content.msgContent { + if let file = cItem.file, + file.fileSize <= maxImageSize, + privacyAcceptImagesGroupDefault.get() { + cItem = apiReceiveFile(fileId: file.fileId)?.chatItem ?? cItem + } + } return createMessageReceivedNtf(cInfo, cItem) - // case let .chatItemUpdated(aChatItem): - // TODO message updated - // let cInfo = aChatItem.chatInfo - // let cItem = aChatItem.chatItem - // NtfManager.shared.notifyMessageReceived(cInfo, cItem) - // case let .chatItemDeleted(_, toChatItem): - // TODO message updated // case let .rcvFileComplete(aChatItem): // TODO file received? // let cInfo = aChatItem.chatInfo @@ -183,6 +179,13 @@ func apiGetNtfMessage(nonce: String, encNtfInfo: String) -> NtfMessages? { return nil } +func apiReceiveFile(fileId: Int64) -> AChatItem? { + let r = sendSimpleXCmd(.receiveFile(fileId: fileId)) + if case let .rcvFileAccepted(chatItem) = r { return chatItem } + logger.error("receiveFile error: \(responseError(r))") + return nil +} + struct NtfMessages { var connEntity: ConnectionEntity? var msgTs: Date? diff --git a/apps/ios/SimpleXChat/AppGroup.swift b/apps/ios/SimpleXChat/AppGroup.swift index 708907bd3..a093082b7 100644 --- a/apps/ios/SimpleXChat/AppGroup.swift +++ b/apps/ios/SimpleXChat/AppGroup.swift @@ -13,6 +13,7 @@ let GROUP_DEFAULT_APP_STATE = "appState" 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 APP_GROUP_NAME = "group.chat.simplex.app" @@ -59,6 +60,8 @@ public let ntfPreviewModeGroupDefault = EnumDefault( withDefault: .message ) +public let privacyAcceptImagesGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_ACCEPT_IMAGES) + public class DateDefault { var defaults: UserDefaults var key: String @@ -103,3 +106,22 @@ public class EnumDefault where T.RawValue == String { defaults.synchronize() } } + +public class BoolDefault { + var defaults: UserDefaults + var key: String + + public init(defaults: UserDefaults = UserDefaults.standard, forKey: String) { + self.defaults = defaults + self.key = forKey + } + + public func get() -> Bool { + defaults.bool(forKey: key) + } + + public func set(_ value: Bool) { + defaults.set(value, forKey: key) + defaults.synchronize() + } +}