diff --git a/Signal/src/ViewControllers/ProfileViewController.m b/Signal/src/ViewControllers/ProfileViewController.m index 38dd8f209..48cb042b7 100644 --- a/Signal/src/ViewControllers/ProfileViewController.m +++ b/Signal/src/ViewControllers/ProfileViewController.m @@ -421,11 +421,15 @@ NSString *const kProfileView_LastPresentedDate = @"kProfileView_LastPresentedDat - (void)updateProfileCompleted { + OWSLogVerbose(@""); + [self profileCompletedOrSkipped]; } - (void)profileCompletedOrSkipped { + OWSLogVerbose(@""); + // Dismiss this view. switch (self.profileViewMode) { case ProfileViewMode_AppSettings: @@ -446,11 +450,15 @@ NSString *const kProfileView_LastPresentedDate = @"kProfileView_LastPresentedDat - (void)showHomeView { + OWSLogVerbose(@""); + [SignalApp.sharedApp showHomeView]; } - (void)showBackupRestoreView { + OWSLogVerbose(@""); + BackupRestoreViewController *restoreView = [BackupRestoreViewController new]; [self.navigationController setViewControllers:@[ restoreView, @@ -460,39 +468,48 @@ NSString *const kProfileView_LastPresentedDate = @"kProfileView_LastPresentedDat - (void)checkCanImportBackup { + OWSLogVerbose(@""); + [OWSBackup.sharedManager checkCanImportBackup:^(BOOL value) { OWSLogInfo(@"has backup available for import? %d", value); if (value) { + [OWSBackup.sharedManager setHasPendingRestoreDecision:YES]; + [self showBackupRestoreView]; } else { [self showHomeView]; } } failure:^(NSError *error) { - UIAlertController *controller = [UIAlertController - alertControllerWithTitle: - NSLocalizedString(@"CHECK_FOR_BACKUP_FAILED_TITLE", - @"Title for alert shown when the app failed to check for an existing backup.") - message:NSLocalizedString(@"CHECK_FOR_BACKUP_FAILED_MESSAGE", - @"Message for alert shown when the app failed to check for an existing " - @"backup.") - preferredStyle:UIAlertControllerStyleAlert]; - [controller addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"REGISTER_FAILED_TRY_AGAIN", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action) { - [self checkCanImportBackup]; - }]]; - [controller - addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"CHECK_FOR_BACKUP_DO_NOT_RESTORE", + [self showBackupCheckFailedAlert]; + }]; +} + +- (void)showBackupCheckFailedAlert +{ + OWSLogVerbose(@""); + + UIAlertController *controller = [UIAlertController + alertControllerWithTitle:NSLocalizedString(@"CHECK_FOR_BACKUP_FAILED_TITLE", + @"Title for alert shown when the app failed to check for an existing backup.") + message:NSLocalizedString(@"CHECK_FOR_BACKUP_FAILED_MESSAGE", + @"Message for alert shown when the app failed to check for an existing " + @"backup.") + preferredStyle:UIAlertControllerStyleAlert]; + [controller addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"REGISTER_FAILED_TRY_AGAIN", nil) + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action) { + [self checkCanImportBackup]; + }]]; + [controller addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"CHECK_FOR_BACKUP_DO_NOT_RESTORE", @"The label for the 'do not restore backup' button.") style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) { [self showHomeView]; }]]; - [self presentViewController:controller animated:YES completion:nil]; - }]; + [self presentViewController:controller animated:YES completion:nil]; } #pragma mark - UITextFieldDelegate diff --git a/Signal/src/ViewControllers/Registration/BackupRestoreViewController.swift b/Signal/src/ViewControllers/Registration/BackupRestoreViewController.swift index dde82053a..15a8de5af 100644 --- a/Signal/src/ViewControllers/Registration/BackupRestoreViewController.swift +++ b/Signal/src/ViewControllers/Registration/BackupRestoreViewController.swift @@ -7,12 +7,14 @@ import UIKit @objc public class BackupRestoreViewController: OWSTableViewController { + private var hasBegunImport = false + private var backup: OWSBackup { return AppEnvironment.shared.backup } override public func loadView() { - navigationItem.title = NSLocalizedString("REMINDER_2FA_NAV_TITLE", comment: "Navbar title for when user is periodically prompted to enter their registration lock PIN") + navigationItem.title = NSLocalizedString("SETTINGS_BACKUP", comment: "Label for the backup view in app settings.") navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(didPressCancelButton)) } @@ -25,12 +27,44 @@ public class BackupRestoreViewController: OWSTableViewController { name: NSNotification.Name(NSNotificationNameBackupStateDidChange), object: nil) - backup.tryToImport() - updateTableContents() } private func updateTableContents() { + if hasBegunImport { + updateProgressContents() + } else { + updateDecisionContents() + } + } + + private func updateDecisionContents() { + let contents = OWSTableContents() + + let section = OWSTableSection() + + section.headerTitle = NSLocalizedString("BACKUP_RESTORE_DECISION_TITLE", comment: "Label for the backup restore decision section.") + + section.add(OWSTableItem.actionItem(withText: NSLocalizedString("CHECK_FOR_BACKUP_DO_NOT_RESTORE", + comment: "The label for the 'do not restore backup' button."), actionBlock: { [weak self] in + guard let strongSelf = self else { + return + } + strongSelf.cancelAndDismiss() + })) + section.add(OWSTableItem.actionItem(withText: NSLocalizedString("CHECK_FOR_BACKUP_RESTORE", + comment: "The label for the 'restore backup' button."), actionBlock: { [weak self] in + guard let strongSelf = self else { + return + } + strongSelf.startImport() + })) + + contents.addSection(section) + self.contents = contents + } + + private func updateProgressContents() { let contents = OWSTableContents() let section = OWSTableSection() @@ -70,9 +104,25 @@ public class BackupRestoreViewController: OWSTableViewController { // TODO: Cancel import. + cancelAndDismiss() + } + + @objc + private func cancelAndDismiss() { + Logger.info("") + + backup.setHasPendingRestoreDecision(false) + self.dismiss(animated: true) } + @objc + private func startImport() { + Logger.info("") + + backup.tryToImport() + } + private func showHomeView() { SignalApp.shared().showHomeView() } diff --git a/Signal/src/util/Backup/OWSBackup.h b/Signal/src/util/Backup/OWSBackup.h index 8d0dc9468..058e9a355 100644 --- a/Signal/src/util/Backup/OWSBackup.h +++ b/Signal/src/util/Backup/OWSBackup.h @@ -48,6 +48,9 @@ NSString *NSStringForBackupImportState(OWSBackupState state); - (BOOL)isBackupEnabled; - (void)setIsBackupEnabled:(BOOL)value; +- (BOOL)hasPendingRestoreDecision; +- (void)setHasPendingRestoreDecision:(BOOL)value; + - (void)tryToExportBackup; - (void)cancelExportBackup; diff --git a/Signal/src/util/Backup/OWSBackup.m b/Signal/src/util/Backup/OWSBackup.m index ebfa7d759..e3bf372dc 100644 --- a/Signal/src/util/Backup/OWSBackup.m +++ b/Signal/src/util/Backup/OWSBackup.m @@ -18,6 +18,7 @@ NSString *const OWSPrimaryStorage_OWSBackupCollection = @"OWSPrimaryStorage_OWSB NSString *const OWSBackup_IsBackupEnabledKey = @"OWSBackup_IsBackupEnabledKey"; NSString *const OWSBackup_LastExportSuccessDateKey = @"OWSBackup_LastExportSuccessDateKey"; NSString *const OWSBackup_LastExportFailureDateKey = @"OWSBackup_LastExportFailureDateKey"; +NSString *const OWSBackup_HasPendingRestoreDecisionKey = @"OWSBackup_HasPendingRestoreDecisionKey"; NSString *NSStringForBackupExportState(OWSBackupState state) { @@ -237,6 +238,22 @@ NSString *NSStringForBackupImportState(OWSBackupState state) [self ensureBackupExportState]; } +- (BOOL)hasPendingRestoreDecision +{ + return [self.dbConnection boolForKey:OWSBackup_HasPendingRestoreDecisionKey + inCollection:OWSPrimaryStorage_OWSBackupCollection + defaultValue:NO]; +} + +- (void)setHasPendingRestoreDecision:(BOOL)value +{ + OWSLogInfo(@"%d", value); + + [self.dbConnection setBool:value + forKey:OWSBackup_HasPendingRestoreDecisionKey + inCollection:OWSPrimaryStorage_OWSBackupCollection]; +} + - (BOOL)canBackupExport { if (!self.isBackupEnabled) {