From 5035cb040ea2b2494bc28ed205e3e7e2cbf02e51 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 8 Mar 2018 12:10:43 -0300 Subject: [PATCH] Implement backup import logic. --- Signal/src/util/OWSBackup.h | 1 + Signal/src/util/OWSBackup.m | 29 ++++++++++++++++++++--- SignalMessaging/profiles/OWSUserProfile.m | 10 ++------ SignalServiceKit/src/Util/NSObject+OWS.h | 4 +++- SignalServiceKit/src/Util/NSObject+OWS.m | 13 +++++++++- SignalServiceKit/src/Util/OWSError.h | 4 ++++ 6 files changed, 48 insertions(+), 13 deletions(-) diff --git a/Signal/src/util/OWSBackup.h b/Signal/src/util/OWSBackup.h index 3e072aaee..2ebd5d63d 100644 --- a/Signal/src/util/OWSBackup.h +++ b/Signal/src/util/OWSBackup.h @@ -61,6 +61,7 @@ typedef NS_ENUM(NSUInteger, OWSBackupState) { // preserve our PIN and/or private key so that restored users // continues to backup. - (void)tryToImportBackup; +- (void)cancelImportBackup; @end diff --git a/Signal/src/util/OWSBackup.m b/Signal/src/util/OWSBackup.m index 18ed53c4f..bfdac260f 100644 --- a/Signal/src/util/OWSBackup.m +++ b/Signal/src/util/OWSBackup.m @@ -320,6 +320,18 @@ NS_ASSUME_NONNULL_BEGIN self.backupImport = [[OWSBackupImport alloc] initWithDelegate:self primaryStorage:[OWSPrimaryStorage sharedManager]]; [self.backupImport startAsync]; + + [self postDidChangeNotification]; +} + +- (void)cancelImportBackup +{ + [self.backupImport cancel]; + self.backupImport = nil; + + _backupImportState = OWSBackupState_Idle; + + [self postDidChangeNotification]; } #pragma mark - @@ -392,13 +404,17 @@ NS_ASSUME_NONNULL_BEGIN DDLogInfo(@"%@ %s: %@, %@", self.logTag, __PRETTY_FUNCTION__, description, progress); + BOOL didChange = !([NSObject isNullableObject:self.backupExportDescription equalTo:description] && + [NSObject isNullableObject:self.backupExportProgress equalTo:progress]); + self.backupExportDescription = description; self.backupExportProgress = progress; - [self postDidChangeNotification]; + if (didChange) { + [self postDidChangeNotification]; + } } - #pragma mark - OWSBackupImportDelegate - (void)backupImportDidSucceed:(OWSBackupImport *)backupImport @@ -447,16 +463,23 @@ NS_ASSUME_NONNULL_BEGIN DDLogInfo(@"%@ %s: %@, %@", self.logTag, __PRETTY_FUNCTION__, description, progress); + BOOL didChange = !([NSObject isNullableObject:self.backupImportDescription equalTo:description] && + [NSObject isNullableObject:self.backupImportProgress equalTo:progress]); + self.backupImportDescription = description; self.backupImportProgress = progress; - [self postDidChangeNotification]; + if (didChange) { + [self postDidChangeNotification]; + } } #pragma mark - Notifications - (void)postDidChangeNotification { + OWSAssertIsOnMainThread(); + [[NSNotificationCenter defaultCenter] postNotificationNameAsync:NSNotificationNameBackupStateDidChange object:nil userInfo:nil]; diff --git a/SignalMessaging/profiles/OWSUserProfile.m b/SignalMessaging/profiles/OWSUserProfile.m index 8870d1705..0a2f460a4 100644 --- a/SignalMessaging/profiles/OWSUserProfile.m +++ b/SignalMessaging/profiles/OWSUserProfile.m @@ -106,17 +106,11 @@ NSString *const kLocalProfileUniqueId = @"kLocalProfileUniqueId"; { @synchronized(self) { - BOOL isEqual; - if (avatarUrlPath != nil) { - isEqual = [avatarUrlPath isEqual:_avatarUrlPath]; - } else { - // are they both nil? - isEqual = _avatarUrlPath == nil; - } + BOOL didChange = ![NSObject isNullableObject:_avatarUrlPath equalTo:avatarUrlPath]; _avatarUrlPath = avatarUrlPath; - if (!isEqual) { + if (didChange) { // If the avatarURL changed, the avatarFileName can't be valid. // Clear it. self.avatarFileName = nil; diff --git a/SignalServiceKit/src/Util/NSObject+OWS.h b/SignalServiceKit/src/Util/NSObject+OWS.h index 624cfa741..9837f8db0 100644 --- a/SignalServiceKit/src/Util/NSObject+OWS.h +++ b/SignalServiceKit/src/Util/NSObject+OWS.h @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // NS_ASSUME_NONNULL_BEGIN @@ -12,6 +12,8 @@ NS_ASSUME_NONNULL_BEGIN + (NSString *)logTag; ++ (BOOL)isNullableObject:(nullable NSObject *)left equalTo:(nullable NSObject *)right; + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Util/NSObject+OWS.m b/SignalServiceKit/src/Util/NSObject+OWS.m index 55a875d3d..6934a0faa 100644 --- a/SignalServiceKit/src/Util/NSObject+OWS.m +++ b/SignalServiceKit/src/Util/NSObject+OWS.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "NSObject+OWS.h" @@ -21,6 +21,17 @@ NS_ASSUME_NONNULL_BEGIN return self.class.logTag; } ++ (BOOL)isNullableObject:(nullable NSObject *)left equalTo:(nullable NSObject *)right +{ + if (!left && !right) { + return YES; + } else if (!left || !right) { + return NO; + } else { + return [left isEqual:right]; + } +} + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Util/OWSError.h b/SignalServiceKit/src/Util/OWSError.h index 176305364..29c9bfa7c 100644 --- a/SignalServiceKit/src/Util/OWSError.h +++ b/SignalServiceKit/src/Util/OWSError.h @@ -35,6 +35,10 @@ typedef NS_ENUM(NSInteger, OWSErrorCode) { OWSErrorCodeExportBackupFailed = 777415, // A possibly recoverable error occured while exporting a backup. OWSErrorCodeExportBackupError = 777416, + // A non-recoverable error occured while importing a backup. + OWSErrorCodeImportBackupFailed = 777417, + // A possibly recoverable error occured while importing a backup. + OWSErrorCodeImportBackupError = 777418, }; extern NSString *const OWSErrorRecipientIdentifierKey;