diff --git a/Riot.xcodeproj/project.pbxproj b/Riot.xcodeproj/project.pbxproj index 4c0e2bac2..8dbf16f81 100644 --- a/Riot.xcodeproj/project.pbxproj +++ b/Riot.xcodeproj/project.pbxproj @@ -332,6 +332,8 @@ B19C4E8E248F7A0E009A423F /* SecretsRecoveryWithPassphraseCoordinatorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19C4E86248F7A0D009A423F /* SecretsRecoveryWithPassphraseCoordinatorType.swift */; }; B19C4E8F248F7A0E009A423F /* SecretsRecoveryWithPassphraseViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19C4E87248F7A0D009A423F /* SecretsRecoveryWithPassphraseViewModelType.swift */; }; B19C4E90248F7A0E009A423F /* SecretsRecoveryWithPassphraseViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B19C4E88248F7A0E009A423F /* SecretsRecoveryWithPassphraseViewController.storyboard */; }; + B19C4E92249223D0009A423F /* SecretsRecoveryGoal.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19C4E91249223D0009A423F /* SecretsRecoveryGoal.swift */; }; + B19C4E9424922403009A423F /* SecretsRecoveryMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19C4E9324922403009A423F /* SecretsRecoveryMode.swift */; }; B19EFA3921F8BB2C00FC070E /* KeyBackupRecoverCoordinatorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19EFA3821F8BB2C00FC070E /* KeyBackupRecoverCoordinatorType.swift */; }; B19EFA3B21F8BB4100FC070E /* KeyBackupRecoverCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19EFA3A21F8BB4100FC070E /* KeyBackupRecoverCoordinator.swift */; }; B1A5B33E227ADF2A004CBA85 /* UIImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1A5B33D227ADF2A004CBA85 /* UIImage.swift */; }; @@ -1203,6 +1205,8 @@ B19C4E86248F7A0D009A423F /* SecretsRecoveryWithPassphraseCoordinatorType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretsRecoveryWithPassphraseCoordinatorType.swift; sourceTree = ""; }; B19C4E87248F7A0D009A423F /* SecretsRecoveryWithPassphraseViewModelType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretsRecoveryWithPassphraseViewModelType.swift; sourceTree = ""; }; B19C4E88248F7A0E009A423F /* SecretsRecoveryWithPassphraseViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = SecretsRecoveryWithPassphraseViewController.storyboard; sourceTree = ""; }; + B19C4E91249223D0009A423F /* SecretsRecoveryGoal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretsRecoveryGoal.swift; sourceTree = ""; }; + B19C4E9324922403009A423F /* SecretsRecoveryMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretsRecoveryMode.swift; sourceTree = ""; }; B19EFA3821F8BB2C00FC070E /* KeyBackupRecoverCoordinatorType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyBackupRecoverCoordinatorType.swift; sourceTree = ""; }; B19EFA3A21F8BB4100FC070E /* KeyBackupRecoverCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyBackupRecoverCoordinator.swift; sourceTree = ""; }; B1A5B33D227ADF2A004CBA85 /* UIImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIImage.swift; sourceTree = ""; }; @@ -2815,6 +2819,8 @@ children = ( B19C4E6D248F79EE009A423F /* SecretsRecoveryCoordinatorType.swift */, B19C4E6E248F79EF009A423F /* SecretsRecoveryCoordinator.swift */, + B19C4E9324922403009A423F /* SecretsRecoveryMode.swift */, + B19C4E91249223D0009A423F /* SecretsRecoveryGoal.swift */, B19C4E6B248E993F009A423F /* RecoverWithPassphrase */, B19C4E6C248E994D009A423F /* RecoverWithKey */, ); @@ -5333,6 +5339,7 @@ 32863A5C2384074C00D07C4A /* RiotSettingAllowedWidgets.swift in Sources */, B1B9DEDA22E9B7350065E677 /* SerializationService.swift in Sources */, B1B5572520EE6C4D00210D55 /* RoomMessagesSearchViewController.m in Sources */, + B19C4E9424922403009A423F /* SecretsRecoveryMode.swift in Sources */, B197B7C6243DE947005ABBF3 /* EncryptionTrustLevelBadgeImageHelper.swift in Sources */, B12D79FD23E2462200FACEDC /* UserVerificationStartViewModelType.swift in Sources */, B1C543AE23A286A000DCA1FA /* KeyVerificationRequestStatusBubbleCell.swift in Sources */, @@ -5383,6 +5390,7 @@ 32D5D16023E1EE2700E3E37C /* ManageSessionViewController.m in Sources */, B1B5573220EE6C4D00210D55 /* GroupHomeViewController.m in Sources */, B1B5595220EF9A8700210D55 /* RecentTableViewCell.m in Sources */, + B19C4E92249223D0009A423F /* SecretsRecoveryGoal.swift in Sources */, 32F6B96C2270623100BBA352 /* KeyVerificationDataLoadingCoordinatorType.swift in Sources */, B14084CA23BF89310010F692 /* KeyVerificationRequestStatusWithPaginationTitleBubbleCell.swift in Sources */, B157A7B42445BD86008A5504 /* KeyVerificationScanConfirmationViewState.swift in Sources */, diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index ed60025d8..eb2d3e589 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -1315,14 +1315,14 @@ // MARK: - Secrets recovery -"secrets_recovery_title" = "Recover secrets"; - // Recover with passphrase -"secrets_recovery_with_passphrase_information" = "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase."; +"secrets_recovery_with_passphrase_title" = "Recovery Passphrase"; +"secrets_recovery_with_passphrase_information_default" = "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase."; +"secrets_recovery_with_passphrase_information_verify_device" = "Use your Recovery Passphrase to verify this device."; "secrets_recovery_with_passphrase_passphrase_title" = "Enter"; -"secrets_recovery_with_passphrase_passphrase_placeholder" = "Enter Passphrase"; -"secrets_recovery_with_passphrase_recover_action" = "Recover secrets"; +"secrets_recovery_with_passphrase_passphrase_placeholder" = "Enter Recovery Passphrase"; +"secrets_recovery_with_passphrase_recover_action" = "Use Passphrase"; "secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Don’t know your recovery passphrase? You can "; "secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "use your recovery key"; @@ -1333,10 +1333,12 @@ // Recover with key -"secrets_recovery_with_key_information" = "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key."; +"secrets_recovery_with_key_title" = "Recovery Key"; +"secrets_recovery_with_key_information_default" = "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key."; +"secrets_recovery_with_key_information_verify_device" = "Use your Recovery Key to verify this device."; "secrets_recovery_with_key_recovery_key_title" = "Enter"; "secrets_recovery_with_key_recovery_key_placeholder" = "Enter Recovery Key"; -"secrets_recovery_with_key_recover_action" = "Recover secrets"; +"secrets_recovery_with_key_recover_action" = "Use Key"; "secrets_recovery_with_key_invalid_recovery_key_title" = "Unable to access secret storage"; "secrets_recovery_with_key_invalid_recovery_key_message" = "Please verify that you entered the correct recovery key."; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index d5f5e047e..c5b8032ec 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -2926,13 +2926,13 @@ internal enum VectorL10n { internal static var searchRooms: String { return VectorL10n.tr("Vector", "search_rooms") } - /// Recover secrets - internal static var secretsRecoveryTitle: String { - return VectorL10n.tr("Vector", "secrets_recovery_title") - } /// Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key. - internal static var secretsRecoveryWithKeyInformation: String { - return VectorL10n.tr("Vector", "secrets_recovery_with_key_information") + internal static var secretsRecoveryWithKeyInformationDefault: String { + return VectorL10n.tr("Vector", "secrets_recovery_with_key_information_default") + } + /// Use your Recovery Key to verify this device. + internal static var secretsRecoveryWithKeyInformationVerifyDevice: String { + return VectorL10n.tr("Vector", "secrets_recovery_with_key_information_verify_device") } /// Please verify that you entered the correct recovery key. internal static var secretsRecoveryWithKeyInvalidRecoveryKeyMessage: String { @@ -2942,7 +2942,7 @@ internal enum VectorL10n { internal static var secretsRecoveryWithKeyInvalidRecoveryKeyTitle: String { return VectorL10n.tr("Vector", "secrets_recovery_with_key_invalid_recovery_key_title") } - /// Recover secrets + /// Use Key internal static var secretsRecoveryWithKeyRecoverAction: String { return VectorL10n.tr("Vector", "secrets_recovery_with_key_recover_action") } @@ -2954,9 +2954,17 @@ internal enum VectorL10n { internal static var secretsRecoveryWithKeyRecoveryKeyTitle: String { return VectorL10n.tr("Vector", "secrets_recovery_with_key_recovery_key_title") } + /// Recovery Key + internal static var secretsRecoveryWithKeyTitle: String { + return VectorL10n.tr("Vector", "secrets_recovery_with_key_title") + } /// Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase. - internal static var secretsRecoveryWithPassphraseInformation: String { - return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_information") + internal static var secretsRecoveryWithPassphraseInformationDefault: String { + return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_information_default") + } + /// Use your Recovery Passphrase to verify this device. + internal static var secretsRecoveryWithPassphraseInformationVerifyDevice: String { + return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_information_verify_device") } /// Please verify that you entered the correct recovery passphrase. internal static var secretsRecoveryWithPassphraseInvalidPassphraseMessage: String { @@ -2978,7 +2986,7 @@ internal enum VectorL10n { internal static var secretsRecoveryWithPassphraseLostPassphraseActionPart3: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_lost_passphrase_action_part3") } - /// Enter Passphrase + /// Enter Recovery Passphrase internal static var secretsRecoveryWithPassphrasePassphrasePlaceholder: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_passphrase_placeholder") } @@ -2986,10 +2994,14 @@ internal enum VectorL10n { internal static var secretsRecoveryWithPassphrasePassphraseTitle: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_passphrase_title") } - /// Recover secrets + /// Use Passphrase internal static var secretsRecoveryWithPassphraseRecoverAction: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_recover_action") } + /// Recovery Passphrase + internal static var secretsRecoveryWithPassphraseTitle: String { + return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_title") + } /// ADVANCED internal static var securitySettingsAdvanced: String { return VectorL10n.tr("Vector", "security_settings_advanced") diff --git a/Riot/Modules/KeyVerification/Common/KeyVerificationCoordinator.swift b/Riot/Modules/KeyVerification/Common/KeyVerificationCoordinator.swift index 37e097b28..856d106f4 100644 --- a/Riot/Modules/KeyVerification/Common/KeyVerificationCoordinator.swift +++ b/Riot/Modules/KeyVerification/Common/KeyVerificationCoordinator.swift @@ -174,7 +174,7 @@ final class KeyVerificationCoordinator: KeyVerificationCoordinatorType { } private func showSecretsRecovery(with recoveryMode: SecretsRecoveryMode) { - let coordinator = SecretsRecoveryCoordinator(session: self.session, recoveryMode: recoveryMode, navigationRouter: self.navigationRouter) + let coordinator = SecretsRecoveryCoordinator(session: self.session, recoveryMode: recoveryMode, recoveryGoal: .verifyDevice, navigationRouter: self.navigationRouter) coordinator.delegate = self coordinator.start() diff --git a/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyCoordinator.swift b/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyCoordinator.swift index 5a6b2ca7d..7db8d0bf3 100644 --- a/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyCoordinator.swift +++ b/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyCoordinator.swift @@ -33,9 +33,9 @@ final class SecretsRecoveryWithKeyCoordinator: SecretsRecoveryWithKeyCoordinator // MARK: - Setup - init(recoveryService: MXRecoveryService) { + init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal) { - let secretsRecoveryWithKeyViewModel = SecretsRecoveryWithKeyViewModel(recoveryService: recoveryService) + let secretsRecoveryWithKeyViewModel = SecretsRecoveryWithKeyViewModel(recoveryService: recoveryService, recoveryGoal: recoveryGoal) let secretsRecoveryWithKeyViewController = SecretsRecoveryWithKeyViewController.instantiate(with: secretsRecoveryWithKeyViewModel) self.secretsRecoveryWithKeyViewController = secretsRecoveryWithKeyViewController self.secretsRecoveryWithKeyViewModel = secretsRecoveryWithKeyViewModel diff --git a/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewController.storyboard b/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewController.storyboard index 3d2e9634f..d9118f291 100644 --- a/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewController.storyboard +++ b/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewController.storyboard @@ -22,26 +22,26 @@ - + - + - - + + - - + + - + - + - - + - - + + + + @@ -169,7 +171,6 @@ - @@ -184,6 +185,6 @@ - + diff --git a/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewController.swift b/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewController.swift index 1c4057fed..c7cacc1af 100644 --- a/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewController.swift +++ b/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewController.swift @@ -35,8 +35,7 @@ final class SecretsRecoveryWithKeyViewController: UIViewController { @IBOutlet private weak var importFileButton: UIButton! - @IBOutlet private weak var recoverButtonBackgroundView: UIView! - @IBOutlet private weak var recoverButton: UIButton! + @IBOutlet private weak var recoverButton: RoundedButton! // MARK: Private @@ -90,14 +89,23 @@ final class SecretsRecoveryWithKeyViewController: UIViewController { } self.navigationItem.rightBarButtonItem = cancelBarButtonItem - self.title = VectorL10n.secretsRecoveryTitle + self.title = VectorL10n.secretsRecoveryWithKeyTitle self.scrollView.keyboardDismissMode = .interactive - let shieldImage = Asset.Images.keyBackupLogo.image.withRenderingMode(.alwaysTemplate) + let shieldImage = Asset.Images.secretsRecoveryKey.image.withRenderingMode(.alwaysTemplate) self.shieldImageView.image = shieldImage - self.informationLabel.text = VectorL10n.secretsRecoveryWithKeyInformation + let informationText: String + + switch self.viewModel.recoveryGoal { + case .default: + informationText = VectorL10n.secretsRecoveryWithKeyInformationDefault + case .verifyDevice: + informationText = VectorL10n.secretsRecoveryWithKeyInformationVerifyDevice + } + + self.informationLabel.text = informationText self.recoveryKeyTitleLabel.text = VectorL10n.secretsRecoveryWithKeyRecoveryKeyTitle self.recoveryKeyTextField.addTarget(self, action: #selector(recoveryKeyTextFieldDidChange(_:)), for: .editingChanged) @@ -129,11 +137,9 @@ final class SecretsRecoveryWithKeyViewController: UIViewController { theme.applyStyle(onTextField: self.recoveryKeyTextField) self.recoveryKeyTextField.attributedPlaceholder = NSAttributedString(string: VectorL10n.secretsRecoveryWithKeyRecoveryKeyPlaceholder, attributes: [.foregroundColor: theme.placeholderTextColor]) + theme.applyStyle(onButton: self.importFileButton) - theme.applyStyle(onButton: self.importFileButton) - - self.recoverButtonBackgroundView.backgroundColor = theme.backgroundColor - theme.applyStyle(onButton: self.recoverButton) + self.recoverButton.update(theme: theme) } private func registerThemeServiceDidChangeThemeNotification() { diff --git a/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewModel.swift b/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewModel.swift index 9d2d5f39d..cc0ea1d11 100644 --- a/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewModel.swift +++ b/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewModel.swift @@ -26,6 +26,8 @@ final class SecretsRecoveryWithKeyViewModel: SecretsRecoveryWithKeyViewModelType // MARK: Public + let recoveryGoal: SecretsRecoveryGoal + var recoveryKey: String? var isFormValid: Bool { @@ -37,8 +39,9 @@ final class SecretsRecoveryWithKeyViewModel: SecretsRecoveryWithKeyViewModelType // MARK: - Setup - init(recoveryService: MXRecoveryService) { + init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal) { self.recoveryService = recoveryService + self.recoveryGoal = recoveryGoal } // MARK: - Public diff --git a/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewModelType.swift b/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewModelType.swift index 384f74c2a..62faee9b5 100644 --- a/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewModelType.swift +++ b/Riot/Modules/SecretsRecovery/RecoverWithKey/SecretsRecoveryWithKeyViewModelType.swift @@ -30,6 +30,7 @@ protocol SecretsRecoveryWithKeyViewModelType { var recoveryKey: String? { get set } var isFormValid: Bool { get } + var recoveryGoal: SecretsRecoveryGoal { get } var viewDelegate: SecretsRecoveryWithKeyViewModelViewDelegate? { get set } var coordinatorDelegate: SecretsRecoveryWithKeyViewModelCoordinatorDelegate? { get set } diff --git a/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseCoordinator.swift b/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseCoordinator.swift index 1c7f753db..38c0b56f6 100644 --- a/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseCoordinator.swift +++ b/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseCoordinator.swift @@ -33,8 +33,8 @@ final class SecretsRecoveryWithPassphraseCoordinator: SecretsRecoveryWithPassphr // MARK: - Setup - init(recoveryService: MXRecoveryService) { - let secretsRecoveryWithPassphraseViewModel = SecretsRecoveryWithPassphraseViewModel(recoveryService: recoveryService) + init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal) { + let secretsRecoveryWithPassphraseViewModel = SecretsRecoveryWithPassphraseViewModel(recoveryService: recoveryService, recoveryGoal: recoveryGoal) let secretsRecoveryWithPassphraseViewController = SecretsRecoveryWithPassphraseViewController.instantiate(with: secretsRecoveryWithPassphraseViewModel) self.secretsRecoveryWithPassphraseViewController = secretsRecoveryWithPassphraseViewController self.secretsRecoveryWithPassphraseViewModel = secretsRecoveryWithPassphraseViewModel diff --git a/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewController.storyboard b/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewController.storyboard index b226e205c..8e16c1993 100644 --- a/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewController.storyboard +++ b/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewController.storyboard @@ -22,27 +22,27 @@ - + - + - - + + - - + + - + - + - - + - + - + @@ -160,6 +160,8 @@ + + @@ -193,7 +195,6 @@ - @@ -205,7 +206,7 @@ - + diff --git a/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewController.swift b/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewController.swift index 232b05978..e542e7f79 100644 --- a/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewController.swift +++ b/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewController.swift @@ -35,9 +35,8 @@ final class SecretsRecoveryWithPassphraseViewController: UIViewController { @IBOutlet private weak var passphraseVisibilityButton: UIButton! @IBOutlet private weak var useRecoveryKeyButton: UIButton! - - @IBOutlet private weak var recoverButtonBackgroundView: UIView! - @IBOutlet private weak var recoverButton: UIButton! + + @IBOutlet private weak var recoverButton: RoundedButton! // MARK: Private @@ -90,17 +89,26 @@ final class SecretsRecoveryWithPassphraseViewController: UIViewController { } self.navigationItem.rightBarButtonItem = cancelBarButtonItem - self.title = VectorL10n.secretsRecoveryTitle + self.title = VectorL10n.secretsRecoveryWithPassphraseTitle self.scrollView.keyboardDismissMode = .interactive - let shieldImage = Asset.Images.keyBackupLogo.image.withRenderingMode(.alwaysTemplate) + let shieldImage = Asset.Images.secretsRecoveryPassphrase.image.withRenderingMode(.alwaysTemplate) self.shieldImageView.image = shieldImage let visibilityImage = Asset.Images.revealPasswordButton.image.withRenderingMode(.alwaysTemplate) self.passphraseVisibilityButton.setImage(visibilityImage, for: .normal) - self.informationLabel.text = VectorL10n.secretsRecoveryWithPassphraseInformation + let informationText: String + + switch self.viewModel.recoveryGoal { + case .default: + informationText = VectorL10n.secretsRecoveryWithPassphraseInformationDefault + case .verifyDevice: + informationText = VectorL10n.secretsRecoveryWithPassphraseInformationVerifyDevice + } + + self.informationLabel.text = informationText self.passphraseTitleLabel.text = VectorL10n.secretsRecoveryWithPassphrasePassphraseTitle self.passphraseTextField.addTarget(self, action: #selector(passphraseTextFieldDidChange(_:)), for: .editingChanged) @@ -134,8 +142,7 @@ final class SecretsRecoveryWithPassphraseViewController: UIViewController { self.theme.applyStyle(onButton: self.passphraseVisibilityButton) - self.recoverButtonBackgroundView.backgroundColor = theme.backgroundColor - theme.applyStyle(onButton: self.recoverButton) + self.recoverButton.update(theme: theme) let useRecoveryKeyAttributedString = NSMutableAttributedString(string: VectorL10n.secretsRecoveryWithPassphraseLostPassphraseActionPart1, attributes: [.foregroundColor: self.theme.textPrimaryColor]) let unknownRecoveryKeyAttributedStringPart2 = NSAttributedString(string: VectorL10n.secretsRecoveryWithPassphraseLostPassphraseActionPart2, attributes: [.foregroundColor: self.theme.tintColor]) diff --git a/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModel.swift b/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModel.swift index e08c92e87..ee1320be4 100644 --- a/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModel.swift +++ b/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModel.swift @@ -26,6 +26,8 @@ final class SecretsRecoveryWithPassphraseViewModel: SecretsRecoveryWithPassphras // MARK: Public + let recoveryGoal: SecretsRecoveryGoal + var passphrase: String? var isFormValid: Bool { @@ -37,8 +39,9 @@ final class SecretsRecoveryWithPassphraseViewModel: SecretsRecoveryWithPassphras // MARK: - Setup - init(recoveryService: MXRecoveryService) { + init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal) { self.recoveryService = recoveryService + self.recoveryGoal = recoveryGoal } // MARK: - Public diff --git a/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModelType.swift b/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModelType.swift index 4d86dcefa..307d351a4 100644 --- a/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModelType.swift +++ b/Riot/Modules/SecretsRecovery/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModelType.swift @@ -31,6 +31,7 @@ protocol SecretsRecoveryWithPassphraseViewModelType { var passphrase: String? { get set } var isFormValid: Bool { get } + var recoveryGoal: SecretsRecoveryGoal { get } var viewDelegate: SecretsRecoveryWithPassphraseViewModelViewDelegate? { get set } var coordinatorDelegate: SecretsRecoveryWithPassphraseViewModelCoordinatorDelegate? { get set } diff --git a/Riot/Modules/SecretsRecovery/SecretsRecoveryCoordinator.swift b/Riot/Modules/SecretsRecovery/SecretsRecoveryCoordinator.swift index d58db6a96..3faacb956 100644 --- a/Riot/Modules/SecretsRecovery/SecretsRecoveryCoordinator.swift +++ b/Riot/Modules/SecretsRecovery/SecretsRecoveryCoordinator.swift @@ -16,11 +16,6 @@ import Foundation -enum SecretsRecoveryMode { - case passphraseOrKey - case onlyKey -} - final class SecretsRecoveryCoordinator: SecretsRecoveryCoordinatorType { // MARK: - Properties @@ -30,6 +25,7 @@ final class SecretsRecoveryCoordinator: SecretsRecoveryCoordinatorType { private let session: MXSession private let navigationRouter: NavigationRouterType private let recoveryMode: SecretsRecoveryMode + private let recoveryGoal: SecretsRecoveryGoal // MARK: Public @@ -39,9 +35,10 @@ final class SecretsRecoveryCoordinator: SecretsRecoveryCoordinatorType { // MARK: - Setup - init(session: MXSession, recoveryMode: SecretsRecoveryMode, navigationRouter: NavigationRouterType? = nil) { + init(session: MXSession, recoveryMode: SecretsRecoveryMode, recoveryGoal: SecretsRecoveryGoal, navigationRouter: NavigationRouterType? = nil) { self.session = session self.recoveryMode = recoveryMode + self.recoveryGoal = recoveryGoal if let navigationRouter = navigationRouter { self.navigationRouter = navigationRouter @@ -85,13 +82,13 @@ final class SecretsRecoveryCoordinator: SecretsRecoveryCoordinatorType { // MARK: - Private private func createRecoverFromKeyCoordinator() -> SecretsRecoveryWithKeyCoordinator { - let coordinator = SecretsRecoveryWithKeyCoordinator(recoveryService: self.session.crypto.recoveryService) + let coordinator = SecretsRecoveryWithKeyCoordinator(recoveryService: self.session.crypto.recoveryService, recoveryGoal: self.recoveryGoal) coordinator.delegate = self return coordinator } private func createRecoverFromPassphraseCoordinator() -> SecretsRecoveryWithPassphraseCoordinator { - let coordinator = SecretsRecoveryWithPassphraseCoordinator(recoveryService: self.session.crypto.recoveryService) + let coordinator = SecretsRecoveryWithPassphraseCoordinator(recoveryService: self.session.crypto.recoveryService, recoveryGoal: self.recoveryGoal) coordinator.delegate = self return coordinator } diff --git a/Riot/Modules/SecretsRecovery/SecretsRecoveryGoal.swift b/Riot/Modules/SecretsRecovery/SecretsRecoveryGoal.swift new file mode 100644 index 000000000..1803300b7 --- /dev/null +++ b/Riot/Modules/SecretsRecovery/SecretsRecoveryGoal.swift @@ -0,0 +1,22 @@ +/* + Copyright 2020 New Vector Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import Foundation + +enum SecretsRecoveryGoal { + case `default` + case verifyDevice +} diff --git a/Riot/Modules/SecretsRecovery/SecretsRecoveryMode.swift b/Riot/Modules/SecretsRecovery/SecretsRecoveryMode.swift new file mode 100644 index 000000000..570366b9f --- /dev/null +++ b/Riot/Modules/SecretsRecovery/SecretsRecoveryMode.swift @@ -0,0 +1,22 @@ +/* + Copyright 2020 New Vector Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import Foundation + +enum SecretsRecoveryMode { + case passphraseOrKey + case onlyKey +}