From dcbb72d8513f0acf512a4eb051b7ca96503345eb Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Mon, 12 Jun 2017 13:30:04 -0400 Subject: [PATCH] Filter messages shown in the home view. // FREEBIE --- src/Contacts/TSThread.h | 3 ++ src/Contacts/TSThread.m | 53 +++++++++++++++++++++++++++++----- src/Storage/TSDatabaseView.h | 2 ++ src/Storage/TSDatabaseView.m | 22 ++++++++++++++ src/Storage/TSStorageManager.m | 1 + 5 files changed, 73 insertions(+), 8 deletions(-) diff --git a/src/Contacts/TSThread.h b/src/Contacts/TSThread.h index 7a25f0882..4e4b7fbee 100644 --- a/src/Contacts/TSThread.h +++ b/src/Contacts/TSThread.h @@ -176,6 +176,9 @@ NS_ASSUME_NONNULL_BEGIN // data loss and will resolve all known issues. - (void)updateWithMutedUntilDate:(NSDate *)mutedUntilDate; +// Returns YES IFF the interaction should show up in the inbox as the last message. ++ (BOOL)shouldInteractionAppearInInbox:(TSInteraction *)interaction; + @end NS_ASSUME_NONNULL_END diff --git a/src/Contacts/TSThread.m b/src/Contacts/TSThread.m index 7ef6677cb..fa1aebcb3 100644 --- a/src/Contacts/TSThread.m +++ b/src/Contacts/TSThread.m @@ -228,7 +228,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)markAllAsReadWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { for (id message in [self unseenMessagesWithTransaction:transaction]) { - [message markAsReadWithTransaction:transaction sendReadReceipt:YES]; + [message markAsReadWithTransaction:transaction sendReadReceipt:YES updateExpiration:YES]; } // Just to be defensive, we'll also check for unread messages. @@ -243,6 +243,15 @@ NS_ASSUME_NONNULL_BEGIN return (TSInteraction *)last; } +- (TSInteraction *)lastInteractionForInbox +{ + __block TSInteraction *last; + [TSStorageManager.sharedManager.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + last = [[transaction ext:TSThreadInboxMessagesDatabaseViewExtensionName] lastObjectInGroup:self.uniqueId]; + }]; + return (TSInteraction *)last; +} + - (NSDate *)lastMessageDate { if (_lastMessageDate) { return _lastMessageDate; @@ -252,22 +261,50 @@ NS_ASSUME_NONNULL_BEGIN } - (NSString *)lastMessageLabel { - if (self.lastInteraction == nil) { + TSInteraction *interaction = self.lastInteractionForInbox; + if (interaction == nil) { return @""; } else { - return [self lastInteraction].description; + return interaction.description; + } +} + ++ (BOOL)shouldInteractionAppearInInbox:(TSInteraction *)interaction +{ + OWSAssert(interaction); + + if (interaction.isDynamicInteraction) { + DDLogDebug(@"%@ not showing dynamic interaction in inbox: %@", self.tag, interaction.debugDescription); + return NO; } + + + if ([interaction isKindOfClass:[TSErrorMessage class]]) { + TSErrorMessage *errorMessage = (TSErrorMessage *)interaction; + if (errorMessage.errorType == TSErrorMessageNonBlockingIdentityChange) { + // Otherwise all group threads with the recipient will percolate to the top of the inbox, even though + // there was no meaningful interaction. + DDLogDebug( + @"%@ not showing nonblocking identity change in inbox: %@", self.tag, errorMessage.debugDescription); + return NO; + } + } else if ([interaction isKindOfClass:[TSInfoMessage class]]) { + TSInfoMessage *infoMessage = (TSInfoMessage *)interaction; + if (infoMessage.messageType == TSInfoMessageVerificationStateChange) { + DDLogDebug( + @"%@ not showing verification state change in inbox: %@", self.tag, infoMessage.debugDescription); + return NO; + } + } + + return YES; } - (void)updateWithLastMessage:(TSInteraction *)lastMessage transaction:(YapDatabaseReadWriteTransaction *)transaction { OWSAssert(lastMessage); OWSAssert(transaction); - if (lastMessage.isDynamicInteraction) { - DDLogDebug(@"%@ not updating lastMessage for thread: %@ dynamic interaction: %@", - self.tag, - self, - lastMessage.debugDescription); + if (![self.class shouldInteractionAppearInInbox:lastMessage]) { return; } diff --git a/src/Storage/TSDatabaseView.h b/src/Storage/TSDatabaseView.h index e6645a460..c561e1c32 100644 --- a/src/Storage/TSDatabaseView.h +++ b/src/Storage/TSDatabaseView.h @@ -14,6 +14,7 @@ extern NSString *TSSecondaryDevicesGroup; extern NSString *TSThreadDatabaseViewExtensionName; extern NSString *TSMessageDatabaseViewExtensionName; +extern NSString *TSThreadInboxMessagesDatabaseViewExtensionName; extern NSString *TSThreadIncomingMessageDatabaseViewExtensionName; extern NSString *TSThreadOutgoingMessageDatabaseViewExtensionName; extern NSString *TSUnreadDatabaseViewExtensionName; @@ -24,6 +25,7 @@ extern NSString *TSSecondaryDevicesDatabaseViewExtensionName; + (BOOL)registerThreadDatabaseView; + (BOOL)registerThreadInteractionsDatabaseView; ++ (BOOL)registerThreadInboxMessageDatabaseView; + (BOOL)registerThreadIncomingMessagesDatabaseView; + (BOOL)registerThreadOutgoingMessagesDatabaseView; diff --git a/src/Storage/TSDatabaseView.m b/src/Storage/TSDatabaseView.m index 43e6fd065..c5b0141c1 100644 --- a/src/Storage/TSDatabaseView.m +++ b/src/Storage/TSDatabaseView.m @@ -20,6 +20,7 @@ NSString *TSSecondaryDevicesGroup = @"TSSecondaryDevicesGroup"; NSString *TSThreadDatabaseViewExtensionName = @"TSThreadDatabaseViewExtensionName"; NSString *TSMessageDatabaseViewExtensionName = @"TSMessageDatabaseViewExtensionName"; +NSString *TSThreadInboxMessagesDatabaseViewExtensionName = @"TSThreadInboxMessagesDatabaseViewExtensionName"; NSString *TSThreadIncomingMessageDatabaseViewExtensionName = @"TSThreadOutgoingMessageDatabaseViewExtensionName"; NSString *TSThreadOutgoingMessageDatabaseViewExtensionName = @"TSThreadOutgoingMessageDatabaseViewExtensionName"; NSString *TSUnreadDatabaseViewExtensionName = @"TSUnreadDatabaseViewExtensionName"; @@ -147,6 +148,27 @@ NSString *TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevicesData version:@"1"]; } ++ (BOOL)registerThreadInboxMessageDatabaseView +{ + YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *( + YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { + if ([object isKindOfClass:[TSInteraction class]]) { + TSInteraction *interaction = (TSInteraction *)object; + if (![TSThread shouldInteractionAppearInInbox:interaction]) { + return nil; + } + return interaction.uniqueThreadId; + } else { + OWSAssert(0); + } + return nil; + }]; + + return [self registerMessageDatabaseViewWithName:TSThreadInboxMessagesDatabaseViewExtensionName + viewGrouping:viewGrouping + version:@"1"]; +} + + (BOOL)registerThreadIncomingMessagesDatabaseView { YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *( diff --git a/src/Storage/TSStorageManager.m b/src/Storage/TSStorageManager.m index 2c5d4f79b..01c3e55b1 100644 --- a/src/Storage/TSStorageManager.m +++ b/src/Storage/TSStorageManager.m @@ -196,6 +196,7 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; // Register extensions which are essential for rendering threads synchronously [TSDatabaseView registerThreadDatabaseView]; [TSDatabaseView registerThreadInteractionsDatabaseView]; + [TSDatabaseView registerThreadInboxMessageDatabaseView]; [TSDatabaseView registerThreadIncomingMessagesDatabaseView]; [TSDatabaseView registerThreadOutgoingMessagesDatabaseView]; [TSDatabaseView registerUnreadDatabaseView];