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 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/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; 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/TSDatabaseView.m b/SignalServiceKit/src/Storage/TSDatabaseView.m index b74e6e66a..dabede30b 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; } @@ -211,24 +212,33 @@ NSString *const TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevic 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]; + OWSAssert(viewTransaction); + 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,7 +248,7 @@ 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]; 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];