Introduce ConversationSnapshot.

pull/2/head
Matthew Chen 6 years ago
parent 9471f24cf3
commit 8b3d08c7e3

@ -450,11 +450,11 @@ typedef enum : NSUInteger {
NSString *_Nullable recipientId = notification.userInfo[kNSNotificationKey_ProfileRecipientId]; NSString *_Nullable recipientId = notification.userInfo[kNSNotificationKey_ProfileRecipientId];
NSData *_Nullable groupId = notification.userInfo[kNSNotificationKey_ProfileGroupId]; NSData *_Nullable groupId = notification.userInfo[kNSNotificationKey_ProfileGroupId];
if (recipientId.length > 0 && [self.thread.recipientIdentifiers containsObject:recipientId]) { if (recipientId.length > 0 && [self.thread.recipientIdentifiers containsObject:recipientId]) {
[self.conversationViewModel ensureDynamicInteractions]; [self.conversationViewModel ensureDynamicInteractionsAndUpdateIfNecessary:YES];
} else if (groupId.length > 0 && self.thread.isGroupThread) { } else if (groupId.length > 0 && self.thread.isGroupThread) {
TSGroupThread *groupThread = (TSGroupThread *)self.thread; TSGroupThread *groupThread = (TSGroupThread *)self.thread;
if ([groupThread.groupModel.groupId isEqualToData:groupId]) { if ([groupThread.groupModel.groupId isEqualToData:groupId]) {
[self.conversationViewModel ensureDynamicInteractions]; [self.conversationViewModel ensureDynamicInteractionsAndUpdateIfNecessary:YES];
[self ensureBannerState]; [self ensureBannerState];
} }
} }
@ -868,6 +868,7 @@ typedef enum : NSUInteger {
// Avoid layout corrupt issues and out-of-date message subtitles. // Avoid layout corrupt issues and out-of-date message subtitles.
self.lastReloadDate = [NSDate new]; self.lastReloadDate = [NSDate new];
[self.conversationViewModel viewDidResetContentAndLayout]; [self.conversationViewModel viewDidResetContentAndLayout];
[self tryToUpdateConversationSnapshot];
[self.collectionView.collectionViewLayout invalidateLayout]; [self.collectionView.collectionViewLayout invalidateLayout];
[self.collectionView reloadData]; [self.collectionView reloadData];
@ -2437,7 +2438,7 @@ typedef enum : NSUInteger {
- (void)contactsViewHelperDidUpdateContacts - (void)contactsViewHelperDidUpdateContacts
{ {
[self.conversationViewModel ensureDynamicInteractions]; [self.conversationViewModel ensureDynamicInteractionsAndUpdateIfNecessary:YES];
} }
- (void)createConversationScrollButtons - (void)createConversationScrollButtons
@ -2475,7 +2476,7 @@ typedef enum : NSUInteger {
_hasUnreadMessages = hasUnreadMessages; _hasUnreadMessages = hasUnreadMessages;
self.scrollDownButton.hasUnreadMessages = hasUnreadMessages; self.scrollDownButton.hasUnreadMessages = hasUnreadMessages;
[self.conversationViewModel ensureDynamicInteractions]; [self.conversationViewModel ensureDynamicInteractionsAndUpdateIfNecessary:YES];
} }
- (void)scrollDownButtonTapped - (void)scrollDownButtonTapped
@ -2620,7 +2621,7 @@ typedef enum : NSUInteger {
[self showApprovalDialogForAttachment:attachment]; [self showApprovalDialogForAttachment:attachment];
[ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:self.thread]; [ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:self.thread];
[self.conversationViewModel ensureDynamicInteractions]; [self.conversationViewModel ensureDynamicInteractionsAndUpdateIfNecessary:YES];
} }
- (void)messageWasSent:(TSOutgoingMessage *)message - (void)messageWasSent:(TSOutgoingMessage *)message
@ -2980,7 +2981,7 @@ typedef enum : NSUInteger {
[self messageWasSent:message]; [self messageWasSent:message];
if (didAddToProfileWhitelist) { if (didAddToProfileWhitelist) {
[self.conversationViewModel ensureDynamicInteractions]; [self.conversationViewModel ensureDynamicInteractionsAndUpdateIfNecessary:YES];
} }
}]; }];
} }
@ -3626,7 +3627,7 @@ typedef enum : NSUInteger {
[self messageWasSent:message]; [self messageWasSent:message];
if (didAddToProfileWhitelist) { if (didAddToProfileWhitelist) {
[self.conversationViewModel ensureDynamicInteractions]; [self.conversationViewModel ensureDynamicInteractionsAndUpdateIfNecessary:YES];
} }
}); });
} }
@ -4029,7 +4030,7 @@ typedef enum : NSUInteger {
[self clearDraft]; [self clearDraft];
if (didAddToProfileWhitelist) { if (didAddToProfileWhitelist) {
[self.conversationViewModel ensureDynamicInteractions]; [self.conversationViewModel ensureDynamicInteractionsAndUpdateIfNecessary:YES];
} }
} }
@ -4927,6 +4928,15 @@ typedef enum : NSUInteger {
#pragma mark - Conversation Snapshot #pragma mark - Conversation Snapshot
- (void)tryToUpdateConversationSnapshot
{
if (!self.isObservingVMUpdates) {
return;
}
[self updateConversationSnapshot];
}
- (void)updateConversationSnapshot - (void)updateConversationSnapshot
{ {
ConversationSnapshot *conversationSnapshot = [ConversationSnapshot new]; ConversationSnapshot *conversationSnapshot = [ConversationSnapshot new];

@ -93,7 +93,7 @@ typedef NS_ENUM(NSUInteger, ConversationUpdateItemType) {
focusMessageIdOnOpen:(nullable NSString *)focusMessageIdOnOpen focusMessageIdOnOpen:(nullable NSString *)focusMessageIdOnOpen
delegate:(id<ConversationViewModelDelegate>)delegate NS_DESIGNATED_INITIALIZER; delegate:(id<ConversationViewModelDelegate>)delegate NS_DESIGNATED_INITIALIZER;
- (void)ensureDynamicInteractions; - (void)ensureDynamicInteractionsAndUpdateIfNecessary:(BOOL)updateIfNecessary;
- (void)clearUnreadMessagesIndicator; - (void)clearUnreadMessagesIndicator;

@ -273,7 +273,7 @@ static const int kYapDatabaseRangeMaxLength = 25000;
{ {
OWSAssertIsOnMainThread(); OWSAssertIsOnMainThread();
[self ensureDynamicInteractions]; [self ensureDynamicInteractionsAndUpdateIfNecessary:YES];
} }
- (void)profileWhitelistDidChange:(NSNotification *)notification - (void)profileWhitelistDidChange:(NSNotification *)notification
@ -308,7 +308,7 @@ static const int kYapDatabaseRangeMaxLength = 25000;
self.typingIndicatorsSender = [self.typingIndicators typingRecipientIdForThread:self.thread]; self.typingIndicatorsSender = [self.typingIndicators typingRecipientIdForThread:self.thread];
self.collapseCutoffDate = [NSDate new]; self.collapseCutoffDate = [NSDate new];
[self ensureDynamicInteractions]; [self ensureDynamicInteractionsAndUpdateIfNecessary:NO];
[self.primaryStorage updateUIDatabaseConnectionToLatest]; [self.primaryStorage updateUIDatabaseConnectionToLatest];
[self createNewMessageMapping]; [self createNewMessageMapping];
@ -464,14 +464,15 @@ static const int kYapDatabaseRangeMaxLength = 25000;
self.collapseCutoffDate = [NSDate new]; self.collapseCutoffDate = [NSDate new];
} }
- (void)ensureDynamicInteractions - (void)ensureDynamicInteractionsAndUpdateIfNecessary:(BOOL)updateIfNecessary
{ {
OWSAssertIsOnMainThread(); OWSAssertIsOnMainThread();
const int currentMaxRangeSize = (int)self.messageMapping.desiredLength; const int currentMaxRangeSize = (int)self.messageMapping.desiredLength;
const int maxRangeSize = MAX(kConversationInitialMaxRangeSize, currentMaxRangeSize); const int maxRangeSize = MAX(kConversationInitialMaxRangeSize, currentMaxRangeSize);
self.dynamicInteractions = [ThreadUtil ensureDynamicInteractionsForThread:self.thread ThreadDynamicInteractions *dynamicInteractions =
[ThreadUtil ensureDynamicInteractionsForThread:self.thread
contactsManager:self.contactsManager contactsManager:self.contactsManager
blockingManager:self.blockingManager blockingManager:self.blockingManager
dbConnection:self.editingDatabaseConnection dbConnection:self.editingDatabaseConnection
@ -479,6 +480,16 @@ static const int kYapDatabaseRangeMaxLength = 25000;
lastUnreadIndicator:self.dynamicInteractions.unreadIndicator lastUnreadIndicator:self.dynamicInteractions.unreadIndicator
focusMessageId:self.focusMessageIdOnOpen focusMessageId:self.focusMessageIdOnOpen
maxRangeSize:maxRangeSize]; maxRangeSize:maxRangeSize];
BOOL didChange = ![NSObject isNullableObject:self.dynamicInteractions equalTo:dynamicInteractions];
self.dynamicInteractions = dynamicInteractions;
if (didChange && updateIfNecessary) {
if (![self reloadViewItems]) {
OWSFailDebug(@"Failed to reload view items.");
}
[self.delegate conversationViewModelDidUpdate:ConversationUpdate.reloadUpdate];
}
} }
- (nullable id<ConversationViewItem>)viewItemForUnreadMessagesIndicator - (nullable id<ConversationViewItem>)viewItemForUnreadMessagesIndicator
@ -519,7 +530,7 @@ static const int kYapDatabaseRangeMaxLength = 25000;
if (self.dynamicInteractions.unreadIndicator) { if (self.dynamicInteractions.unreadIndicator) {
// If we've just cleared the "unread messages" indicator, // If we've just cleared the "unread messages" indicator,
// update the dynamic interactions. // update the dynamic interactions.
[self ensureDynamicInteractions]; [self ensureDynamicInteractionsAndUpdateIfNecessary:YES];
} }
} }
@ -962,7 +973,7 @@ static const int kYapDatabaseRangeMaxLength = 25000;
self.collapseCutoffDate = [NSDate new]; self.collapseCutoffDate = [NSDate new];
[self ensureDynamicInteractions]; [self ensureDynamicInteractionsAndUpdateIfNecessary:NO];
if (![self reloadViewItems]) { if (![self reloadViewItems]) {
OWSFailDebug(@"failed to reload view items in resetMapping."); OWSFailDebug(@"failed to reload view items in resetMapping.");
@ -1584,7 +1595,7 @@ static const int kYapDatabaseRangeMaxLength = 25000;
self.collapseCutoffDate = [NSDate new]; self.collapseCutoffDate = [NSDate new];
[self ensureDynamicInteractions]; [self ensureDynamicInteractionsAndUpdateIfNecessary:NO];
if (![self reloadViewItems]) { if (![self reloadViewItems]) {
OWSFailDebug(@"failed to reload view items in resetMapping."); OWSFailDebug(@"failed to reload view items in resetMapping.");

@ -45,6 +45,21 @@ NS_ASSUME_NONNULL_BEGIN
self.unreadIndicator = nil; self.unreadIndicator = nil;
} }
- (BOOL)isEqual:(id)object
{
if (self == object) {
return YES;
}
if (![object isKindOfClass:[ThreadDynamicInteractions class]]) {
return NO;
}
ThreadDynamicInteractions *other = (ThreadDynamicInteractions *)object;
return ([NSObject isNullableObject:self.focusMessagePosition equalTo:other.focusMessagePosition] &&
[NSObject isNullableObject:self.unreadIndicator equalTo:other.unreadIndicator]);
}
@end @end
#pragma mark - #pragma mark -

Loading…
Cancel
Save