Respond to CR.

// FREEBIE
pull/1/head
Matthew Chen 9 years ago
parent 2a2ad7d679
commit 02004a75f9

@ -22,7 +22,7 @@ extern NSString * const kNSNotificationName_BlockedPhoneNumbersDidChange;
// When updating the block list from a sync message, we don't // When updating the block list from a sync message, we don't
// want to fire a sync message. // want to fire a sync message.
- (void)setBlockedPhoneNumbers:(NSArray<NSString *> *)blockedPhoneNumbers skipSyncMessage:(BOOL)skipSyncMessage; - (void)setBlockedPhoneNumbers:(NSArray<NSString *> *)blockedPhoneNumbers sendSyncMessage:(BOOL)sendSyncMessage;
- (NSArray<NSString *> *)blockedPhoneNumbers; - (NSArray<NSString *> *)blockedPhoneNumbers;

@ -33,7 +33,8 @@ NSString *const kTSStorageManager_SyncedBlockedPhoneNumbersKey = @"kTSStorageMan
@implementation TSBlockingManager @implementation TSBlockingManager
+ (instancetype)sharedManager { + (instancetype)sharedManager
{
static TSBlockingManager *sharedMyManager = nil; static TSBlockingManager *sharedMyManager = nil;
static dispatch_once_t onceToken; static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
@ -65,26 +66,26 @@ NSString *const kTSStorageManager_SyncedBlockedPhoneNumbersKey = @"kTSStorageMan
_storageManager = storageManager; _storageManager = storageManager;
_messageSender = messageSender; _messageSender = messageSender;
[self loadBlockedPhoneNumbers];
return self; return self;
} }
- (void)addBlockedPhoneNumber:(NSString *)phoneNumber { - (void)addBlockedPhoneNumber:(NSString *)phoneNumber {
OWSAssert(phoneNumber.length > 0); OWSAssert(phoneNumber.length > 0);
DDLogInfo(@"%@ addBlockedPhoneNumber: %@", self.tag, phoneNumber); DDLogInfo(@"%@ addBlockedPhoneNumber: %@", self.tag, phoneNumber);
@synchronized (self) { @synchronized (self) {
[self lazyLoadBlockedPhoneNumbersIfNecessary];
if ([_blockedPhoneNumberSet containsObject:phoneNumber]) { if ([_blockedPhoneNumberSet containsObject:phoneNumber]) {
// Ignore redundant changes.
return; return;
} }
[_blockedPhoneNumberSet addObject:phoneNumber]; [_blockedPhoneNumberSet addObject:phoneNumber];
} }
[self handleUpdate:NO]; [self handleUpdate];
} }
- (void)removeBlockedPhoneNumber:(NSString *)phoneNumber { - (void)removeBlockedPhoneNumber:(NSString *)phoneNumber {
@ -93,23 +94,28 @@ NSString *const kTSStorageManager_SyncedBlockedPhoneNumbersKey = @"kTSStorageMan
DDLogInfo(@"%@ removeBlockedPhoneNumber: %@", self.tag, phoneNumber); DDLogInfo(@"%@ removeBlockedPhoneNumber: %@", self.tag, phoneNumber);
@synchronized (self) { @synchronized (self) {
[self lazyLoadBlockedPhoneNumbersIfNecessary];
if (![_blockedPhoneNumberSet containsObject:phoneNumber]) { if (![_blockedPhoneNumberSet containsObject:phoneNumber]) {
// Ignore redundant changes.
return; return;
} }
[_blockedPhoneNumberSet removeObject:phoneNumber]; [_blockedPhoneNumberSet removeObject:phoneNumber];
} }
[self handleUpdate:NO]; [self handleUpdate];
} }
- (void)setBlockedPhoneNumbers:(NSArray<NSString *> *)blockedPhoneNumbers skipSyncMessage:(BOOL)skipSyncMessage - (void)setBlockedPhoneNumbers:(NSArray<NSString *> *)blockedPhoneNumbers sendSyncMessage:(BOOL)sendSyncMessage
{ {
OWSAssert(blockedPhoneNumbers != nil); OWSAssert(blockedPhoneNumbers != nil);
DDLogInfo(@"%@ setBlockedPhoneNumbers: %d", self.tag, (int)blockedPhoneNumbers.count); DDLogInfo(@"%@ setBlockedPhoneNumbers: %d", self.tag, (int)blockedPhoneNumbers.count);
@synchronized (self) { @synchronized (self) {
[self lazyLoadBlockedPhoneNumbersIfNecessary];
NSSet *newSet = [NSSet setWithArray:blockedPhoneNumbers]; NSSet *newSet = [NSSet setWithArray:blockedPhoneNumbers];
if ([_blockedPhoneNumberSet isEqualToSet:newSet]) { if ([_blockedPhoneNumberSet isEqualToSet:newSet]) {
return; return;
@ -118,24 +124,35 @@ NSString *const kTSStorageManager_SyncedBlockedPhoneNumbersKey = @"kTSStorageMan
_blockedPhoneNumberSet = [newSet mutableCopy]; _blockedPhoneNumberSet = [newSet mutableCopy];
} }
[self handleUpdate:skipSyncMessage]; [self handleUpdate:sendSyncMessage];
} }
- (NSArray<NSString *> *)blockedPhoneNumbers { - (NSArray<NSString *> *)blockedPhoneNumbers {
@synchronized (self) { @synchronized (self) {
[self lazyLoadBlockedPhoneNumbersIfNecessary];
return [_blockedPhoneNumberSet.allObjects sortedArrayUsingSelector:@selector(compare:)]; return [_blockedPhoneNumberSet.allObjects sortedArrayUsingSelector:@selector(compare:)];
} }
} }
// This should be called every time the block list changes. // This should be called every time the block list changes.
- (void)handleUpdate:(BOOL)skipSyncMessage
- (void)handleUpdate
{
// By default, always send a sync message when the block list changes.
[self handleUpdate:YES];
}
- (void)handleUpdate:(BOOL)sendSyncMessage
{ {
NSArray<NSString *> *blockedPhoneNumbers = [self blockedPhoneNumbers]; NSArray<NSString *> *blockedPhoneNumbers = [self blockedPhoneNumbers];
[self saveBlockedPhoneNumbers:blockedPhoneNumbers]; [_storageManager setObject:blockedPhoneNumbers
forKey:kTSStorageManager_BlockedPhoneNumbersKey
inCollection:kTSStorageManager_BlockedPhoneNumbersCollection];
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
if (!skipSyncMessage) { if (sendSyncMessage) {
[self sendBlockedPhoneNumbersMessage:blockedPhoneNumbers]; [self sendBlockedPhoneNumbersMessage:blockedPhoneNumbers];
} else { } else {
// If this update came from an incoming blocklist sync message, // If this update came from an incoming blocklist sync message,
@ -159,20 +176,14 @@ NSString *const kTSStorageManager_SyncedBlockedPhoneNumbersKey = @"kTSStorageMan
}); });
} }
- (void)saveBlockedPhoneNumbers:(NSArray<NSString *> *)blockedPhoneNumbers // This method should only be called from within a synchronized block.
- (void)lazyLoadBlockedPhoneNumbersIfNecessary
{ {
OWSAssert(blockedPhoneNumbers); if (_blockedPhoneNumberSet) {
// _blockedPhoneNumberSet has already been loaded, abort.
DDLogInfo(@"%@ saveBlockedPhoneNumbers", self.tag); return;
}
[_storageManager setObject:blockedPhoneNumbers
forKey:kTSStorageManager_BlockedPhoneNumbersKey
inCollection:kTSStorageManager_BlockedPhoneNumbersCollection];
}
// We don't need to synchronize this method since it should only be called by the constructor.
- (void)loadBlockedPhoneNumbers
{
NSArray<NSString *> *blockedPhoneNumbers = [_storageManager objectForKey:kTSStorageManager_BlockedPhoneNumbersKey NSArray<NSString *> *blockedPhoneNumbers = [_storageManager objectForKey:kTSStorageManager_BlockedPhoneNumbersKey
inCollection:kTSStorageManager_BlockedPhoneNumbersCollection]; inCollection:kTSStorageManager_BlockedPhoneNumbersCollection];
_blockedPhoneNumberSet = [[NSMutableSet alloc] initWithArray:(blockedPhoneNumbers ?: [NSArray new])]; _blockedPhoneNumberSet = [[NSMutableSet alloc] initWithArray:(blockedPhoneNumbers ?: [NSArray new])];

@ -542,7 +542,7 @@ NS_ASSUME_NONNULL_BEGIN
DDLogInfo(@"%@ Received `blocked` syncMessage.", self.tag); DDLogInfo(@"%@ Received `blocked` syncMessage.", self.tag);
NSArray<NSString *> *blockedPhoneNumbers = [syncMessage.blocked.numbers copy]; NSArray<NSString *> *blockedPhoneNumbers = [syncMessage.blocked.numbers copy];
[_blockingManager setBlockedPhoneNumbers:blockedPhoneNumbers skipSyncMessage:YES]; [_blockingManager setBlockedPhoneNumbers:blockedPhoneNumbers sendSyncMessage:NO];
} else if (syncMessage.read.count > 0) { } else if (syncMessage.read.count > 0) {
DDLogInfo(@"%@ Received %ld read receipt(s)", self.tag, (u_long)syncMessage.read.count); DDLogInfo(@"%@ Received %ld read receipt(s)", self.tag, (u_long)syncMessage.read.count);

Loading…
Cancel
Save