mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-11-12 11:38:01 +00:00
* plan: UI improvements to improve LLM usage via SimpleX * core, ui: types for chat layout * core, ui: settings for alternative terminal-like chat layout for managing LLMs or other service bots * plan: message priority * fixes * query plan * update plans * remove silent messages plan * rename migrations * implement layout * amend * fix * fix * fix * improve * time on the right, sender name in blue * no avatar in direct chats * better previews * update, fixes * update * time gap * changes * ui: terminal layout line heights, gaps and time placement * ui: simplify terminal meta layout, correct its docs and tests * ui: right-to-left emoji edge in terminal rows, time placement tests * android, desktop: raise Kotlin compiler memory to 4 GB * ui: terminal captions as follow-up text, classic event separators * ui: terminal media edge and overlay time, plan decisions * ui: simplify terminal row separation, correct doc line references * ui: keep the media time inside terminal rows, restore caption conditions * ui: terminal heading capitals at large font scales, idle live message time * ui: rename the classic voice-with-text flag, correct the meta copy docs * ui: smaller terminal layout diff, sender gap and meta names * ui: terminal row as tall as the media time * docs: remove the chat layout section from the bots readme * docs: shorten the terminal layout section of the chat view * core: address settings API as on master, /auto_accept reads the stored layout * ui: smaller terminal headings * ui: classic sender rows and avatar rule as on master * ui: classic reply quote text colour as on master * ios: keep the chat layout setting with other UI settings * ui: go-to button at the end of terminal rows, no gutter in direct chats * ui: forwarded arrow on the header line of terminal rows, above the time * ui: forwarded arrow centred above the time line of terminal rows --------- Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
112 lines
6.7 KiB
Swift
112 lines
6.7 KiB
Swift
//
|
|
// AppSettings.swift
|
|
// SimpleX (iOS)
|
|
//
|
|
// Created by Avently on 26.02.2024.
|
|
// Copyright © 2024 SimpleX Chat. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import SimpleXChat
|
|
import SwiftUI
|
|
|
|
extension AppSettings {
|
|
public func importIntoApp() {
|
|
let def = UserDefaults.standard
|
|
if var val = networkConfig {
|
|
// migrating from Android/desktop BUT shouldn't be here ever because it should be changed in migration stage
|
|
if case .onionViaSocks = val.hostMode {
|
|
val.hostMode = .publicHost
|
|
val.requiredHostMode = true
|
|
}
|
|
if val.socksProxy != nil {
|
|
val.socksProxy = networkProxy?.toProxyString()
|
|
setNetCfg(val, networkProxy: networkProxy)
|
|
} else {
|
|
val.socksProxy = nil
|
|
setNetCfg(val, networkProxy: nil)
|
|
}
|
|
}
|
|
if let val = networkProxy { networkProxyDefault.set(val) }
|
|
if let val = privacyEncryptLocalFiles { privacyEncryptLocalFilesGroupDefault.set(val) }
|
|
if let val = privacyAskToApproveRelays { privacyAskToApproveRelaysGroupDefault.set(val) }
|
|
if let val = privacyAcceptImages {
|
|
privacyAcceptImagesGroupDefault.set(val)
|
|
def.setValue(val, forKey: DEFAULT_PRIVACY_ACCEPT_IMAGES)
|
|
}
|
|
if let val = privacyLinkPreviews {
|
|
privacyLinkPreviewsGroupDefault.set(val)
|
|
def.setValue(val, forKey: DEFAULT_PRIVACY_LINK_PREVIEWS)
|
|
}
|
|
if let val = privacySanitizeLinks { privacySanitizeLinksGroupDefault.set(val) }
|
|
if let val = privacyShowChatPreviews { def.setValue(val, forKey: DEFAULT_PRIVACY_SHOW_CHAT_PREVIEWS) }
|
|
if let val = privacySaveLastDraft { def.setValue(val, forKey: DEFAULT_PRIVACY_SAVE_LAST_DRAFT) }
|
|
if let val = privacyProtectScreen { def.setValue(val, forKey: DEFAULT_PRIVACY_PROTECT_SCREEN) }
|
|
if let val = privacyMediaBlurRadius { def.setValue(val, forKey: DEFAULT_PRIVACY_MEDIA_BLUR_RADIUS) }
|
|
if let val = notificationMode { ChatModel.shared.notificationMode = val.toNotificationsMode() }
|
|
if let val = notificationPreviewMode { ntfPreviewModeGroupDefault.set(val) }
|
|
if let val = webrtcPolicyRelay { def.setValue(val, forKey: DEFAULT_WEBRTC_POLICY_RELAY) }
|
|
if let val = webrtcICEServers { def.setValue(val, forKey: DEFAULT_WEBRTC_ICE_SERVERS) }
|
|
if let val = confirmRemoteSessions { def.setValue(val, forKey: DEFAULT_CONFIRM_REMOTE_SESSIONS) }
|
|
if let val = connectRemoteViaMulticast { def.setValue(val, forKey: DEFAULT_CONNECT_REMOTE_VIA_MULTICAST) }
|
|
if let val = connectRemoteViaMulticastAuto { def.setValue(val, forKey: DEFAULT_CONNECT_REMOTE_VIA_MULTICAST_AUTO) }
|
|
if let val = developerTools { def.setValue(val, forKey: DEFAULT_DEVELOPER_TOOLS) }
|
|
if let val = confirmDBUpgrades { confirmDBUpgradesGroupDefault.set(val) }
|
|
if let val = androidCallOnLockScreen { def.setValue(val.rawValue, forKey: ANDROID_DEFAULT_CALL_ON_LOCK_SCREEN) }
|
|
if let val = iosCallKitEnabled { callKitEnabledGroupDefault.set(val) }
|
|
if let val = iosCallKitCallsInRecents { def.setValue(val, forKey: DEFAULT_CALL_KIT_CALLS_IN_RECENTS) }
|
|
if let val = uiProfileImageCornerRadius {
|
|
profileImageCornerRadiusGroupDefault.set(val)
|
|
def.setValue(val, forKey: DEFAULT_PROFILE_IMAGE_CORNER_RADIUS)
|
|
}
|
|
if let val = uiChatItemRoundness { def.setValue(val, forKey: DEFAULT_CHAT_ITEM_ROUNDNESS)}
|
|
if let val = uiChatItemTail { def.setValue(val, forKey: DEFAULT_CHAT_ITEM_TAIL)}
|
|
if let val = uiColorScheme { currentThemeDefault.set(val) }
|
|
if let val = uiDarkColorScheme { systemDarkThemeDefault.set(val) }
|
|
if let val = uiCurrentThemeIds { currentThemeIdsDefault.set(val) }
|
|
if let val = uiThemes { themeOverridesDefault.set(val.skipDuplicates()) }
|
|
if let val = oneHandUI { groupDefaults.setValue(val, forKey: GROUP_DEFAULT_ONE_HAND_UI) }
|
|
if let val = chatBottomBar { groupDefaults.setValue(val, forKey: GROUP_DEFAULT_CHAT_BOTTOM_BAR) }
|
|
if let val = uiChatLayout { chatLayoutDefault.set(val) }
|
|
}
|
|
|
|
public static var current: AppSettings {
|
|
let def = UserDefaults.standard
|
|
var c = AppSettings.defaults
|
|
c.networkConfig = getNetCfg()
|
|
c.networkProxy = networkProxyDefault.get()
|
|
c.privacyEncryptLocalFiles = privacyEncryptLocalFilesGroupDefault.get()
|
|
c.privacyAskToApproveRelays = privacyAskToApproveRelaysGroupDefault.get()
|
|
c.privacyAcceptImages = privacyAcceptImagesGroupDefault.get()
|
|
c.privacyLinkPreviews = privacyLinkPreviewsGroupDefault.get()
|
|
c.privacySanitizeLinks = privacySanitizeLinksGroupDefault.get()
|
|
c.privacyShowChatPreviews = def.bool(forKey: DEFAULT_PRIVACY_SHOW_CHAT_PREVIEWS)
|
|
c.privacySaveLastDraft = def.bool(forKey: DEFAULT_PRIVACY_SAVE_LAST_DRAFT)
|
|
c.privacyProtectScreen = def.bool(forKey: DEFAULT_PRIVACY_PROTECT_SCREEN)
|
|
c.privacyMediaBlurRadius = def.integer(forKey: DEFAULT_PRIVACY_MEDIA_BLUR_RADIUS)
|
|
c.notificationMode = AppSettingsNotificationMode.from(ChatModel.shared.notificationMode)
|
|
c.notificationPreviewMode = ntfPreviewModeGroupDefault.get()
|
|
c.webrtcPolicyRelay = def.bool(forKey: DEFAULT_WEBRTC_POLICY_RELAY)
|
|
c.webrtcICEServers = def.stringArray(forKey: DEFAULT_WEBRTC_ICE_SERVERS)
|
|
c.confirmRemoteSessions = def.bool(forKey: DEFAULT_CONFIRM_REMOTE_SESSIONS)
|
|
c.connectRemoteViaMulticast = def.bool(forKey: DEFAULT_CONNECT_REMOTE_VIA_MULTICAST)
|
|
c.connectRemoteViaMulticastAuto = def.bool(forKey: DEFAULT_CONNECT_REMOTE_VIA_MULTICAST_AUTO)
|
|
c.developerTools = def.bool(forKey: DEFAULT_DEVELOPER_TOOLS)
|
|
c.confirmDBUpgrades = confirmDBUpgradesGroupDefault.get()
|
|
c.androidCallOnLockScreen = AppSettingsLockScreenCalls(rawValue: def.string(forKey: ANDROID_DEFAULT_CALL_ON_LOCK_SCREEN)!)
|
|
c.iosCallKitEnabled = callKitEnabledGroupDefault.get()
|
|
c.iosCallKitCallsInRecents = def.bool(forKey: DEFAULT_CALL_KIT_CALLS_IN_RECENTS)
|
|
c.uiProfileImageCornerRadius = def.double(forKey: DEFAULT_PROFILE_IMAGE_CORNER_RADIUS)
|
|
c.uiChatItemRoundness = def.double(forKey: DEFAULT_CHAT_ITEM_ROUNDNESS)
|
|
c.uiChatItemTail = def.bool(forKey: DEFAULT_CHAT_ITEM_TAIL)
|
|
c.uiColorScheme = currentThemeDefault.get()
|
|
c.uiDarkColorScheme = systemDarkThemeDefault.get()
|
|
c.uiCurrentThemeIds = currentThemeIdsDefault.get()
|
|
c.uiThemes = themeOverridesDefault.get()
|
|
c.oneHandUI = groupDefaults.bool(forKey: GROUP_DEFAULT_ONE_HAND_UI)
|
|
c.chatBottomBar = groupDefaults.bool(forKey: GROUP_DEFAULT_CHAT_BOTTOM_BAR)
|
|
c.uiChatLayout = chatLayoutDefault.get()
|
|
return c
|
|
}
|
|
}
|