From d06ad25d77a2d4e2c306bf72bb8ac3a212b8bd06 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Mon, 5 Mar 2018 14:36:29 -0300 Subject: [PATCH] Sketch out incremental backup manager and settings view. --- Signal.xcodeproj/project.pbxproj | 8 +-- .../AppSettings/AppSettingsViewController.m | 5 +- .../OWSBackupSettingsViewController.h | 10 +-- ...er.m => OWSBackupSettingsViewController.m} | 62 ++++++++++++++++++- .../src/ViewControllers/HomeViewController.m | 4 ++ Signal/src/util/OWSBackup.h | 3 + Signal/src/util/OWSBackup.m | 52 +++++++++++----- .../translations/en.lproj/Localizable.strings | 17 +++-- 8 files changed, 127 insertions(+), 34 deletions(-) rename Signal/src/ViewControllers/AppSettings/{OWSBackupExportViewController.m => OWSBackupSettingsViewController.m} (87%) diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index c20ba411f..67a731875 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -24,7 +24,7 @@ 340FC8B1204DAC8D007AEB0F /* BlockListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC887204DAC8C007AEB0F /* BlockListViewController.m */; }; 340FC8B2204DAC8D007AEB0F /* AdvancedSettingsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC88C204DAC8C007AEB0F /* AdvancedSettingsTableViewController.m */; }; 340FC8B3204DAC8D007AEB0F /* AppSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC88D204DAC8C007AEB0F /* AppSettingsViewController.m */; }; - 340FC8B4204DAC8D007AEB0F /* OWSBackupExportViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC88E204DAC8C007AEB0F /* OWSBackupExportViewController.m */; }; + 340FC8B4204DAC8D007AEB0F /* OWSBackupSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC88E204DAC8C007AEB0F /* OWSBackupSettingsViewController.m */; }; 340FC8B5204DAC8D007AEB0F /* AboutTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC893204DAC8C007AEB0F /* AboutTableViewController.m */; }; 340FC8B6204DAC8D007AEB0F /* OWSQRCodeScanningViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC896204DAC8C007AEB0F /* OWSQRCodeScanningViewController.m */; }; 340FC8B7204DAC8D007AEB0F /* OWSConversationSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC89A204DAC8D007AEB0F /* OWSConversationSettingsViewController.m */; }; @@ -543,7 +543,7 @@ 340FC88B204DAC8C007AEB0F /* NotificationSettingsOptionsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotificationSettingsOptionsViewController.h; sourceTree = ""; }; 340FC88C204DAC8C007AEB0F /* AdvancedSettingsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdvancedSettingsTableViewController.m; sourceTree = ""; }; 340FC88D204DAC8C007AEB0F /* AppSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppSettingsViewController.m; sourceTree = ""; }; - 340FC88E204DAC8C007AEB0F /* OWSBackupExportViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSBackupExportViewController.m; sourceTree = ""; }; + 340FC88E204DAC8C007AEB0F /* OWSBackupSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSBackupSettingsViewController.m; sourceTree = ""; }; 340FC88F204DAC8C007AEB0F /* PrivacySettingsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrivacySettingsTableViewController.h; sourceTree = ""; }; 340FC890204DAC8C007AEB0F /* BlockListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockListViewController.h; sourceTree = ""; }; 340FC891204DAC8C007AEB0F /* OWSLinkDeviceViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSLinkDeviceViewController.h; sourceTree = ""; }; @@ -1240,7 +1240,7 @@ 340FC88A204DAC8C007AEB0F /* NotificationSettingsViewController.h */, 340FC87C204DAC8C007AEB0F /* NotificationSettingsViewController.m */, 340FC87F204DAC8C007AEB0F /* OWSBackupSettingsViewController.h */, - 340FC88E204DAC8C007AEB0F /* OWSBackupExportViewController.m */, + 340FC88E204DAC8C007AEB0F /* OWSBackupSettingsViewController.m */, 340FC891204DAC8C007AEB0F /* OWSLinkDeviceViewController.h */, 340FC885204DAC8C007AEB0F /* OWSLinkDeviceViewController.m */, 340FC895204DAC8C007AEB0F /* OWSLinkedDevicesTableViewController.h */, @@ -3059,7 +3059,7 @@ 341F2C0F1F2B8AE700D07D6B /* DebugUIMisc.m in Sources */, 340FC8AF204DAC8D007AEB0F /* OWSLinkDeviceViewController.m in Sources */, 34E3EF0D1EFC235B007F6822 /* DebugUIDiskUsage.m in Sources */, - 340FC8B4204DAC8D007AEB0F /* OWSBackupExportViewController.m in Sources */, + 340FC8B4204DAC8D007AEB0F /* OWSBackupSettingsViewController.m in Sources */, 34D1F0871F8678AA0066283D /* ConversationViewItem.m in Sources */, B6DA6B071B8A2F9A00CA6F98 /* AppStoreRating.m in Sources */, 451A13B11E13DED2000A50FD /* CallNotificationsAdapter.swift in Sources */, diff --git a/Signal/src/ViewControllers/AppSettings/AppSettingsViewController.m b/Signal/src/ViewControllers/AppSettings/AppSettingsViewController.m index 36dfa756a..e60226c28 100644 --- a/Signal/src/ViewControllers/AppSettings/AppSettingsViewController.m +++ b/Signal/src/ViewControllers/AppSettings/AppSettingsViewController.m @@ -90,6 +90,10 @@ self.title = NSLocalizedString(@"SETTINGS_NAV_BAR_TITLE", @"Title for settings activity"); [self updateTableContents]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [self showBackup]; + }); } - (void)viewWillAppear:(BOOL)animated @@ -365,7 +369,6 @@ { OWSBackupSettingsViewController *vc = [OWSBackupSettingsViewController new]; [self.navigationController pushViewController:vc animated:YES]; -}]]; } - (void)showDebugUI diff --git a/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.h b/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.h index 2224d9aeb..9a986af8c 100644 --- a/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.h +++ b/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.h @@ -2,17 +2,11 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN -//@class TSThread; - -@interface OWSBackupSettingsViewController : OWSViewController - -//// If currentThread is non-nil, we should offer to let users send the -//// backup in that thread. -//- (void)exportBackup:(TSThread *_Nullable)currentThread skipPassword:(BOOL)skipPassword; +@interface OWSBackupSettingsViewController : OWSTableViewController @end diff --git a/Signal/src/ViewControllers/AppSettings/OWSBackupExportViewController.m b/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.m similarity index 87% rename from Signal/src/ViewControllers/AppSettings/OWSBackupExportViewController.m rename to Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.m index ff05792e3..875369e50 100644 --- a/Signal/src/ViewControllers/AppSettings/OWSBackupExportViewController.m +++ b/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.m @@ -2,8 +2,8 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import "OWSBackup.h" #import "OWSBackupSettingsViewController.h" +#import "OWSBackup.h" #import "OWSProgressView.h" #import "Signal-Swift.h" #import "ThreadUtil.h" @@ -30,6 +30,66 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSBackupSettingsViewController +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = NSLocalizedString(@"SETTINGS_BACKUP", @"Label for the backup view in app settings."); + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(backupStateDidChange:) + name:NSNotificationNameBackupStateDidChange + object:nil]; + + [self updateTableContents]; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)viewDidAppear:(BOOL)animated +{ + [self updateTableContents]; +} + +#pragma mark - Table Contents + +- (void)updateTableContents +{ + OWSTableContents *contents = [OWSTableContents new]; + + BOOL isBackupEnabled = [OWSBackup.sharedManager isBackupEnabled]; + + // TODO: This UI is temporary. + // Enabling backup will involve entering and registering a PIN. + OWSTableSection *enableSection = [OWSTableSection new]; + enableSection.headerTitle = NSLocalizedString(@"SETTINGS_BACKUP", @"Label for the backup view in app settings."); + [enableSection + addItem:[OWSTableItem switchItemWithText: + NSLocalizedString(@"SETTINGS_BACKUP_ENABLING_SWITCH", + @"Label for switch in settings that controls whether or not backup is enabled.") + isOn:isBackupEnabled + target:self + selector:@selector(isBackupEnabledDidChange:)]]; + [contents addSection:enableSection]; + + self.contents = contents; +} + +- (void)isBackupEnabledDidChange:(UISwitch *)sender +{ + [OWSBackup.sharedManager setIsBackupEnabled:sender.isOn]; +} + +#pragma mark - Events + +- (void)backupStateDidChange:(NSNotification *)notification +{ + [self updateTableContents]; +} + //- (void)loadView //{ // [super loadView]; diff --git a/Signal/src/ViewControllers/HomeViewController.m b/Signal/src/ViewControllers/HomeViewController.m index dccd63e15..8d47def8b 100644 --- a/Signal/src/ViewControllers/HomeViewController.m +++ b/Signal/src/ViewControllers/HomeViewController.m @@ -426,6 +426,10 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState }; } [self checkIfEmptyView]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [self settingsButtonPressed:nil]; + }); } - (void)viewWillDisappear:(BOOL)animated diff --git a/Signal/src/util/OWSBackup.h b/Signal/src/util/OWSBackup.h index e516be3fe..16b63ce37 100644 --- a/Signal/src/util/OWSBackup.h +++ b/Signal/src/util/OWSBackup.h @@ -46,6 +46,9 @@ typedef NS_ENUM(NSUInteger, OWSBackupState) { + (instancetype)sharedManager; +- (BOOL)isBackupEnabled; +- (void)setIsBackupEnabled:(BOOL)value; + //- (void)exportBackup:(nullable TSThread *)currentThread skipPassword:(BOOL)skipPassword; // //- (void)importBackup:(NSString *)backupZipPath password:(NSString *_Nullable)password; diff --git a/Signal/src/util/OWSBackup.m b/Signal/src/util/OWSBackup.m index 73688f4c6..d8876be43 100644 --- a/Signal/src/util/OWSBackup.m +++ b/Signal/src/util/OWSBackup.m @@ -18,9 +18,13 @@ //#import #import "NSNotificationCenter+OWS.h" #import +#import NSString *const NSNotificationNameBackupStateDidChange = @"NSNotificationNameBackupStateDidChange"; +NSString *const OWSPrimaryStorage_OWSBackupCollection = @"OWSPrimaryStorage_OWSBackupCollection"; +NSString *const OWSBackup_IsBackupEnabledKey = @"OWSBackup_IsBackupEnabledKey"; + NS_ASSUME_NONNULL_BEGIN //// Hide the "import" directories from exports, etc. by prefixing their name with a period. @@ -42,7 +46,9 @@ NS_ASSUME_NONNULL_BEGIN // NSString *const Keychain_ImportBackupService = @"OWSKeychainService"; // NSString *const Keychain_ImportBackupKey = @"ImportBackupKey"; -@interface OWSStorage (OWSBackup) +@interface OWSBackup () + +@property (nonatomic, readonly) YapDatabaseConnection *dbConnection; //- (NSData *)databasePassword; // @@ -73,6 +79,8 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSBackup +@synthesize dbConnection = _dbConnection; + + (instancetype)sharedManager { static OWSBackup *sharedMyManager = nil; @@ -85,26 +93,22 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initDefault { - // OWSPrimaryStorage *primaryStorage = [OWSPrimaryStorage sharedManager]; - // OWSMessageSender *messageSender = [TextSecureKitEnv sharedEnv].messageSender; - // - // return [self initWithPrimaryStorage:primaryStorage messageSender:messageSender]; - //} - // - //- (instancetype)initWithPrimaryStorage:(OWSPrimaryStorage *)primaryStorage - // messageSender:(OWSMessageSender *)messageSender - //{ + OWSPrimaryStorage *primaryStorage = [OWSPrimaryStorage sharedManager]; + + return [self initWithPrimaryStorage:primaryStorage]; +} + +- (instancetype)initWithPrimaryStorage:(OWSPrimaryStorage *)primaryStorage +{ self = [super init]; if (!self) { return self; } - // OWSAssert(primaryStorage); - // OWSAssert(messageSender); - // - // _dbConnection = primaryStorage.newDatabaseConnection; - // _messageSender = messageSender; + OWSAssert(primaryStorage); + + _dbConnection = primaryStorage.newDatabaseConnection; _backupExportState = OWSBackupState_AtRest; @@ -145,6 +149,24 @@ NS_ASSUME_NONNULL_BEGIN userInfo:nil]; } +- (BOOL)isBackupEnabled +{ + return [self.dbConnection boolForKey:OWSBackup_IsBackupEnabledKey + inCollection:OWSPrimaryStorage_OWSBackupCollection + defaultValue:NO]; +} + +- (void)setIsBackupEnabled:(BOOL)value +{ + [self.dbConnection setBool:value + forKey:OWSBackup_IsBackupEnabledKey + inCollection:OWSPrimaryStorage_OWSBackupCollection]; + + [[NSNotificationCenter defaultCenter] postNotificationNameAsync:NSNotificationNameBackupStateDidChange + object:nil + userInfo:nil]; +} + //- (void)setBackupProgress:(CGFloat)backupProgress //{ // _backupProgress = backupProgress; diff --git a/Signal/translations/en.lproj/Localizable.strings b/Signal/translations/en.lproj/Localizable.strings index 691421500..23f685e6d 100644 --- a/Signal/translations/en.lproj/Localizable.strings +++ b/Signal/translations/en.lproj/Localizable.strings @@ -163,7 +163,8 @@ /* Message indicating that backup export is complete. */ "BACKUP_EXPORT_COMPLETE_MESSAGE" = "Backup complete."; -/* Label for button that copies backup password to the pasteboard. */ +/* Label for button that copies backup password to the +// pasteboard. */ "BACKUP_EXPORT_COPY_PASSWORD_BUTTON" = "Copy Password"; /* Message indicating that backup export failed. */ @@ -175,10 +176,12 @@ /* Format for message indicating that backup export is complete. Embeds: {{the backup password}}. */ "BACKUP_EXPORT_PASSWORD_MESSAGE_FORMAT" = "Your backup password is: %@. Make sure to keep a copy of this password or you won't be able to restore from this backup."; -/* Label for button that 'send backup' in the current conversation. */ +/* Label for button that 'send backup' in the current +// conversation. */ "BACKUP_EXPORT_SEND_BACKUP_BUTTON" = "Send Backup as Message"; -/* Message indicating that sending the backup failed. */ +/* Message indicating that sending +// the backup failed. */ "BACKUP_EXPORT_SEND_BACKUP_FAILED" = "Sending Backup Failed."; /* Message indicating that sending the backup succeeded. */ @@ -187,7 +190,8 @@ /* Label for button that opens share UI for backup. */ "BACKUP_EXPORT_SHARE_BACKUP_BUTTON" = "Share Backup"; -/* Title for the 'backup export' view. */ +/* Title for the 'backup export' +// view. */ "BACKUP_EXPORT_VIEW_TITLE" = "Backup"; /* Format for backup filenames. Embeds: {{the date and time of the backup}}. Should not include characters like slash (/ or \\) or colon (:). */ @@ -1580,7 +1584,10 @@ "SETTINGS_AUDIO_DEFAULT_TONE_LABEL_FORMAT" = "%@ (default)"; /* Label for the backup view in app settings. */ -"SETTINGS_BACKUP" = "SETTINGS_BACKUP"; +"SETTINGS_BACKUP" = "Backup"; + +/* Label for switch in settings that controls whether or not backup is enabled. */ +"SETTINGS_BACKUP_ENABLING_SWITCH" = "Backup Enabled"; /* A label for the 'add phone number' button in the block list table. */ "SETTINGS_BLOCK_LIST_ADD_BUTTON" = "Add…";