diff --git a/Ring/Ring/Constants/Generated/Strings.swift b/Ring/Ring/Constants/Generated/Strings.swift index cd29b0af871757dacd2066e7af726ebd46f12b97..4a25d3303fcf086ce039120e1cc22439ba14cad0 100644 --- a/Ring/Ring/Constants/Generated/Strings.swift +++ b/Ring/Ring/Constants/Generated/Strings.swift @@ -453,8 +453,10 @@ internal enum L10n { internal static let turnServer = L10n.tr("Localizable", "accountPage.turnServer", fallback: "TURN address") /// TURN username internal static let turnUsername = L10n.tr("Localizable", "accountPage.turnUsername", fallback: "TURN username") - /// Typing indicator - internal static let typingIndicator = L10n.tr("Localizable", "accountPage.typingIndicator", fallback: "Typing indicator") + /// Enable typing indicator + internal static let typingIndicator = L10n.tr("Localizable", "accountPage.typingIndicator", fallback: "Enable typing indicator") + /// Send and receive typing indicators showing that a message is being typed. + internal static let typingIndicatorExplanation = L10n.tr("Localizable", "accountPage.typingIndicatorExplanation", fallback: "Send and receive typing indicators showing that a message is being typed.") /// Unblock internal static let unblockContact = L10n.tr("Localizable", "accountPage.unblockContact", fallback: "Unblock") /// Unlink diff --git a/Ring/Ring/Features/Settings/Me/AccountSettings.swift b/Ring/Ring/Features/Settings/Me/AccountSettings.swift index 5234b16a7910fad91d0016fafefd536138967dc5..a7bc27bb27ddb2c97053e091aa2796a413ded0b1 100644 --- a/Ring/Ring/Features/Settings/Me/AccountSettings.swift +++ b/Ring/Ring/Features/Settings/Me/AccountSettings.swift @@ -31,6 +31,7 @@ class AccountSettings: ObservableObject { @Published var showNotificationPermitionIssue: Bool = false @Published var upnpEnabled: Bool = false @Published var turnEnabled: Bool = false + @Published var typingIndicator: Bool = true @Published var autoRegistrationEnabled: Bool = false @Published var autoRegistrationExpirationTime = "" @@ -120,6 +121,7 @@ extension AccountSettings { self.proxyAddress = self.account.proxy self.callsFromUnknownContacts = self.getBoolState(for: ConfigKey.dhtPublicIn) self.peerDiscovery = self.getBoolState(for: ConfigKey.dhtPeerDiscovery) + self.typingIndicator = self.getBoolState(for: ConfigKey.typingIndicator) self.verifyNotificationPermissionStatus() observeNotificationPermissionChanges() } @@ -133,6 +135,15 @@ extension AccountSettings { self.callsFromUnknownContacts = enable } + func enableTypingIndicator(enable: Bool) { + if self.typingIndicator == enable { + return + } + let property = ConfigKeyModel(withKey: ConfigKey.typingIndicator) + self.accountService.switchAccountPropertyTo(state: enable, accountId: account.id, property: property) + self.typingIndicator = enable + } + func enableProxyList(enable: Bool) { if self.proxyListEnabled == enable { return diff --git a/Ring/Ring/Features/Settings/Me/AccountSettingsViews.swift b/Ring/Ring/Features/Settings/Me/AccountSettingsViews.swift index ad7e246ba8fd568b76e0d5dedd4372bb14168a7f..0b4d8de34f4d3427646a4c5057f08c6c94ab4484 100644 --- a/Ring/Ring/Features/Settings/Me/AccountSettingsViews.swift +++ b/Ring/Ring/Features/Settings/Me/AccountSettingsViews.swift @@ -42,6 +42,31 @@ struct CallSettingsView: View { } } +struct ChatSettingsView: View { + @StateObject var model: AccountSettings + + init(injectionBag: InjectionBag, account: AccountModel) { + _model = StateObject(wrappedValue: AccountSettings(account: account, injectionBag: injectionBag)) + } + + var body: some View { + List { + VStack(alignment: .leading) { + ToggleCell( + toggleText: L10n.AccountPage.typingIndicator, + getAction: { model.typingIndicator }, + setAction: { newValue in model.enableTypingIndicator(enable: newValue) } + ) + Text(L10n.AccountPage.typingIndicatorExplanation) + .font(.footnote) + .foregroundColor(Color(UIColor.secondaryLabel)) + } + } + .navigationBarTitleDisplayMode(.inline) + .navigationTitle(L10n.AccountPage.chats) + } +} + struct NotificationsSettingsView: View { @StateObject var model: AccountSettings diff --git a/Ring/Ring/Features/Settings/Me/SettingsSummaryView.swift b/Ring/Ring/Features/Settings/Me/SettingsSummaryView.swift index 64cf6320a5a75a1a0c1fa9f4f913803ccebd4577..575e0f6c4ff9fee8b46435f87aa79b51ba4bfbcc 100644 --- a/Ring/Ring/Features/Settings/Me/SettingsSummaryView.swift +++ b/Ring/Ring/Features/Settings/Me/SettingsSummaryView.swift @@ -31,6 +31,9 @@ struct SettingsSummaryView: View { SettingsRow(iconName: "shield", title: L10n.AccountPage.security) } } else { + NavigationLink(destination: ChatSettingsView(injectionBag: model.injectionBag, account: model.account)) { + SettingsRow(iconName: "message", title: L10n.AccountPage.chats) + } NavigationLink(destination: CallSettingsView(injectionBag: model.injectionBag, account: model.account)) { SettingsRow(iconName: "phone", title: L10n.Global.call) } diff --git a/Ring/Ring/Models/ConfigKeyModel.swift b/Ring/Ring/Models/ConfigKeyModel.swift index 3989539a8bb2ed2ce7e4e3afc9531cc2df64c1fa..d2918370c27ecaedc1769555a33607bd0f8a893e 100644 --- a/Ring/Ring/Models/ConfigKeyModel.swift +++ b/Ring/Ring/Models/ConfigKeyModel.swift @@ -111,6 +111,7 @@ enum ConfigKey: String { case accountPublish = "Account.accountPublish" case managerUri = "Account.managerUri" case managerUsername = "Account.managerUsername" + case typingIndicator = "Account.sendComposing" } /** diff --git a/Ring/Ring/Resources/en.lproj/Localizable.strings b/Ring/Ring/Resources/en.lproj/Localizable.strings index 6644c7df71744afc0a626e57eb69b8b6d05f05d2..0d6c502d0b4cb5991a617fbe0e1b7fceab0e1180 100644 --- a/Ring/Ring/Resources/en.lproj/Localizable.strings +++ b/Ring/Ring/Resources/en.lproj/Localizable.strings @@ -406,7 +406,8 @@ "accountPage.dhtConfiguration" = "OpenDHT configuration"; "accountPage.nameServer" = "Name server"; "accountPage.chats" = "Chats"; -"accountPage.typingIndicator" = "Typing indicator"; +"accountPage.typingIndicator" = "Enable typing indicator"; +"accountPage.typingIndicatorExplanation" = "Send and receive typing indicators showing that a message is being typed."; // Backup Account "backupAccount.explanation" = "This Jami account exists only on this device. The account will be lost if this device is lost or if the application is uninstalled. It is recommended to make a backup of this account.";