consolidate blocked-group state tracking

pull/1/head
Michael Kirk 7 years ago
parent 0f9b0936df
commit 24ea8262d5

@ -110,16 +110,15 @@ NS_ASSUME_NONNULL_BEGIN
[contents addSection:blockedContactsSection]; [contents addSection:blockedContactsSection];
} }
NSArray<NSData *> *blockedGroupIds = self.blockingManager.blockedGroupIds; NSArray<TSGroupModel *> *blockedGroups = self.blockingManager.blockedGroups;
if (blockedGroupIds.count > 0) { if (blockedGroups.count > 0) {
OWSTableSection *blockedGroupsSection = [OWSTableSection new]; OWSTableSection *blockedGroupsSection = [OWSTableSection new];
blockedGroupsSection.headerTitle = NSLocalizedString( blockedGroupsSection.headerTitle = NSLocalizedString(
@"BLOCK_LIST_BLOCKED_GROUPS_SECTION", @"Section header for groups that have been blocked"); @"BLOCK_LIST_BLOCKED_GROUPS_SECTION", @"Section header for groups that have been blocked");
for (NSData *groupId in blockedGroupIds) {
TSGroupModel *_Nullable cachedGroup = [self.blockingManager cachedGroupDetailsWithGroupId:groupId]; for (TSGroupModel *blockedGroup in blockedGroups) {
OWSAssert(cachedGroup); UIImage *image = blockedGroup.groupImage ?: OWSGroupAvatarBuilder.defaultGroupImage;
UIImage *image = cachedGroup.groupImage ?: OWSGroupAvatarBuilder.defaultGroupImage; NSString *groupName = blockedGroup.groupName ?: TSGroupThread.defaultGroupName;
NSString *groupName = cachedGroup.groupName ?: TSGroupThread.defaultGroupName;
[blockedGroupsSection addItem:[OWSTableItem [blockedGroupsSection addItem:[OWSTableItem
itemWithCustomCellBlock:^{ itemWithCustomCellBlock:^{
@ -131,7 +130,7 @@ NS_ASSUME_NONNULL_BEGIN
} }
customRowHeight:UITableViewAutomaticDimension customRowHeight:UITableViewAutomaticDimension
actionBlock:^{ actionBlock:^{
[BlockListUIUtils showUnblockGroupActionSheet:cachedGroup [BlockListUIUtils showUnblockGroupActionSheet:blockedGroup
displayName:groupName displayName:groupName
fromViewController:weakSelf fromViewController:weakSelf
blockingManager:helper.blockingManager blockingManager:helper.blockingManager

@ -28,6 +28,8 @@ extern NSString *const kNSNotificationName_BlockListDidChange;
- (NSArray<NSString *> *)blockedPhoneNumbers; - (NSArray<NSString *> *)blockedPhoneNumbers;
@property (readonly) NSArray<NSData *> *blockedGroupIds; @property (readonly) NSArray<NSData *> *blockedGroupIds;
@property (readonly) NSArray<TSGroupModel *> *blockedGroups;
- (void)addBlockedGroup:(TSGroupModel *)group; - (void)addBlockedGroup:(TSGroupModel *)group;
- (void)removeBlockedGroupId:(NSData *)groupId; - (void)removeBlockedGroupId:(NSData *)groupId;
- (nullable TSGroupModel *)cachedGroupDetailsWithGroupId:(NSData *)groupId; - (nullable TSGroupModel *)cachedGroupDetailsWithGroupId:(NSData *)groupId;

@ -22,7 +22,6 @@ 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_BlockedGroupMapKey = @"kOWSBlockingManager_BlockedGroupMapKey"; 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.
@ -38,7 +37,6 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
// consistency issues between clients, but these should all be valid e164 // consistency issues between clients, but these should all be valid e164
// 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) NSMutableDictionary<NSData *, TSGroupModel *> *blockedGroupMap; @property (atomic, readonly) NSMutableDictionary<NSData *, TSGroupModel *> *blockedGroupMap;
@end @end
@ -205,14 +203,21 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
{ {
@synchronized(self) { @synchronized(self) {
[self ensureLazyInitialization]; [self ensureLazyInitialization];
// TODO use blockedGroupMap.allKeys? return self.blockedGroupMap.allKeys;
return _blockedGroupIdSet.allObjects; }
}
- (NSArray<TSGroupModel *> *)blockedGroups
{
@synchronized(self) {
[self ensureLazyInitialization];
return self.blockedGroupMap.allValues;
} }
} }
- (BOOL)isGroupIdBlocked:(NSData *)groupId - (BOOL)isGroupIdBlocked:(NSData *)groupId
{ {
return [self.blockedGroupIds containsObject:groupId]; return self.blockedGroupMap[groupId] != nil;
} }
- (nullable TSGroupModel *)cachedGroupDetailsWithGroupId:(NSData *)groupId - (nullable TSGroupModel *)cachedGroupDetailsWithGroupId:(NSData *)groupId
@ -232,12 +237,10 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
@synchronized(self) { @synchronized(self) {
[self ensureLazyInitialization]; [self ensureLazyInitialization];
if ([self.blockedGroupIdSet containsObject:groupId]) { if ([self isGroupIdBlocked:groupId]) {
// Ignore redundant changes. // Ignore redundant changes.
return; return;
} }
[self.blockedGroupIdSet addObject:groupId];
self.blockedGroupMap[groupId] = groupModel; self.blockedGroupMap[groupId] = groupModel;
} }
@ -253,12 +256,12 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
@synchronized(self) { @synchronized(self) {
[self ensureLazyInitialization]; [self ensureLazyInitialization];
if (![_blockedGroupIdSet containsObject:groupId]) { if (![self isGroupIdBlocked:groupId]) {
// Ignore redundant changes. // Ignore redundant changes.
return; return;
} }
[_blockedGroupIdSet removeObject:groupId]; [self.blockedGroupMap removeObjectForKey:groupId];
} }
[self handleUpdate]; [self handleUpdate];
@ -284,16 +287,11 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
forKey:kOWSBlockingManager_BlockedPhoneNumbersKey forKey:kOWSBlockingManager_BlockedPhoneNumbersKey
inCollection:kOWSBlockingManager_BlockListCollection]; inCollection:kOWSBlockingManager_BlockListCollection];
NSArray<NSData *> *blockedGroupIds = [self blockedGroupIds];
[self.dbConnection setObject:blockedGroupIds
forKey:kOWSBlockingManager_BlockedGroupIdsKey
inCollection:kOWSBlockingManager_BlockListCollection];
NSDictionary *blockedGroupMap; NSDictionary *blockedGroupMap;
@synchronized(self) { @synchronized(self) {
blockedGroupMap = [self.blockedGroupMap copy]; blockedGroupMap = [self.blockedGroupMap copy];
} }
NSArray<NSData *> *blockedGroupIds = blockedGroupMap.allKeys;
[self.dbConnection setObject:blockedGroupMap [self.dbConnection setObject:blockedGroupMap
forKey:kOWSBlockingManager_BlockedGroupMapKey forKey:kOWSBlockingManager_BlockedGroupMapKey
@ -329,7 +327,7 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
- (void)ensureLazyInitialization - (void)ensureLazyInitialization
{ {
if (_blockedPhoneNumberSet) { if (_blockedPhoneNumberSet) {
OWSAssert(_blockedGroupIdSet); OWSAssert(_blockedGroupMap);
// already loaded // already loaded
return; return;
@ -340,10 +338,6 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
inCollection:kOWSBlockingManager_BlockListCollection]; inCollection:kOWSBlockingManager_BlockListCollection];
_blockedPhoneNumberSet = [[NSMutableSet alloc] initWithArray:(blockedPhoneNumbers ?: [NSArray new])]; _blockedPhoneNumberSet = [[NSMutableSet alloc] initWithArray:(blockedPhoneNumbers ?: [NSArray new])];
NSArray<NSData *> *blockedGroupIds = [self.dbConnection objectForKey:kOWSBlockingManager_BlockedGroupIdsKey
inCollection:kOWSBlockingManager_BlockListCollection];
_blockedGroupIdSet = [[NSMutableSet alloc] initWithArray:(blockedGroupIds ?: [NSArray new])];
NSDictionary<NSData *, TSGroupModel *> *storedBlockedGroupMap = NSDictionary<NSData *, TSGroupModel *> *storedBlockedGroupMap =
[self.dbConnection objectForKey:kOWSBlockingManager_BlockedGroupMapKey [self.dbConnection objectForKey:kOWSBlockingManager_BlockedGroupMapKey
inCollection:kOWSBlockingManager_BlockListCollection]; inCollection:kOWSBlockingManager_BlockListCollection];
@ -384,14 +378,17 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
inCollection:kOWSBlockingManager_BlockListCollection]; inCollection:kOWSBlockingManager_BlockListCollection];
NSSet<NSData *> *syncedBlockedGroupIdSet = [[NSSet alloc] initWithArray:(syncedBlockedGroupIds ?: [NSArray new])]; NSSet<NSData *> *syncedBlockedGroupIdSet = [[NSSet alloc] initWithArray:(syncedBlockedGroupIds ?: [NSArray new])];
NSArray<NSData *> *localBlockedGroupIds = self.blockedGroupIds;
NSSet<NSData *> *localBlockedGroupIdSet = [[NSSet alloc] initWithArray:localBlockedGroupIds];
if ([self.blockedPhoneNumberSet isEqualToSet:syncedBlockedPhoneNumberSet] && if ([self.blockedPhoneNumberSet isEqualToSet:syncedBlockedPhoneNumberSet] &&
[self.blockedGroupIdSet isEqualToSet:syncedBlockedGroupIdSet]) { [localBlockedGroupIdSet isEqualToSet:syncedBlockedGroupIdSet]) {
DDLogVerbose(@"Ignoring redundant block list sync"); DDLogVerbose(@"Ignoring redundant block list sync");
return; return;
} }
DDLogInfo(@"%@ retrying sync of block list", self.logTag); DDLogInfo(@"%@ retrying sync of block list", self.logTag);
[self sendBlockListSyncMessageWithPhoneNumbers:self.blockedPhoneNumbers groupIds:self.blockedGroupIds]; [self sendBlockListSyncMessageWithPhoneNumbers:self.blockedPhoneNumbers groupIds:localBlockedGroupIds];
} }
- (void)sendBlockListSyncMessageWithPhoneNumbers:(NSArray<NSString *> *)blockedPhoneNumbers - (void)sendBlockListSyncMessageWithPhoneNumbers:(NSArray<NSString *> *)blockedPhoneNumbers

Loading…
Cancel
Save