From c0cb7df10ad9d499456d5e3c96cf85d4b42cdeca Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 11 Dec 2018 14:42:07 -0700 Subject: [PATCH 1/4] rename hasEverHadMessage -> shouldThreadBeVisible --- SignalMessaging/utils/ThreadUtil.m | 2 +- SignalServiceKit/src/Contacts/TSThread.h | 2 +- SignalServiceKit/src/Contacts/TSThread.m | 13 +++++++++++-- .../src/Storage/FullTextSearchFinder.swift | 2 +- SignalServiceKit/src/Storage/TSDatabaseView.m | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/SignalMessaging/utils/ThreadUtil.m b/SignalMessaging/utils/ThreadUtil.m index b6d562279..068532fa1 100644 --- a/SignalMessaging/utils/ThreadUtil.m +++ b/SignalMessaging/utils/ThreadUtil.m @@ -806,7 +806,7 @@ NS_ASSUME_NONNULL_BEGIN if ([OWSProfileManager.sharedManager isThreadInProfileWhitelist:thread]) { return NO; } - if (!thread.hasEverHadMessage) { + if (!thread.shouldThreadBeVisible) { [OWSProfileManager.sharedManager addThreadToProfileWhitelist:thread]; return YES; } else { diff --git a/SignalServiceKit/src/Contacts/TSThread.h b/SignalServiceKit/src/Contacts/TSThread.h index 0bdc7c106..1b0228c0f 100644 --- a/SignalServiceKit/src/Contacts/TSThread.h +++ b/SignalServiceKit/src/Contacts/TSThread.h @@ -33,7 +33,7 @@ extern ConversationColorName const kConversationColorName_Default; @interface TSThread : TSYapDatabaseObject // YES IFF this thread has ever had a message. -@property (nonatomic) BOOL hasEverHadMessage; +@property (nonatomic) BOOL shouldThreadBeVisible; /** * Whether the object is a group thread or not. diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index 4d046f132..7406e9d73 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -82,7 +82,16 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa if (!self) { return self; } - + + // renamed `hasEverHadMessage` -> `shouldThreadBeVisible` + if (!_shouldThreadBeVisible) { + NSNumber *legacy_hasEverHadMessage = [coder decodeObjectForKey:@"hasEverHadMessage"]; + + if (legacy_hasEverHadMessage != nil) { + _shouldThreadBeVisible = legacy_hasEverHadMessage.boolValue; + } + } + if (_conversationColorName.length == 0) { NSString *_Nullable colorSeed = self.contactIdentifier; if (colorSeed.length > 0) { @@ -390,7 +399,7 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa return; } - self.hasEverHadMessage = YES; + self.shouldThreadBeVisible = YES; NSDate *lastMessageDate = [lastMessage dateForSorting]; if (!_lastMessageDate || [lastMessageDate timeIntervalSinceDate:self.lastMessageDate] > 0) { diff --git a/SignalServiceKit/src/Storage/FullTextSearchFinder.swift b/SignalServiceKit/src/Storage/FullTextSearchFinder.swift index 53e3e7147..10d0fa9a3 100644 --- a/SignalServiceKit/src/Storage/FullTextSearchFinder.swift +++ b/SignalServiceKit/src/Storage/FullTextSearchFinder.swift @@ -204,7 +204,7 @@ public class FullTextSearchFinder: NSObject { if let groupThread = object as? TSGroupThread { return self.groupThreadIndexer.index(groupThread, transaction: transaction) } else if let contactThread = object as? TSContactThread { - guard contactThread.hasEverHadMessage else { + guard contactThread.shouldThreadBeVisible else { // If we've never sent/received a message in a TSContactThread, // then we want it to appear in the "Other Contacts" section rather // than in the "Conversations" section. diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.m b/SignalServiceKit/src/Storage/TSDatabaseView.m index ade284d92..e309b2365 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.m +++ b/SignalServiceKit/src/Storage/TSDatabaseView.m @@ -204,7 +204,7 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" if (thread.isGroupThread) { // Do nothing; we never hide group threads. - } else if (thread.hasEverHadMessage) { + } else if (thread.shouldThreadBeVisible) { // Do nothing; we never hide threads that have ever had a message. } else { YapDatabaseViewTransaction *viewTransaction = [transaction ext:TSMessageDatabaseViewExtensionName]; From beb02afce9bb4c3fc19ddc0f7aa45cf45db10443 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 11 Dec 2018 15:07:50 -0700 Subject: [PATCH 2/4] Soft delete group threads --- .../ViewControllers/HomeView/HomeViewController.m | 8 ++++++++ .../src/Contacts/Threads/TSGroupThread.h | 6 ++++++ .../src/Contacts/Threads/TSGroupThread.m | 12 ++++++++++++ SignalServiceKit/src/Storage/TSDatabaseView.m | 6 ++---- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Signal/src/ViewControllers/HomeView/HomeViewController.m b/Signal/src/ViewControllers/HomeView/HomeViewController.m index 446326f74..586ef500e 100644 --- a/Signal/src/ViewControllers/HomeView/HomeViewController.m +++ b/Signal/src/ViewControllers/HomeView/HomeViewController.m @@ -1137,6 +1137,14 @@ NSString *const kArchivedConversationsReuseIdentifier = @"kArchivedConversations - (void)deleteThread:(TSThread *)thread { [self.editingDbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + if ([thread isKindOfClass:[TSGroupThread class]]) { + TSGroupThread *groupThread = (TSGroupThread *)thread; + if (groupThread.isLocalUserInGroup) { + [groupThread softDeleteGroupThreadWithTransaction:transaction]; + return; + } + } + [thread removeWithTransaction:transaction]; }]; diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h index 3fe639295..bc214f93b 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h @@ -31,6 +31,8 @@ extern NSString *const TSGroupThread_NotificationKey_UniqueId; + (NSString *)defaultGroupName; +- (BOOL)isLocalUserInGroup; + // all group threads containing recipient as a member + (NSArray *)groupThreadsWithRecipientId:(NSString *)recipientId transaction:(YapDatabaseReadWriteTransaction *)transaction; @@ -38,6 +40,10 @@ extern NSString *const TSGroupThread_NotificationKey_UniqueId; - (void)leaveGroupWithSneakyTransaction; - (void)leaveGroupWithTransaction:(YapDatabaseReadWriteTransaction *)transaction; +- (void)softDeleteGroupThreadWithTransaction:(YapDatabaseReadWriteTransaction *)transaction; + +#pragma mark - Avatar + - (void)updateAvatarWithAttachmentStream:(TSAttachmentStream *)attachmentStream; - (void)updateAvatarWithAttachmentStream:(TSAttachmentStream *)attachmentStream transaction:(YapDatabaseReadWriteTransaction *)transaction; diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m index 8ea47e1e2..bb892b0c1 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m @@ -173,6 +173,11 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific return true; } +- (BOOL)isLocalUserInGroup +{ + return [self.groupModel.groupMemberIds containsObject:TSAccountManager.localNumber]; +} + - (NSString *)name { // TODO sometimes groupName is set to the empty string. I'm hesitent to change @@ -203,6 +208,13 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific [self saveWithTransaction:transaction]; } +- (void)softDeleteGroupThreadWithTransaction:(YapDatabaseReadWriteTransaction *)transaction +{ + [self removeAllThreadInteractionsWithTransaction:transaction]; + self.shouldThreadBeVisible = NO; + [self saveWithTransaction:transaction]; +} + #pragma mark - Avatar - (void)updateAvatarWithAttachmentStream:(TSAttachmentStream *)attachmentStream diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.m b/SignalServiceKit/src/Storage/TSDatabaseView.m index e309b2365..af7d7d1db 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.m +++ b/SignalServiceKit/src/Storage/TSDatabaseView.m @@ -202,9 +202,7 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" } TSThread *thread = (TSThread *)object; - if (thread.isGroupThread) { - // Do nothing; we never hide group threads. - } else if (thread.shouldThreadBeVisible) { + if (thread.shouldThreadBeVisible) { // Do nothing; we never hide threads that have ever had a message. } else { YapDatabaseViewTransaction *viewTransaction = [transaction ext:TSMessageDatabaseViewExtensionName]; @@ -232,7 +230,7 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" [[YapWhitelistBlacklist alloc] initWithWhitelist:[NSSet setWithObject:[TSThread collection]]]; YapDatabaseView *databaseView = - [[YapDatabaseAutoView alloc] initWithGrouping:viewGrouping sorting:viewSorting versionTag:@"3" options:options]; + [[YapDatabaseAutoView alloc] initWithGrouping:viewGrouping sorting:viewSorting versionTag:@"4" options:options]; [storage asyncRegisterExtension:databaseView withName:TSThreadDatabaseViewExtensionName]; } From c8c932033b00b4eb8a58b8403f3eda4012918044 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Wed, 12 Dec 2018 09:05:27 -0700 Subject: [PATCH 3/4] add proper nullability annotation --- SignalServiceKit/src/Contacts/TSThread.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index 7406e9d73..3a02af197 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -85,7 +85,7 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa // renamed `hasEverHadMessage` -> `shouldThreadBeVisible` if (!_shouldThreadBeVisible) { - NSNumber *legacy_hasEverHadMessage = [coder decodeObjectForKey:@"hasEverHadMessage"]; + NSNumber *_Nullable legacy_hasEverHadMessage = [coder decodeObjectForKey:@"hasEverHadMessage"]; if (legacy_hasEverHadMessage != nil) { _shouldThreadBeVisible = legacy_hasEverHadMessage.boolValue; From 425bdd7a4fbdb6f20660ea30765378d06777c574 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Wed, 12 Dec 2018 09:05:41 -0700 Subject: [PATCH 4/4] guard against edge case Though, I don't think this method should ever be called when localNumber is nil. --- SignalServiceKit/src/Contacts/Threads/TSGroupThread.m | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m index bb892b0c1..af20285bb 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m @@ -175,7 +175,12 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific - (BOOL)isLocalUserInGroup { - return [self.groupModel.groupMemberIds containsObject:TSAccountManager.localNumber]; + NSString *_Nullable localNumber = TSAccountManager.localNumber; + if (localNumber == nil) { + return NO; + } + + return [self.groupModel.groupMemberIds containsObject:localNumber]; } - (NSString *)name