diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift index 0e0db707f..de8381960 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift @@ -40,6 +40,7 @@ import UIKit private enum BackupRows { case info(text: String) case description(text: String) + case createSecureBackupAction case resetSecureBackupAction case createKeyBackupAction case restoreFromKeyBackupAction(keyBackupVersion: MXKeyBackupVersion, title: String) @@ -71,8 +72,8 @@ private enum BackupRows { // MARK: - Public - @objc init(withKeyBackup keyBackup: MXKeyBackup, userDevice: MXDeviceInfo) { - self.viewModel = SettingsSecureBackupViewModel(keyBackup: keyBackup) + @objc init(withRecoveryService recoveryService: MXRecoveryService, keyBackup: MXKeyBackup, userDevice: MXDeviceInfo) { + self.viewModel = SettingsSecureBackupViewModel(recoveryService: recoveryService, keyBackup: keyBackup) self.userDevice = userDevice super.init() self.viewModel.viewDelegate = self @@ -93,6 +94,8 @@ private enum BackupRows { cell = self.textCell(atRow: row, text: text) case .description(let text): cell = self.descriptionCell(atRow: row, text: text) + case .createSecureBackupAction: + cell = self.buttonCellForCreateSecureBackup(atRow: row) case .resetSecureBackupAction: cell = self.buttonCellForResetSecureBackup(atRow: row) case .createKeyBackupAction: @@ -127,6 +130,17 @@ private enum BackupRows { .description(text: VectorL10n.securitySettingsSecureBackupDescription) ] + case .noSecureBackup: + let noBackup = VectorL10n.settingsKeyBackupInfoNone + let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning + let infoText = [noBackup, signoutWarning].joined(separator: "\n") + + backupRows = [ + .info(text: infoText), + .createSecureBackupAction, + .description(text: VectorL10n.securitySettingsSecureBackupDescription) + ] + case .noKeyBackup: let noBackup = VectorL10n.settingsKeyBackupInfoNone let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning @@ -214,6 +228,25 @@ private enum BackupRows { // MARK: - Button cells + private func buttonCellForCreateSecureBackup(atRow row: Int) -> UITableViewCell { + + guard let delegate = self.delegate else { + return UITableViewCell() + } + + let cell: MXKTableViewCellWithButton = delegate.settingsSecureBackupTableViewSection(self, buttonCellForRow: row) + + let btnTitle = VectorL10n.securitySettingsSecureBackupSetup + cell.mxkButton.setTitle(btnTitle, for: .normal) + cell.mxkButton.setTitle(btnTitle, for: .highlighted) + + cell.mxkButton.vc_addAction { + self.viewModel.process(viewAction: .createSecureBackup) + } + + return cell + } + private func buttonCellForResetSecureBackup(atRow row: Int) -> UITableViewCell { guard let delegate = self.delegate else { diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift index 1d05cb393..2616d25cb 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift @@ -18,6 +18,7 @@ import UIKit enum SettingsSecureBackupViewAction { case load + case createSecureBackup case resetSecureBackup case createKeyBackup case restoreFromKeyBackup(MXKeyBackupVersion) diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift index 1100641fc..594fd8e3c 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift @@ -22,9 +22,11 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { weak var viewDelegate: SettingsSecureBackupViewModelViewDelegate? // MARK: Private + private let recoveryService: MXRecoveryService private let keyBackup: MXKeyBackup - init(keyBackup: MXKeyBackup) { + init(recoveryService: MXRecoveryService, keyBackup: MXKeyBackup) { + self.recoveryService = recoveryService self.keyBackup = keyBackup self.registerKeyBackupVersionDidChangeStateNotification() } @@ -46,7 +48,8 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { case .load: viewDelegate.settingsSecureBackupViewModel(self, didUpdateViewState: .checkingBackup) self.checkKeyBackupState() - case .resetSecureBackup: + case .resetSecureBackup, + .createSecureBackup: // The implement supports both viewDelegate.settingsSecureBackupViewModelShowSecureBackupReset(self) case .createKeyBackup: viewDelegate.settingsSecureBackupViewModelShowKeyBackupCreate(self) @@ -81,6 +84,12 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { } private func computeState(withBackupVersionTrust keyBackupVersionTrust: MXKeyBackupVersionTrust? = nil) { + + // We want to have a secure backup before having a key backup + if recoveryService.hasRecovery() == false { + self.viewDelegate?.settingsSecureBackupViewModel(self, didUpdateViewState: .noSecureBackup) + return + } var viewState: SettingsSecureBackupViewState? switch self.keyBackup.state { diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift index 8162faffc..e8b164338 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift @@ -26,6 +26,7 @@ import UIKit /// - keyBackupNotTrusted: There is a backup on the homeserver but it is not trusted enum SettingsSecureBackupViewState { case checkingBackup + case noSecureBackup case noKeyBackup case keyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust) case keyBackupAndRunning(MXKeyBackupVersion, MXKeyBackupVersionTrust, Progress)