diff --git a/src/Messages/TSBlockingManager.h b/src/Messages/TSBlockingManager.h index e1cee787c..ddbfe59bd 100644 --- a/src/Messages/TSBlockingManager.h +++ b/src/Messages/TSBlockingManager.h @@ -20,7 +20,9 @@ extern NSString * const kNSNotificationName_BlockedPhoneNumbersDidChange; - (void)removeBlockedPhoneNumber:(NSString *)phoneNumber; -- (void)setBlockedPhoneNumbers:(NSArray *)blockedPhoneNumbers; +// When updating the block list from a sync message, we don't +// want to fire a sync message. +- (void)setBlockedPhoneNumbers:(NSArray *)blockedPhoneNumbers skipSyncMessage:(BOOL)skipSyncMessage; - (NSArray *)blockedPhoneNumbers; diff --git a/src/Messages/TSBlockingManager.m b/src/Messages/TSBlockingManager.m index da35260dc..e1e9bf28c 100644 --- a/src/Messages/TSBlockingManager.m +++ b/src/Messages/TSBlockingManager.m @@ -81,8 +81,8 @@ NSString *const kTSStorageManager_SyncedBlockedPhoneNumbersKey = @"kTSStorageMan [_blockedPhoneNumberSet addObject:phoneNumber]; } - - [self handleUpdate]; + + [self handleUpdate:NO]; } - (void)removeBlockedPhoneNumber:(NSString *)phoneNumber { @@ -95,11 +95,12 @@ NSString *const kTSStorageManager_SyncedBlockedPhoneNumbersKey = @"kTSStorageMan [_blockedPhoneNumberSet removeObject:phoneNumber]; } - - [self handleUpdate]; + + [self handleUpdate:NO]; } -- (void)setBlockedPhoneNumbers:(NSArray *)blockedPhoneNumbers { +- (void)setBlockedPhoneNumbers:(NSArray *)blockedPhoneNumbers skipSyncMessage:(BOOL)skipSyncMessage +{ OWSAssert(blockedPhoneNumbers != nil); @synchronized (self) { @@ -110,8 +111,8 @@ NSString *const kTSStorageManager_SyncedBlockedPhoneNumbersKey = @"kTSStorageMan _blockedPhoneNumberSet = [newSet mutableCopy]; } - - [self handleUpdate]; + + [self handleUpdate:skipSyncMessage]; } - (NSArray *)blockedPhoneNumbers { @@ -121,14 +122,19 @@ NSString *const kTSStorageManager_SyncedBlockedPhoneNumbersKey = @"kTSStorageMan } // This should be called every time the block list changes. -- (void)handleUpdate { +- (void)handleUpdate:(BOOL)skipSyncMessage +{ NSArray *blockedPhoneNumbers = [self blockedPhoneNumbers]; [self saveBlockedPhoneNumbers:blockedPhoneNumbers]; dispatch_async(dispatch_get_main_queue(), ^{ - [self sendBlockedPhoneNumbersMessage:blockedPhoneNumbers]; - + if (!skipSyncMessage) { + [self sendBlockedPhoneNumbersMessage:blockedPhoneNumbers]; + } else { + [self saveSyncedBlockedPhoneNumbers:blockedPhoneNumbers]; + } + [[NSNotificationCenter defaultCenter] postNotificationName:kNSNotificationName_BlockedPhoneNumbersDidChange object:nil userInfo:nil]; @@ -176,15 +182,23 @@ NSString *const kTSStorageManager_SyncedBlockedPhoneNumbersKey = @"kTSStorageMan DDLogInfo(@"%@ Successfully sent blocked phone numbers", self.tag); // Record the last set of "blocked phone numbers" which we successfully synced. - [_storageManager setObject:blockedPhoneNumbers - forKey:kTSStorageManager_SyncedBlockedPhoneNumbersKey - inCollection:kTSStorageManager_BlockedPhoneNumbersCollection]; + [self saveSyncedBlockedPhoneNumbers:blockedPhoneNumbers]; } failure:^(NSError *error) { DDLogError(@"%@ Failed to send blocked phone numbers with error: %@", self.tag, error); }]; } +- (void)saveSyncedBlockedPhoneNumbers:(NSArray *)blockedPhoneNumbers +{ + OWSAssert(blockedPhoneNumbers); + + // Record the last set of "blocked phone numbers" which we successfully synced. + [_storageManager setObject:blockedPhoneNumbers + forKey:kTSStorageManager_SyncedBlockedPhoneNumbersKey + inCollection:kTSStorageManager_BlockedPhoneNumbersCollection]; +} + #pragma mark - Logging + (NSString *)tag diff --git a/src/Messages/TSMessagesManager.m b/src/Messages/TSMessagesManager.m index 42e3b4788..097c1f6bf 100644 --- a/src/Messages/TSMessagesManager.m +++ b/src/Messages/TSMessagesManager.m @@ -542,8 +542,7 @@ NS_ASSUME_NONNULL_BEGIN DDLogInfo(@"%@ Received `blocked` syncMessage.", self.tag); NSArray *blockedPhoneNumbers = [syncMessage.blocked.numbers copy]; - [_blockingManager setBlockedPhoneNumbers:blockedPhoneNumbers]; - + [_blockingManager setBlockedPhoneNumbers:blockedPhoneNumbers skipSyncMessage:YES]; } else if (syncMessage.read.count > 0) { DDLogInfo(@"%@ Received %ld read receipt(s)", self.tag, (u_long)syncMessage.read.count);