|  |  | @ -23,6 +23,7 @@ NSString *const kOWSBlockingManager_BlockListCollection = @"kOWSBlockingManager_ | 
			
		
	
		
		
			
				
					
					|  |  |  | // These keys are used to persist the current local "block list" state. |  |  |  | // These keys are used to persist the current local "block list" state. | 
			
		
	
		
		
			
				
					
					|  |  |  | NSString *const kOWSBlockingManager_BlockedPhoneNumbersKey = @"kOWSBlockingManager_BlockedPhoneNumbersKey"; |  |  |  | NSString *const kOWSBlockingManager_BlockedPhoneNumbersKey = @"kOWSBlockingManager_BlockedPhoneNumbersKey"; | 
			
		
	
		
		
			
				
					
					|  |  |  | NSString *const kOWSBlockingManager_BlockedGroupIdsKey = @"kOWSBlockingManager_BlockedGroupIdsKey"; |  |  |  | NSString *const kOWSBlockingManager_BlockedGroupIdsKey = @"kOWSBlockingManager_BlockedGroupIdsKey"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | NSString *const kOWSBlockingManager_BlockedGroupMapKey = @"kOWSBlockingManager_BlockedGroupMapKey"; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | // These keys are used to persist the most recently synced remote "block list" state. |  |  |  | // These keys are used to persist the most recently synced remote "block list" state. | 
			
		
	
		
		
			
				
					
					|  |  |  | NSString *const kOWSBlockingManager_SyncedBlockedPhoneNumbersKey = @"kOWSBlockingManager_SyncedBlockedPhoneNumbersKey"; |  |  |  | NSString *const kOWSBlockingManager_SyncedBlockedPhoneNumbersKey = @"kOWSBlockingManager_SyncedBlockedPhoneNumbersKey"; | 
			
		
	
	
		
		
			
				
					|  |  | @ -38,6 +39,7 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan | 
			
		
	
		
		
			
				
					
					|  |  |  | // phone numbers. |  |  |  | // phone numbers. | 
			
		
	
		
		
			
				
					
					|  |  |  | @property (atomic, readonly) NSMutableSet<NSString *> *blockedPhoneNumberSet; |  |  |  | @property (atomic, readonly) NSMutableSet<NSString *> *blockedPhoneNumberSet; | 
			
		
	
		
		
			
				
					
					|  |  |  | @property (atomic, readonly) NSMutableSet<NSData *> *blockedGroupIdSet; |  |  |  | @property (atomic, readonly) NSMutableSet<NSData *> *blockedGroupIdSet; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | @property (atomic, readonly) NSMutableDictionary<NSData *, TSGroupModel *> *blockedGroupMap; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | @end |  |  |  | @end | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -203,7 +205,7 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |     @synchronized(self) { |  |  |  |     @synchronized(self) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         [self ensureLazyInitialization]; |  |  |  |         [self ensureLazyInitialization]; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |         // TODO use blockedGroupMap.allKeys? | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         return _blockedGroupIdSet.allObjects; |  |  |  |         return _blockedGroupIdSet.allObjects; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | @ -213,8 +215,16 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan | 
			
		
	
		
		
			
				
					
					|  |  |  |     return [self.blockedGroupIds containsObject:groupId]; |  |  |  |     return [self.blockedGroupIds containsObject:groupId]; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | - (void)addBlockedGroupId:(NSData *)groupId |  |  |  | - (nullable TSGroupModel *)cachedGroupDetailsWithGroupId:(NSData *)groupId | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     @synchronized(self) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         return self.blockedGroupMap[groupId]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | - (void)addBlockedGroup:(TSGroupModel *)groupModel | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     NSData *groupId = groupModel.groupId; | 
			
		
	
		
		
			
				
					
					|  |  |  |     OWSAssert(groupId.length > 0); |  |  |  |     OWSAssert(groupId.length > 0); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     DDLogInfo(@"%@ addBlockedGroupId: %@", self.logTag, groupId); |  |  |  |     DDLogInfo(@"%@ addBlockedGroupId: %@", self.logTag, groupId); | 
			
		
	
	
		
		
			
				
					|  |  | @ -222,12 +232,13 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan | 
			
		
	
		
		
			
				
					
					|  |  |  |     @synchronized(self) { |  |  |  |     @synchronized(self) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         [self ensureLazyInitialization]; |  |  |  |         [self ensureLazyInitialization]; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if ([_blockedGroupIdSet containsObject:groupId]) { |  |  |  |         if ([self.blockedGroupIdSet containsObject:groupId]) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             // Ignore redundant changes. |  |  |  |             // Ignore redundant changes. | 
			
		
	
		
		
			
				
					
					|  |  |  |             return; |  |  |  |             return; | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         [_blockedGroupIdSet addObject:groupId]; |  |  |  |         [self.blockedGroupIdSet addObject:groupId]; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         self.blockedGroupMap[groupId] = groupModel; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     [self handleUpdate]; |  |  |  |     [self handleUpdate]; | 
			
		
	
	
		
		
			
				
					|  |  | @ -279,6 +290,16 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan | 
			
		
	
		
		
			
				
					
					|  |  |  |                           forKey:kOWSBlockingManager_BlockedGroupIdsKey |  |  |  |                           forKey:kOWSBlockingManager_BlockedGroupIdsKey | 
			
		
	
		
		
			
				
					
					|  |  |  |                     inCollection:kOWSBlockingManager_BlockListCollection]; |  |  |  |                     inCollection:kOWSBlockingManager_BlockListCollection]; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     NSDictionary *blockedGroupMap; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     @synchronized(self) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         blockedGroupMap = [self.blockedGroupMap copy]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     [self.dbConnection setObject:blockedGroupMap | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                           forKey:kOWSBlockingManager_BlockedGroupMapKey | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     inCollection:kOWSBlockingManager_BlockListCollection]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ |  |  |  |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (sendSyncMessage) { |  |  |  |         if (sendSyncMessage) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             [self sendBlockListSyncMessageWithPhoneNumbers:blockedPhoneNumbers groupIds:blockedGroupIds]; |  |  |  |             [self sendBlockListSyncMessageWithPhoneNumbers:blockedPhoneNumbers groupIds:blockedGroupIds]; | 
			
		
	
	
		
		
			
				
					|  |  | @ -323,6 +344,15 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan | 
			
		
	
		
		
			
				
					
					|  |  |  |                                                             inCollection:kOWSBlockingManager_BlockListCollection]; |  |  |  |                                                             inCollection:kOWSBlockingManager_BlockListCollection]; | 
			
		
	
		
		
			
				
					
					|  |  |  |     _blockedGroupIdSet = [[NSMutableSet alloc] initWithArray:(blockedGroupIds ?: [NSArray new])]; |  |  |  |     _blockedGroupIdSet = [[NSMutableSet alloc] initWithArray:(blockedGroupIds ?: [NSArray new])]; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     NSDictionary<NSData *, TSGroupModel *> *storedBlockedGroupMap = | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         [self.dbConnection objectForKey:kOWSBlockingManager_BlockedGroupMapKey | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                            inCollection:kOWSBlockingManager_BlockListCollection]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if ([storedBlockedGroupMap isKindOfClass:[NSDictionary class]]) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         _blockedGroupMap = [storedBlockedGroupMap mutableCopy]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         _blockedGroupMap = [NSMutableDictionary new]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     [self syncBlockListIfNecessary]; |  |  |  |     [self syncBlockListIfNecessary]; | 
			
		
	
		
		
			
				
					
					|  |  |  |     [self observeNotifications]; |  |  |  |     [self observeNotifications]; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |