From 103a7fab36c6e8e6d79728cfeb89dc695413b961 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 27 Jul 2017 11:51:36 -0400 Subject: [PATCH 1/7] Hide empty conversations in home view. // FREEBIE --- Carthage | 2 +- .../ConversationView/MessagesViewController.m | 3 -- SignalServiceKit/src/Storage/TSDatabaseView.h | 3 +- SignalServiceKit/src/Storage/TSDatabaseView.m | 54 ++++++++++++------- .../src/Storage/TSStorageManager.m | 2 +- 5 files changed, 39 insertions(+), 25 deletions(-) diff --git a/Carthage b/Carthage index fc8eebb92..c9f5152a2 160000 --- a/Carthage +++ b/Carthage @@ -1 +1 @@ -Subproject commit fc8eebb92367031f60ea337c897551cc54baa4b2 +Subproject commit c9f5152a2ed8516c3f23364105135c048f901553 diff --git a/Signal/src/ViewControllers/ConversationView/MessagesViewController.m b/Signal/src/ViewControllers/ConversationView/MessagesViewController.m index 44ad6ceff..1c7a8c40d 100644 --- a/Signal/src/ViewControllers/ConversationView/MessagesViewController.m +++ b/Signal/src/ViewControllers/ConversationView/MessagesViewController.m @@ -528,9 +528,6 @@ typedef enum : NSUInteger { // We need to update the dynamic interactions before we do any layout. [self ensureDynamicInteractions]; - // Triggering modified notification renders "call notification" when leaving full screen call view - [self.thread touch]; - [self ensureBannerState]; [super viewWillAppear:animated]; diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.h b/SignalServiceKit/src/Storage/TSDatabaseView.h index 92279916c..21a434229 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.h +++ b/SignalServiceKit/src/Storage/TSDatabaseView.h @@ -25,7 +25,8 @@ extern NSString *const TSSecondaryDevicesDatabaseViewExtensionName; + (BOOL)hasPendingViewRegistrations; -+ (void)registerThreadDatabaseView; +// This method must be called _AFTER_ registerThreadInteractionsDatabaseView. ++ (void)asyncRegisterThreadDatabaseView; + (void)registerThreadInteractionsDatabaseView; + (void)asyncRegisterThreadOutgoingMessagesDatabaseView; diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.m b/SignalServiceKit/src/Storage/TSDatabaseView.m index b74e6e66a..973591896 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.m +++ b/SignalServiceKit/src/Storage/TSDatabaseView.m @@ -82,6 +82,7 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic YapDatabaseView *existingView = [[TSStorageManager sharedManager].database registeredExtension:viewName]; if (existingView) { + OWSFail(@"Registered database view twice: %@", viewName); return; } @@ -206,29 +207,37 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic async:YES]; } -+ (void)registerThreadDatabaseView ++ (void)asyncRegisterThreadDatabaseView { YapDatabaseView *threadView = [[TSStorageManager sharedManager].database registeredExtension:TSThreadDatabaseViewExtensionName]; if (threadView) { + OWSFail(@"Registered database view twice: %@", TSThreadDatabaseViewExtensionName); return; } - YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping - withObjectBlock:^NSString *( - YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { - if ([object isKindOfClass:[TSThread class]]) { - TSThread *thread = (TSThread *)object; - if (thread.archivalDate) { - return ([self threadShouldBeInInbox:thread]) ? TSInboxGroup : TSArchiveGroup; - } else if (thread.archivalDate) { - return TSArchiveGroup; - } else { - return TSInboxGroup; - } - } - return nil; - }]; + YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *( + YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { + if (![object isKindOfClass:[TSThread class]]) { + return nil; + } + + TSThread *thread = (TSThread *)object; + + YapDatabaseViewTransaction *viewTransaction = [transaction ext:TSMessageDatabaseViewExtensionName]; + NSUInteger threadMessageCount = [viewTransaction numberOfItemsInGroup:thread.uniqueId]; + if (threadMessageCount < 1) { + return nil; + } + + if (thread.archivalDate) { + return ([self threadShouldBeInInbox:thread]) ? TSInboxGroup : TSArchiveGroup; + } else if (thread.archivalDate) { + return TSArchiveGroup; + } else { + return TSInboxGroup; + } + }]; YapDatabaseViewSorting *viewSorting = [self threadSorting]; @@ -238,10 +247,17 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic [[YapWhitelistBlacklist alloc] initWithWhitelist:[NSSet setWithObject:[TSThread collection]]]; YapDatabaseView *databaseView = - [[YapDatabaseView alloc] initWithGrouping:viewGrouping sorting:viewSorting versionTag:@"1" options:options]; + [[YapDatabaseView alloc] initWithGrouping:viewGrouping sorting:viewSorting versionTag:@"2" options:options]; - [[TSStorageManager sharedManager].database registerExtension:databaseView - withName:TSThreadDatabaseViewExtensionName]; + [[TSStorageManager sharedManager].database + asyncRegisterExtension:databaseView + withName:TSThreadDatabaseViewExtensionName + completionBlock:^(BOOL ready) { + OWSCAssert(ready); + + DDLogInfo( + @"%@ asyncRegisterExtension: %@ -> %d", self.tag, TSThreadDatabaseViewExtensionName, ready); + }]; } /** diff --git a/SignalServiceKit/src/Storage/TSStorageManager.m b/SignalServiceKit/src/Storage/TSStorageManager.m index 18e4ef8e2..d1c0cfdb5 100644 --- a/SignalServiceKit/src/Storage/TSStorageManager.m +++ b/SignalServiceKit/src/Storage/TSStorageManager.m @@ -192,7 +192,6 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; - (void)setupDatabaseWithSafeBlockingMigrations:(void (^_Nonnull)())safeBlockingMigrationsBlock { // Synchronously register extensions which are essential for views. - [TSDatabaseView registerThreadDatabaseView]; [TSDatabaseView registerThreadInteractionsDatabaseView]; [TSDatabaseView registerUnreadDatabaseView]; [self.database registerExtension:[TSDatabaseSecondaryIndexes registerTimeStampIndex] withName:@"idx"]; @@ -210,6 +209,7 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; // // All sync registrations must be done before all async registrations, // or the sync registrations will block on the async registrations. + [TSDatabaseView asyncRegisterThreadDatabaseView]; [TSDatabaseView asyncRegisterUnseenDatabaseView]; [TSDatabaseView asyncRegisterThreadOutgoingMessagesDatabaseView]; [TSDatabaseView asyncRegisterThreadSpecialMessagesDatabaseView]; From 1890039165e258d38e9e8571f63465dd507f7499 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 27 Jul 2017 11:53:29 -0400 Subject: [PATCH 2/7] Hide empty conversations in home view. // FREEBIE --- Signal/src/AppDelegate.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 33bb4d6cd..a50a7dd78 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -171,6 +171,9 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; NSString *lastLaunchedAppVersion = AppVersion.instance.lastAppVersion; NSString *lastCompletedLaunchAppVersion = AppVersion.instance.lastCompletedLaunchAppVersion; + // Every time we change a database view in such a way that might cause a delay on launch, + // we need to bump this constant. + // // We added a number of database views in v2.13.0. NSString *kLastVersionWithDatabaseViewChange = @"2.13.0"; BOOL mayNeedUpgrade = ([TSAccountManager isRegistered] && lastLaunchedAppVersion From 8e628a62966553ff2c5155af3177ff89a258d255 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 27 Jul 2017 11:55:47 -0400 Subject: [PATCH 3/7] Hide empty conversations in home view. // FREEBIE --- SignalServiceKit/src/Messages/Interactions/TSInteraction.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/SignalServiceKit/src/Messages/Interactions/TSInteraction.m b/SignalServiceKit/src/Messages/Interactions/TSInteraction.m index 87e8ff3fb..60b3b8ac1 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSInteraction.m +++ b/SignalServiceKit/src/Messages/Interactions/TSInteraction.m @@ -114,6 +114,13 @@ NS_ASSUME_NONNULL_BEGIN [fetchedThread updateWithLastMessage:self transaction:transaction]; } +- (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction +{ + [super removeWithTransaction:transaction]; + + [self touchThreadWithTransaction:transaction]; +} + - (BOOL)isDynamicInteraction { return NO; From c6e21e83a39854f8a5fc1cbb55eed780c905178b Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 27 Jul 2017 12:00:19 -0400 Subject: [PATCH 4/7] Hide empty conversations in home view. // FREEBIE --- SignalServiceKit/src/Storage/TSDatabaseView.h | 3 +-- SignalServiceKit/src/Storage/TSDatabaseView.m | 13 +++---------- SignalServiceKit/src/Storage/TSStorageManager.m | 2 +- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.h b/SignalServiceKit/src/Storage/TSDatabaseView.h index 21a434229..92279916c 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.h +++ b/SignalServiceKit/src/Storage/TSDatabaseView.h @@ -25,8 +25,7 @@ extern NSString *const TSSecondaryDevicesDatabaseViewExtensionName; + (BOOL)hasPendingViewRegistrations; -// This method must be called _AFTER_ registerThreadInteractionsDatabaseView. -+ (void)asyncRegisterThreadDatabaseView; ++ (void)registerThreadDatabaseView; + (void)registerThreadInteractionsDatabaseView; + (void)asyncRegisterThreadOutgoingMessagesDatabaseView; diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.m b/SignalServiceKit/src/Storage/TSDatabaseView.m index 973591896..ccd3ed960 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.m +++ b/SignalServiceKit/src/Storage/TSDatabaseView.m @@ -207,7 +207,7 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic async:YES]; } -+ (void)asyncRegisterThreadDatabaseView ++ (void)registerThreadDatabaseView { YapDatabaseView *threadView = [[TSStorageManager sharedManager].database registeredExtension:TSThreadDatabaseViewExtensionName]; @@ -249,15 +249,8 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic YapDatabaseView *databaseView = [[YapDatabaseView alloc] initWithGrouping:viewGrouping sorting:viewSorting versionTag:@"2" options:options]; - [[TSStorageManager sharedManager].database - asyncRegisterExtension:databaseView - withName:TSThreadDatabaseViewExtensionName - completionBlock:^(BOOL ready) { - OWSCAssert(ready); - - DDLogInfo( - @"%@ asyncRegisterExtension: %@ -> %d", self.tag, TSThreadDatabaseViewExtensionName, ready); - }]; + [[TSStorageManager sharedManager].database registerExtension:databaseView + withName:TSThreadDatabaseViewExtensionName]; } /** diff --git a/SignalServiceKit/src/Storage/TSStorageManager.m b/SignalServiceKit/src/Storage/TSStorageManager.m index d1c0cfdb5..18e4ef8e2 100644 --- a/SignalServiceKit/src/Storage/TSStorageManager.m +++ b/SignalServiceKit/src/Storage/TSStorageManager.m @@ -192,6 +192,7 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; - (void)setupDatabaseWithSafeBlockingMigrations:(void (^_Nonnull)())safeBlockingMigrationsBlock { // Synchronously register extensions which are essential for views. + [TSDatabaseView registerThreadDatabaseView]; [TSDatabaseView registerThreadInteractionsDatabaseView]; [TSDatabaseView registerUnreadDatabaseView]; [self.database registerExtension:[TSDatabaseSecondaryIndexes registerTimeStampIndex] withName:@"idx"]; @@ -209,7 +210,6 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; // // All sync registrations must be done before all async registrations, // or the sync registrations will block on the async registrations. - [TSDatabaseView asyncRegisterThreadDatabaseView]; [TSDatabaseView asyncRegisterUnseenDatabaseView]; [TSDatabaseView asyncRegisterThreadOutgoingMessagesDatabaseView]; [TSDatabaseView asyncRegisterThreadSpecialMessagesDatabaseView]; From c042a96aa40240239a26a65c52725546bbf89ef2 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 27 Jul 2017 12:02:40 -0400 Subject: [PATCH 5/7] Hide empty conversations in home view. // FREEBIE --- SignalServiceKit/src/Storage/TSDatabaseView.h | 1 + SignalServiceKit/src/Storage/TSStorageManager.m | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.h b/SignalServiceKit/src/Storage/TSDatabaseView.h index 92279916c..921b36ede 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.h +++ b/SignalServiceKit/src/Storage/TSDatabaseView.h @@ -25,6 +25,7 @@ extern NSString *const TSSecondaryDevicesDatabaseViewExtensionName; + (BOOL)hasPendingViewRegistrations; +// This method must be called _AFTER_ registerThreadInteractionsDatabaseView. + (void)registerThreadDatabaseView; + (void)registerThreadInteractionsDatabaseView; diff --git a/SignalServiceKit/src/Storage/TSStorageManager.m b/SignalServiceKit/src/Storage/TSStorageManager.m index 18e4ef8e2..c52489fdd 100644 --- a/SignalServiceKit/src/Storage/TSStorageManager.m +++ b/SignalServiceKit/src/Storage/TSStorageManager.m @@ -192,8 +192,8 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; - (void)setupDatabaseWithSafeBlockingMigrations:(void (^_Nonnull)())safeBlockingMigrationsBlock { // Synchronously register extensions which are essential for views. - [TSDatabaseView registerThreadDatabaseView]; [TSDatabaseView registerThreadInteractionsDatabaseView]; + [TSDatabaseView registerThreadDatabaseView]; [TSDatabaseView registerUnreadDatabaseView]; [self.database registerExtension:[TSDatabaseSecondaryIndexes registerTimeStampIndex] withName:@"idx"]; [OWSMessageReceiver syncRegisterDatabaseExtension:self.database]; From 678db31c1fe907753e6eb2c7212818bd111c1bbe Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 27 Jul 2017 12:06:02 -0400 Subject: [PATCH 6/7] Hide empty conversations in home view. // FREEBIE --- SignalServiceKit/src/Storage/TSDatabaseView.m | 1 + 1 file changed, 1 insertion(+) diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.m b/SignalServiceKit/src/Storage/TSDatabaseView.m index ccd3ed960..dabede30b 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.m +++ b/SignalServiceKit/src/Storage/TSDatabaseView.m @@ -225,6 +225,7 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic TSThread *thread = (TSThread *)object; YapDatabaseViewTransaction *viewTransaction = [transaction ext:TSMessageDatabaseViewExtensionName]; + OWSAssert(viewTransaction); NSUInteger threadMessageCount = [viewTransaction numberOfItemsInGroup:thread.uniqueId]; if (threadMessageCount < 1) { return nil; From e74ef14ae6a96e2b5552dba39d901cf58e1fe432 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 27 Jul 2017 15:45:27 -0400 Subject: [PATCH 7/7] Revert accidental change to Carthage. // FREEBIE --- Carthage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Carthage b/Carthage index c9f5152a2..fc8eebb92 160000 --- a/Carthage +++ b/Carthage @@ -1 +1 @@ -Subproject commit c9f5152a2ed8516c3f23364105135c048f901553 +Subproject commit fc8eebb92367031f60ea337c897551cc54baa4b2