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];