diff --git a/Signal/src/Models/TSMessageAdapaters/TSMessageAdapter.m b/Signal/src/Models/TSMessageAdapaters/TSMessageAdapter.m index 3bd3ae9c6..79b598afc 100644 --- a/Signal/src/Models/TSMessageAdapaters/TSMessageAdapter.m +++ b/Signal/src/Models/TSMessageAdapaters/TSMessageAdapter.m @@ -57,7 +57,6 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic) double expiresAtSeconds; @property (nonatomic) uint32_t expiresInSeconds; -@property (nonatomic) NSDate *messageDate; @property (nonatomic) NSString *messageBody; @property (nonatomic) NSString *interactionUniqueId; @@ -76,7 +75,6 @@ NS_ASSUME_NONNULL_BEGIN } _interaction = interaction; - _messageDate = interaction.dateForSorting; self.interactionUniqueId = interaction.uniqueId; @@ -249,7 +247,6 @@ NS_ASSUME_NONNULL_BEGIN return call; } } else if ([interaction isKindOfClass:[TSUnreadIndicatorInteraction class]]) { - TSUnreadIndicatorInteraction *unreadIndicator = (TSUnreadIndicatorInteraction *)interaction; adapter.messageType = TSUnreadIndicatorAdapter; } else if ([interaction isKindOfClass:[TSErrorMessage class]]) { TSErrorMessage *errorMessage = (TSErrorMessage *)interaction; @@ -276,7 +273,7 @@ NS_ASSUME_NONNULL_BEGIN } - (NSDate *)date { - return self.messageDate; + return self.interaction.dateForSorting; } #pragma mark - OWSMessageEditing Protocol diff --git a/Signal/src/util/ThreadUtil.m b/Signal/src/util/ThreadUtil.m index 07009537d..96e154697 100644 --- a/Signal/src/util/ThreadUtil.m +++ b/Signal/src/util/ThreadUtil.m @@ -104,7 +104,6 @@ NS_ASSUME_NONNULL_BEGIN __block OWSAddToContactsOfferMessage *existingAddToContactsOffer = nil; __block OWSUnknownContactBlockOfferMessage *existingBlockOffer = nil; __block TSUnreadIndicatorInteraction *existingUnreadIndicator = nil; - NSMutableArray *safetyNumberChanges = [NSMutableArray new]; __block TSIncomingMessage *firstIncomingMessage = nil; __block TSOutgoingMessage *firstOutgoingMessage = nil; __block long outgoingMessageCount = 0; @@ -124,14 +123,27 @@ NS_ASSUME_NONNULL_BEGIN } else if ([object isKindOfClass:[TSUnreadIndicatorInteraction class]]) { OWSAssert(!existingUnreadIndicator); existingUnreadIndicator = (TSUnreadIndicatorInteraction *)object; - } else if ([object isKindOfClass:[TSInvalidIdentityKeyErrorMessage class]]) { - [safetyNumberChanges addObject:object]; } else { DDLogError(@"Unexpected dynamic interaction type: %@", [object class]); OWSAssert(0); } }]; + // We use different views for performance reasons. + NSMutableArray *safetyNumberChanges = [NSMutableArray new]; + [[transaction ext:TSSafetyNumberChangeDatabaseViewExtensionName] + enumerateRowsInGroup:thread.uniqueId + usingBlock:^( + NSString *collection, NSString *key, id object, id metadata, NSUInteger index, BOOL *stop) { + + if ([object isKindOfClass:[TSInvalidIdentityKeyErrorMessage class]]) { + [safetyNumberChanges addObject:object]; + } else { + DDLogError(@"Unexpected interaction type: %@", [object class]); + OWSAssert(0); + } + }]; + // IFF this variable is non-null, there are unseen messages in the thread. __block NSNumber *firstUnseenInteractionTimestamp; if (firstUnseenInteractionTimestampParameter) { @@ -169,8 +181,7 @@ NS_ASSUME_NONNULL_BEGIN firstIncomingMessage = incomingMessage; } else { OWSAssert( - [[firstIncomingMessage dateForSorting] compare:[incomingMessage dateForSorting]] - == NSOrderedAscending); + [firstIncomingMessage compareForSorting:incomingMessage] == NSOrderedAscending); } } else if ([object isKindOfClass:[TSOutgoingMessage class]]) { TSOutgoingMessage *outgoingMessage = (TSOutgoingMessage *)object; @@ -178,8 +189,7 @@ NS_ASSUME_NONNULL_BEGIN firstOutgoingMessage = outgoingMessage; } else { OWSAssert( - [[firstOutgoingMessage dateForSorting] compare:[outgoingMessage dateForSorting]] - == NSOrderedAscending); + [firstOutgoingMessage compareForSorting:outgoingMessage] == NSOrderedAscending); } outgoingMessageCount++; if (outgoingMessageCount >= kMaxBlockOfferOutgoingMessageCount) { @@ -268,9 +278,7 @@ NS_ASSUME_NONNULL_BEGIN TSMessage *firstMessage = firstIncomingMessage; if (!firstMessage - || (firstOutgoingMessage && - [[firstOutgoingMessage dateForSorting] compare:[firstMessage dateForSorting]] - == NSOrderedAscending)) { + || (firstOutgoingMessage && [firstOutgoingMessage compareForSorting:firstMessage] == NSOrderedAscending)) { firstMessage = firstOutgoingMessage; } @@ -314,8 +322,7 @@ NS_ASSUME_NONNULL_BEGIN BOOL hasOutgoingBeforeIncomingInteraction = (firstOutgoingMessage && (!firstIncomingMessage || - [[firstOutgoingMessage dateForSorting] compare:[firstIncomingMessage dateForSorting]] - == NSOrderedAscending)); + [firstOutgoingMessage compareForSorting:firstIncomingMessage] == NSOrderedAscending)); if (hasOutgoingBeforeIncomingInteraction) { // If there is an outgoing message before an incoming message // the local user initiated this conversation, don't show a block offer.