Merge pull request #7078 from vector-im/andy/large_backups

Import progress for room keys
This commit is contained in:
Anderas 2022-11-15 15:13:30 +00:00 committed by GitHub
commit 62980bed54
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 58 additions and 18 deletions

View file

@ -140,8 +140,20 @@ private enum BackupRows {
.info(text: infoText), .info(text: infoText),
.createSecureBackupAction .createSecureBackupAction
] ]
case .keyBackup(let keyBackupVersion, _, _), case .keyBackup(let keyBackupVersion, _, let progress):
.keyBackupNotTrusted(let keyBackupVersion, _): // Manage the key backup in the same way for the moment if let progress = progress {
backupRows = [
.info(text: importProgressText(for: progress)),
.deleteKeyBackupAction(keyBackupVersion: keyBackupVersion)
]
} else {
backupRows = [
.info(text: VectorL10n.securitySettingsSecureBackupInfoValid),
.restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore),
.deleteKeyBackupAction(keyBackupVersion: keyBackupVersion)
]
}
case .keyBackupNotTrusted(let keyBackupVersion, _):
backupRows = [ backupRows = [
.info(text: VectorL10n.securitySettingsSecureBackupInfoValid), .info(text: VectorL10n.securitySettingsSecureBackupInfoValid),
.restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore), .restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore),
@ -160,8 +172,22 @@ private enum BackupRows {
.createKeyBackupAction, .createKeyBackupAction,
.resetSecureBackupAction .resetSecureBackupAction
] ]
case .keyBackup(let keyBackupVersion, _, _), case .keyBackup(let keyBackupVersion, _, let progress):
.keyBackupNotTrusted(let keyBackupVersion, _): // Manage the key backup in the same way for the moment if let progress = progress {
backupRows = [
.info(text: importProgressText(for: progress)),
.deleteKeyBackupAction(keyBackupVersion: keyBackupVersion),
.resetSecureBackupAction
]
} else {
backupRows = [
.info(text: VectorL10n.securitySettingsSecureBackupInfoValid),
.restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore),
.deleteKeyBackupAction(keyBackupVersion: keyBackupVersion),
.resetSecureBackupAction
]
}
case .keyBackupNotTrusted(let keyBackupVersion, _):
backupRows = [ backupRows = [
.info(text: VectorL10n.securitySettingsSecureBackupInfoValid), .info(text: VectorL10n.securitySettingsSecureBackupInfoValid),
.restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore), .restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore),
@ -172,6 +198,11 @@ private enum BackupRows {
} }
self.backupRows = backupRows self.backupRows = backupRows
} }
private func importProgressText(for progress: Progress) -> String {
let percentage = Int(round(progress.fractionCompleted * 100))
return VectorL10n.keyBackupRecoverFromPrivateKeyInfo + " \(percentage)%"
}
// MARK: - Cells - // MARK: - Cells -

View file

@ -24,6 +24,7 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType {
// MARK: Private // MARK: Private
private let recoveryService: MXRecoveryService private let recoveryService: MXRecoveryService
private let keyBackup: MXKeyBackup private let keyBackup: MXKeyBackup
private var progressUpdateTimer: Timer?
init(recoveryService: MXRecoveryService, keyBackup: MXKeyBackup) { init(recoveryService: MXRecoveryService, keyBackup: MXKeyBackup) {
self.recoveryService = recoveryService self.recoveryService = recoveryService
@ -106,17 +107,13 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType {
guard let keyBackupVersion = self.keyBackup.keyBackupVersion, let keyBackupVersionTrust = keyBackupVersionTrust else { guard let keyBackupVersion = self.keyBackup.keyBackupVersion, let keyBackupVersionTrust = keyBackupVersionTrust else {
return return
} }
// Get the backup progress before updating the state let importProgress = keyBackup.importProgress
self.keyBackup.backupProgress { [weak self] (progress) in let keyBackupState: SettingsSecureBackupViewState.KeyBackupState = .keyBackup(keyBackupVersion, keyBackupVersionTrust, importProgress)
guard let self = self else { let viewState: SettingsSecureBackupViewState = self.recoveryService.hasRecovery() ? .secureBackup(keyBackupState) : .noSecureBackup(keyBackupState)
return self.viewDelegate?.settingsSecureBackupViewModel(self, didUpdateViewState: viewState)
} scheduleProgressUpdateIfNecessary(keyBackupVersionTrust: keyBackupVersionTrust, progress: importProgress)
let keyBackupState: SettingsSecureBackupViewState.KeyBackupState = .keyBackup(keyBackupVersion, keyBackupVersionTrust, progress)
let viewState: SettingsSecureBackupViewState = self.recoveryService.hasRecovery() ? .secureBackup(keyBackupState) : .noSecureBackup(keyBackupState)
self.viewDelegate?.settingsSecureBackupViewModel(self, didUpdateViewState: viewState)
}
default: default:
break break
} }
@ -130,6 +127,17 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType {
self.viewDelegate?.settingsSecureBackupViewModel(self, didUpdateViewState: viewState) self.viewDelegate?.settingsSecureBackupViewModel(self, didUpdateViewState: viewState)
} }
} }
private func scheduleProgressUpdateIfNecessary(keyBackupVersionTrust: MXKeyBackupVersionTrust, progress: Progress?) {
if progress != nil {
progressUpdateTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { [weak self] _ in
self?.computeState(withBackupVersionTrust: keyBackupVersionTrust)
}
} else {
progressUpdateTimer?.invalidate()
progressUpdateTimer = nil
}
}
private func deleteKeyBackupVersion(_ keyBackupVersion: MXKeyBackupVersion) { private func deleteKeyBackupVersion(_ keyBackupVersion: MXKeyBackupVersion) {
guard let keyBackupVersionVersion = keyBackupVersion.version else { guard let keyBackupVersionVersion = keyBackupVersion.version else {

View file

@ -35,7 +35,7 @@ enum SettingsSecureBackupViewState {
/// - keyBackupNotTrusted: There is a backup on the homeserver but it is not trusted /// - keyBackupNotTrusted: There is a backup on the homeserver but it is not trusted
enum KeyBackupState { enum KeyBackupState {
case noKeyBackup case noKeyBackup
case keyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust, Progress) case keyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust, Progress?)
case keyBackupNotTrusted(MXKeyBackupVersion, MXKeyBackupVersionTrust) case keyBackupNotTrusted(MXKeyBackupVersion, MXKeyBackupVersionTrust)
} }
} }

View file

@ -1218,9 +1218,9 @@ TableViewSectionsDelegate>
cell = [secureBackupSection cellForRowAtRow:rowTag]; cell = [secureBackupSection cellForRowAtRow:rowTag];
} }
#ifdef CROSS_SIGNING_AND_BACKUP_DEV #ifdef CROSS_SIGNING_AND_BACKUP_DEV
else if (section == SECTION_KEYBACKUP) else if (sectionTag == SECTION_KEYBACKUP)
{ {
cell = [keyBackupSection cellForRowAtRow:row]; cell = [keyBackupSection cellForRowAtRow:rowTag];
} }
#endif #endif
else if (sectionTag == SECTION_CROSSSIGNING) else if (sectionTag == SECTION_CROSSSIGNING)

View file

@ -0,0 +1 @@
CryptoV2: Import progress for room keys