Security settings: Manage the case when there is no secure backup

This commit is contained in:
manuroe 2021-06-16 11:50:50 +02:00
parent 5d526fdb82
commit ed7eb4edc6
4 changed files with 48 additions and 4 deletions

View file

@ -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 {

View file

@ -18,6 +18,7 @@ import UIKit
enum SettingsSecureBackupViewAction {
case load
case createSecureBackup
case resetSecureBackup
case createKeyBackup
case restoreFromKeyBackup(MXKeyBackupVersion)

View file

@ -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)
@ -82,6 +85,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 {

View file

@ -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)