diff --git a/Signal/src/util/Backup/OWSBackup.h b/Signal/src/util/Backup/OWSBackup.h index 0eabc15e3..c16e3dfdf 100644 --- a/Signal/src/util/Backup/OWSBackup.h +++ b/Signal/src/util/Backup/OWSBackup.h @@ -42,7 +42,7 @@ NSError *OWSBackupErrorWithDescription(NSString *description); #pragma mark - Backup Export -@property (nonatomic, readonly) OWSBackupState backupExportState; +@property (atomic, readonly) OWSBackupState backupExportState; // If a "backup export" is in progress (see backupExportState), // backupExportDescription _might_ contain a string that describes @@ -65,7 +65,7 @@ NSError *OWSBackupErrorWithDescription(NSString *description); #pragma mark - Backup Import -@property (nonatomic, readonly) OWSBackupState backupImportState; +@property (atomic, readonly) OWSBackupState backupImportState; // If a "backup import" is in progress (see backupImportState), // backupImportDescription _might_ contain a string that describes diff --git a/Signal/src/util/Backup/OWSBackup.m b/Signal/src/util/Backup/OWSBackup.m index 61eedf744..e348ca6ad 100644 --- a/Signal/src/util/Backup/OWSBackup.m +++ b/Signal/src/util/Backup/OWSBackup.m @@ -93,6 +93,9 @@ NSError *OWSBackupErrorWithDescription(NSString *description) @property (nonatomic, nullable) NSString *backupImportDescription; @property (nonatomic, nullable) NSNumber *backupImportProgress; +@property (atomic) OWSBackupState backupExportState; +@property (atomic) OWSBackupState backupImportState; + @end #pragma mark - @@ -116,8 +119,8 @@ NSError *OWSBackupErrorWithDescription(NSString *description) return self; } - _backupExportState = OWSBackupState_Idle; - _backupImportState = OWSBackupState_Idle; + self.backupExportState = OWSBackupState_Idle; + self.backupImportState = OWSBackupState_Idle; OWSSingletonAssert(); @@ -219,7 +222,7 @@ NSError *OWSBackupErrorWithDescription(NSString *description) [self.backupImportJob cancel]; self.backupImportJob = nil; - _backupExportState = OWSBackupState_InProgress; + self.backupExportState = OWSBackupState_InProgress; self.backupExportJob = [[OWSBackupExportJob alloc] initWithDelegate:self recipientId:recipientId]; [self.backupExportJob start]; @@ -402,8 +405,8 @@ NSError *OWSBackupErrorWithDescription(NSString *description) } } - BOOL stateDidChange = _backupExportState != backupExportState; - _backupExportState = backupExportState; + BOOL stateDidChange = self.backupExportState != backupExportState; + self.backupExportState = backupExportState; if (stateDidChange) { [self postDidChangeNotification]; } @@ -526,7 +529,7 @@ NSError *OWSBackupErrorWithDescription(NSString *description) [self.backupImportJob cancel]; self.backupImportJob = nil; - _backupImportState = OWSBackupState_InProgress; + self.backupImportState = OWSBackupState_InProgress; self.backupImportJob = [[OWSBackupImportJob alloc] initWithDelegate:self recipientId:recipientId]; [self.backupImportJob start]; @@ -539,7 +542,7 @@ NSError *OWSBackupErrorWithDescription(NSString *description) [self.backupImportJob cancel]; self.backupImportJob = nil; - _backupImportState = OWSBackupState_Idle; + self.backupImportState = OWSBackupState_Idle; [self postDidChangeNotification]; } @@ -589,7 +592,7 @@ NSError *OWSBackupErrorWithDescription(NSString *description) if (self.backupImportJob == backupJob) { self.backupImportJob = nil; - _backupImportState = OWSBackupState_Succeeded; + self.backupImportState = OWSBackupState_Succeeded; } else if (self.backupExportJob == backupJob) { self.backupExportJob = nil; @@ -613,7 +616,7 @@ NSError *OWSBackupErrorWithDescription(NSString *description) if (self.backupImportJob == backupJob) { self.backupImportJob = nil; - _backupImportState = OWSBackupState_Failed; + self.backupImportState = OWSBackupState_Failed; } else if (self.backupExportJob == backupJob) { self.backupExportJob = nil; diff --git a/Signal/src/util/Backup/OWSBackupLazyRestore.swift b/Signal/src/util/Backup/OWSBackupLazyRestore.swift index 149dfa48f..e605911e0 100644 --- a/Signal/src/util/Backup/OWSBackupLazyRestore.swift +++ b/Signal/src/util/Backup/OWSBackupLazyRestore.swift @@ -47,6 +47,12 @@ public class BackupLazyRestore: NSObject { NotificationCenter.default.addObserver(forName: .reachabilityChanged, object: nil, queue: nil) { _ in self.runIfNecessary() } + NotificationCenter.default.addObserver(forName: .reachabilityChanged, object: nil, queue: nil) { _ in + self.runIfNecessary() + } + NotificationCenter.default.addObserver(forName: NSNotification.Name(NSNotificationNameBackupStateDidChange), object: nil, queue: nil) { _ in + self.runIfNecessary() + } } // MARK: - @@ -62,6 +68,11 @@ public class BackupLazyRestore: NSObject { runIfNecessary() } + @objc + public func isBackupImportInProgress() -> Bool { + return backup.backupImportState == .inProgress + } + @objc public func runIfNecessary() { AssertIsOnMainThread() @@ -72,6 +83,9 @@ public class BackupLazyRestore: NSObject { guard tsAccountManager.isRegisteredAndReady() else { return } + guard !isBackupImportInProgress() else { + return + } guard !isRunning, !isComplete else { return } @@ -106,6 +120,12 @@ public class BackupLazyRestore: NSObject { } private func tryToRestoreNextAttachment(attachmentIds: [String], errorCount: UInt, backupIO: OWSBackupIO) { + guard !isBackupImportInProgress() else { + Logger.verbose("A backup import is in progress; abort.") + complete(errorCount: errorCount + 1) + return + } + var attachmentIdsCopy = attachmentIds guard let attachmentId = attachmentIdsCopy.popLast() else { // This job is done.