Observe profile changes in conversation view.

// FREEBIE
pull/1/head
Matthew Chen 8 years ago
parent 9a70aef99f
commit 1e43e93371

@ -8,6 +8,9 @@ NS_ASSUME_NONNULL_BEGIN
extern NSString *const kNSNotificationName_LocalProfileDidChange; extern NSString *const kNSNotificationName_LocalProfileDidChange;
extern NSString *const kNSNotificationName_OtherUsersProfileDidChange; extern NSString *const kNSNotificationName_OtherUsersProfileDidChange;
extern NSString *const kNSNotificationName_ProfileWhitelistDidChange;
extern NSString *const kNSNotificationName_ProfileRecipientId;
extern NSString *const kNSNotificationName_ProfileGroupId;
extern const NSUInteger kOWSProfileManager_MaxAvatarDiameter; extern const NSUInteger kOWSProfileManager_MaxAvatarDiameter;

@ -87,6 +87,9 @@ NSString *const kLocalProfileUniqueId = @"kLocalProfileUniqueId";
NSString *const kNSNotificationName_LocalProfileDidChange = @"kNSNotificationName_LocalProfileDidChange"; NSString *const kNSNotificationName_LocalProfileDidChange = @"kNSNotificationName_LocalProfileDidChange";
NSString *const kNSNotificationName_OtherUsersProfileDidChange = @"kNSNotificationName_OtherUsersProfileDidChange"; NSString *const kNSNotificationName_OtherUsersProfileDidChange = @"kNSNotificationName_OtherUsersProfileDidChange";
NSString *const kNSNotificationName_ProfileWhitelistDidChange = @"kNSNotificationName_ProfileWhitelistDidChange";
NSString *const kNSNotificationName_ProfileRecipientId = @"kNSNotificationName_ProfileRecipientId";
NSString *const kNSNotificationName_ProfileGroupId = @"kNSNotificationName_ProfileGroupId";
NSString *const kOWSProfileManager_UserWhitelistCollection = @"kOWSProfileManager_UserWhitelistCollection"; NSString *const kOWSProfileManager_UserWhitelistCollection = @"kOWSProfileManager_UserWhitelistCollection";
NSString *const kOWSProfileManager_GroupWhitelistCollection = @"kOWSProfileManager_GroupWhitelistCollection"; NSString *const kOWSProfileManager_GroupWhitelistCollection = @"kOWSProfileManager_GroupWhitelistCollection";
@ -251,7 +254,9 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
[[NSNotificationCenter defaultCenter] [[NSNotificationCenter defaultCenter]
postNotificationName:kNSNotificationName_OtherUsersProfileDidChange postNotificationName:kNSNotificationName_OtherUsersProfileDidChange
object:nil object:nil
userInfo:nil]; userInfo:@{
kNSNotificationName_ProfileRecipientId : userProfile.recipientId,
}];
} }
}); });
} }
@ -655,9 +660,22 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
@synchronized(self) @synchronized(self)
{ {
// We just consult the lazy cache, not the db.
if (self.userProfileWhitelistCache[recipientId]) {
return;
}
self.userProfileWhitelistCache[recipientId] = @(YES); self.userProfileWhitelistCache[recipientId] = @(YES);
[self.dbConnection setBool:YES forKey:recipientId inCollection:kOWSProfileManager_UserWhitelistCollection]; [self.dbConnection setBool:YES forKey:recipientId inCollection:kOWSProfileManager_UserWhitelistCollection];
} }
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:kNSNotificationName_ProfileWhitelistDidChange
object:nil
userInfo:@{
kNSNotificationName_ProfileRecipientId : recipientId,
}];
});
}); });
} }
@ -666,9 +684,11 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
OWSAssert(recipientIds); OWSAssert(recipientIds);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSMutableArray<NSString *> *newRecipientIds = [NSMutableArray new];
@synchronized(self) @synchronized(self)
{ {
NSMutableArray<NSString *> *newRecipientIds = [NSMutableArray new]; // We just consult the lazy cache, not the db.
for (NSString *recipientId in recipientIds) { for (NSString *recipientId in recipientIds) {
if (!self.userProfileWhitelistCache[recipientId]) { if (!self.userProfileWhitelistCache[recipientId]) {
[newRecipientIds addObject:recipientId]; [newRecipientIds addObject:recipientId];
@ -688,6 +708,17 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
} }
}]; }];
} }
dispatch_async(dispatch_get_main_queue(), ^{
for (NSString *recipientId in newRecipientIds) {
[[NSNotificationCenter defaultCenter]
postNotificationName:kNSNotificationName_ProfileWhitelistDidChange
object:nil
userInfo:@{
kNSNotificationName_ProfileRecipientId : recipientId,
}];
}
});
}); });
} }
@ -713,12 +744,30 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
{ {
OWSAssert(groupId.length > 0); OWSAssert(groupId.length > 0);
@synchronized(self) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
{ @synchronized(self)
NSString *groupIdKey = [groupId hexadecimalString]; {
[self.dbConnection setObject:@(1) forKey:groupIdKey inCollection:kOWSProfileManager_GroupWhitelistCollection]; NSString *groupIdKey = [groupId hexadecimalString];
self.groupProfileWhitelistCache[groupIdKey] = @(YES);
} // We just consult the lazy cache, not the db.
if (self.groupProfileWhitelistCache[groupIdKey]) {
return;
}
[self.dbConnection setObject:@(1)
forKey:groupIdKey
inCollection:kOWSProfileManager_GroupWhitelistCollection];
self.groupProfileWhitelistCache[groupIdKey] = @(YES);
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:kNSNotificationName_ProfileWhitelistDidChange
object:nil
userInfo:@{
kNSNotificationName_ProfileGroupId : groupId,
}];
});
}
});
} }
- (void)addThreadToProfileWhitelist:(TSThread *)thread - (void)addThreadToProfileWhitelist:(TSThread *)thread

@ -337,6 +337,43 @@ typedef enum : NSUInteger {
selector:@selector(cancelReadTimer) selector:@selector(cancelReadTimer)
name:UIApplicationDidEnterBackgroundNotification name:UIApplicationDidEnterBackgroundNotification
object:nil]; object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(otherUsersProfileDidChange:)
name:kNSNotificationName_OtherUsersProfileDidChange
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(profileWhitelistDidChange:)
name:kNSNotificationName_ProfileWhitelistDidChange
object:nil];
}
- (void)otherUsersProfileDidChange:(NSNotification *)notification
{
OWSAssert([NSThread isMainThread]);
NSString *recipientId = notification.userInfo[kNSNotificationName_ProfileRecipientId];
OWSAssert(recipientId.length > 0);
if (recipientId.length > 0 && [self.thread.recipientIdentifiers containsObject:recipientId]) {
// Reload all cells.
[self resetContentAndLayout];
}
}
- (void)profileWhitelistDidChange:(NSNotification *)notification
{
OWSAssert([NSThread isMainThread]);
// If profile whitelist just changed, we may want to hide a profile whitelist offer.
NSString *_Nullable recipientId = notification.userInfo[kNSNotificationName_ProfileRecipientId];
NSData *_Nullable groupId = notification.userInfo[kNSNotificationName_ProfileGroupId];
if (recipientId.length > 0 && [self.thread.recipientIdentifiers containsObject:recipientId]) {
[self ensureDynamicInteractions];
} else if (groupId.length > 0 && self.thread.isGroupThread) {
TSGroupThread *groupThread = (TSGroupThread *)self.thread;
if ([groupThread.groupModel.groupId isEqualToData:groupId]) {
[self ensureDynamicInteractions];
}
}
} }
- (void)blockedPhoneNumbersDidChange:(id)notification - (void)blockedPhoneNumbersDidChange:(id)notification

Loading…
Cancel
Save