diff --git a/src/Messages/Interactions/TSInteraction.h b/src/Messages/Interactions/TSInteraction.h index b91b05d3c..c89e5a8a1 100644 --- a/src/Messages/Interactions/TSInteraction.h +++ b/src/Messages/Interactions/TSInteraction.h @@ -35,6 +35,14 @@ NS_ASSUME_NONNULL_BEGIN - (nullable NSDate *)receiptDateForSorting; +// "Dynamic" interactions are not messages or static events (like +// info messages, error messages, etc.). They are interactions +// created, updated and deleted by the views. +// +// These include block offers, "add to contact" offers, +// unseen message indicators, etc. +- (BOOL)isDynamicInteraction; + @end NS_ASSUME_NONNULL_END diff --git a/src/Messages/Interactions/TSInteraction.m b/src/Messages/Interactions/TSInteraction.m index 39937faa3..1c7e33425 100644 --- a/src/Messages/Interactions/TSInteraction.m +++ b/src/Messages/Interactions/TSInteraction.m @@ -109,6 +109,11 @@ NS_ASSUME_NONNULL_BEGIN [fetchedThread updateWithLastMessage:self transaction:transaction]; } +- (BOOL)isDynamicInteraction +{ + return NO; +} + @end NS_ASSUME_NONNULL_END diff --git a/src/Messages/OWSAddToContactsOfferMessage.m b/src/Messages/OWSAddToContactsOfferMessage.m index b870f00ca..a0a830cee 100644 --- a/src/Messages/OWSAddToContactsOfferMessage.m +++ b/src/Messages/OWSAddToContactsOfferMessage.m @@ -42,6 +42,11 @@ NS_ASSUME_NONNULL_BEGIN return self.date; } +- (BOOL)isDynamicInteraction +{ + return YES; +} + @end NS_ASSUME_NONNULL_END diff --git a/src/Messages/OWSUnknownContactBlockOfferMessage.m b/src/Messages/OWSUnknownContactBlockOfferMessage.m index 2dd83706c..a574c929b 100644 --- a/src/Messages/OWSUnknownContactBlockOfferMessage.m +++ b/src/Messages/OWSUnknownContactBlockOfferMessage.m @@ -44,6 +44,11 @@ NS_ASSUME_NONNULL_BEGIN return self.date; } +- (BOOL)isDynamicInteraction +{ + return YES; +} + @end NS_ASSUME_NONNULL_END diff --git a/src/Storage/TSDatabaseView.h b/src/Storage/TSDatabaseView.h index 9fbb72541..8beb55895 100644 --- a/src/Storage/TSDatabaseView.h +++ b/src/Storage/TSDatabaseView.h @@ -1,9 +1,5 @@ // -// TSDatabaseView.h -// TextSecureKit -// -// Created by Frederic Jacobs on 17/11/14. -// Copyright (c) 2014 Open Whisper Systems. All rights reserved. +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // #import @@ -19,11 +15,13 @@ extern NSString *TSSecondaryDevicesGroup; extern NSString *TSThreadDatabaseViewExtensionName; extern NSString *TSMessageDatabaseViewExtensionName; extern NSString *TSUnreadDatabaseViewExtensionName; +extern NSString *TSDynamicMessagesDatabaseViewExtensionName; extern NSString *TSSecondaryDevicesDatabaseViewExtensionName; + (BOOL)registerThreadDatabaseView; + (BOOL)registerBuddyConversationDatabaseView; + (BOOL)registerUnreadDatabaseView; ++ (BOOL)registerDynamicMessagesDatabaseView; + (void)asyncRegisterSecondaryDevicesDatabaseView; @end diff --git a/src/Storage/TSDatabaseView.m b/src/Storage/TSDatabaseView.m index 09112389d..229ede593 100644 --- a/src/Storage/TSDatabaseView.m +++ b/src/Storage/TSDatabaseView.m @@ -22,6 +22,7 @@ NSString *TSSecondaryDevicesGroup = @"TSSecondaryDevicesGroup"; NSString *TSThreadDatabaseViewExtensionName = @"TSThreadDatabaseViewExtensionName"; NSString *TSMessageDatabaseViewExtensionName = @"TSMessageDatabaseViewExtensionName"; NSString *TSUnreadDatabaseViewExtensionName = @"TSUnreadDatabaseViewExtensionName"; +NSString *TSDynamicMessagesDatabaseViewExtensionName = @"TSDynamicMessagesDatabaseViewExtensionName"; NSString *TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevicesDatabaseViewExtensionName"; @implementation TSDatabaseView @@ -58,6 +59,41 @@ NSString *TSSecondaryDevicesDatabaseViewExtensionName = @"TSSecondaryDevicesData [[TSStorageManager sharedManager].database registerExtension:view withName:TSUnreadDatabaseViewExtensionName]; } ++ (BOOL)registerDynamicMessagesDatabaseView +{ + YapDatabaseView *existingView = + [[TSStorageManager sharedManager].database registeredExtension:TSDynamicMessagesDatabaseViewExtensionName]; + if (existingView) { + return YES; + } + + YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *( + YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { + if ([object isKindOfClass:[TSInteraction class]]) { + TSInteraction *interaction = (TSInteraction *)object; + if ([interaction isDynamicInteraction]) { + return interaction.uniqueThreadId; + } + } else { + OWSAssert(0); + } + return nil; + }]; + + YapDatabaseViewSorting *viewSorting = [self messagesSorting]; + + YapDatabaseViewOptions *options = [[YapDatabaseViewOptions alloc] init]; + options.isPersistent = YES; + options.allowedCollections = + [[YapWhitelistBlacklist alloc] initWithWhitelist:[NSSet setWithObject:[TSInteraction collection]]]; + + YapDatabaseView *view = + [[YapDatabaseView alloc] initWithGrouping:viewGrouping sorting:viewSorting versionTag:@"1" options:options]; + + return [[TSStorageManager sharedManager].database registerExtension:view + withName:TSDynamicMessagesDatabaseViewExtensionName]; +} + + (BOOL)registerThreadDatabaseView { YapDatabaseView *threadView = [[TSStorageManager sharedManager].database registeredExtension:TSThreadDatabaseViewExtensionName]; diff --git a/src/Storage/TSStorageManager.m b/src/Storage/TSStorageManager.m index fd4ba4a66..c32c1df11 100644 --- a/src/Storage/TSStorageManager.m +++ b/src/Storage/TSStorageManager.m @@ -199,6 +199,7 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; [TSDatabaseView registerThreadDatabaseView]; [TSDatabaseView registerBuddyConversationDatabaseView]; [TSDatabaseView registerUnreadDatabaseView]; + [TSDatabaseView registerDynamicMessagesDatabaseView]; [self.database registerExtension:[TSDatabaseSecondaryIndexes registerTimeStampIndex] withName:@"idx"]; // Register extensions which aren't essential for rendering threads async