Cache group details on blocking manager

In case the group thread is later deleted.
pull/1/head
Michael Kirk 7 years ago
parent 8d51839a2a
commit 1f15ba6dc5

@ -231,7 +231,7 @@ typedef void (^BlockAlertCompletionBlock)(UIAlertAction *action);
OWSAssert(blockingManager);
// block the group regardless of the ability to deliver the "leave group" message.
[blockingManager addBlockedGroupId:groupThread.groupModel.groupId];
[blockingManager addBlockedGroup:groupThread.groupModel];
// blockingManager.addBlocked* creates sneaky transactions, so we can't pass in a transaction
// via params and instead have to create our own sneaky transaction here.

@ -4,6 +4,7 @@
NS_ASSUME_NONNULL_BEGIN
@class TSGroupModel;
@class TSThread;
extern NSString *const kNSNotificationName_BlockListDidChange;
@ -27,8 +28,9 @@ extern NSString *const kNSNotificationName_BlockListDidChange;
- (NSArray<NSString *> *)blockedPhoneNumbers;
@property (readonly) NSArray<NSData *> *blockedGroupIds;
- (void)addBlockedGroupId:(NSData *)groupId;
- (void)addBlockedGroup:(TSGroupModel *)group;
- (void)removeBlockedGroupId:(NSData *)groupId;
- (nullable TSGroupModel *)cachedGroupDetailsWithGroupId:(NSData *)groupId;
- (BOOL)isRecipientIdBlocked:(NSString *)recipientId;
- (BOOL)isGroupIdBlocked:(NSData *)groupId;

@ -23,6 +23,7 @@ NSString *const kOWSBlockingManager_BlockListCollection = @"kOWSBlockingManager_
// These keys are used to persist the current local "block list" state.
NSString *const kOWSBlockingManager_BlockedPhoneNumbersKey = @"kOWSBlockingManager_BlockedPhoneNumbersKey";
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.
NSString *const kOWSBlockingManager_SyncedBlockedPhoneNumbersKey = @"kOWSBlockingManager_SyncedBlockedPhoneNumbersKey";
@ -38,6 +39,7 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
// phone numbers.
@property (atomic, readonly) NSMutableSet<NSString *> *blockedPhoneNumberSet;
@property (atomic, readonly) NSMutableSet<NSData *> *blockedGroupIdSet;
@property (atomic, readonly) NSMutableDictionary<NSData *, TSGroupModel *> *blockedGroupMap;
@end
@ -203,7 +205,7 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
{
@synchronized(self) {
[self ensureLazyInitialization];
// TODO use blockedGroupMap.allKeys?
return _blockedGroupIdSet.allObjects;
}
}
@ -213,8 +215,16 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
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);
DDLogInfo(@"%@ addBlockedGroupId: %@", self.logTag, groupId);
@ -222,12 +232,13 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
@synchronized(self) {
[self ensureLazyInitialization];
if ([_blockedGroupIdSet containsObject:groupId]) {
if ([self.blockedGroupIdSet containsObject:groupId]) {
// Ignore redundant changes.
return;
}
[_blockedGroupIdSet addObject:groupId];
[self.blockedGroupIdSet addObject:groupId];
self.blockedGroupMap[groupId] = groupModel;
}
[self handleUpdate];
@ -279,6 +290,16 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
forKey:kOWSBlockingManager_BlockedGroupIdsKey
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), ^{
if (sendSyncMessage) {
[self sendBlockListSyncMessageWithPhoneNumbers:blockedPhoneNumbers groupIds:blockedGroupIds];
@ -323,6 +344,15 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
inCollection:kOWSBlockingManager_BlockListCollection];
_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 observeNotifications];
}

Loading…
Cancel
Save