diff --git a/Podfile b/Podfile index ea1aa18d9..05252c6c5 100644 --- a/Podfile +++ b/Podfile @@ -69,8 +69,11 @@ target 'SessionMessagingKit' do pod 'AFNetworking', inhibit_warnings: true pod 'CryptoSwift', :inhibit_warnings => true pod 'Curve25519Kit', git: 'https://github.com/signalapp/Curve25519Kit.git', :inhibit_warnings => true + pod 'HKDFKit', :inhibit_warnings => true pod 'Mantle', git: 'https://github.com/signalapp/Mantle', branch: 'signal-master', :inhibit_warnings => true pod 'PromiseKit', :inhibit_warnings => true + pod 'Reachability', :inhibit_warnings => true + pod 'SAMKeychain', :inhibit_warnings => true pod 'SignalCoreKit', git: 'https://github.com/signalapp/SignalCoreKit.git', :inhibit_warnings => true pod 'SwiftProtobuf', '~> 1.5.0', :inhibit_warnings => true pod 'YapDatabase/SQLCipher', :git => 'https://github.com/signalapp/YapDatabase.git', branch: 'signal-release', :inhibit_warnings => true @@ -92,13 +95,16 @@ target 'SessionSnodeKit' do pod 'Curve25519Kit', git: 'https://github.com/signalapp/Curve25519Kit.git', :inhibit_warnings => true pod 'PromiseKit', :inhibit_warnings => true pod 'SignalCoreKit', git: 'https://github.com/signalapp/SignalCoreKit.git', :inhibit_warnings => true + pod 'YapDatabase/SQLCipher', :git => 'https://github.com/signalapp/YapDatabase.git', branch: 'signal-release', :inhibit_warnings => true end target 'SessionUtilitiesKit' do + pod 'AFNetworking', inhibit_warnings: true pod 'CryptoSwift', :inhibit_warnings => true pod 'Curve25519Kit', git: 'https://github.com/signalapp/Curve25519Kit.git', :inhibit_warnings => true pod 'Mantle', git: 'https://github.com/signalapp/Mantle', branch: 'signal-master', :inhibit_warnings => true pod 'PromiseKit', :inhibit_warnings => true + pod 'SAMKeychain', :inhibit_warnings => true pod 'SignalCoreKit', git: 'https://github.com/signalapp/SignalCoreKit.git', :inhibit_warnings => true pod 'YapDatabase/SQLCipher', :git => 'https://github.com/signalapp/YapDatabase.git', branch: 'signal-release', :inhibit_warnings => true end diff --git a/Podfile.lock b/Podfile.lock index 4f46bd158..2b4ff5437 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -230,6 +230,6 @@ SPEC CHECKSUMS: YYImage: 6db68da66f20d9f169ceb94dfb9947c3867b9665 ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb -PODFILE CHECKSUM: 62df79698293257648cb6e60724f720f8477bd0f +PODFILE CHECKSUM: b12682bc3bf974c758ec8e4b9838639f7ec51d5e COCOAPODS: 1.10.0.rc.1 diff --git a/SignalUtilitiesKit/Database/Storage/Storage+VolumeSamples.swift b/Session/Database/Storage+VolumeSamples.swift similarity index 100% rename from SignalUtilitiesKit/Database/Storage/Storage+VolumeSamples.swift rename to Session/Database/Storage+VolumeSamples.swift diff --git a/Session/Meta/Signal-Bridging-Header.h b/Session/Meta/Signal-Bridging-Header.h index 578c0f2e7..93706eb46 100644 --- a/Session/Meta/Signal-Bridging-Header.h +++ b/Session/Meta/Signal-Bridging-Header.h @@ -66,31 +66,31 @@ #import #import #import -#import +#import #import -#import +#import #import #import #import #import -#import +#import #import #import #import #import #import -#import +#import #import #import #import -#import +#import #import -#import -#import +#import +#import #import -#import +#import #import -#import +#import #import #import #import diff --git a/Session/Signal/AboutTableViewController.m b/Session/Signal/AboutTableViewController.m index 21d436adc..0c32a1dba 100644 --- a/Session/Signal/AboutTableViewController.m +++ b/Session/Signal/AboutTableViewController.m @@ -8,8 +8,8 @@ #import #import #import -#import -#import +#import +#import @implementation AboutTableViewController diff --git a/Session/Signal/AddToBlockListViewController.m b/Session/Signal/AddToBlockListViewController.m index 58b64c436..8d3315238 100644 --- a/Session/Signal/AddToBlockListViewController.m +++ b/Session/Signal/AddToBlockListViewController.m @@ -4,8 +4,8 @@ #import "AddToBlockListViewController.h" #import "BlockListUIUtils.h" -#import -#import +#import +#import #import NS_ASSUME_NONNULL_BEGIN diff --git a/Session/Signal/AppDelegate.m b/Session/Signal/AppDelegate.m index a8fa1c079..569f8783f 100644 --- a/Session/Signal/AppDelegate.m +++ b/Session/Signal/AppDelegate.m @@ -18,17 +18,17 @@ #import #import #import -#import -#import -#import +#import +#import +#import #import #import #import -#import -#import +#import +#import #import -#import -#import +#import +#import #import #import #import diff --git a/Session/Signal/AvatarViewHelper.m b/Session/Signal/AvatarViewHelper.m index bf4664007..1b2c41163 100644 --- a/Session/Signal/AvatarViewHelper.m +++ b/Session/Signal/AvatarViewHelper.m @@ -10,8 +10,8 @@ #import #import -#import -#import +#import +#import #import NS_ASSUME_NONNULL_BEGIN diff --git a/Session/Signal/ConversationView/ConversationViewController.m b/Session/Signal/ConversationView/ConversationViewController.m index 7f376a217..180490268 100644 --- a/Session/Signal/ConversationView/ConversationViewController.m +++ b/Session/Signal/ConversationView/ConversationViewController.m @@ -32,7 +32,7 @@ #import "TSGroupThread.h" #import "TSIncomingMessage.h" #import "TSInfoMessage.h" -#import +#import #import "UIFont+OWS.h" #import "UIViewController+Permissions.h" #import @@ -53,15 +53,15 @@ #import #import #import -#import -#import -#import +#import +#import +#import #import -#import +#import #import -#import +#import #import -#import +#import #import #import #import diff --git a/Session/Signal/ConversationView/ConversationViewItem.m b/Session/Signal/ConversationView/ConversationViewItem.m index 0d9b25ee6..371c55eb8 100644 --- a/Session/Signal/ConversationView/ConversationViewItem.m +++ b/Session/Signal/ConversationView/ConversationViewItem.m @@ -15,7 +15,7 @@ #import #import -#import +#import #import NS_ASSUME_NONNULL_BEGIN diff --git a/Session/Signal/ConversationView/ConversationViewModel.m b/Session/Signal/ConversationView/ConversationViewModel.m index c7884aa4b..eaef14c18 100644 --- a/Session/Signal/ConversationView/ConversationViewModel.m +++ b/Session/Signal/ConversationView/ConversationViewModel.m @@ -11,14 +11,14 @@ #import #import #import -#import -#import -#import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import +#import +#import +#import #import #import #import diff --git a/Session/Signal/MainAppContext.m b/Session/Signal/MainAppContext.m index a6c020904..48b2cd22b 100644 --- a/Session/Signal/MainAppContext.m +++ b/Session/Signal/MainAppContext.m @@ -8,7 +8,7 @@ #import #import #import -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/Session/Signal/OWSBackup.m b/Session/Signal/OWSBackup.m index 2ab57d41b..4f0ec36b0 100644 --- a/Session/Signal/OWSBackup.m +++ b/Session/Signal/OWSBackup.m @@ -9,8 +9,8 @@ #import "Session-Swift.h" #import #import -#import -#import +#import +#import @import CloudKit; diff --git a/Session/Signal/OWSBackupExportJob.m b/Session/Signal/OWSBackupExportJob.m index 0d0593483..a2156a81f 100644 --- a/Session/Signal/OWSBackupExportJob.m +++ b/Session/Signal/OWSBackupExportJob.m @@ -10,13 +10,13 @@ #import #import #import -#import +#import #import #import #import #import #import -#import +#import @import CloudKit; diff --git a/Session/Signal/OWSBackupImportJob.m b/Session/Signal/OWSBackupImportJob.m index 024f47e56..e746d4a51 100644 --- a/Session/Signal/OWSBackupImportJob.m +++ b/Session/Signal/OWSBackupImportJob.m @@ -9,11 +9,11 @@ #import "Session-Swift.h" #import #import -#import +#import #import #import #import -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/Session/Signal/OWSConversationSettingsViewController.m b/Session/Signal/OWSConversationSettingsViewController.m index 449485ae1..7e178370a 100644 --- a/Session/Signal/OWSConversationSettingsViewController.m +++ b/Session/Signal/OWSConversationSettingsViewController.m @@ -23,12 +23,12 @@ #import #import #import -#import +#import -#import -#import -#import -#import +#import +#import +#import +#import @import ContactsUI; @import PromiseKit; diff --git a/Session/Signal/OWSOrphanDataCleaner.m b/Session/Signal/OWSOrphanDataCleaner.m index 5da139091..2d7ca614f 100644 --- a/Session/Signal/OWSOrphanDataCleaner.m +++ b/Session/Signal/OWSOrphanDataCleaner.m @@ -7,17 +7,17 @@ #import #import #import -#import +#import #import #import #import -#import +#import #import #import #import #import -#import -#import +#import +#import #import #import diff --git a/Session/Signal/OWSSessionResetJobRecord.h b/Session/Signal/OWSSessionResetJobRecord.h index cadc73300..3d7020832 100644 --- a/Session/Signal/OWSSessionResetJobRecord.h +++ b/Session/Signal/OWSSessionResetJobRecord.h @@ -2,7 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import @class TSContactThread; diff --git a/Session/Signal/OWSSessionResetJobRecord.m b/Session/Signal/OWSSessionResetJobRecord.m index 02b90f513..95953daac 100644 --- a/Session/Signal/OWSSessionResetJobRecord.m +++ b/Session/Signal/OWSSessionResetJobRecord.m @@ -3,7 +3,7 @@ // #import "OWSSessionResetJobRecord.h" -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/Session/Signal/PrivacySettingsTableViewController.m b/Session/Signal/PrivacySettingsTableViewController.m index f3ad86240..b18449d1e 100644 --- a/Session/Signal/PrivacySettingsTableViewController.m +++ b/Session/Signal/PrivacySettingsTableViewController.m @@ -13,7 +13,7 @@ #import #import #import -#import +#import #import NS_ASSUME_NONNULL_BEGIN diff --git a/Session/Signal/SignalApp.m b/Session/Signal/SignalApp.m index bf5e6ef07..0061f9a77 100644 --- a/Session/Signal/SignalApp.m +++ b/Session/Signal/SignalApp.m @@ -9,9 +9,9 @@ #import #import #import -#import -#import -#import +#import +#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SessionMessagingKit/Configuration.swift b/SessionMessagingKit/Configuration.swift index f514bc6aa..c4bf93445 100644 --- a/SessionMessagingKit/Configuration.swift +++ b/SessionMessagingKit/Configuration.swift @@ -2,15 +2,10 @@ import SessionProtocolKit public struct Configuration { public let storage: SessionMessagingKitStorageProtocol - public let messageSenderDelegate: MessageSenderDelegate - public let messageReceiverDelegate: MessageReceiverDelegate public let signalStorage: SessionStore & PreKeyStore & SignedPreKeyStore public let identityKeyStore: IdentityKeyStore public let sessionRestorationImplementation: SessionRestorationProtocol public let certificateValidator: SMKCertificateValidator - public let openGroupAPIDelegate: OpenGroupAPIDelegate - public let pnServerURL: String - public let pnServerPublicKey: String internal static var shared: Configuration! } @@ -19,27 +14,17 @@ public enum SNMessagingKit { // Just to make the external API nice public static func configure( storage: SessionMessagingKitStorageProtocol, - messageSenderDelegate: MessageSenderDelegate, - messageReceiverDelegate: MessageReceiverDelegate, signalStorage: SessionStore & PreKeyStore & SignedPreKeyStore, identityKeyStore: IdentityKeyStore, sessionRestorationImplementation: SessionRestorationProtocol, - certificateValidator: SMKCertificateValidator, - openGroupAPIDelegate: OpenGroupAPIDelegate, - pnServerURL: String, - pnServerPublicKey: String + certificateValidator: SMKCertificateValidator ) { Configuration.shared = Configuration( storage: storage, - messageSenderDelegate: messageSenderDelegate, - messageReceiverDelegate: messageReceiverDelegate, signalStorage: signalStorage, identityKeyStore: identityKeyStore, sessionRestorationImplementation: sessionRestorationImplementation, - certificateValidator: certificateValidator, - openGroupAPIDelegate: openGroupAPIDelegate, - pnServerURL: pnServerURL, - pnServerPublicKey: pnServerPublicKey + certificateValidator: certificateValidator ) } } diff --git a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage.h b/SessionMessagingKit/Database/OWSPrimaryStorage.h similarity index 97% rename from SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage.h rename to SessionMessagingKit/Database/OWSPrimaryStorage.h index 2599b378d..269ad1fc9 100644 --- a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage.h +++ b/SessionMessagingKit/Database/OWSPrimaryStorage.h @@ -2,7 +2,7 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage.m b/SessionMessagingKit/Database/OWSPrimaryStorage.m similarity index 98% rename from SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage.m rename to SessionMessagingKit/Database/OWSPrimaryStorage.m index edd029b88..69b39cdc0 100644 --- a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage.m +++ b/SessionMessagingKit/Database/OWSPrimaryStorage.m @@ -5,8 +5,6 @@ #import "OWSPrimaryStorage.h" #import "AppContext.h" #import "OWSDisappearingMessagesFinder.h" -#import "OWSFailedAttachmentDownloadsJob.h" -#import "OWSFailedMessagesJob.h" #import "OWSFileSystem.h" #import "OWSIncomingMessageFinder.h" #import "OWSMediaGalleryFinder.h" @@ -14,7 +12,8 @@ #import "SSKEnvironment.h" #import "TSDatabaseSecondaryIndexes.h" #import "TSDatabaseView.h" -#import +#import +#import #import "SSKAsserts.h" NS_ASSUME_NONNULL_BEGIN @@ -201,8 +200,6 @@ void VerifyRegistrationsForPrimaryStorage(OWSStorage *storage) [FullTextSearchFinder asyncRegisterDatabaseExtensionWithStorage:self]; [OWSIncomingMessageFinder asyncRegisterExtensionWithPrimaryStorage:self]; [OWSDisappearingMessagesFinder asyncRegisterDatabaseExtensions:self]; - [OWSFailedMessagesJob asyncRegisterDatabaseExtensionsWithPrimaryStorage:self]; - [OWSFailedAttachmentDownloadsJob asyncRegisterDatabaseExtensionsWithPrimaryStorage:self]; [OWSMediaGalleryFinder asyncRegisterDatabaseExtensionsWithPrimaryStorage:self]; [TSDatabaseView asyncRegisterLazyRestoreAttachmentsDatabaseView:self]; [SSKJobRecordFinder asyncRegisterDatabaseExtensionObjCWithStorage:self]; diff --git a/SignalUtilitiesKit/Database/OWSStorage/OWSStorage.h b/SessionMessagingKit/Database/OWSStorage.h similarity index 100% rename from SignalUtilitiesKit/Database/OWSStorage/OWSStorage.h rename to SessionMessagingKit/Database/OWSStorage.h diff --git a/SignalUtilitiesKit/Database/OWSStorage/OWSStorage.m b/SessionMessagingKit/Database/OWSStorage.m similarity index 83% rename from SignalUtilitiesKit/Database/OWSStorage/OWSStorage.m rename to SessionMessagingKit/Database/OWSStorage.m index f1df7a394..30c081e1c 100644 --- a/SignalUtilitiesKit/Database/OWSStorage/OWSStorage.m +++ b/SessionMessagingKit/Database/OWSStorage.m @@ -4,24 +4,24 @@ #import "OWSStorage.h" #import "AppContext.h" -#import "NSNotificationCenter+OWS.h" -#import "NSUserDefaults+OWS.h" #import "OWSBackgroundTask.h" #import "OWSFileSystem.h" #import "OWSPrimaryStorage.h" -#import "OWSStorage+Subclass.h" +#import "TSYapDatabaseObject.h" #import "TSAttachmentStream.h" -#import +#import #import -#import #import #import -#import #import +#import #import #import #import #import +#import +#import +#import NS_ASSUME_NONNULL_BEGIN @@ -59,8 +59,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ return self; } - OWSAssertDebug(delegate); - self.delegate = delegate; return self; @@ -76,8 +74,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ - (void)readWriteWithBlock:(void (^)(YapDatabaseReadWriteTransaction *transaction))block { id delegate = self.delegate; - OWSAssertDebug(delegate); - OWSAssertDebug(delegate.areAllRegistrationsComplete); OWSBackgroundTask *_Nullable backgroundTask = nil; if (CurrentAppContext().isMainApp && !CurrentAppContext().isRunningTests) { @@ -103,8 +99,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ completionBlock:(nullable dispatch_block_t)completionBlock { id delegate = self.delegate; - OWSAssertDebug(delegate); - OWSAssertDebug(delegate.areAllRegistrationsComplete); __block OWSBackgroundTask *_Nullable backgroundTask = nil; if (CurrentAppContext().isMainApp) { @@ -155,8 +149,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ return self; } - OWSAssertDebug(delegate); - self.delegate = delegate; return self; @@ -169,7 +161,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ - (YapDatabaseConnection *)newConnection { id delegate = self.delegate; - OWSAssertDebug(delegate); OWSDatabaseConnection *connection = [[OWSDatabaseConnection alloc] initWithDatabase:self delegate:delegate]; [self addConnection:connection]; @@ -201,8 +192,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ - (void)encodeWithCoder:(NSCoder *)aCoder { - OWSFailDebug(@"Tried to save object from unknown collection"); - return [super encodeWithCoder:aCoder]; } @@ -218,22 +207,16 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ - (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSFailDebug(@"Tried to save unknown object"); - // No-op. } - (void)touchWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSFailDebug(@"Tried to touch unknown object"); - // No-op. } - (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSFailDebug(@"Tried to remove unknown object"); - // No-op. } @@ -253,11 +236,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ cannotDecodeObjectOfClassName:(NSString *)name originalClasses:(NSArray *)classNames { - if ([name isEqualToString:@"TSRecipient"]) { - OWSLogError(@"Could not decode object: %@", name); - } else { - NSLog(@"Could not decode object: %@", name); - } return [OWSUnknownDBObject class]; } @@ -295,9 +273,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ - (void)dealloc { - // Surface memory leaks by logging the deallocation of this class. - OWSLogVerbose(@"Dealloc: %@", self.class); - [[NSNotificationCenter defaultCenter] removeObserver:self]; } @@ -308,7 +283,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ // // The best we can try to do is to discard the current database // and behave like a clean install. - OWSFailDebug(@"Could not load database"); // Try to reset app by deleting all databases. // @@ -316,34 +290,27 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ // [OWSStorage deleteDatabaseFiles]; if (![self tryToLoadDatabase]) { - OWSFailDebug(@"Could not load database (second try)"); // Sleep to give analytics events time to be delivered. [NSThread sleepForTimeInterval:15.0f]; - OWSFail(@"Failed to initialize database."); + NSAssert(NO, @"Couldn't load database"); } } } - (nullable id)dbNotificationObject { - OWSAssertDebug(self.database); - return self.database; } - (BOOL)areAsyncRegistrationsComplete { - OWSAbstractMethod(); - return NO; } - (BOOL)areSyncRegistrationsComplete { - OWSAbstractMethod(); - return NO; } @@ -354,26 +321,22 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ - (void)runSyncRegistrations { - OWSAbstractMethod(); + } - (void)runAsyncRegistrationsWithCompletion:(void (^_Nonnull)(void))completion { - OWSAbstractMethod(); + } + (void)registerExtensionsWithMigrationBlock:(OWSStorageMigrationBlock)migrationBlock { - OWSAssertDebug(migrationBlock); - __block OWSBackgroundTask *_Nullable backgroundTask = [OWSBackgroundTask backgroundTaskWithLabelStr:__PRETTY_FUNCTION__]; [OWSPrimaryStorage.sharedManager runSyncRegistrations]; [OWSPrimaryStorage.sharedManager runAsyncRegistrationsWithCompletion:^{ - OWSAssertDebug(self.isStorageReady); - [self postRegistrationCompleteNotification]; migrationBlock(); @@ -390,10 +353,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ // Returns YES IFF all registrations are complete. + (void)postRegistrationCompleteNotification { - OWSAssertDebug(self.isStorageReady); - - OWSLogInfo(@""); - static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [[NSNotificationCenter defaultCenter] postNotificationNameAsync:StorageIsReadyNotification @@ -424,15 +383,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ // https://www.zetetic.net/sqlcipher/sqlcipher-api/#cipher_migrate options.legacyCipherCompatibilityVersion = 3; - // If any of these asserts fails, we need to verify and update - // OWSDatabaseConverter which assumes the values of these options. - OWSAssertDebug(options.cipherDefaultkdfIterNumber == 0); - OWSAssertDebug(options.kdfIterNumber == 0); - OWSAssertDebug(options.cipherPageSize == 0); - OWSAssertDebug(options.pragmaPageSize == 0); - OWSAssertDebug(options.pragmaJournalSizeLimit == 0); - OWSAssertDebug(options.pragmaMMapSize == 0); - return options; } @@ -445,13 +395,11 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ // (e.g. by using OWSAssertDebug()) or this database will contain a // circular reference and will leak. OWSStorage *strongSelf = weakSelf; - OWSCAssertDebug(strongSelf); // Rather than compute this once and capture the value of the key // in the closure, we prefer to fetch the key from the keychain multiple times // in order to keep the key out of application memory. NSData *databaseKeySpec = [strongSelf databaseKeySpec]; - OWSCAssertDebug(databaseKeySpec.length == kSQLCipherKeySpecLength); return databaseKeySpec; }; @@ -484,7 +432,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ return ^id(NSString __unused *collection, NSString __unused *key, NSData *data) { if (!data || data.length <= 0) { - OWSFailDebug(@"can't deserialize null object: %@", collection); return [OWSUnknownDBObject new]; } @@ -502,9 +449,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ - (YapDatabaseConnection *)newDatabaseConnection { YapDatabaseConnection *dbConnection = self.database.newConnection; - if (!dbConnection) { - OWSFail(@"Storage could not open new database connection."); - } return dbConnection; } @@ -512,8 +456,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ + (void)incrementVersionOfDatabaseExtension:(NSString *)extensionName { - OWSLogError(@"%@", extensionName); - // Don't increment version of a given extension more than once // per launch. static NSMutableSet *incrementedViewSet = nil; @@ -523,14 +465,12 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ }); @synchronized(incrementedViewSet) { if ([incrementedViewSet containsObject:extensionName]) { - OWSLogInfo(@"Ignoring redundant increment: %@", extensionName); return; } [incrementedViewSet addObject:extensionName]; } NSUserDefaults *appUserDefaults = [NSUserDefaults appUserDefaults]; - OWSAssertDebug(appUserDefaults); NSMutableDictionary *_Nullable versionMap = [[appUserDefaults valueForKey:kNSUserDefaults_DatabaseExtensionVersionMap] mutableCopy]; if (!versionMap) { @@ -545,10 +485,7 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ - (nullable NSString *)appendSuffixToDatabaseExtensionVersionIfNecessary:(nullable NSString *)versionTag extensionName:(NSString *)extensionName { - OWSAssertIsOnMainThread(); - NSUserDefaults *appUserDefaults = [NSUserDefaults appUserDefaults]; - OWSAssertDebug(appUserDefaults); NSDictionary *_Nullable versionMap = [appUserDefaults valueForKey:kNSUserDefaults_DatabaseExtensionVersionMap]; NSNumber *_Nullable versionSuffix = versionMap[extensionName]; @@ -556,7 +493,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ if (versionSuffix) { NSString *result = [NSString stringWithFormat:@"%@.%@", (versionTag.length < 1 ? @"0" : versionTag), versionSuffix]; - OWSLogWarn(@"database extension version: %@ + %@ -> %@", versionTag, versionSuffix, result); return result; } return versionTag; @@ -564,9 +500,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ - (YapDatabaseExtension *)updateExtensionVersion:(YapDatabaseExtension *)extension withName:(NSString *)extensionName { - OWSAssertDebug(extension); - OWSAssertDebug(extensionName.length > 0); - if ([extension isKindOfClass:[YapDatabaseAutoView class]]) { YapDatabaseAutoView *databaseView = (YapDatabaseAutoView *)extension; YapDatabaseAutoView *databaseViewCopy = [[YapDatabaseAutoView alloc] @@ -578,8 +511,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ return databaseViewCopy; } else if ([extension isKindOfClass:[YapDatabaseSecondaryIndex class]]) { YapDatabaseSecondaryIndex *secondaryIndex = (YapDatabaseSecondaryIndex *)extension; - OWSAssertDebug(secondaryIndex->setup); - OWSAssertDebug(secondaryIndex->handler); YapDatabaseSecondaryIndex *secondaryIndexCopy = [[YapDatabaseSecondaryIndex alloc] initWithSetup:secondaryIndex->setup handler:secondaryIndex->handler @@ -606,7 +537,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ // This method needs to be able to update the versionTag of all extensions. // If we start using other extension types, we need to modify this method to // handle them as well. - OWSFailDebug(@"Unknown extension type: %@", [extension class]); return extension; } @@ -616,7 +546,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ { extension = [self updateExtensionVersion:extension withName:extensionName]; - OWSAssertDebug(![self.extensionNames containsObject:extensionName]); [self.extensionNames addObject:extensionName]; return [self.database registerExtension:extension withName:extensionName]; @@ -634,18 +563,11 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ { extension = [self updateExtensionVersion:extension withName:extensionName]; - OWSAssertDebug(![self.extensionNames containsObject:extensionName]); [self.extensionNames addObject:extensionName]; [self.database asyncRegisterExtension:extension withName:extensionName completionBlock:^(BOOL ready) { - if (!ready) { - OWSFailDebug(@"asyncRegisterExtension failed: %@", extensionName); - } else { - OWSLogVerbose(@"asyncRegisterExtension succeeded: %@", extensionName); - } - dispatch_async(dispatch_get_main_queue(), ^{ if (completion) { completion(); @@ -710,22 +632,16 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ - (NSString *)databaseFilePath { - OWSAbstractMethod(); - return @""; } - (NSString *)databaseFilePath_SHM { - OWSAbstractMethod(); - return @""; } - (NSString *)databaseFilePath_WAL { - OWSAbstractMethod(); - return @""; } @@ -740,10 +656,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ return YES; } - if (error) { - OWSLogWarn(@"Database key couldn't be accessed: %@", error.localizedDescription); - } - return NO; } @@ -755,29 +667,21 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ + (nullable NSData *)tryToLoadDatabaseCipherKeySpec:(NSError **)errorHandle { NSData *_Nullable data = [self tryToLoadKeyChainValue:keychainDBCipherKeySpec errorHandle:errorHandle]; - OWSAssertDebug(!data || data.length == kSQLCipherKeySpecLength); return data; } + (void)storeDatabaseCipherKeySpec:(NSData *)cipherKeySpecData { - OWSAssertDebug(cipherKeySpecData.length == kSQLCipherKeySpecLength); - [self storeKeyChainValue:cipherKeySpecData keychainKey:keychainDBCipherKeySpec]; } + (void)removeLegacyPassphrase { - OWSLogInfo(@"removing legacy passphrase"); - NSError *_Nullable error; BOOL result = [CurrentAppContext().keychainStorage removeWithService:keychainService key:keychainDBLegacyPassphrase error:&error]; - if (error || !result) { - OWSFailDebug(@"could not remove legacy passphrase."); - } } - (void)ensureDatabaseKeySpecExists @@ -800,8 +704,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ errorDescription = [errorDescription stringByAppendingFormat:@", ApplicationState: %@", NSStringForUIApplicationState(applicationState)]; } - OWSLogError(@"%@", errorDescription); - [DDLog flushLog]; if (CurrentAppContext().isMainApp) { if (CurrentAppContext().isInBackground) { @@ -818,9 +720,6 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ // or the keychain has become corrupt. Either way, we want to get back to a // "known good state" and behave like a new install. BOOL doesDBExist = [NSFileManager.defaultManager fileExistsAtPath:[self databaseFilePath]]; - if (doesDBExist) { - OWSFailDebug(@"Could not load database metadata"); - } if (!CurrentAppContext().isRunningTests) { // Try to reset app by deleting database. @@ -838,12 +737,10 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ NSData *_Nullable keySpec = [[self class] tryToLoadDatabaseCipherKeySpec:&error]; if (error) { - OWSLogError(@"failed to fetch databaseKeySpec with error: %@", error); [self raiseKeySpecInaccessibleExceptionWithErrorDescription:@"CipherKeySpec inaccessible"]; } if (keySpec.length != kSQLCipherKeySpecLength) { - OWSLogError(@"keyspec had length: %lu", (unsigned long)keySpec.length); [self raiseKeySpecInaccessibleExceptionWithErrorDescription:@"CipherKeySpec invalid"]; } @@ -852,15 +749,12 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ - (void)raiseKeySpecInaccessibleExceptionWithErrorDescription:(NSString *)errorDescription { - OWSAssertDebug(CurrentAppContext().isMainApp && CurrentAppContext().isInBackground); - // Sleep to give analytics events time to be delivered. [NSThread sleepForTimeInterval:5.0f]; // Presumably this happened in response to a push notification. It's possible that the keychain is corrupted // but it could also just be that the user hasn't yet unlocked their device since our password is // kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly - OWSFail(@"%@", errorDescription); } + (void)deleteDBKeys @@ -869,15 +763,9 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ BOOL result = [CurrentAppContext().keychainStorage removeWithService:keychainService key:keychainDBLegacyPassphrase error:&error]; - if (error || !result) { - OWSFailDebug(@"could not remove legacy passphrase."); - } result = [CurrentAppContext().keychainStorage removeWithService:keychainService key:keychainDBCipherKeySpec error:&error]; - if (error || !result) { - OWSFailDebug(@"could not remove cipher key spec."); - } } - (unsigned long long)databaseFileSize @@ -897,42 +785,27 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_ + (nullable NSData *)tryToLoadKeyChainValue:(NSString *)keychainKey errorHandle:(NSError **)errorHandle { - OWSAssertDebug(keychainKey.length > 0); - OWSAssertDebug(errorHandle); - NSData *_Nullable data = [CurrentAppContext().keychainStorage dataForService:keychainService key:keychainKey error:errorHandle]; - if (*errorHandle || !data) { - OWSLogWarn(@"could not load keychain value."); - } return data; } + (void)storeKeyChainValue:(NSData *)data keychainKey:(NSString *)keychainKey { - OWSAssertDebug(keychainKey.length > 0); - OWSAssertDebug(data.length > 0); - NSError *error; BOOL success = [CurrentAppContext().keychainStorage setWithData:data service:keychainService key:keychainKey error:&error]; if (!success || error) { - OWSFailDebug(@"Could not store database metadata"); // Sleep to give analytics events time to be delivered. [NSThread sleepForTimeInterval:15.0f]; - OWSFail(@"Setting keychain value failed with error: %@", error); - } else { - OWSLogWarn(@"Successfully set new keychain value."); } } - (void)logFileSizes { - OWSLogInfo(@"Database file size: %@", [OWSFileSystem fileSizeOfPath:self.databaseFilePath]); - OWSLogInfo(@"\t SHM file size: %@", [OWSFileSystem fileSizeOfPath:self.databaseFilePath_SHM]); - OWSLogInfo(@"\t WAL file size: %@", [OWSFileSystem fileSizeOfPath:self.databaseFilePath_WAL]); + } @end diff --git a/SignalUtilitiesKit/Database/Utilities/SSKPreferences.swift b/SessionMessagingKit/Database/SSKPreferences.swift similarity index 100% rename from SignalUtilitiesKit/Database/Utilities/SSKPreferences.swift rename to SessionMessagingKit/Database/SSKPreferences.swift diff --git a/SignalUtilitiesKit/Database/Storage/Storage+ClosedGroups.swift b/SessionMessagingKit/Database/Storage+ClosedGroups.swift similarity index 99% rename from SignalUtilitiesKit/Database/Storage/Storage+ClosedGroups.swift rename to SessionMessagingKit/Database/Storage+ClosedGroups.swift index 5aed45fc9..ea75d9c54 100644 --- a/SignalUtilitiesKit/Database/Storage/Storage+ClosedGroups.swift +++ b/SessionMessagingKit/Database/Storage+ClosedGroups.swift @@ -1,3 +1,4 @@ +import SessionProtocolKit extension Storage { diff --git a/SignalUtilitiesKit/Database/Storage/Storage+Jobs.swift b/SessionMessagingKit/Database/Storage+Jobs.swift similarity index 100% rename from SignalUtilitiesKit/Database/Storage/Storage+Jobs.swift rename to SessionMessagingKit/Database/Storage+Jobs.swift diff --git a/SignalUtilitiesKit/Database/Storage/Storage+Messaging.swift b/SessionMessagingKit/Database/Storage+Messaging.swift similarity index 100% rename from SignalUtilitiesKit/Database/Storage/Storage+Messaging.swift rename to SessionMessagingKit/Database/Storage+Messaging.swift diff --git a/SignalUtilitiesKit/Database/Storage/Storage+OpenGroups.swift b/SessionMessagingKit/Database/Storage+OpenGroups.swift similarity index 100% rename from SignalUtilitiesKit/Database/Storage/Storage+OpenGroups.swift rename to SessionMessagingKit/Database/Storage+OpenGroups.swift diff --git a/SignalUtilitiesKit/Database/Storage/Storage+Shared.swift b/SessionMessagingKit/Database/Storage+Shared.swift similarity index 100% rename from SignalUtilitiesKit/Database/Storage/Storage+Shared.swift rename to SessionMessagingKit/Database/Storage+Shared.swift diff --git a/SignalUtilitiesKit/Database/Utilities/TSDatabaseSecondaryIndexes.h b/SessionMessagingKit/Database/TSDatabaseSecondaryIndexes.h similarity index 100% rename from SignalUtilitiesKit/Database/Utilities/TSDatabaseSecondaryIndexes.h rename to SessionMessagingKit/Database/TSDatabaseSecondaryIndexes.h diff --git a/SignalUtilitiesKit/Database/Utilities/TSDatabaseSecondaryIndexes.m b/SessionMessagingKit/Database/TSDatabaseSecondaryIndexes.m similarity index 100% rename from SignalUtilitiesKit/Database/Utilities/TSDatabaseSecondaryIndexes.m rename to SessionMessagingKit/Database/TSDatabaseSecondaryIndexes.m diff --git a/SignalUtilitiesKit/Database/Utilities/TSDatabaseView.h b/SessionMessagingKit/Database/TSDatabaseView.h similarity index 98% rename from SignalUtilitiesKit/Database/Utilities/TSDatabaseView.h rename to SessionMessagingKit/Database/TSDatabaseView.h index bdd52ee8b..1598f55fd 100644 --- a/SignalUtilitiesKit/Database/Utilities/TSDatabaseView.h +++ b/SessionMessagingKit/Database/TSDatabaseView.h @@ -2,7 +2,7 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // -#import +#import #import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Database/Utilities/TSDatabaseView.m b/SessionMessagingKit/Database/TSDatabaseView.m similarity index 89% rename from SignalUtilitiesKit/Database/Utilities/TSDatabaseView.m rename to SessionMessagingKit/Database/TSDatabaseView.m index fdb13e221..876063959 100644 --- a/SignalUtilitiesKit/Database/Utilities/TSDatabaseView.m +++ b/SessionMessagingKit/Database/TSDatabaseView.m @@ -60,8 +60,6 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" + (void)registerCrossProcessNotifier:(OWSStorage *)storage { - OWSAssertDebug(storage); - // I don't think the identifier and name of this extension matter for our purposes, // so long as they don't conflict with any other extension names. YapDatabaseExtension *extension = @@ -74,14 +72,8 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" version:(NSString *)version storage:(OWSStorage *)storage { - OWSAssertIsOnMainThread(); - OWSAssertDebug(viewName.length > 0); - OWSAssertDebug((viewGrouping)); - OWSAssertDebug(storage); - YapDatabaseView *existingView = [storage registeredExtension:viewName]; if (existingView) { - OWSFailDebug(@"Registered database view twice: %@", viewName); return; } @@ -142,7 +134,6 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *( YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { if (![object isKindOfClass:[TSInteraction class]]) { - OWSFailDebug(@"Unexpected entity %@ in collection: %@", [object class], collection); return nil; } TSInteraction *interaction = (TSInteraction *)object; @@ -167,19 +158,14 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" + (void)asyncRegisterLegacyThreadInteractionsDatabaseView:(OWSStorage *)storage { - OWSAssertIsOnMainThread(); - OWSAssert(storage); - YapDatabaseView *existingView = [storage registeredExtension:TSMessageDatabaseViewExtensionName_Legacy]; if (existingView) { - OWSFailDebug(@"Registered database view twice: %@", TSMessageDatabaseViewExtensionName_Legacy); return; } YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *( YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { if (![object isKindOfClass:[TSInteraction class]]) { - OWSFailDebug(@"%@ Unexpected entity %@ in collection: %@", self.logTag, [object class], collection); return nil; } TSInteraction *interaction = (TSInteraction *)object; @@ -197,11 +183,9 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" NSString *key2, id object2) { if (![object1 isKindOfClass:[TSInteraction class]]) { - OWSFailDebug(@"%@ Unexpected entity %@ in collection: %@", self.logTag, [object1 class], collection1); return NSOrderedSame; } if (![object2 isKindOfClass:[TSInteraction class]]) { - OWSFailDebug(@"%@ Unexpected entity %@ in collection: %@", self.logTag, [object2 class], collection2); return NSOrderedSame; } TSInteraction *interaction1 = (TSInteraction *)object1; @@ -237,7 +221,6 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *( YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { if (![object isKindOfClass:[TSInteraction class]]) { - OWSFailDebug(@"Unexpected entity %@ in collection: %@", [object class], collection); return nil; } TSInteraction *interaction = (TSInteraction *)object; @@ -271,14 +254,12 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" { YapDatabaseView *threadView = [storage registeredExtension:TSThreadDatabaseViewExtensionName]; if (threadView) { - OWSFailDebug(@"Registered database view twice: %@", TSThreadDatabaseViewExtensionName); return; } YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *( YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { if (![object isKindOfClass:[TSThread class]]) { - OWSFailDebug(@"Unexpected entity %@ in collection: %@", [object class], collection); return nil; } TSThread *thread = (TSThread *)object; @@ -287,7 +268,6 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" // Do nothing; we never hide threads that have ever had a message. } else { YapDatabaseViewTransaction *viewTransaction = [transaction ext:TSMessageDatabaseViewExtensionName]; - OWSAssertDebug(viewTransaction); NSUInteger threadMessageCount = [viewTransaction numberOfItemsInGroup:thread.uniqueId]; if (threadMessageCount < 1) { return nil; @@ -320,11 +300,9 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" NSString *key2, id object2) { if (![object1 isKindOfClass:[TSThread class]]) { - OWSFailDebug(@"Unexpected entity %@ in collection: %@", [object1 class], collection1); return NSOrderedSame; } if (![object2 isKindOfClass:[TSThread class]]) { - OWSFailDebug(@"Unexpected entity %@ in collection: %@", [object2 class], collection2); return NSOrderedSame; } TSThread *thread1 = (TSThread *)object1; @@ -356,11 +334,9 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" NSString *key2, id object2) { if (![object1 isKindOfClass:[TSInteraction class]]) { - OWSFailDebug(@"Unexpected entity %@ in collection: %@", [object1 class], collection1); return NSOrderedSame; } if (![object2 isKindOfClass:[TSInteraction class]]) { - OWSFailDebug(@"Unexpected entity %@ in collection: %@", [object2 class], collection2); return NSOrderedSame; } TSInteraction *message1 = (TSInteraction *)object1; @@ -375,7 +351,6 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *_Nullable( YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { if (![object isKindOfClass:[TSAttachment class]]) { - OWSFailDebug(@"Unexpected entity %@ in collection: %@", [object class], collection); return nil; } if (![object isKindOfClass:[TSAttachmentPointer class]]) { @@ -399,11 +374,9 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" NSString *key2, id object2) { if (![object1 isKindOfClass:[TSAttachmentPointer class]]) { - OWSFailDebug(@"Unexpected entity %@ in collection: %@", [object1 class], collection1); return NSOrderedSame; } if (![object2 isKindOfClass:[TSAttachmentPointer class]]) { - OWSFailDebug(@"Unexpected entity %@ in collection: %@", [object2 class], collection2); return NSOrderedSame; } @@ -424,15 +397,11 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" + (id)unseenDatabaseViewExtension:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(transaction); - id _Nullable result = [transaction ext:TSUnseenDatabaseViewExtensionName]; - OWSAssertDebug(result); // TODO: I believe we can now safely remove this? if (!result) { result = [transaction ext:TSUnreadDatabaseViewExtensionName]; - OWSAssertDebug(result); } return result; @@ -441,20 +410,14 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" // MJK TODO - dynamic interactions + (id)threadOutgoingMessageDatabaseView:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(transaction); - id result = [transaction ext:TSThreadOutgoingMessageDatabaseViewExtensionName]; - OWSAssertDebug(result); return result; } + (id)threadSpecialMessagesDatabaseView:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(transaction); - id result = [transaction ext:TSThreadSpecialMessagesDatabaseViewExtensionName]; - OWSAssertDebug(result); return result; } diff --git a/SessionMessagingKit/Jobs/NotifyPNServerJob.swift b/SessionMessagingKit/Jobs/NotifyPNServerJob.swift index 2c94a5c79..c26ed550c 100644 --- a/SessionMessagingKit/Jobs/NotifyPNServerJob.swift +++ b/SessionMessagingKit/Jobs/NotifyPNServerJob.swift @@ -34,13 +34,13 @@ public final class NotifyPNServerJob : NSObject, Job, NSCoding { // NSObject/NSC // MARK: Running public func execute() { - let server = Configuration.shared.pnServerURL + let server = PushNotificationAPI.server let parameters = [ "data" : message.data.description, "send_to" : message.recipient ] let url = URL(string: "\(server)/notify")! let request = TSRequest(url: url, method: "POST", parameters: parameters) request.allHTTPHeaderFields = [ "Content-Type" : "application/json" ] attempt(maxRetryCount: 4, recoveringOn: DispatchQueue.global()) { - OnionRequestAPI.sendOnionRequest(request, to: server, target: "/loki/v2/lsrpc", using: Configuration.shared.pnServerPublicKey).map { _ in } + OnionRequestAPI.sendOnionRequest(request, to: server, target: "/loki/v2/lsrpc", using: PushNotificationAPI.serverPublicKey).map { _ in } }.done(on: DispatchQueue.global()) { // Intentionally capture self self.handleSuccess() }.catch(on: DispatchQueue.global()) { error in diff --git a/SessionMessagingKit/Messages/Message+Destination.swift b/SessionMessagingKit/Messages/Message+Destination.swift index f35a2181c..55f1d2dc4 100644 --- a/SessionMessagingKit/Messages/Message+Destination.swift +++ b/SessionMessagingKit/Messages/Message+Destination.swift @@ -5,5 +5,20 @@ public extension Message { case contact(publicKey: String) case closedGroup(groupPublicKey: String) case openGroup(channel: UInt64, server: String) + + static func from(_ thread: TSThread) -> Message.Destination { + if let thread = thread as? TSContactThread { + return .contact(publicKey: thread.contactIdentifier()) + } else if let thread = thread as? TSGroupThread, thread.usesSharedSenderKeys { + let groupID = thread.groupModel.groupId + let groupPublicKey = LKGroupUtilities.getDecodedGroupID(groupID) + return .closedGroup(groupPublicKey: groupPublicKey) + } else if let thread = thread as? TSGroupThread, thread.isOpenGroup { + let openGroup = Storage.shared.getOpenGroup(for: thread.uniqueId!)! + return .openGroup(channel: openGroup.channel, server: openGroup.server) + } else { + preconditionFailure("TODO: Handle legacy closed groups.") + } + } } } diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSErrorMessage.h b/SessionMessagingKit/Messages/Signal/TSErrorMessage.h similarity index 97% rename from SignalUtilitiesKit/Messaging/Core Messages/TSErrorMessage.h rename to SessionMessagingKit/Messages/Signal/TSErrorMessage.h index bb04ed25f..a0a65d6d5 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSErrorMessage.h +++ b/SessionMessagingKit/Messages/Signal/TSErrorMessage.h @@ -2,8 +2,8 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // -#import -#import +#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSErrorMessage.m b/SessionMessagingKit/Messages/Signal/TSErrorMessage.m similarity index 97% rename from SignalUtilitiesKit/Messaging/Core Messages/TSErrorMessage.m rename to SessionMessagingKit/Messages/Signal/TSErrorMessage.m index 09944f332..572da4454 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSErrorMessage.m +++ b/SessionMessagingKit/Messages/Signal/TSErrorMessage.m @@ -7,8 +7,8 @@ #import "TSContactThread.h" #import "TSErrorMessage_privateConstructor.h" #import -#import #import +#import NS_ASSUME_NONNULL_BEGIN @@ -205,13 +205,10 @@ NSUInteger TSErrorMessageSchemaVersion = 1; sendReadReceipt:(BOOL)sendReadReceipt transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - if (_read) { return; } - OWSLogDebug(@"marking as read uniqueId: %@ which has timestamp: %llu", self.uniqueId, self.timestamp); _read = YES; [self saveWithTransaction:transaction]; diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSErrorMessage_privateConstructor.h b/SessionMessagingKit/Messages/Signal/TSErrorMessage_privateConstructor.h similarity index 90% rename from SignalUtilitiesKit/Messaging/Core Messages/TSErrorMessage_privateConstructor.h rename to SessionMessagingKit/Messages/Signal/TSErrorMessage_privateConstructor.h index 08de35a44..e402d95fb 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSErrorMessage_privateConstructor.h +++ b/SessionMessagingKit/Messages/Signal/TSErrorMessage_privateConstructor.h @@ -2,7 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSIncomingMessage+Conversion.swift b/SessionMessagingKit/Messages/Signal/TSIncomingMessage+Conversion.swift similarity index 100% rename from SignalUtilitiesKit/Messaging/Core Messages/TSIncomingMessage+Conversion.swift rename to SessionMessagingKit/Messages/Signal/TSIncomingMessage+Conversion.swift diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSIncomingMessage.h b/SessionMessagingKit/Messages/Signal/TSIncomingMessage.h similarity index 97% rename from SignalUtilitiesKit/Messaging/Core Messages/TSIncomingMessage.h rename to SessionMessagingKit/Messages/Signal/TSIncomingMessage.h index 84c3f1cf2..58b770a40 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSIncomingMessage.h +++ b/SessionMessagingKit/Messages/Signal/TSIncomingMessage.h @@ -2,8 +2,8 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // -#import -#import +#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSIncomingMessage.m b/SessionMessagingKit/Messages/Signal/TSIncomingMessage.m similarity index 90% rename from SignalUtilitiesKit/Messaging/Core Messages/TSIncomingMessage.m rename to SessionMessagingKit/Messages/Signal/TSIncomingMessage.m index 40092305c..69e3a0f3a 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSIncomingMessage.m +++ b/SessionMessagingKit/Messages/Signal/TSIncomingMessage.m @@ -13,6 +13,7 @@ #import "TSGroupThread.h" #import #import +#import NS_ASSUME_NONNULL_BEGIN @@ -36,7 +37,6 @@ NS_ASSUME_NONNULL_BEGIN } if (_authorId == nil) { - OWSAssertDebug([self.uniqueThreadId hasPrefix:TSContactThreadPrefix]); _authorId = [TSContactThread contactIdFromThreadId:self.uniqueThreadId]; } @@ -81,8 +81,6 @@ NS_ASSUME_NONNULL_BEGIN timestamp:(uint64_t)timestamp transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - __block TSIncomingMessage *foundMessage; // In theory we could build a new secondaryIndex for (authorId,timestamp), but in practice there should // be *very* few (millisecond) timestamps with multiple authors. @@ -93,9 +91,6 @@ NS_ASSUME_NONNULL_BEGIN [TSInteraction fetchObjectWithUniqueID:key transaction:transaction]; if ([interaction isKindOfClass:[TSIncomingMessage class]]) { TSIncomingMessage *message = (TSIncomingMessage *)interaction; - - OWSAssertDebug(message.authorId > 0); - if ([message.authorId isEqualToString:authorId]) { foundMessage = message; } @@ -133,7 +128,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)markAsReadNowWithSendReadReceipt:(BOOL)sendReadReceipt transaction:(YapDatabaseReadWriteTransaction *)transaction; { - [self markAsReadAtTimestamp:[NSDate ows_millisecondTimeStamp] + [self markAsReadAtTimestamp:[NSDate millisecondTimestamp] sendReadReceipt:sendReadReceipt transaction:transaction]; } @@ -142,17 +137,11 @@ NS_ASSUME_NONNULL_BEGIN sendReadReceipt:(BOOL)sendReadReceipt transaction:(YapDatabaseReadWriteTransaction *)transaction; { - OWSAssertDebug(transaction); - if (_read && readTimestamp >= self.expireStartedAt) { return; } - NSTimeInterval secondsAgoRead = ((NSTimeInterval)[NSDate ows_millisecondTimeStamp] - (NSTimeInterval)readTimestamp) / 1000; - OWSLogDebug(@"marking uniqueId: %@ which has timestamp: %llu as read: %f seconds ago", - self.uniqueId, - self.timestamp, - secondsAgoRead); + NSTimeInterval secondsAgoRead = ((NSTimeInterval)[NSDate millisecondTimestamp] - (NSTimeInterval)readTimestamp) / 1000; _read = YES; [self saveWithTransaction:transaction]; diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSInfoMessage.h b/SessionMessagingKit/Messages/Signal/TSInfoMessage.h similarity index 96% rename from SignalUtilitiesKit/Messaging/Core Messages/TSInfoMessage.h rename to SessionMessagingKit/Messages/Signal/TSInfoMessage.h index 53e462619..e7ae3d82e 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSInfoMessage.h +++ b/SessionMessagingKit/Messages/Signal/TSInfoMessage.h @@ -2,8 +2,8 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // -#import -#import +#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSInfoMessage.m b/SessionMessagingKit/Messages/Signal/TSInfoMessage.m similarity index 95% rename from SignalUtilitiesKit/Messaging/Core Messages/TSInfoMessage.m rename to SessionMessagingKit/Messages/Signal/TSInfoMessage.m index 1db237167..39d168d7e 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSInfoMessage.m +++ b/SessionMessagingKit/Messages/Signal/TSInfoMessage.m @@ -6,6 +6,7 @@ #import "SSKEnvironment.h" #import #import +#import NS_ASSUME_NONNULL_BEGIN @@ -97,11 +98,8 @@ NSUInteger TSInfoMessageSchemaVersion = 1; + (instancetype)userNotRegisteredMessageInThread:(TSThread *)thread recipientId:(NSString *)recipientId { - OWSAssertDebug(thread); - OWSAssertDebug(recipientId); - // MJK TODO - remove senderTimestamp - return [[self alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] + return [[self alloc] initWithTimestamp:[NSDate millisecondTimestamp] inThread:thread messageType:TSInfoMessageUserNotRegistered unregisteredRecipientId:recipientId]; @@ -169,13 +167,10 @@ NSUInteger TSInfoMessageSchemaVersion = 1; sendReadReceipt:(BOOL)sendReadReceipt transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - if (_read) { return; } - OWSLogDebug(@"marking as read uniqueId: %@ which has timestamp: %llu", self.uniqueId, self.timestamp); _read = YES; [self saveWithTransaction:transaction]; diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSInteraction.h b/SessionMessagingKit/Messages/Signal/TSInteraction.h similarity index 100% rename from SignalUtilitiesKit/Messaging/Core Messages/TSInteraction.h rename to SessionMessagingKit/Messages/Signal/TSInteraction.h diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSInteraction.m b/SessionMessagingKit/Messages/Signal/TSInteraction.m similarity index 95% rename from SignalUtilitiesKit/Messaging/Core Messages/TSInteraction.m rename to SessionMessagingKit/Messages/Signal/TSInteraction.m index 004d923f5..813145b3f 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSInteraction.m +++ b/SessionMessagingKit/Messages/Signal/TSInteraction.m @@ -7,7 +7,7 @@ #import "TSThread.h" #import "TSGroupThread.h" #import -#import +#import NS_ASSUME_NONNULL_BEGIN @@ -47,8 +47,6 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) ofClass:(Class)clazz withTransaction:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(timestamp > 0); - // Accept any interaction. return [self interactionsWithTimestamp:timestamp filter:^(TSInteraction *interaction) { @@ -61,8 +59,6 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) filter:(BOOL (^_Nonnull)(TSInteraction *))filter withTransaction:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(timestamp > 0); - NSMutableArray *interactions = [NSMutableArray new]; [TSDatabaseSecondaryIndexes @@ -88,8 +84,6 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) timestamp:(uint64_t)timestamp inThread:(TSThread *)thread { - OWSAssertDebug(timestamp > 0); - self = [super initWithUniqueId:uniqueId]; if (!self) { @@ -104,8 +98,6 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) - (instancetype)initInteractionWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread { - OWSAssertDebug(timestamp > 0); - self = [super initWithUniqueId:[[NSUUID UUID] UUIDString]]; if (!self) { @@ -169,8 +161,6 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) - (void)applyChangeToSelfAndLatestCopy:(YapDatabaseReadWriteTransaction *)transaction changeBlock:(void (^)(id))changeBlock { - OWSAssertDebug(transaction); - [super applyChangeToSelfAndLatestCopy:transaction changeBlock:changeBlock]; [self touchThreadWithTransaction:transaction]; } @@ -203,8 +193,6 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) - (NSComparisonResult)compareForSorting:(TSInteraction *)other { - OWSAssertDebug(other); - uint64_t sortId1; uint64_t sortId2; @@ -230,8 +218,6 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) - (OWSInteractionType)interactionType { - OWSFailDebug(@"unknown interaction type."); - return OWSInteractionType_Unknown; } @@ -246,7 +232,6 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) - (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { if (!self.uniqueId) { - OWSFailDebug(@"Missing uniqueId."); self.uniqueId = [NSUUID new].UUIDString; } if (self.sortId == 0) { diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeyErrorMessage.h b/SessionMessagingKit/Messages/Signal/TSInvalidIdentityKeyErrorMessage.h similarity index 84% rename from SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeyErrorMessage.h rename to SessionMessagingKit/Messages/Signal/TSInvalidIdentityKeyErrorMessage.h index effae70d4..a12d51534 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeyErrorMessage.h +++ b/SessionMessagingKit/Messages/Signal/TSInvalidIdentityKeyErrorMessage.h @@ -2,12 +2,10 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN -@class OWSFingerprint; - @interface TSInvalidIdentityKeyErrorMessage : TSErrorMessage - (void)throws_acceptNewIdentityKey NS_SWIFT_UNAVAILABLE("throws objc exceptions"); diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeyErrorMessage.m b/SessionMessagingKit/Messages/Signal/TSInvalidIdentityKeyErrorMessage.m similarity index 85% rename from SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeyErrorMessage.m rename to SessionMessagingKit/Messages/Signal/TSInvalidIdentityKeyErrorMessage.m index 028466323..ce9e3a62d 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeyErrorMessage.m +++ b/SessionMessagingKit/Messages/Signal/TSInvalidIdentityKeyErrorMessage.m @@ -11,18 +11,16 @@ NS_ASSUME_NONNULL_BEGIN - (void)throws_acceptNewIdentityKey { - OWSAbstractMethod(); + } - (nullable NSData *)throws_newIdentityKey { - OWSAbstractMethod(); return nil; } - (NSString *)theirSignalId { - OWSAbstractMethod(); return nil; } diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeyReceivingErrorMessage.h b/SessionMessagingKit/Messages/Signal/TSInvalidIdentityKeyReceivingErrorMessage.h similarity index 90% rename from SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeyReceivingErrorMessage.h rename to SessionMessagingKit/Messages/Signal/TSInvalidIdentityKeyReceivingErrorMessage.h index a59fe3bbb..8b2de8c6f 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeyReceivingErrorMessage.h +++ b/SessionMessagingKit/Messages/Signal/TSInvalidIdentityKeyReceivingErrorMessage.h @@ -2,7 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeyReceivingErrorMessage.m b/SessionMessagingKit/Messages/Signal/TSInvalidIdentityKeyReceivingErrorMessage.m similarity index 87% rename from SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeyReceivingErrorMessage.m rename to SessionMessagingKit/Messages/Signal/TSInvalidIdentityKeyReceivingErrorMessage.m index 168db6d70..c85c57276 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeyReceivingErrorMessage.m +++ b/SessionMessagingKit/Messages/Signal/TSInvalidIdentityKeyReceivingErrorMessage.m @@ -12,8 +12,8 @@ #import "TSErrorMessage_privateConstructor.h" #import #import -#import #import +#import NS_ASSUME_NONNULL_BEGIN @@ -59,7 +59,6 @@ __attribute__((deprecated)) @interface TSInvalidIdentityKeyReceivingErrorMessage NSError *error; _envelopeData = [envelope serializedDataAndReturnError:&error]; if (!_envelopeData || error != nil) { - OWSFailDebug(@"failure: envelope data failed with error: %@", error); return nil; } @@ -75,7 +74,7 @@ __attribute__((deprecated)) @interface TSInvalidIdentityKeyReceivingErrorMessage NSError *error; SNProtoEnvelope *_Nullable envelope = [SNProtoEnvelope parseData:self.envelopeData error:&error]; if (error || envelope == nil) { - OWSFailDebug(@"Could not parse proto: %@", error); + } else { _envelope = envelope; } @@ -85,16 +84,12 @@ __attribute__((deprecated)) @interface TSInvalidIdentityKeyReceivingErrorMessage - (void)throws_acceptNewIdentityKey { - OWSAssertIsOnMainThread(); - if (self.errorType != TSErrorMessageWrongTrustedIdentityKey) { - OWSLogError(@"Refusing to accept identity key for anything but a Key error."); return; } NSData *_Nullable newKey = [self throws_newIdentityKey]; if (!newKey) { - OWSFailDebug(@"Couldn't extract identity key to accept"); return; } @@ -116,18 +111,15 @@ __attribute__((deprecated)) @interface TSInvalidIdentityKeyReceivingErrorMessage - (nullable NSData *)throws_newIdentityKey { if (!self.envelope) { - OWSLogError(@"Error message had no envelope data to extract key from"); return nil; } if (self.envelope.type != SNProtoEnvelopeTypePrekeyBundle) { - OWSLogError(@"Refusing to attempt key extraction from an envelope which isn't a prekey bundle"); return nil; } NSData *pkwmData = self.envelope.content; if (!pkwmData) { - OWSLogError(@"Ignoring acceptNewIdentityKey for empty message"); return nil; } diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSMessage.h b/SessionMessagingKit/Messages/Signal/TSMessage.h similarity index 96% rename from SignalUtilitiesKit/Messaging/Core Messages/TSMessage.h rename to SessionMessagingKit/Messages/Signal/TSMessage.h index 436780bfe..d5f9058cf 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSMessage.h +++ b/SessionMessagingKit/Messages/Signal/TSMessage.h @@ -2,7 +2,7 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN @@ -17,6 +17,8 @@ NS_ASSUME_NONNULL_BEGIN @class TSQuotedMessage; @class YapDatabaseReadWriteTransaction; +extern const NSUInteger kOversizeTextMessageSizeThreshold; + @interface TSMessage : TSInteraction @property (nonatomic, readonly) NSMutableArray *attachmentIds; diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSOutgoingMessage+Conversion.swift b/SessionMessagingKit/Messages/Signal/TSOutgoingMessage+Conversion.swift similarity index 100% rename from SignalUtilitiesKit/Messaging/Core Messages/TSOutgoingMessage+Conversion.swift rename to SessionMessagingKit/Messages/Signal/TSOutgoingMessage+Conversion.swift diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSOutgoingMessage.h b/SessionMessagingKit/Messages/Signal/TSOutgoingMessage.h similarity index 99% rename from SignalUtilitiesKit/Messaging/Core Messages/TSOutgoingMessage.h rename to SessionMessagingKit/Messages/Signal/TSOutgoingMessage.h index dfd9d73e2..61958afc8 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSOutgoingMessage.h +++ b/SessionMessagingKit/Messages/Signal/TSOutgoingMessage.h @@ -2,7 +2,7 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSOutgoingMessage.m b/SessionMessagingKit/Messages/Signal/TSOutgoingMessage.m similarity index 92% rename from SignalUtilitiesKit/Messaging/Core Messages/TSOutgoingMessage.m rename to SessionMessagingKit/Messages/Signal/TSOutgoingMessage.m index 35fe9dd7c..7ba4eaa91 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSOutgoingMessage.m +++ b/SessionMessagingKit/Messages/Signal/TSOutgoingMessage.m @@ -5,7 +5,6 @@ @import Foundation; #import "TSOutgoingMessage.h" -#import "NSString+SSK.h" #import "TSDatabaseSecondaryIndexes.h" #import "OWSPrimaryStorage.h" #import "ProfileManagerProtocol.h" @@ -18,9 +17,9 @@ #import "TSGroupThread.h" #import "TSQuotedMessage.h" #import -#import #import #import +#import NS_ASSUME_NONNULL_BEGIN @@ -109,7 +108,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt if (!self.recipientStateMap) { [self migrateRecipientStateMapWithCoder:coder]; - OWSAssertDebug(self.recipientStateMap); } } @@ -118,9 +116,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt - (void)migrateRecipientStateMapWithCoder:(NSCoder *)coder { - OWSAssertDebug(!self.recipientStateMap); - OWSAssertDebug(coder); - // Determine the "overall message state." TSOutgoingMessageState oldMessageState = TSOutgoingMessageStateFailed; NSNumber *_Nullable messageStateValue = [coder decodeObjectForKey:@"messageState"]; @@ -184,7 +179,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt NSString *_Nullable singleGroupRecipient = [coder decodeObjectForKey:@"singleGroupRecipient"]; if (singleGroupRecipient) { - OWSFailDebug(@"unexpected single group recipient message."); // If this is a "single group recipient message", treat it as such. recipientIds = @[ singleGroupRecipient, @@ -207,7 +201,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt recipientState.state = OWSOutgoingMessageRecipientStateSent; recipientState.deliveryTimestamp = deliveryTimestamp; } else if (wasDeliveredToContact) { - OWSAssertDebug(!isGroupThread); recipientState.state = OWSOutgoingMessageRecipientStateSent; // Use message time as an estimate of delivery time. recipientState.deliveryTimestamp = @(self.timestamp); @@ -329,7 +322,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt _groupMetaMessage = groupMetaMessage; } } else { - OWSAssertDebug(groupMetaMessage == TSGroupMetaMessageUnspecified); // Specifying a group meta message only makes sense for Group threads _groupMetaMessage = TSGroupMetaMessageUnspecified; } @@ -377,7 +369,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt TSAttachment *_Nullable attachment = [TSAttachment fetchObjectWithUniqueID:attachmentId transaction:transaction]; if (!attachment) { - OWSLogError(@"Couldn't load interaction's attachment for deletion."); continue; } [attachment removeWithTransaction:transaction]; @@ -417,8 +408,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt + (TSOutgoingMessageState)messageStateForRecipientStates:(NSArray *)recipientStates { - OWSAssertDebug(recipientStates); - // If there are any "sending" recipients, consider this message "sending". BOOL hasFailed = NO; for (TSOutgoingMessageRecipientState *recipientState in recipientStates) { @@ -455,8 +444,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt // There's no need to save this message, since it's not displayed to the user. // // Should we find a need to save this in the future, we need to exclude any non-serializable properties. - OWSLogDebug(@"Skipping save for transient outgoing message."); - return; } @@ -483,8 +470,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt // no longer be considered sent. // So here we take extra care not to stop any expiration that had previously started. // This can also happen under normal cirumstances with an outgoing group message. - OWSLogWarn(@"expiration previously started"); - return YES; } @@ -587,10 +572,7 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt - (nullable TSOutgoingMessageRecipientState *)recipientStateForRecipientId:(NSString *)recipientId { - OWSAssertDebug(recipientId.length > 0); - TSOutgoingMessageRecipientState *_Nullable result = self.recipientStateMap[recipientId]; - OWSAssertDebug(result); return [result copy]; } @@ -598,7 +580,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt - (void)updateWithSendingError:(NSError *)error transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(error); [self applyChangeToSelfAndLatestCopy:transaction changeBlock:^(TSOutgoingMessage *message) { // Mark any "sending" recipients as "failed." @@ -613,8 +594,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt - (void)updateWithAllSendingRecipientsMarkedAsFailedWithTansaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - [self applyChangeToSelfAndLatestCopy:transaction changeBlock:^(TSOutgoingMessage *message) { // Mark any "sending" recipients as "failed." @@ -629,8 +608,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt - (void)updateWithMarkingAllUnsentRecipientsAsSendingWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - [self applyChangeToSelfAndLatestCopy:transaction changeBlock:^(TSOutgoingMessage *message) { // Mark any "sending" recipients as "failed." @@ -654,9 +631,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt - (void)updateWithCustomMessage:(NSString *)customMessage transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(customMessage); - OWSAssertDebug(transaction); - [self applyChangeToSelfAndLatestCopy:transaction changeBlock:^(TSOutgoingMessage *message) { [message setCustomMessage:customMessage]; @@ -673,9 +647,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt - (void)updateWithSentRecipient:(NSString *)recipientId wasSentByUD:(BOOL)wasSentByUD transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(recipientId.length > 0); - OWSAssertDebug(transaction); - [self applyChangeToSelfAndLatestCopy:transaction changeBlock:^(TSOutgoingMessage *message) { TSOutgoingMessageRecipientState *_Nullable recipientState @@ -688,9 +659,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt - (void)updateWithSkippedRecipient:(NSString *)recipientId transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(recipientId.length > 0); - OWSAssertDebug(transaction); - [self applyChangeToSelfAndLatestCopy:transaction changeBlock:^(TSOutgoingMessage *message) { TSOutgoingMessageRecipientState *_Nullable recipientState @@ -704,9 +672,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt deliveryTimestamp:(NSNumber *_Nullable)deliveryTimestamp transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(recipientId.length > 0); - OWSAssertDebug(transaction); - // If delivery notification doesn't include timestamp, use "now" as an estimate. if (!deliveryTimestamp) { deliveryTimestamp = @([NSDate ows_millisecondTimeStamp]); @@ -716,13 +681,7 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt changeBlock:^(TSOutgoingMessage *message) { TSOutgoingMessageRecipientState *_Nullable recipientState = message.recipientStateMap[recipientId]; - if (!recipientState) { - // OWSFailDebug(@"Missing recipient state for delivered recipient: %@", recipientId); - return; - } - if (recipientState.state != OWSOutgoingMessageRecipientStateSent) { - OWSLogWarn(@"marking unsent message as delivered."); - } + if (!recipientState) { return; } recipientState.state = OWSOutgoingMessageRecipientStateSent; recipientState.deliveryTimestamp = deliveryTimestamp; }]; @@ -732,16 +691,10 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt readTimestamp:(uint64_t)readTimestamp transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(recipientId.length > 0); - OWSAssertDebug(transaction); - [self applyChangeToSelfAndLatestCopy:transaction changeBlock:^(TSOutgoingMessage *message) { TSOutgoingMessageRecipientState *_Nullable recipientState = message.recipientStateMap[recipientId]; if (!recipientState) { return; } - if (recipientState.state != OWSOutgoingMessageRecipientStateSent) { - OWSLogWarn(@"Marking unsent message as delivered."); - } recipientState.state = OWSOutgoingMessageRecipientStateSent; recipientState.readTimestamp = @(readTimestamp); }]; @@ -752,8 +705,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt isSentUpdate:(BOOL)isSentUpdate transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - [self applyChangeToSelfAndLatestCopy:transaction changeBlock:^(TSOutgoingMessage *message) { @@ -764,8 +715,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt = [NSMutableDictionary new]; for (NSString *recipientId in udRecipientIds) { if (recipientStateMap[recipientId]) { - OWSFailDebug( - @"recipient appears more than once in recipient lists: %@", recipientId); continue; } TSOutgoingMessageRecipientState *recipientState = @@ -776,8 +725,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt } for (NSString *recipientId in nonUdRecipientIds) { if (recipientStateMap[recipientId]) { - OWSFailDebug( - @"recipient appears more than once in recipient lists: %@", recipientId); continue; } TSOutgoingMessageRecipientState *recipientState = @@ -822,9 +769,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt - (void)updateWithSendingToSingleGroupRecipient:(NSString *)singleGroupRecipient transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - OWSAssertDebug(singleGroupRecipient.length > 0); - [self applyChangeToSelfAndLatestCopy:transaction changeBlock:^(TSOutgoingMessage *message) { TSOutgoingMessageRecipientState *recipientState = @@ -853,8 +797,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt - (void)updateWithFakeMessageState:(TSOutgoingMessageState)messageState transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - [self applyChangeToSelfAndLatestCopy:transaction changeBlock:^(TSOutgoingMessage *message) { for (TSOutgoingMessageRecipientState *recipientState in message.recipientStateMap @@ -870,7 +812,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt recipientState.state = OWSOutgoingMessageRecipientStateSent; break; default: - OWSFailDebug(@"unexpected message state."); break; } } @@ -882,7 +823,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt - (nullable id)dataMessageBuilder { TSThread *thread = self.thread; - OWSAssertDebug(thread); SNProtoDataMessageBuilder *builder = [SNProtoDataMessage builder]; [builder setTimestamp:self.timestamp]; @@ -890,11 +830,8 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt if ([self.body lengthOfBytesUsingEncoding:NSUTF8StringEncoding] <= kOversizeTextMessageSizeThreshold) { [builder setBody:self.body]; } else { - OWSFailDebug(@"message body length too long."); NSString *truncatedBody = [self.body copy]; while ([truncatedBody lengthOfBytesUsingEncoding:NSUTF8StringEncoding] > kOversizeTextMessageSizeThreshold) { - OWSLogError(@"truncating body which is too long: %lu", - (unsigned long)[truncatedBody lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); truncatedBody = [truncatedBody substringToIndex:truncatedBody.length / 2]; } [builder setBody:truncatedBody]; @@ -926,7 +863,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt SNProtoAttachmentPointer *_Nullable attachmentProto = [TSAttachmentStream buildProtoForAttachmentId:self.attachmentIds.firstObject]; if (!attachmentProto) { - OWSFailDebug(@"could not build protobuf."); return nil; } [groupBuilder setAvatar:attachmentProto]; @@ -939,7 +875,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt NSError *error; SNProtoGroupContext *_Nullable groupContextProto = [groupBuilder buildAndReturnError:&error]; if (error || !groupContextProto) { - OWSFailDebug(@"could not build protobuf: %@.", error); return nil; } [builder setGroup:groupContextProto]; @@ -952,7 +887,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt SNProtoAttachmentPointer *_Nullable attachmentProto = [TSAttachmentStream buildProtoForAttachmentId:attachmentId]; if (!attachmentProto) { - OWSFailDebug(@"could not build protobuf."); return nil; } [attachments addObject:attachmentProto]; @@ -966,7 +900,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt NSError *error; SNProtoDataMessageQuote *_Nullable quoteProto = [quotedMessageBuilder buildAndReturnError:&error]; if (error || !quoteProto) { - OWSFailDebug(@"could not build protobuf: %@.", error); return nil; } [builder setQuote:quoteProto]; @@ -983,7 +916,7 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt SNProtoAttachmentPointer *_Nullable attachmentProto = [TSAttachmentStream buildProtoForAttachmentId:self.linkPreview.imageAttachmentId]; if (!attachmentProto) { - OWSFailDebug(@"Could not build link preview image protobuf."); + } else { [previewBuilder setImage:attachmentProto]; } @@ -992,7 +925,7 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt NSError *error; SNProtoDataMessagePreview *_Nullable previewProto = [previewBuilder buildAndReturnError:&error]; if (error || !previewProto) { - OWSFailDebug(@"Could not build link preview protobuf: %@.", error); + } else { [builder addPreview:previewProto]; } @@ -1036,7 +969,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt SNProtoDataMessageQuoteQuotedAttachment *_Nullable quotedAttachmentMessage = [quotedAttachmentBuilder buildAndReturnError:&error]; if (error || !quotedAttachmentMessage) { - OWSFailDebug(@"could not build protobuf: %@", error); return nil; } @@ -1047,7 +979,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt if (hasQuotedText || hasQuotedAttachment) { return quoteBuilder; } else { - OWSFailDebug(@"Invalid quoted message data."); return nil; } } @@ -1055,10 +986,8 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt // recipientId is nil when building "sent" sync messages for messages sent to groups. - (nullable SNProtoDataMessage *)buildDataMessage:(NSString *_Nullable)recipientId { - OWSAssertDebug(self.thread); SNProtoDataMessageBuilder *_Nullable builder = [self dataMessageBuilder]; if (builder == nil) { - OWSFailDebug(@"Couldn't build protobuf."); return nil; } @@ -1082,7 +1011,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt NSError *error; SNProtoDataMessage *_Nullable dataProto = [builder buildAndReturnError:&error]; if (error != nil || dataProto == nil) { - OWSFailDebug(@"Couldn't build protobuf due to error: %@.", error); return nil; } return dataProto; @@ -1092,7 +1020,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt SNProtoDataMessage *_Nullable dataMessage = [self buildDataMessage:recipient.recipientId]; if (dataMessage == nil) { - OWSFailDebug(@"Couldn't build protobuf."); return nil; } @@ -1109,7 +1036,6 @@ NSString *NSStringForOutgoingMessageRecipientState(OWSOutgoingMessageRecipientSt NSError *error; NSData *_Nullable contentData = [contentBuilder buildSerializedDataAndReturnError:&error]; if (error != nil || contentData == nil) { - OWSFailDebug(@"Couldn't serialize protobuf due to error: %@.", error); return nil; } diff --git a/SessionMessagingKit/Messages/Visible Messages/Attachments/VisibleMessage+Attachment.swift b/SessionMessagingKit/Messages/Visible Messages/VisibleMessage+Attachment.swift similarity index 100% rename from SessionMessagingKit/Messages/Visible Messages/Attachments/VisibleMessage+Attachment.swift rename to SessionMessagingKit/Messages/Visible Messages/VisibleMessage+Attachment.swift diff --git a/SessionMessagingKit/Meta/SessionMessagingKit.h b/SessionMessagingKit/Meta/SessionMessagingKit.h index 0665b4812..07bef159a 100644 --- a/SessionMessagingKit/Meta/SessionMessagingKit.h +++ b/SessionMessagingKit/Meta/SessionMessagingKit.h @@ -3,6 +3,47 @@ FOUNDATION_EXPORT double SessionMessagingKitVersionNumber; FOUNDATION_EXPORT const unsigned char SessionMessagingKitVersionString[]; +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import #import #import #import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import diff --git a/SessionMessagingKit/Open Groups/OpenGroupAPI.swift b/SessionMessagingKit/Open Groups/OpenGroupAPI.swift index 423a36652..7c75c7672 100644 --- a/SessionMessagingKit/Open Groups/OpenGroupAPI.swift +++ b/SessionMessagingKit/Open Groups/OpenGroupAPI.swift @@ -350,7 +350,7 @@ public final class OpenGroupAPI : DotNetAPI { storage.setUserCount(to: memberCount, forOpenGroupWithID: "\(server).\(channel)", using: transaction) } let openGroupInfo = OpenGroupInfo(displayName: displayName, profilePictureURL: profilePictureURL, memberCount: memberCount) - Configuration.shared.openGroupAPIDelegate.updateProfileIfNeeded(for: channel, on: server, from: openGroupInfo) + OpenGroupAPI.updateProfileIfNeeded(for: channel, on: server, from: openGroupInfo) return openGroupInfo } } @@ -358,6 +358,39 @@ public final class OpenGroupAPI : DotNetAPI { } } + public static func updateProfileIfNeeded(for channel: UInt64, on server: String, from info: OpenGroupInfo) { + let openGroupID = "\(server).\(channel)" + Storage.write { transaction in + // Update user count + Storage.shared.setUserCount(to: info.memberCount, forOpenGroupWithID: openGroupID, using: transaction) + let thread = TSGroupThread.getOrCreateThread(withGroupId: openGroupID.data(using: .utf8)!, groupType: .openGroup, transaction: transaction) + // Update display name if needed + let model = thread.groupModel + if model.groupName != info.displayName { + let newGroupModel = TSGroupModel(title: info.displayName, memberIds: model.groupMemberIds, image: model.groupImage, groupId: model.groupId, groupType: model.groupType, adminIds: model.groupAdminIds) + thread.groupModel = newGroupModel + thread.save(with: transaction) + } + // Download and update profile picture if needed + let oldProfilePictureURL = Storage.shared.getProfilePictureURL(forOpenGroupWithID: openGroupID) + if oldProfilePictureURL != info.profilePictureURL || model.groupImage == nil { + Storage.shared.setProfilePictureURL(to: info.profilePictureURL, forOpenGroupWithID: openGroupID, using: transaction) + if let profilePictureURL = info.profilePictureURL { + var sanitizedServerURL = server + while sanitizedServerURL.hasSuffix("/") { sanitizedServerURL.removeLast() } + var sanitizedProfilePictureURL = profilePictureURL + while sanitizedProfilePictureURL.hasPrefix("/") { sanitizedProfilePictureURL.removeFirst() } + let url = "\(sanitizedServerURL)/\(sanitizedProfilePictureURL)" + FileServerAPI.downloadAttachment(from: url).map2 { data in + let attachmentStream = TSAttachmentStream(contentType: OWSMimeTypeImageJpeg, byteCount: UInt32(data.count), sourceFilename: nil, caption: nil, albumMessageId: nil) + try attachmentStream.write(data) + thread.updateAvatar(with: attachmentStream) + } + } + } + } + } + public static func join(_ channel: UInt64, on server: String) -> Promise { return attempt(maxRetryCount: maxRetryCount, recoveringOn: DispatchQueue.global(qos: .default)) { getOpenGroupServerPublicKey(for: server).then(on: DispatchQueue.global(qos: .default)) { serverPublicKey in diff --git a/SessionMessagingKit/Open Groups/OpenGroupAPIDelegate.swift b/SessionMessagingKit/Open Groups/OpenGroupAPIDelegate.swift deleted file mode 100644 index a8418c4f8..000000000 --- a/SessionMessagingKit/Open Groups/OpenGroupAPIDelegate.swift +++ /dev/null @@ -1,5 +0,0 @@ - -public protocol OpenGroupAPIDelegate { - - func updateProfileIfNeeded(for channel: UInt64, on server: String, from info: OpenGroupInfo) -} diff --git a/SessionMessagingKit/Messages/Visible Messages/Attachments/OWSThumbnailService.swift b/SessionMessagingKit/Sending & Receiving/Attachments/OWSThumbnailService.swift similarity index 100% rename from SessionMessagingKit/Messages/Visible Messages/Attachments/OWSThumbnailService.swift rename to SessionMessagingKit/Sending & Receiving/Attachments/OWSThumbnailService.swift diff --git a/SignalUtilitiesKit/Messaging/Attachments/SignalAttachment.swift b/SessionMessagingKit/Sending & Receiving/Attachments/SignalAttachment.swift similarity index 93% rename from SignalUtilitiesKit/Messaging/Attachments/SignalAttachment.swift rename to SessionMessagingKit/Sending & Receiving/Attachments/SignalAttachment.swift index 3547fa2f5..b60dabb61 100644 --- a/SignalUtilitiesKit/Messaging/Attachments/SignalAttachment.swift +++ b/SessionMessagingKit/Sending & Receiving/Attachments/SignalAttachment.swift @@ -8,7 +8,7 @@ import MobileCoreServices import PromiseKit import AVFoundation -enum SignalAttachmentError: Error { +public enum SignalAttachmentError: Error { case missingData case fileSizeTooLarge case invalidData @@ -21,17 +21,16 @@ enum SignalAttachmentError: Error { } extension String { - var filenameWithoutExtension: String { + public var filenameWithoutExtension: String { return (self as NSString).deletingPathExtension } - var fileExtension: String? { + public var fileExtension: String? { return (self as NSString).pathExtension } - func appendingFileExtension(_ fileExtension: String) -> String { + public func appendingFileExtension(_ fileExtension: String) -> String { guard let result = (self as NSString).appendingPathExtension(fileExtension) else { - owsFailDebug("Failed to append file extension: \(fileExtension) to string: \(self)") return self } return result @@ -160,12 +159,9 @@ public class SignalAttachment: NSObject { @objc public let dataUTI: String - var error: SignalAttachmentError? { + public var error: SignalAttachmentError? { didSet { - AssertIsOnMainThread() - assert(oldValue == nil) - Logger.verbose("Attachment has error: \(String(describing: error))") } } @@ -213,7 +209,6 @@ public class SignalAttachment: NSObject { public var errorName: String? { guard let error = error else { // This method should only be called if there is an error. - owsFailDebug("Missing error") return nil } @@ -224,11 +219,9 @@ public class SignalAttachment: NSObject { public var localizedErrorDescription: String? { guard let error = self.error else { // This method should only be called if there is an error. - owsFailDebug("Missing error") return nil } guard let errorDescription = error.errorDescription else { - owsFailDebug("Missing error description") return nil } @@ -238,7 +231,6 @@ public class SignalAttachment: NSObject { @objc public class var missingDataErrorMessage: String { guard let errorDescription = SignalAttachmentError.missingData.errorDescription else { - owsFailDebug("Missing error description") return "" } return errorDescription @@ -284,7 +276,6 @@ public class SignalAttachment: NSObject { do { let filePath = mediaUrl.path guard FileManager.default.fileExists(atPath: filePath) else { - owsFailDebug("asset at \(filePath) doesn't exist") return nil } @@ -298,7 +289,6 @@ public class SignalAttachment: NSObject { return image } catch let error { - Logger.verbose("Could not generate video thumbnail: \(error.localizedDescription)") return nil } } @@ -536,7 +526,6 @@ public class SignalAttachment: NSObject { for dataUTI in inputImageUTISet { if pasteboardUTISet.contains(dataUTI) { guard let data = dataForFirstPasteboardItem(dataUTI: dataUTI) else { - owsFailDebug("Missing expected pasteboard data for UTI: \(dataUTI)") return nil } let dataSource = DataSourceValue.dataSource(with: data, utiType: dataUTI) @@ -547,7 +536,6 @@ public class SignalAttachment: NSObject { for dataUTI in videoUTISet { if pasteboardUTISet.contains(dataUTI) { guard let data = dataForFirstPasteboardItem(dataUTI: dataUTI) else { - owsFailDebug("Missing expected pasteboard data for UTI: \(dataUTI)") return nil } let dataSource = DataSourceValue.dataSource(with: data, utiType: dataUTI) @@ -557,7 +545,6 @@ public class SignalAttachment: NSObject { for dataUTI in audioUTISet { if pasteboardUTISet.contains(dataUTI) { guard let data = dataForFirstPasteboardItem(dataUTI: dataUTI) else { - owsFailDebug("Missing expected pasteboard data for UTI: \(dataUTI)") return nil } let dataSource = DataSourceValue.dataSource(with: data, utiType: dataUTI) @@ -567,7 +554,6 @@ public class SignalAttachment: NSObject { let dataUTI = pasteboardUTISet[pasteboardUTISet.startIndex] guard let data = dataForFirstPasteboardItem(dataUTI: dataUTI) else { - owsFailDebug("Missing expected pasteboard data for UTI: \(dataUTI)") return nil } let dataSource = DataSourceValue.dataSource(with: data, utiType: dataUTI) @@ -579,11 +565,9 @@ public class SignalAttachment: NSObject { private class func dataForFirstPasteboardItem(dataUTI: String) -> Data? { let itemSet = IndexSet(integer: 0) guard let datas = UIPasteboard.general.data(forPasteboardType: dataUTI, inItemSet: itemSet) else { - owsFailDebug("Missing expected pasteboard data for UTI: \(dataUTI)") return nil } guard datas.count > 0 else { - owsFailDebug("Missing expected pasteboard data for UTI: \(dataUTI)") return nil } return datas[0] @@ -613,7 +597,6 @@ public class SignalAttachment: NSObject { } guard dataSource.dataLength() > 0 else { - owsFailDebug("imageData was empty") attachment.error = .invalidData return attachment } @@ -625,7 +608,6 @@ public class SignalAttachment: NSObject { } // Never re-encode animated images (i.e. GIFs) as JPEGs. - Logger.verbose("Sending raw \(attachment.mimeType) to retain any animation") return attachment } else { guard let image = UIImage(data: dataSource.data()) else { @@ -649,17 +631,14 @@ public class SignalAttachment: NSObject { // However the problem comes in when you edit an HEIC image in Photos.app - the image is saved // in the Photos.app as a JPEG, but retains the (now incongruous) HEIC extension in the filename. assert(dataUTI == kUTTypeJPEG as String || !isValidOutput) - Logger.verbose("changing extension: \(sourceFileExtension) to match jpg uti type") let baseFilename = sourceFilename.filenameWithoutExtension dataSource.sourceFilename = baseFilename.appendingFileExtension("jpg") } if isValidOutput { - Logger.verbose("Rewriting attachment with metadata removed \(attachment.mimeType)") return removeImageMetadata(attachment: attachment) } else { - Logger.verbose("Compressing attachment as image/jpeg, \(dataSource.dataLength()) bytes") return compressImageAsJPEG(image: image, attachment: attachment, filename: dataSource.sourceFilename, imageQuality: imageQuality) } } @@ -706,7 +685,6 @@ public class SignalAttachment: NSObject { let attachment = SignalAttachment(dataSource: dataSource, dataUTI: dataUTI) attachment.cachedImage = image - Logger.verbose("Writing \(attachment.mimeType) as image/jpeg") return compressImageAsJPEG(image: image, attachment: attachment, filename: filename, imageQuality: imageQuality) } @@ -751,7 +729,6 @@ public class SignalAttachment: NSObject { dataSource.dataLength() <= kMaxFileSizeImage { let recompressedAttachment = SignalAttachment(dataSource: dataSource, dataUTI: kUTTypeJPEG as String) recompressedAttachment.cachedImage = dstImage - Logger.verbose("Converted \(attachment.mimeType) to image/jpeg, \(jpgImageData.count) bytes") return recompressedAttachment } @@ -781,7 +758,6 @@ public class SignalAttachment: NSObject { // Resizing using a CGContext seems to work fine. private class func imageScaled(_ uiImage: UIImage, toMaxSize maxSize: CGFloat) -> UIImage? { guard let cgImage = uiImage.cgImage else { - owsFailDebug("UIImage missing cgImage.") return nil } @@ -804,7 +780,6 @@ public class SignalAttachment: NSObject { bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo.rawValue) else { - owsFailDebug("could not create CGContext.") return nil } context.interpolationQuality = .high @@ -814,7 +789,6 @@ public class SignalAttachment: NSObject { context.draw(cgImage, in: drawRect) guard let newCGImage = context.makeImage() else { - owsFailDebug("could not create new CGImage.") return nil } return UIImage(cgImage: newCGImage, @@ -914,7 +888,6 @@ public class SignalAttachment: NSObject { return strippedAttachment } else { - Logger.verbose("CGImageDestinationFinalize failed") attachment.error = .couldNotRemoveMetadata return attachment } @@ -934,10 +907,6 @@ public class SignalAttachment: NSObject { return attachment } - if !isValidOutputVideo(dataSource: dataSource, dataUTI: dataUTI) { - owsFailDebug("building video with invalid output, migrate to async API using compressVideoAsMp4") - } - return newAttachment(dataSource: dataSource, dataUTI: dataUTI, validUTISet: videoUTISet, @@ -949,7 +918,6 @@ public class SignalAttachment: NSObject { OWSFileSystem.ensureDirectoryExists(baseDir.path) let toUrl = baseDir.appendingPathComponent(fromUrl.lastPathComponent) - Logger.debug("moving \(fromUrl) -> \(toUrl)") try FileManager.default.copyItem(at: fromUrl, to: toUrl) return toUrl @@ -962,8 +930,6 @@ public class SignalAttachment: NSObject { } public class func compressVideoAsMp4(dataSource: DataSource, dataUTI: String) -> (Promise, AVAssetExportSession?) { - Logger.debug("") - guard let url = dataSource.dataUrl() else { let attachment = SignalAttachment(dataSource: DataSourceValue.emptyDataSource(), dataUTI: dataUTI) attachment.error = .missingData @@ -987,15 +953,12 @@ public class SignalAttachment: NSObject { let (promise, resolver) = Promise.pending() - Logger.debug("starting video export") exportSession.exportAsynchronously { - Logger.debug("Completed video export") let baseFilename = dataSource.sourceFilename let mp4Filename = baseFilename?.filenameWithoutExtension.appendingFileExtension("mp4") guard let dataSource = DataSourcePath.dataSource(with: exportURL, shouldDeleteOnDeallocation: true) else { - owsFailDebug("Failed to build data source for exported video URL") let attachment = SignalAttachment(dataSource: DataSourceValue.emptyDataSource(), dataUTI: dataUTI) attachment.error = .couldNotConvertToMpeg4 resolver.fulfill(attachment) @@ -1120,9 +1083,6 @@ public class SignalAttachment: NSObject { // Check the attachment's error property. @objc public class func attachment(dataSource: DataSource?, dataUTI: String) -> SignalAttachment { - if inputImageUTISet.contains(dataUTI) { - owsFailDebug("must specify image quality type") - } return attachment(dataSource: dataSource, dataUTI: dataUTI, imageQuality: .original) } @@ -1175,7 +1135,6 @@ public class SignalAttachment: NSObject { } guard dataSource.dataLength() > 0 else { - owsFailDebug("Empty attachment") assert(dataSource.dataLength() > 0) attachment.error = .invalidData return attachment diff --git a/SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachment.h b/SessionMessagingKit/Sending & Receiving/Attachments/TSAttachment.h similarity index 88% rename from SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachment.h rename to SessionMessagingKit/Sending & Receiving/Attachments/TSAttachment.h index 121a19be9..89f3b4aae 100644 --- a/SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachment.h +++ b/SessionMessagingKit/Sending & Receiving/Attachments/TSAttachment.h @@ -1,4 +1,5 @@ #import +#import NS_ASSUME_NONNULL_BEGIN @@ -87,6 +88,16 @@ typedef NS_ENUM(NSUInteger, TSAttachmentType) { + (NSString *)emojiForMimeType:(NSString *)contentType; +#pragma mark - Media Album + +- (nullable TSMessage *)fetchAlbumMessageWithTransaction:(YapDatabaseReadTransaction *)transaction; + +// `migrateAlbumMessageId` is only used in the migration to the new multi-attachment message scheme, +// and shouldn't be used as a general purpose setter. Instead, `albumMessageId` should be passed as +// an initializer param. +- (void)migrateAlbumMessageId:(NSString *)albumMesssageId; + + @end NS_ASSUME_NONNULL_END diff --git a/SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachment.m b/SessionMessagingKit/Sending & Receiving/Attachments/TSAttachment.m similarity index 94% rename from SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachment.m rename to SessionMessagingKit/Sending & Receiving/Attachments/TSAttachment.m index 2a36909ee..e32418bdf 100644 --- a/SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachment.m +++ b/SessionMessagingKit/Sending & Receiving/Attachments/TSAttachment.m @@ -244,6 +244,21 @@ NSUInteger const TSAttachmentSchemaVersion = 4; return _contentType.filterFilename; } +#pragma mark - Media Album + +- (nullable TSMessage *)fetchAlbumMessageWithTransaction:(YapDatabaseReadTransaction *)transaction +{ + if (self.albumMessageId == nil) { + return nil; + } + return [TSMessage fetchObjectWithUniqueID:self.albumMessageId transaction:transaction]; +} + +- (void)migrateAlbumMessageId:(NSString *)albumMesssageId +{ + self.albumMessageId = albumMesssageId; +} + @end NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/Messaging/Attachments/Attachment+Conversion.swift b/SessionMessagingKit/Sending & Receiving/Attachments/TSAttachmentPointer+Conversion.swift similarity index 100% rename from SignalUtilitiesKit/Messaging/Attachments/Attachment+Conversion.swift rename to SessionMessagingKit/Sending & Receiving/Attachments/TSAttachmentPointer+Conversion.swift diff --git a/SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachmentPointer.h b/SessionMessagingKit/Sending & Receiving/Attachments/TSAttachmentPointer.h similarity index 100% rename from SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachmentPointer.h rename to SessionMessagingKit/Sending & Receiving/Attachments/TSAttachmentPointer.h diff --git a/SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachmentPointer.m b/SessionMessagingKit/Sending & Receiving/Attachments/TSAttachmentPointer.m similarity index 100% rename from SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachmentPointer.m rename to SessionMessagingKit/Sending & Receiving/Attachments/TSAttachmentPointer.m diff --git a/SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachmentStream.h b/SessionMessagingKit/Sending & Receiving/Attachments/TSAttachmentStream.h similarity index 100% rename from SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachmentStream.h rename to SessionMessagingKit/Sending & Receiving/Attachments/TSAttachmentStream.h diff --git a/SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachmentStream.m b/SessionMessagingKit/Sending & Receiving/Attachments/TSAttachmentStream.m similarity index 100% rename from SessionMessagingKit/Messages/Visible Messages/Attachments/TSAttachmentStream.m rename to SessionMessagingKit/Sending & Receiving/Attachments/TSAttachmentStream.m diff --git a/SignalUtilitiesKit/Messaging/Blocking/OWSBlockingManager.h b/SessionMessagingKit/Sending & Receiving/Blocking/OWSBlockingManager.h similarity index 100% rename from SignalUtilitiesKit/Messaging/Blocking/OWSBlockingManager.h rename to SessionMessagingKit/Sending & Receiving/Blocking/OWSBlockingManager.h diff --git a/SignalUtilitiesKit/Messaging/Blocking/OWSBlockingManager.m b/SessionMessagingKit/Sending & Receiving/Blocking/OWSBlockingManager.m similarity index 99% rename from SignalUtilitiesKit/Messaging/Blocking/OWSBlockingManager.m rename to SessionMessagingKit/Sending & Receiving/Blocking/OWSBlockingManager.m index 34a1767f4..cdb20550c 100644 --- a/SignalUtilitiesKit/Messaging/Blocking/OWSBlockingManager.m +++ b/SessionMessagingKit/Sending & Receiving/Blocking/OWSBlockingManager.m @@ -11,7 +11,7 @@ #import "TSContactThread.h" #import "TSGroupThread.h" #import "YapDatabaseConnection+OWS.h" -#import +#import #import "SSKAsserts.h" NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingConfigurationUpdateInfoMessage.h b/SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingConfigurationUpdateInfoMessage.h similarity index 94% rename from SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingConfigurationUpdateInfoMessage.h rename to SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingConfigurationUpdateInfoMessage.h index 18d61e452..347c2f80e 100644 --- a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingConfigurationUpdateInfoMessage.h +++ b/SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingConfigurationUpdateInfoMessage.h @@ -2,7 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingConfigurationUpdateInfoMessage.m b/SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingConfigurationUpdateInfoMessage.m similarity index 95% rename from SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingConfigurationUpdateInfoMessage.m rename to SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingConfigurationUpdateInfoMessage.m index 27c7add0b..3b1c7250b 100644 --- a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingConfigurationUpdateInfoMessage.m +++ b/SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingConfigurationUpdateInfoMessage.m @@ -5,7 +5,7 @@ #import "OWSDisappearingConfigurationUpdateInfoMessage.h" #import "NSString+SSK.h" #import "OWSDisappearingMessagesConfiguration.h" -#import +#import NS_ASSUME_NONNULL_BEGIN @@ -34,8 +34,6 @@ NS_ASSUME_NONNULL_BEGIN _configurationDurationSeconds = configuration.durationSeconds; // At most one should be set - OWSAssertDebug(!remoteName || !createdInExistingGroup); - _createdByRemoteName = remoteName; _createdInExistingGroup = createdInExistingGroup; @@ -52,7 +50,6 @@ NS_ASSUME_NONNULL_BEGIN -(NSString *)previewTextWithTransaction:(YapDatabaseReadTransaction *)transaction { if (self.createdInExistingGroup) { - OWSAssertDebug(self.configurationIsEnabled && self.configurationDurationSeconds > 0); NSString *infoFormat = NSLocalizedString(@"DISAPPEARING_MESSAGES_CONFIGURATION_GROUP_EXISTING_FORMAT", @"Info Message when added to a group which has enabled disappearing messages. Embeds {{time amount}} " @"before messages disappear, see the *_TIME_AMOUNT strings for context."); diff --git a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesConfiguration.h b/SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingMessagesConfiguration.h similarity index 96% rename from SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesConfiguration.h rename to SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingMessagesConfiguration.h index 3b1c12e19..dfbee9b3a 100644 --- a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesConfiguration.h +++ b/SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingMessagesConfiguration.h @@ -3,6 +3,7 @@ // #import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesConfiguration.m b/SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingMessagesConfiguration.m similarity index 95% rename from SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesConfiguration.m rename to SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingMessagesConfiguration.m index 4422da013..88e0ee576 100644 --- a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesConfiguration.m +++ b/SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingMessagesConfiguration.m @@ -4,7 +4,8 @@ #import "OWSDisappearingMessagesConfiguration.h" #import "NSString+SSK.h" -#import +#import +#import NS_ASSUME_NONNULL_BEGIN @@ -85,9 +86,6 @@ NS_ASSUME_NONNULL_BEGIN static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ max = [[self.validDurationsSeconds valueForKeyPath:@"@max.intValue"] unsignedIntValue]; - - // It's safe to update this assert if we add a larger duration - OWSAssertDebug(max == 1 * kWeekInterval); }); return max; diff --git a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesJob.h b/SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingMessagesJob.h similarity index 100% rename from SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesJob.h rename to SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingMessagesJob.h diff --git a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesJob.m b/SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingMessagesJob.m similarity index 99% rename from SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesJob.m rename to SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingMessagesJob.m index ee95b421c..8ebcadb59 100644 --- a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesJob.m +++ b/SessionMessagingKit/Sending & Receiving/Expiration/OWSDisappearingMessagesJob.m @@ -15,7 +15,7 @@ #import "TSMessage.h" #import "TSThread.h" #import -#import +#import #import #import "SSKAsserts.h" diff --git a/SignalUtilitiesKit/Messaging/Link Previews/OWSLinkPreview.swift b/SessionMessagingKit/Sending & Receiving/Link Previews/OWSLinkPreview.swift similarity index 88% rename from SignalUtilitiesKit/Messaging/Link Previews/OWSLinkPreview.swift rename to SessionMessagingKit/Sending & Receiving/Link Previews/OWSLinkPreview.swift index a5e6260b8..f134d9971 100644 --- a/SignalUtilitiesKit/Messaging/Link Previews/OWSLinkPreview.swift +++ b/SessionMessagingKit/Sending & Receiving/Link Previews/OWSLinkPreview.swift @@ -2,6 +2,7 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // +import AFNetworking import Foundation import PromiseKit @@ -138,29 +139,23 @@ public class OWSLinkPreview: MTLModel { throw LinkPreviewError.noPreview } guard dataMessage.attachments.count < 1 else { - Logger.error("Discarding link preview; message has attachments.") throw LinkPreviewError.invalidInput } let urlString = previewProto.url guard URL(string: urlString) != nil else { - Logger.error("Could not parse preview URL.") throw LinkPreviewError.invalidInput } guard let body = body else { - Logger.error("Preview for message without body.") throw LinkPreviewError.invalidInput } let previewUrls = allPreviewUrls(forMessageBodyText: body) guard previewUrls.contains(urlString) else { - Logger.error("URL not present in body.") throw LinkPreviewError.invalidInput } guard isValidLinkUrl(urlString) else { - Logger.verbose("Invalid link URL \(urlString).") - Logger.error("Invalid link URL.") throw LinkPreviewError.invalidInput } @@ -178,7 +173,6 @@ public class OWSLinkPreview: MTLModel { imageAttachmentPointer.save(with: transaction) imageAttachmentId = imageAttachmentPointer.uniqueId } else { - Logger.error("Could not parse image proto.") throw LinkPreviewError.invalidInput } } @@ -186,7 +180,6 @@ public class OWSLinkPreview: MTLModel { let linkPreview = OWSLinkPreview(urlString: urlString, title: title, imageAttachmentId: imageAttachmentId) guard linkPreview.isValid() else { - Logger.error("Preview has neither title nor image.") throw LinkPreviewError.invalidInput } @@ -208,7 +201,6 @@ public class OWSLinkPreview: MTLModel { let linkPreview = OWSLinkPreview(urlString: info.urlString, title: info.title, imageAttachmentId: imageAttachmentId) guard linkPreview.isValid() else { - owsFailDebug("Preview has neither title nor image.") throw LinkPreviewError.invalidInput } @@ -225,7 +217,6 @@ public class OWSLinkPreview: MTLModel { let fileSize = imageData.count guard fileSize > 0 else { - owsFailDebug("Invalid file size for image data.") return nil } @@ -234,17 +225,14 @@ public class OWSLinkPreview: MTLModel { do { try imageData.write(to: NSURL.fileURL(withPath: filePath), options: .atomicWrite) } catch let error as NSError { - owsFailDebug("file write failed: \(filePath), \(error)") return nil } guard let dataSource = DataSourcePath.dataSource(withFilePath: filePath, shouldDeleteOnDeallocation: true) else { - owsFailDebug("Could not create data source for path: \(filePath)") return nil } let attachment = TSAttachmentStream(contentType: mimeType, byteCount: UInt32(fileSize), sourceFilename: nil, caption: nil, albumMessageId: nil) guard attachment.write(dataSource) else { - owsFailDebug("Could not write data source for path: \(filePath)") return nil } attachment.save(with: transaction) @@ -264,11 +252,9 @@ public class OWSLinkPreview: MTLModel { @objc public func removeAttachment(transaction: YapDatabaseReadWriteTransaction) { guard let imageAttachmentId = imageAttachmentId else { - owsFailDebug("No attachment id.") return } guard let attachment = TSAttachment.fetch(uniqueId: imageAttachmentId, transaction: transaction) else { - owsFailDebug("Could not load attachment.") return } attachment.remove(with: transaction) @@ -376,18 +362,15 @@ public class OWSLinkPreview: MTLModel { @objc public class func displayDomain(forUrl urlString: String?) -> String? { guard let urlString = urlString else { - owsFailDebug("Missing url.") return nil } guard let url = URL(string: urlString) else { - owsFailDebug("Invalid url.") return nil } guard let result = whitelistedDomain(forUrl: url, domainWhitelist: OWSLinkPreview.linkDomainWhitelist, allowSubdomains: false) else { - Logger.error("Missing domain.") - return nil + return nil } return result } @@ -443,12 +426,6 @@ public class OWSLinkPreview: MTLModel { private static let serialQueue = DispatchQueue(label: "org.signal.linkPreview") - private class func assertIsOnSerialQueue() { - if _isDebugAssertConfiguration(), #available(iOS 10.0, *) { - assertOnQueue(serialQueue) - } - } - // MARK: - Text Parsing // This cache should only be accessed on main thread. @@ -465,7 +442,6 @@ public class OWSLinkPreview: MTLModel { } public class func previewUrl(forMessageBodyText body: String?, selectedRange: NSRange?) -> String? { - AssertIsOnMainThread() // Exit early if link previews are not enabled in order to avoid // tainting the cache. @@ -482,7 +458,6 @@ public class OWSLinkPreview: MTLModel { } if let cachedUrl = previewUrlCache.object(forKey: body as NSString) as String? { - Logger.verbose("URL parsing cache hit.") guard cachedUrl.count > 0 else { return nil } @@ -496,16 +471,13 @@ public class OWSLinkPreview: MTLModel { } if let selectedRange = selectedRange { - Logger.verbose("match: urlString: \(urlMatch.urlString) range: \(urlMatch.matchRange) selectedRange: \(selectedRange)") let cursorAtEndOfMatch = urlMatch.matchRange.location + urlMatch.matchRange.length == selectedRange.location if selectedRange.location != body.count, (urlMatch.matchRange.intersection(selectedRange) != nil || cursorAtEndOfMatch) { - Logger.debug("ignoring URL, since the user is currently editing it.") // we don't want to cache the result here, as we want to fetch the link preview // if the user moves the cursor. return nil } - Logger.debug("considering URL, since the user is not currently editing it.") } previewUrlCache.setObject(urlMatch.urlString as NSString, forKey: body as NSString) @@ -533,7 +505,6 @@ public class OWSLinkPreview: MTLModel { do { detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) } catch { - owsFailDebug("Could not create NSDataDetector: \(error).") return [] } @@ -541,7 +512,6 @@ public class OWSLinkPreview: MTLModel { let matches = detector.matches(in: body, options: [], range: NSRange(location: 0, length: body.count)) for match in matches { guard let matchURL = match.url else { - owsFailDebug("Match missing url") continue } let urlString = matchURL.absoluteString @@ -564,10 +534,8 @@ public class OWSLinkPreview: MTLModel { return serialQueue.sync { guard let linkPreviewDraft = linkPreviewDraftCache, linkPreviewDraft.urlString == previewUrl else { - Logger.verbose("----- Cache miss.") return nil } - Logger.verbose("----- Cache hit.") return linkPreviewDraft } } @@ -606,7 +574,6 @@ public class OWSLinkPreview: MTLModel { return Promise(error: LinkPreviewError.invalidInput) } if let cachedInfo = cachedLinkPreview(forPreviewUrl: previewUrl) { - Logger.verbose("Link preview info cache hit.") return Promise.value(cachedInfo) } return downloadLink(url: previewUrl) @@ -624,9 +591,6 @@ public class OWSLinkPreview: MTLModel { class func downloadLink(url urlString: String, remainingRetries: UInt = 3) -> Promise { - - Logger.verbose("url: \(urlString)") - // let sessionConfiguration = ContentProxy.sessionConfiguration() // Loki: Signal's proxy appears to have been banned by YouTube let sessionConfiguration = URLSessionConfiguration.ephemeral @@ -640,7 +604,6 @@ public class OWSLinkPreview: MTLModel { sessionManager.responseSerializer = AFHTTPResponseSerializer() guard ContentProxy.configureSessionManager(sessionManager: sessionManager, forUrl: urlString) else { - owsFailDebug("Could not configure url: \(urlString).") return Promise(error: LinkPreviewError.assertionFailure) } @@ -652,40 +615,32 @@ public class OWSLinkPreview: MTLModel { success: { task, value in guard let response = task.response as? HTTPURLResponse else { - Logger.warn("Invalid response: \(type(of: task.response)).") resolver.reject(LinkPreviewError.assertionFailure) return } if let contentType = response.allHeaderFields["Content-Type"] as? String { guard contentType.lowercased().hasPrefix("text/") else { - Logger.warn("Invalid content type: \(contentType).") resolver.reject(LinkPreviewError.invalidContent) return } } guard let data = value as? Data else { - Logger.warn("Result is not data: \(type(of: value)).") resolver.reject(LinkPreviewError.assertionFailure) return } guard data.count > 0 else { - Logger.warn("Empty data: \(type(of: value)).") resolver.reject(LinkPreviewError.invalidContent) return } resolver.fulfill(data) }, failure: { _, error in - Logger.verbose("Error: \(error)") - guard isRetryable(error: error) else { - Logger.warn("Error is not retryable.") resolver.reject(LinkPreviewError.couldNotDownload) return } guard remainingRetries > 0 else { - Logger.warn("No more retries.") resolver.reject(LinkPreviewError.couldNotDownload) return } @@ -700,16 +655,11 @@ public class OWSLinkPreview: MTLModel { } private class func downloadImage(url urlString: String, imageMimeType: String) -> Promise { - - Logger.verbose("url: \(urlString)") - guard let url = URL(string: urlString) else { - Logger.error("Could not parse URL.") return Promise(error: LinkPreviewError.invalidInput) } guard let assetDescription = ProxiedContentAssetDescription(url: url as NSURL) else { - Logger.error("Could not create asset description.") return Promise(error: LinkPreviewError.invalidInput) } let (promise, resolver) = Promise.pending() @@ -719,7 +669,6 @@ public class OWSLinkPreview: MTLModel { success: { (_, asset) in resolver.fulfill(asset) }, failure: { (_) in - Logger.warn("Error downloading asset") resolver.reject(LinkPreviewError.couldNotDownload) }) } @@ -727,13 +676,11 @@ public class OWSLinkPreview: MTLModel { do { let imageSize = NSData.imageSize(forFilePath: asset.filePath, mimeType: imageMimeType) guard imageSize.width > 0, imageSize.height > 0 else { - Logger.error("Link preview is invalid or has invalid size.") return Promise(error: LinkPreviewError.invalidContent) } let data = try Data(contentsOf: URL(fileURLWithPath: asset.filePath)) guard let srcImage = UIImage(data: data) else { - Logger.error("Could not parse image.") return Promise(error: LinkPreviewError.invalidContent) } @@ -744,23 +691,19 @@ public class OWSLinkPreview: MTLModel { let shouldResize = imageSize.width > maxImageSize || imageSize.height > maxImageSize guard shouldResize else { guard let dstData = srcImage.jpegData(compressionQuality: 0.8) else { - Logger.error("Could not write resized image.") return Promise(error: LinkPreviewError.invalidContent) } return Promise.value(dstData) } guard let dstImage = srcImage.resized(withMaxDimensionPoints: maxImageSize) else { - Logger.error("Could not resize image.") return Promise(error: LinkPreviewError.invalidContent) } guard let dstData = dstImage.jpegData(compressionQuality: 0.8) else { - Logger.error("Could not write resized image.") return Promise(error: LinkPreviewError.invalidContent) } return Promise.value(dstData) } catch { - owsFailDebug("Could not load asset data: \(type(of: asset.filePath)).") return Promise(error: LinkPreviewError.assertionFailure) } } @@ -786,15 +729,12 @@ public class OWSLinkPreview: MTLModel { } guard isValidMediaUrl(imageUrl) else { - Logger.error("Invalid image URL.") return Promise.value(OWSLinkPreviewDraft(urlString: linkUrlString, title: title)) } guard let imageFileExtension = fileExtension(forImageUrl: imageUrl) else { - Logger.error("Image URL has unknown or invalid file extension: \(imageUrl).") return Promise.value(OWSLinkPreviewDraft(urlString: linkUrlString, title: title)) } guard let imageMimeType = mimetype(forImageFileExtension: imageFileExtension) else { - Logger.error("Image URL has unknown or invalid content type: \(imageUrl).") return Promise.value(OWSLinkPreviewDraft(urlString: linkUrlString, title: title)) } @@ -808,7 +748,6 @@ public class OWSLinkPreview: MTLModel { return Promise.value(OWSLinkPreviewDraft(urlString: linkUrlString, title: title)) } } catch { - owsFailDebug("Could not parse link data: \(error).") return Promise(error: error) } } @@ -819,7 +758,6 @@ public class OWSLinkPreview: MTLModel { // class func parse(linkData: Data) throws -> OWSLinkPreviewContents { guard let linkText = String(bytes: linkData, encoding: .utf8) else { - owsFailDebug("Could not parse link text.") throw LinkPreviewError.invalidInput } @@ -835,8 +773,6 @@ public class OWSLinkPreview: MTLModel { } } - Logger.verbose("title: \(String(describing: title))") - guard let rawImageUrlString = NSRegularExpression.parseFirstMatch(pattern: "]*content\\s*=\\s*\"(.*?)\"[^>]*/?>", text: linkText) else { return OWSLinkPreviewContents(title: title) } @@ -849,7 +785,6 @@ public class OWSLinkPreview: MTLModel { class func fileExtension(forImageUrl urlString: String) -> String? { guard let imageUrl = URL(string: urlString) else { - Logger.error("Could not parse image URL.") return nil } let imageFilename = imageUrl.lastPathComponent @@ -874,7 +809,6 @@ public class OWSLinkPreview: MTLModel { return nil } guard let imageMimeType = MIMETypeUtil.mimeType(forFileExtension: imageFileExtension) else { - Logger.error("Image URL has unknown content type: \(imageFileExtension).") return nil } let kValidMimeTypes = [ @@ -883,7 +817,6 @@ public class OWSLinkPreview: MTLModel { OWSMimeTypeImageGif, ] guard kValidMimeTypes.contains(imageMimeType) else { - Logger.error("Image URL has invalid content type: \(imageMimeType).") return nil } return imageMimeType diff --git a/SignalUtilitiesKit/Messaging/Mentions/Mention.swift b/SessionMessagingKit/Sending & Receiving/Mentions/Mention.swift similarity index 100% rename from SignalUtilitiesKit/Messaging/Mentions/Mention.swift rename to SessionMessagingKit/Sending & Receiving/Mentions/Mention.swift diff --git a/SignalUtilitiesKit/Messaging/Mentions/MentionsManager.swift b/SessionMessagingKit/Sending & Receiving/Mentions/MentionsManager.swift similarity index 100% rename from SignalUtilitiesKit/Messaging/Mentions/MentionsManager.swift rename to SessionMessagingKit/Sending & Receiving/Mentions/MentionsManager.swift diff --git a/SignalUtilitiesKit/Messaging/Sending & Receiving/MessageReceiverDelegate.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift similarity index 73% rename from SignalUtilitiesKit/Messaging/Sending & Receiving/MessageReceiverDelegate.swift rename to SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift index bb72e8bac..8bd51b568 100644 --- a/SignalUtilitiesKit/Messaging/Sending & Receiving/MessageReceiverDelegate.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift @@ -1,37 +1,35 @@ -import SessionMessagingKit +import SessionProtocolKit +import SignalCoreKit -public final class MessageReceiverDelegate : SessionMessagingKit.MessageReceiverDelegate { +extension MessageReceiver { - public static let shared = MessageReceiverDelegate() - - - - // MARK: - Blocking - - public func isBlocked(_ publicKey: String) -> Bool { + internal static func isBlocked(_ publicKey: String) -> Bool { return SSKEnvironment.shared.blockingManager.isRecipientIdBlocked(publicKey) } - - - // MARK: - Profiles - - public func updateProfile(for publicKey: String, from profile: VisibleMessage.Profile, using transaction: Any) { - let transaction = transaction as! YapDatabaseReadWriteTransaction - let profileManager = SSKEnvironment.shared.profileManager - if let displayName = profile.displayName { - profileManager.updateProfileForContact(withID: publicKey, displayName: displayName, with: transaction) - } - if let profileKey = profile.profileKey, let profilePictureURL = profile.profilePictureURL, profileKey.count == kAES256_KeyByteLength { - profileManager.setProfileKeyData(profileKey, forRecipientId: publicKey, avatarURL: profilePictureURL) + internal static func handle(_ message: Message, associatedWithProto proto: SNProtoContent, using transaction: Any) throws { + switch message { + case let message as ReadReceipt: handleReadReceipt(message, using: transaction) + case let message as TypingIndicator: handleTypingIndicator(message, using: transaction) + case let message as ClosedGroupUpdate: handleClosedGroupUpdate(message, using: transaction) + case let message as ExpirationTimerUpdate: handleExpirationTimerUpdate(message, using: transaction) + case let message as VisibleMessage: try handleVisibleMessage(message, associatedWithProto: proto, using: transaction) + default: fatalError() } } + private static func handleReadReceipt(_ message: ReadReceipt, using transaction: Any) { + SSKEnvironment.shared.readReceiptManager.processReadReceipts(fromRecipientId: message.sender!, sentTimestamps: message.timestamps!.map { NSNumber(value: $0) }, readTimestamp: message.receivedTimestamp!) + } + private static func handleTypingIndicator(_ message: TypingIndicator, using transaction: Any) { + switch message.kind! { + case .started: showTypingIndicatorIfNeeded(for: message.sender!) + case .stopped: hideTypingIndicatorIfNeeded(for: message.sender!) + } + } - // MARK: - Typing Indicators - - public func showTypingIndicatorIfNeeded(for senderPublicKey: String) { + public static func showTypingIndicatorIfNeeded(for senderPublicKey: String) { var threadOrNil: TSContactThread? Storage.read { transaction in threadOrNil = TSContactThread.getWithContactId(senderPublicKey, transaction: transaction) @@ -49,7 +47,7 @@ public final class MessageReceiverDelegate : SessionMessagingKit.MessageReceiver } } - public func hideTypingIndicatorIfNeeded(for senderPublicKey: String) { + public static func hideTypingIndicatorIfNeeded(for senderPublicKey: String) { var threadOrNil: TSContactThread? Storage.read { transaction in threadOrNil = TSContactThread.getWithContactId(senderPublicKey, transaction: transaction) @@ -67,7 +65,7 @@ public final class MessageReceiverDelegate : SessionMessagingKit.MessageReceiver } } - public func cancelTypingIndicatorsIfNeeded(for senderPublicKey: String) { + public static func cancelTypingIndicatorsIfNeeded(for senderPublicKey: String) { var threadOrNil: TSContactThread? Storage.read { transaction in threadOrNil = TSContactThread.getWithContactId(senderPublicKey, transaction: transaction) @@ -85,30 +83,15 @@ public final class MessageReceiverDelegate : SessionMessagingKit.MessageReceiver } } - - - // MARK: - Notifications - - public func notifyUserIfNeeded(forMessageWithID messageID: String, threadID: String) { - guard let message = TSIncomingMessage.fetch(uniqueId: messageID), let thread = TSThread.fetch(uniqueId: threadID) else { return } - Storage.read { transaction in - SSKEnvironment.shared.notificationsManager!.notifyUser(for: message, in: thread, transaction: transaction) + private static func handleExpirationTimerUpdate(_ message: ExpirationTimerUpdate, using transaction: Any) { + if message.duration! > 0 { + setExpirationTimer(to: message.duration!, for: message.sender!, groupPublicKey: message.groupPublicKey, using: transaction) + } else { + disableExpirationTimer(for: message.sender!, groupPublicKey: message.groupPublicKey, using: transaction) } } - - - // MARK: - Read Receipts - - public func markMessagesAsRead(_ timestamps: [UInt64], from senderPublicKey: String, at timestamp: UInt64) { - SSKEnvironment.shared.readReceiptManager.processReadReceipts(fromRecipientId: senderPublicKey, sentTimestamps: timestamps.map { NSNumber(value: $0) }, readTimestamp: timestamp) - } - - - - // MARK: - Expiration - - public func setExpirationTimer(to duration: UInt32, for senderPublicKey: String, groupPublicKey: String?, using transaction: Any) { + public static func setExpirationTimer(to duration: UInt32, for senderPublicKey: String, groupPublicKey: String?, using transaction: Any) { let transaction = transaction as! YapDatabaseReadWriteTransaction var threadOrNil: TSThread? Storage.read { transaction in @@ -130,7 +113,7 @@ public final class MessageReceiverDelegate : SessionMessagingKit.MessageReceiver SSKEnvironment.shared.disappearingMessagesJob.startIfNecessary() } - public func disableExpirationTimer(for senderPublicKey: String, groupPublicKey: String?, using transaction: Any) { + public static func disableExpirationTimer(for senderPublicKey: String, groupPublicKey: String?, using transaction: Any) { let transaction = transaction as! YapDatabaseReadWriteTransaction var threadOrNil: TSThread? Storage.read { transaction in @@ -152,11 +135,59 @@ public final class MessageReceiverDelegate : SessionMessagingKit.MessageReceiver SSKEnvironment.shared.disappearingMessagesJob.startIfNecessary() } + private static func handleVisibleMessage(_ message: VisibleMessage, associatedWithProto proto: SNProtoContent, using transaction: Any) throws { + let storage = Configuration.shared.storage + let transaction = transaction as! YapDatabaseReadWriteTransaction + // Parse & persist attachments + let attachments: [VisibleMessage.Attachment] = proto.dataMessage!.attachments.compactMap { proto in + guard let attachment = VisibleMessage.Attachment.fromProto(proto) else { return nil } + return attachment.isValid ? attachment : nil + } + let attachmentIDs = storage.persist(attachments, using: transaction) + message.attachmentIDs = attachmentIDs + // Update profile if needed + if let profile = message.profile { + let profileManager = SSKEnvironment.shared.profileManager + if let displayName = profile.displayName { + profileManager.updateProfileForContact(withID: message.sender!, displayName: displayName, with: transaction) + } + if let profileKey = profile.profileKey, let profilePictureURL = profile.profilePictureURL, profileKey.count == kAES256_KeyByteLength { + profileManager.setProfileKeyData(profileKey, forRecipientId: message.sender!, avatarURL: profilePictureURL) + } + } + // Persist the message + guard let (threadID, tsIncomingMessageID) = storage.persist(message, groupPublicKey: message.groupPublicKey, using: transaction) else { throw Error.noThread } + message.threadID = threadID + // Start attachment downloads if needed + storage.withAsync({ transaction in + attachmentIDs.forEach { attachmentID in + let downloadJob = AttachmentDownloadJob(attachmentID: attachmentID, tsIncomingMessageID: tsIncomingMessageID) + if CurrentAppContext().isMainAppAndActive { + JobQueue.shared.add(downloadJob, using: transaction) + } else { + JobQueue.shared.addWithoutExecuting(downloadJob, using: transaction) + } + } + }, completion: { }) + // Cancel any typing indicators + cancelTypingIndicatorsIfNeeded(for: message.sender!) + // Notify the user if needed + guard let tsIncomingMessage = TSIncomingMessage.fetch(uniqueId: tsIncomingMessageID), let thread = TSThread.fetch(uniqueId: threadID) else { return } + Storage.read { transaction in + SSKEnvironment.shared.notificationsManager!.notifyUser(for: tsIncomingMessage, in: thread, transaction: transaction) + } + } + private static func handleClosedGroupUpdate(_ message: ClosedGroupUpdate, using transaction: Any) { + switch message.kind! { + case .new: handleNewGroup(message, using: transaction) + case .info: handleGroupUpdate(message, using: transaction) + case .senderKeyRequest: handleSenderKeyRequest(message, using: transaction) + case .senderKey: handleSenderKey(message, using: transaction) + } + } - // MARK: - Closed Groups - - public func handleNewGroup(_ message: ClosedGroupUpdate, using transaction: Any) { + private static func handleNewGroup(_ message: ClosedGroupUpdate, using transaction: Any) { guard case let .new(groupPublicKeyAsData, name, groupPrivateKey, senderKeys, membersAsData, adminsAsData) = message.kind else { return } let transaction = transaction as! YapDatabaseReadWriteTransaction let groupPublicKey = groupPublicKeyAsData.toHexString() @@ -185,7 +216,7 @@ public final class MessageReceiverDelegate : SessionMessagingKit.MessageReceiver } } missingSenderKeys.subtracting([ userPublicKey ]).forEach { publicKey in - MessageSenderDelegate.shared.requestSenderKey(for: groupPublicKey, senderPublicKey: publicKey, using: transaction) + MessageSender.shared.requestSenderKey(for: groupPublicKey, senderPublicKey: publicKey, using: transaction) } // Create the group let groupID = LKGroupUtilities.getEncodedClosedGroupIDAsData(groupPublicKey) @@ -208,7 +239,7 @@ public final class MessageReceiverDelegate : SessionMessagingKit.MessageReceiver infoMessage.save(with: transaction) } - public func handleGroupUpdate(_ message: ClosedGroupUpdate, using transaction: Any) { + private static func handleGroupUpdate(_ message: ClosedGroupUpdate, using transaction: Any) { guard case let .info(groupPublicKeyAsData, name, senderKeys, membersAsData, adminsAsData) = message.kind else { return } let transaction = transaction as! YapDatabaseReadWriteTransaction let groupPublicKey = groupPublicKeyAsData.toHexString() @@ -272,7 +303,7 @@ public final class MessageReceiverDelegate : SessionMessagingKit.MessageReceiver } } - public func handleSenderKeyRequest(_ message: ClosedGroupUpdate, using transaction: Any) { + private static func handleSenderKeyRequest(_ message: ClosedGroupUpdate, using transaction: Any) { guard case let .senderKeyRequest(groupPublicKeyAsData) = message.kind else { return } let transaction = transaction as! YapDatabaseReadWriteTransaction let userPublicKey = getUserHexEncodedPublicKey() @@ -300,7 +331,7 @@ public final class MessageReceiverDelegate : SessionMessagingKit.MessageReceiver MessageSender.send(closedGroupUpdate, in: thread, using: transaction) } - public func handleSenderKey(_ message: ClosedGroupUpdate, using transaction: Any) { + private static func handleSenderKey(_ message: ClosedGroupUpdate, using transaction: Any) { guard case let .senderKey(groupPublicKeyAsData, senderKey) = message.kind else { return } let groupPublicKey = groupPublicKeyAsData.toHexString() guard senderKey.publicKey.toHexString() == message.sender! else { diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift index 7da27586b..ced2e30ae 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift @@ -2,7 +2,6 @@ import SessionUtilitiesKit internal enum MessageReceiver { - // MARK: Error internal enum Error : LocalizedError { case invalidMessage case unknownMessage @@ -42,7 +41,6 @@ internal enum MessageReceiver { } } - // MARK: Parsing internal static func parse(_ data: Data, messageServerID: UInt64?, using transaction: Any) throws -> (Message, SNProtoContent) { let userPublicKey = Configuration.shared.storage.getUserPublicKey() // Parse the envelope @@ -59,7 +57,7 @@ internal enum MessageReceiver { default: throw Error.unknownEnvelopeType } // Don't process the envelope any further if the sender is blocked - guard !Configuration.shared.messageReceiverDelegate.isBlocked(sender) else { throw Error.senderBlocked } + guard !isBlocked(sender) else { throw Error.senderBlocked } // Ignore self sends guard sender != userPublicKey else { throw Error.selfSend } // Parse the proto @@ -92,81 +90,4 @@ internal enum MessageReceiver { throw Error.unknownMessage } } - - // MARK: Handling - internal static func handle(_ message: Message, associatedWithProto proto: SNProtoContent, using transaction: Any) throws { - switch message { - case let message as ReadReceipt: handleReadReceipt(message, using: transaction) - case let message as TypingIndicator: handleTypingIndicator(message, using: transaction) - case let message as ClosedGroupUpdate: handleClosedGroupUpdate(message, using: transaction) - case let message as ExpirationTimerUpdate: handleExpirationTimerUpdate(message, using: transaction) - case let message as VisibleMessage: try handleVisibleMessage(message, associatedWithProto: proto, using: transaction) - default: fatalError() - } - } - - private static func handleReadReceipt(_ message: ReadReceipt, using transaction: Any) { - Configuration.shared.messageReceiverDelegate.markMessagesAsRead(message.timestamps!, from: message.sender!, at: message.receivedTimestamp!) - } - - private static func handleTypingIndicator(_ message: TypingIndicator, using transaction: Any) { - let delegate = Configuration.shared.messageReceiverDelegate - switch message.kind! { - case .started: delegate.showTypingIndicatorIfNeeded(for: message.sender!) - case .stopped: delegate.hideTypingIndicatorIfNeeded(for: message.sender!) - } - } - - private static func handleClosedGroupUpdate(_ message: ClosedGroupUpdate, using transaction: Any) { - let delegate = Configuration.shared.messageReceiverDelegate - switch message.kind! { - case .new: delegate.handleNewGroup(message, using: transaction) - case .info: delegate.handleGroupUpdate(message, using: transaction) - case .senderKeyRequest: delegate.handleSenderKeyRequest(message, using: transaction) - case .senderKey: delegate.handleSenderKey(message, using: transaction) - } - } - - private static func handleExpirationTimerUpdate(_ message: ExpirationTimerUpdate, using transaction: Any) { - let delegate = Configuration.shared.messageReceiverDelegate - if message.duration! > 0 { - delegate.setExpirationTimer(to: message.duration!, for: message.sender!, groupPublicKey: message.groupPublicKey, using: transaction) - } else { - delegate.disableExpirationTimer(for: message.sender!, groupPublicKey: message.groupPublicKey, using: transaction) - } - } - - private static func handleVisibleMessage(_ message: VisibleMessage, associatedWithProto proto: SNProtoContent, using transaction: Any) throws { - let delegate = Configuration.shared.messageReceiverDelegate - let storage = Configuration.shared.storage - // Parse & persist attachments - let attachments: [VisibleMessage.Attachment] = proto.dataMessage!.attachments.compactMap { proto in - guard let attachment = VisibleMessage.Attachment.fromProto(proto) else { return nil } - return attachment.isValid ? attachment : nil - } - let attachmentIDs = storage.persist(attachments, using: transaction) - message.attachmentIDs = attachmentIDs - // Update profile if needed - if let profile = message.profile { - delegate.updateProfile(for: message.sender!, from: profile, using: transaction) - } - // Persist the message - guard let (threadID, tsIncomingMessageID) = storage.persist(message, groupPublicKey: message.groupPublicKey, using: transaction) else { throw Error.noThread } - message.threadID = threadID - // Start attachment downloads if needed - storage.withAsync({ transaction in - attachmentIDs.forEach { attachmentID in - let downloadJob = AttachmentDownloadJob(attachmentID: attachmentID, tsIncomingMessageID: tsIncomingMessageID) - if CurrentAppContext().isMainAppAndActive { - JobQueue.shared.add(downloadJob, using: transaction) - } else { - JobQueue.shared.addWithoutExecuting(downloadJob, using: transaction) - } - } - }, completion: { }) - // Cancel any typing indicators - delegate.cancelTypingIndicatorsIfNeeded(for: message.sender!) - // Notify the user if needed - delegate.notifyUserIfNeeded(forMessageWithID: tsIncomingMessageID, threadID: threadID) - } } diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiverDelegate.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiverDelegate.swift deleted file mode 100644 index 4ac94717d..000000000 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiverDelegate.swift +++ /dev/null @@ -1,17 +0,0 @@ - -public protocol MessageReceiverDelegate { - - func isBlocked(_ publicKey: String) -> Bool - func updateProfile(for publicKey: String, from profile: VisibleMessage.Profile, using transaction: Any) - func showTypingIndicatorIfNeeded(for senderPublicKey: String) - func hideTypingIndicatorIfNeeded(for senderPublicKey: String) - func cancelTypingIndicatorsIfNeeded(for senderPublicKey: String) - func notifyUserIfNeeded(forMessageWithID messageID: String, threadID: String) - func markMessagesAsRead(_ timestamps: [UInt64], from senderPublicKey: String, at timestamp: UInt64) - func setExpirationTimer(to duration: UInt32, for senderPublicKey: String, groupPublicKey: String?, using transaction: Any) - func disableExpirationTimer(for senderPublicKey: String, groupPublicKey: String?, using transaction: Any) - func handleNewGroup(_ message: ClosedGroupUpdate, using transaction: Any) - func handleGroupUpdate(_ message: ClosedGroupUpdate, using transaction: Any) - func handleSenderKeyRequest(_ message: ClosedGroupUpdate, using transaction: Any) - func handleSenderKey(_ message: ClosedGroupUpdate, using transaction: Any) -} diff --git a/SessionMessagingKit/Sending & Receiving/MessageSender.swift b/SessionMessagingKit/Sending & Receiving/MessageSender.swift index f31f00162..dabf06e6e 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageSender.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageSender.swift @@ -11,10 +11,14 @@ public final class MessageSender : NSObject { case protoConversionFailed case proofOfWorkCalculationFailed case noUserPublicKey + // Closed groups + case noThread + case noPrivateKey + case invalidClosedGroupUpdate internal var isRetryable: Bool { switch self { - case .invalidMessage, .protoConversionFailed, .proofOfWorkCalculationFailed: return false + case .invalidMessage, .protoConversionFailed, .proofOfWorkCalculationFailed, .invalidClosedGroupUpdate: return false default: return true } } @@ -25,6 +29,10 @@ public final class MessageSender : NSObject { case .protoConversionFailed: return "Couldn't convert message to proto." case .proofOfWorkCalculationFailed: return "Proof of work calculation failed." case .noUserPublicKey: return "Couldn't find user key pair." + // Closed groups + case .noThread: return "Couldn't find a thread associated with the given group public key." + case .noPrivateKey: return "Couldn't find a private key associated with the given group public key." + case .invalidClosedGroupUpdate: return "Invalid group update." } } } @@ -32,6 +40,8 @@ public final class MessageSender : NSObject { // MARK: Initialization private override init() { } + public static let shared = MessageSender() // FIXME: Remove once requestSenderKey is static + // MARK: Convenience public static func send(_ message: Message, to destination: Message.Destination, using transaction: Any) -> Promise { switch destination { @@ -56,7 +66,7 @@ public final class MessageSender : NSObject { // Set the failure handler (for precondition failure handling) let _ = promise.catch(on: DispatchQueue.main) { error in storage.withAsync({ transaction in - Configuration.shared.messageSenderDelegate.handleFailedMessageSend(message, with: error, using: transaction) + MessageSender.handleFailedMessageSend(message, with: error, using: transaction) }, completion: { }) if case .contact(_) = destination { NotificationCenter.default.post(name: .messageSendingFailed, object: NSNumber(value: message.sentTimestamp!)) @@ -157,7 +167,7 @@ public final class MessageSender : NSObject { // Handle completion let _ = promise.done(on: DispatchQueue.main) { storage.withAsync({ transaction in - Configuration.shared.messageSenderDelegate.handleSuccessfulMessageSend(message, using: transaction) + MessageSender.handleSuccessfulMessageSend(message, using: transaction) }, completion: { }) if case .contact(_) = destination { NotificationCenter.default.post(name: .messageSent, object: NSNumber(value: message.sentTimestamp!)) @@ -186,7 +196,7 @@ public final class MessageSender : NSObject { // Set the failure handler (for precondition failure handling) let _ = promise.catch(on: DispatchQueue.global(qos: .userInitiated)) { error in storage.withAsync({ transaction in - Configuration.shared.messageSenderDelegate.handleFailedMessageSend(message, with: error, using: transaction) + MessageSender.handleFailedMessageSend(message, with: error, using: transaction) }, completion: { }) } // Validate the message @@ -210,10 +220,23 @@ public final class MessageSender : NSObject { // Handle completion let _ = promise.done(on: DispatchQueue.global(qos: .userInitiated)) { storage.withAsync({ transaction in - Configuration.shared.messageSenderDelegate.handleSuccessfulMessageSend(message, using: transaction) + MessageSender.handleSuccessfulMessageSend(message, using: transaction) }, completion: { }) } // Return return promise } + + // MARK: Result Handling + public static func handleSuccessfulMessageSend(_ message: Message, using transaction: Any) { + guard let tsMessage = TSOutgoingMessage.find(withTimestamp: message.sentTimestamp!) else { return } + tsMessage.openGroupServerMessageID = message.openGroupServerMessageID ?? 0 + tsMessage.isOpenGroupMessage = tsMessage.openGroupServerMessageID != 0 + tsMessage.update(withSentRecipient: message.recipient!, wasSentByUD: true, transaction: transaction as! YapDatabaseReadWriteTransaction) + } + + public static func handleFailedMessageSend(_ message: Message, with error: Swift.Error, using transaction: Any) { + guard let tsMessage = TSOutgoingMessage.find(withTimestamp: message.sentTimestamp!) else { return } + tsMessage.update(sendingError: error, transaction: transaction as! YapDatabaseReadWriteTransaction) + } } diff --git a/SessionMessagingKit/Sending & Receiving/MessageSenderDelegate.swift b/SessionMessagingKit/Sending & Receiving/MessageSenderDelegate.swift deleted file mode 100644 index 1f1cc0969..000000000 --- a/SessionMessagingKit/Sending & Receiving/MessageSenderDelegate.swift +++ /dev/null @@ -1,6 +0,0 @@ - -public protocol MessageSenderDelegate { - - func handleSuccessfulMessageSend(_ message: Message, using transaction: Any) - func handleFailedMessageSend(_ message: Message, with error: Error, using transaction: Any) -} diff --git a/SignalUtilitiesKit/NotificationsProtocol.h b/SessionMessagingKit/Sending & Receiving/Notifications/NotificationsProtocol.h similarity index 100% rename from SignalUtilitiesKit/NotificationsProtocol.h rename to SessionMessagingKit/Sending & Receiving/Notifications/NotificationsProtocol.h diff --git a/SignalUtilitiesKit/Messaging/Notifications/PushNotificationAPI.swift b/SessionMessagingKit/Sending & Receiving/Notifications/PushNotificationAPI.swift similarity index 99% rename from SignalUtilitiesKit/Messaging/Notifications/PushNotificationAPI.swift rename to SessionMessagingKit/Sending & Receiving/Notifications/PushNotificationAPI.swift index 560440b66..a7076ad8c 100644 --- a/SignalUtilitiesKit/Messaging/Notifications/PushNotificationAPI.swift +++ b/SessionMessagingKit/Sending & Receiving/Notifications/PushNotificationAPI.swift @@ -1,3 +1,4 @@ +import SessionSnodeKit import PromiseKit @objc(LKPushNotificationAPI) diff --git a/SignalUtilitiesKit/Messaging/Sending & Receiving/ClosedGroupPoller.swift b/SessionMessagingKit/Sending & Receiving/Pollers/ClosedGroupPoller.swift similarity index 95% rename from SignalUtilitiesKit/Messaging/Sending & Receiving/ClosedGroupPoller.swift rename to SessionMessagingKit/Sending & Receiving/Pollers/ClosedGroupPoller.swift index d8effed4e..ca2ae693e 100644 --- a/SignalUtilitiesKit/Messaging/Sending & Receiving/ClosedGroupPoller.swift +++ b/SessionMessagingKit/Sending & Receiving/Pollers/ClosedGroupPoller.swift @@ -1,3 +1,4 @@ +import SessionSnodeKit import PromiseKit @objc(LKClosedGroupPoller) @@ -23,7 +24,9 @@ public final class ClosedGroupPoller : NSObject { // MARK: Public API @objc public func startIfNeeded() { - AssertIsOnMainThread() // Timers don't do well on background queues + #if DEBUG + assert(Thread.current.isMainThread) // Timers don't do well on background queues + #endif guard !isPolling else { return } isPolling = true timer = Timer.scheduledTimer(withTimeInterval: ClosedGroupPoller.pollInterval, repeats: true) { [weak self] _ in diff --git a/SignalUtilitiesKit/Messaging/Sending & Receiving/OpenGroupPoller.swift b/SessionMessagingKit/Sending & Receiving/Pollers/OpenGroupPoller.swift similarity index 97% rename from SignalUtilitiesKit/Messaging/Sending & Receiving/OpenGroupPoller.swift rename to SessionMessagingKit/Sending & Receiving/Pollers/OpenGroupPoller.swift index bae1a244a..5dccd17da 100644 --- a/SignalUtilitiesKit/Messaging/Sending & Receiving/OpenGroupPoller.swift +++ b/SessionMessagingKit/Sending & Receiving/Pollers/OpenGroupPoller.swift @@ -162,10 +162,10 @@ public final class OpenGroupPoller : NSObject { private func pollForDeletedMessages() { let openGroup = self.openGroup let _ = OpenGroupAPI.getDeletedMessageServerIDs(for: openGroup.channel, on: openGroup.server).done(on: DispatchQueue.global(qos: .default)) { deletedMessageServerIDs in + let deletedMessageIDs = deletedMessageServerIDs.compactMap { Storage.shared.getIDForMessage(withServerID: UInt64($0)) } Storage.writeSync { transaction in - let deletedMessageIDs = deletedMessageServerIDs.compactMap { OWSPrimaryStorage.shared().getIDForMessage(withServerID: UInt($0), in: transaction) } deletedMessageIDs.forEach { messageID in - TSMessage.fetch(uniqueId: messageID)?.remove(with: transaction) + TSMessage.fetch(uniqueId: String(messageID))?.remove(with: transaction) } } } diff --git a/SignalUtilitiesKit/Messaging/Sending & Receiving/Poller.swift b/SessionMessagingKit/Sending & Receiving/Pollers/Poller.swift similarity index 99% rename from SignalUtilitiesKit/Messaging/Sending & Receiving/Poller.swift rename to SessionMessagingKit/Sending & Receiving/Pollers/Poller.swift index c02223ceb..082e3a7fc 100644 --- a/SignalUtilitiesKit/Messaging/Sending & Receiving/Poller.swift +++ b/SessionMessagingKit/Sending & Receiving/Pollers/Poller.swift @@ -1,3 +1,4 @@ +import SessionSnodeKit import PromiseKit @objc(LKPoller) diff --git a/SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel+Conversion.swift b/SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel+Conversion.swift new file mode 100644 index 000000000..3c932b16b --- /dev/null +++ b/SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel+Conversion.swift @@ -0,0 +1,13 @@ + +extension VisibleMessage.Quote { + + @objc(from:) + public static func from(_ quote: OWSQuotedReplyModel?) -> VisibleMessage.Quote? { + guard let quote = quote else { return nil } + let result = VisibleMessage.Quote() + result.timestamp = quote.timestamp + result.publicKey = quote.authorId + result.text = quote.body + return result + } +} diff --git a/SignalUtilitiesKit/Messaging/Quotes/OWSQuotedReplyModel.h b/SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel.h similarity index 96% rename from SignalUtilitiesKit/Messaging/Quotes/OWSQuotedReplyModel.h rename to SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel.h index d478b1bd2..44dc4be9c 100644 --- a/SignalUtilitiesKit/Messaging/Quotes/OWSQuotedReplyModel.h +++ b/SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel.h @@ -2,7 +2,8 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Messaging/Quotes/OWSQuotedReplyModel.m b/SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel.m similarity index 92% rename from SignalUtilitiesKit/Messaging/Quotes/OWSQuotedReplyModel.m rename to SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel.m index 3ea9a8420..2505ae6ee 100644 --- a/SignalUtilitiesKit/Messaging/Quotes/OWSQuotedReplyModel.m +++ b/SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel.m @@ -4,16 +4,15 @@ #import "OWSQuotedReplyModel.h" #import "ConversationViewItem.h" -#import #import -#import +#import #import #import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import NS_ASSUME_NONNULL_BEGIN @@ -78,7 +77,6 @@ NS_ASSUME_NONNULL_BEGIN threadId:(NSString *)threadId transaction:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(quotedMessage.quotedAttachments.count <= 1); OWSAttachmentInfo *attachmentInfo = quotedMessage.quotedAttachments.firstObject; BOOL thumbnailDownloadFailed = NO; @@ -123,17 +121,12 @@ NS_ASSUME_NONNULL_BEGIN threadId:(NSString *)threadId transaction:(YapDatabaseReadTransaction *)transaction; { - OWSAssertDebug(conversationItem); - OWSAssertDebug(transaction); - TSMessage *message = (TSMessage *)conversationItem.interaction; if (![message isKindOfClass:[TSMessage class]]) { - OWSFailDebug(@"unexpected reply message: %@", message); return nil; } TSThread *thread = [message threadWithTransaction:transaction]; - OWSAssertDebug(thread); uint64_t timestamp = message.timestamp; @@ -143,11 +136,9 @@ NS_ASSUME_NONNULL_BEGIN } else if ([message isKindOfClass:[TSIncomingMessage class]]) { return [(TSIncomingMessage *)message authorId]; } else { - OWSFailDebug(@"Unexpected message type: %@", message.class); return (NSString * _Nullable) nil; } }(); - OWSAssertDebug(authorId.length > 0); NSString *_Nullable quotedText = message.body; BOOL hasText = quotedText.length > 0; @@ -192,8 +183,6 @@ NS_ASSUME_NONNULL_BEGIN } if ([truncatedText dataUsingEncoding:NSUTF8StringEncoding].length < kOversizeTextMessageSizeThreshold) { quotedText = truncatedText; - } else { - OWSFailDebug(@"Missing valid text snippet."); } } } else { @@ -209,7 +198,6 @@ NS_ASSUME_NONNULL_BEGIN BOOL hasAttachment = quotedAttachment != nil; if (!hasText && !hasAttachment) { - OWSFailDebug(@"quoted message has neither text nor attachment"); quotedText = @""; hasText = YES; } diff --git a/SignalUtilitiesKit/Messaging/Quotes/Quote+Conversion.swift b/SessionMessagingKit/Sending & Receiving/Quotes/TSQuotedMessage+Conversion.swift similarity index 51% rename from SignalUtilitiesKit/Messaging/Quotes/Quote+Conversion.swift rename to SessionMessagingKit/Sending & Receiving/Quotes/TSQuotedMessage+Conversion.swift index e7bee2c4c..1d018b5a4 100644 --- a/SignalUtilitiesKit/Messaging/Quotes/Quote+Conversion.swift +++ b/SessionMessagingKit/Sending & Receiving/Quotes/TSQuotedMessage+Conversion.swift @@ -1,17 +1,4 @@ -extension VisibleMessage.Quote { - - @objc(from:) - public static func from(_ quote: OWSQuotedReplyModel?) -> VisibleMessage.Quote? { - guard let quote = quote else { return nil } - let result = VisibleMessage.Quote() - result.timestamp = quote.timestamp - result.publicKey = quote.authorId - result.text = quote.body - return result - } -} - extension TSQuotedMessage { @objc(from:) diff --git a/SignalUtilitiesKit/Messaging/Quotes/TSQuotedMessage.h b/SessionMessagingKit/Sending & Receiving/Quotes/TSQuotedMessage.h similarity index 100% rename from SignalUtilitiesKit/Messaging/Quotes/TSQuotedMessage.h rename to SessionMessagingKit/Sending & Receiving/Quotes/TSQuotedMessage.h diff --git a/SignalUtilitiesKit/Messaging/Quotes/TSQuotedMessage.m b/SessionMessagingKit/Sending & Receiving/Quotes/TSQuotedMessage.m similarity index 88% rename from SignalUtilitiesKit/Messaging/Quotes/TSQuotedMessage.m rename to SessionMessagingKit/Sending & Receiving/Quotes/TSQuotedMessage.m index 8af86dafb..d69b971e0 100644 --- a/SignalUtilitiesKit/Messaging/Quotes/TSQuotedMessage.m +++ b/SessionMessagingKit/Sending & Receiving/Quotes/TSQuotedMessage.m @@ -11,8 +11,8 @@ #import "TSInteraction.h" #import "TSOutgoingMessage.h" #import "TSThread.h" -#import #import +#import NS_ASSUME_NONNULL_BEGIN @@ -20,10 +20,6 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithAttachmentStream:(TSAttachmentStream *)attachmentStream; { - OWSAssertDebug([attachmentStream isKindOfClass:[TSAttachmentStream class]]); - OWSAssertDebug(attachmentStream.uniqueId); - OWSAssertDebug(attachmentStream.contentType); - return [self initWithAttachmentId:attachmentStream.uniqueId contentType:attachmentStream.contentType sourceFilename:attachmentStream.sourceFilename]; @@ -62,9 +58,6 @@ NS_ASSUME_NONNULL_BEGIN bodySource:(TSQuotedMessageContentSource)bodySource receivedQuotedAttachmentInfos:(NSArray *)attachmentInfos { - OWSAssertDebug(timestamp > 0); - OWSAssertDebug(authorId.length > 0); - self = [super init]; if (!self) { return nil; @@ -84,9 +77,6 @@ NS_ASSUME_NONNULL_BEGIN body:(NSString *_Nullable)body quotedAttachmentsForSending:(NSArray *)attachments { - OWSAssertDebug(timestamp > 0); - OWSAssertDebug(authorId.length > 0); - self = [super init]; if (!self) { return nil; @@ -110,8 +100,6 @@ NS_ASSUME_NONNULL_BEGIN thread:(TSThread *)thread transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(dataMessage); - if (!dataMessage.quote) { return nil; } @@ -119,13 +107,11 @@ NS_ASSUME_NONNULL_BEGIN SNProtoDataMessageQuote *quoteProto = [dataMessage quote]; if (quoteProto.id == 0) { - OWSFailDebug(@"quoted message missing id"); return nil; } uint64_t timestamp = [quoteProto id]; if (quoteProto.author.length == 0) { - OWSFailDebug(@"quoted message missing author"); return nil; } // TODO: We could verify that this is a valid e164 value. @@ -173,18 +159,10 @@ NS_ASSUME_NONNULL_BEGIN transaction:transaction]; if (localThumbnail) { - OWSLogDebug(@"Generated local thumbnail for quoted quoted message: %@:%lu", - thread.uniqueId, - (unsigned long)timestamp); - [localThumbnail saveWithTransaction:transaction]; attachmentInfo.thumbnailAttachmentStreamId = localThumbnail.uniqueId; } else if (quotedAttachment.thumbnail) { - OWSLogDebug(@"Saving reference for fetching remote thumbnail for quoted message: %@:%lu", - thread.uniqueId, - (unsigned long)timestamp); - SNProtoAttachmentPointer *thumbnailAttachmentProto = quotedAttachment.thumbnail; TSAttachmentPointer *_Nullable thumbnailPointer = [TSAttachmentPointer attachmentPointerFromProto:thumbnailAttachmentProto albumMessage:nil]; @@ -192,11 +170,7 @@ NS_ASSUME_NONNULL_BEGIN [thumbnailPointer saveWithTransaction:transaction]; attachmentInfo.thumbnailAttachmentPointerId = thumbnailPointer.uniqueId; - } else { - OWSFailDebug(@"Invalid thumbnail attachment."); } - } else { - OWSLogDebug(@"No thumbnail for quoted message: %@:%lu", thread.uniqueId, (unsigned long)timestamp); } [attachmentInfos addObject:attachmentInfo]; @@ -251,18 +225,13 @@ NS_ASSUME_NONNULL_BEGIN authorId:(NSString *)authorId transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - if (timestamp <= 0) { - OWSFailDebug(@"Invalid timestamp: %llu", timestamp); return nil; } if (threadId.length <= 0) { - OWSFailDebug(@"Invalid thread."); return nil; } if (authorId.length <= 0) { - OWSFailDebug(@"Invalid authorId: %@", authorId); return nil; } @@ -284,7 +253,6 @@ NS_ASSUME_NONNULL_BEGIN return message; } - OWSLogWarn(@"Could not find quoted message: %llu", timestamp); return nil; } @@ -292,7 +260,6 @@ NS_ASSUME_NONNULL_BEGIN - (nullable OWSAttachmentInfo *)firstAttachmentInfo { - OWSAssertDebug(self.quotedAttachments.count <= 1); return self.quotedAttachments.firstObject; } @@ -326,9 +293,6 @@ NS_ASSUME_NONNULL_BEGIN - (void)setThumbnailAttachmentStream:(TSAttachmentStream *)attachmentStream { - OWSAssertDebug([attachmentStream isKindOfClass:[TSAttachmentStream class]]); - OWSAssertDebug(self.quotedAttachments.count == 1); - OWSAttachmentInfo *firstAttachment = self.firstAttachmentInfo; firstAttachment.thumbnailAttachmentStreamId = attachmentStream.uniqueId; } @@ -352,8 +316,6 @@ NS_ASSUME_NONNULL_BEGIN NSMutableArray *thumbnailAttachments = [NSMutableArray new]; for (OWSAttachmentInfo *info in self.quotedAttachments) { - - OWSAssertDebug(info.attachmentId); TSAttachment *attachment = [TSAttachment fetchObjectWithUniqueID:info.attachmentId transaction:transaction]; if (![attachment isKindOfClass:[TSAttachmentStream class]]) { continue; diff --git a/SignalUtilitiesKit/Messaging/Read Tracking/OWSOutgoingReceiptManager.h b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSOutgoingReceiptManager.h similarity index 100% rename from SignalUtilitiesKit/Messaging/Read Tracking/OWSOutgoingReceiptManager.h rename to SessionMessagingKit/Sending & Receiving/Read Tracking/OWSOutgoingReceiptManager.h diff --git a/SignalUtilitiesKit/Messaging/Read Tracking/OWSOutgoingReceiptManager.m b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSOutgoingReceiptManager.m similarity index 94% rename from SignalUtilitiesKit/Messaging/Read Tracking/OWSOutgoingReceiptManager.m rename to SessionMessagingKit/Sending & Receiving/Read Tracking/OWSOutgoingReceiptManager.m index 8163fa538..0bb42314a 100644 --- a/SignalUtilitiesKit/Messaging/Read Tracking/OWSOutgoingReceiptManager.m +++ b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSOutgoingReceiptManager.m @@ -3,16 +3,16 @@ // #import "OWSOutgoingReceiptManager.h" -#import "AppReadiness.h" -#import "OWSError.h" -#import -#import "OWSPrimaryStorage.h" +#import #import "SSKEnvironment.h" +#import "AppReadiness.h" +#import "OWSPrimaryStorage.h" #import "TSContactThread.h" #import "TSYapDatabaseObject.h" +#import +#import #import -#import -#import "SSKAsserts.h" +#import NS_ASSUME_NONNULL_BEGIN @@ -41,8 +41,6 @@ NSString *const kOutgoingReadReceiptManagerCollection = @"kOutgoingReadReceiptMa + (instancetype)sharedManager { - OWSAssert(SSKEnvironment.shared.outgoingReceiptManager); - return SSKEnvironment.shared.outgoingReceiptManager; } @@ -58,8 +56,6 @@ NSString *const kOutgoingReadReceiptManagerCollection = @"kOutgoingReadReceiptMa _dbConnection = primaryStorage.newDatabaseConnection; - OWSSingletonAssert(); - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged) name:kReachabilityChangedNotification @@ -93,15 +89,11 @@ NSString *const kOutgoingReadReceiptManagerCollection = @"kOutgoingReadReceiptMa // Schedules a processing pass, unless one is already scheduled. - (void)process { - OWSAssertDebug(AppReadiness.isAppReady); - dispatch_async(self.serialQueue, ^{ if (self.isProcessing) { return; } - OWSLogVerbose(@"Processing outbound receipts."); - self.isProcessing = YES; if (!self.reachability.isReachable) { @@ -159,7 +151,6 @@ NSString *const kOutgoingReadReceiptManagerCollection = @"kOutgoingReadReceiptMa for (NSString *recipientId in queuedReceiptMap) { NSSet *timestamps = queuedReceiptMap[recipientId]; if (timestamps.count < 1) { - OWSFailDebug(@"Missing timestamps."); continue; } @@ -236,11 +227,9 @@ NSString *const kOutgoingReadReceiptManagerCollection = @"kOutgoingReadReceiptMa NSString *collection = [self collectionForReceiptType:receiptType]; if (recipientId.length < 1) { - OWSFailDebug(@"Invalid recipient id."); return; } if (timestamp < 1) { - OWSFailDebug(@"Invalid timestamp."); return; } dispatch_async(self.serialQueue, ^{ @@ -263,11 +252,9 @@ NSString *const kOutgoingReadReceiptManagerCollection = @"kOutgoingReadReceiptMa NSString *collection = [self collectionForReceiptType:receiptType]; if (recipientId.length < 1) { - OWSFailDebug(@"Invalid recipient id."); return; } if (timestamps.count < 1) { - OWSFailDebug(@"Invalid timestamps."); return; } dispatch_async(self.serialQueue, ^{ @@ -288,8 +275,6 @@ NSString *const kOutgoingReadReceiptManagerCollection = @"kOutgoingReadReceiptMa - (void)reachabilityChanged { - OWSAssertIsOnMainThread(); - [self process]; } diff --git a/SignalUtilitiesKit/Messaging/Read Tracking/OWSReadReceiptManager.h b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.h similarity index 85% rename from SignalUtilitiesKit/Messaging/Read Tracking/OWSReadReceiptManager.h rename to SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.h index aeacacee3..d369acf74 100644 --- a/SignalUtilitiesKit/Messaging/Read Tracking/OWSReadReceiptManager.h +++ b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.h @@ -51,15 +51,6 @@ extern NSString *const kIncomingMessageMarkedAsReadNotification; - (void)applyEarlyReadReceiptsForOutgoingMessageFromLinkedDevice:(TSOutgoingMessage *)message transaction:(YapDatabaseReadWriteTransaction *)transaction; -#pragma mark - Linked Device Read Receipts - -- (void)processReadReceiptsFromLinkedDevice:(NSArray *)readReceiptProtos - readTimestamp:(uint64_t)readTimestamp - transaction:(YapDatabaseReadWriteTransaction *)transaction; - -- (void)applyEarlyReadReceiptsForIncomingMessage:(TSIncomingMessage *)message - transaction:(YapDatabaseReadWriteTransaction *)transaction; - #pragma mark - Locally Read // This method cues this manager: diff --git a/SignalUtilitiesKit/Messaging/Read Tracking/OWSReadReceiptManager.m b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m similarity index 66% rename from SignalUtilitiesKit/Messaging/Read Tracking/OWSReadReceiptManager.m rename to SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m index 4ec0df35f..67006c39d 100644 --- a/SignalUtilitiesKit/Messaging/Read Tracking/OWSReadReceiptManager.m +++ b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m @@ -10,13 +10,13 @@ #import "SSKEnvironment.h" #import "TSAccountManager.h" #import "TSContactThread.h" +#import "TSOutgoingMessage.h" #import "TSDatabaseView.h" #import "TSIncomingMessage.h" #import "YapDatabaseConnection+OWS.h" #import -#import +#import #import -#import "SSKAsserts.h" NS_ASSUME_NONNULL_BEGIN @@ -41,8 +41,6 @@ NSString *const kIncomingMessageMarkedAsReadNotification = @"kIncomingMessageMar - (instancetype)initWithSentTimestamp:(uint64_t)sentTimestamp { - OWSAssertDebug(sentTimestamp > 0); - self = [super initWithUniqueId:[TSRecipientReadReceipt uniqueIdForSentTimestamp:sentTimestamp]]; if (self) { @@ -60,9 +58,6 @@ NSString *const kIncomingMessageMarkedAsReadNotification = @"kIncomingMessageMar - (void)addRecipientId:(NSString *)recipientId timestamp:(uint64_t)timestamp { - OWSAssertDebug(recipientId.length > 0); - OWSAssertDebug(timestamp > 0); - NSMutableDictionary *recipientMapCopy = [self.recipientMap mutableCopy]; recipientMapCopy[recipientId] = @(timestamp); _recipientMap = [recipientMapCopy copy]; @@ -73,8 +68,6 @@ NSString *const kIncomingMessageMarkedAsReadNotification = @"kIncomingMessageMar readTimestamp:(uint64_t)readTimestamp transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - TSRecipientReadReceipt *_Nullable recipientReadReceipt = [transaction objectForKey:[self uniqueIdForSentTimestamp:sentTimestamp] inCollection:[self collection]]; if (!recipientReadReceipt) { @@ -88,8 +81,6 @@ NSString *const kIncomingMessageMarkedAsReadNotification = @"kIncomingMessageMar transaction: (YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - TSRecipientReadReceipt *_Nullable recipientReadReceipt = [transaction objectForKey:[self uniqueIdForSentTimestamp:sentTimestamp] inCollection:[self collection]]; return recipientReadReceipt.recipientMap; @@ -98,8 +89,6 @@ NSString *const kIncomingMessageMarkedAsReadNotification = @"kIncomingMessageMar + (void)removeRecipientIdsForTimestamp:(uint64_t)sentTimestamp transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - [transaction removeObjectForKey:[self uniqueIdForSentTimestamp:sentTimestamp] inCollection:[self collection]]; } @@ -133,8 +122,6 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE + (instancetype)sharedManager { - OWSAssert(SSKEnvironment.shared.readReceiptManager); - return SSKEnvironment.shared.readReceiptManager; } @@ -148,8 +135,6 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE _dbConnection = primaryStorage.newDatabaseConnection; - OWSSingletonAssert(); - // Start processing. [AppReadiness runNowOrWhenAppDidBecomeReady:^{ [self scheduleProcessing]; @@ -167,8 +152,6 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE - (OWSOutgoingReceiptManager *)outgoingReceiptManager { - OWSAssertDebug(SSKEnvironment.shared.outgoingReceiptManager); - return SSKEnvironment.shared.outgoingReceiptManager; } @@ -177,8 +160,6 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE // Schedules a processing pass, unless one is already scheduled. - (void)scheduleProcessing { - OWSAssertDebug(AppReadiness.isAppReady); - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ @synchronized(self) { @@ -240,13 +221,11 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE - (void)markAsReadLocallyBeforeSortId:(uint64_t)sortId thread:(TSThread *)thread { - OWSAssertDebug(thread); - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self markAsReadBeforeSortId:sortId thread:thread - readTimestamp:[NSDate ows_millisecondTimeStamp] + readTimestamp:[NSDate millisecondTimestamp] wasLocal:YES transaction:transaction]; }]; @@ -303,11 +282,7 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE sentTimestamps:(NSArray *)sentTimestamps readTimestamp:(uint64_t)readTimestamp { - OWSAssertDebug(recipientId.length > 0); - OWSAssertDebug(sentTimestamps); - if (![self areReadReceiptsEnabled]) { - OWSLogInfo(@"Ignoring incoming receipt message as read receipts are disabled."); return; } @@ -320,9 +295,6 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE = (NSArray *)[TSInteraction interactionsWithTimestamp:sentTimestamp ofClass:[TSOutgoingMessage class] withTransaction:transaction]; - if (messages.count > 1) { - OWSLogError(@"More than one matching message with timestamp: %llu.", sentTimestamp); - } if (messages.count > 0) { // TODO: We might also need to "mark as read by recipient" any older messages // from us in that thread. Or maybe this state should hang on the thread? @@ -344,124 +316,6 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE }); } -- (void)applyEarlyReadReceiptsForOutgoingMessageFromLinkedDevice:(TSOutgoingMessage *)message - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(message); - OWSAssertDebug(transaction); - - uint64_t sentTimestamp = message.timestamp; - NSDictionary *recipientMap = - [TSRecipientReadReceipt recipientMapForSentTimestamp:sentTimestamp transaction:transaction]; - if (!recipientMap) { - return; - } - OWSAssertDebug(recipientMap.count > 0); - for (NSString *recipientId in recipientMap) { - NSNumber *nsReadTimestamp = recipientMap[recipientId]; - OWSAssertDebug(nsReadTimestamp); - uint64_t readTimestamp = [nsReadTimestamp unsignedLongLongValue]; - - [message updateWithReadRecipientId:recipientId readTimestamp:readTimestamp transaction:transaction]; - } - [TSRecipientReadReceipt removeRecipientIdsForTimestamp:message.timestamp transaction:transaction]; -} - -#pragma mark - Linked Device Read Receipts - -- (void)applyEarlyReadReceiptsForIncomingMessage:(TSIncomingMessage *)message - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - /* - OWSAssertDebug(message); - OWSAssertDebug(transaction); - - NSString *senderId = message.authorId; - uint64_t timestamp = message.timestamp; - if (senderId.length < 1 || timestamp < 1) { - OWSFailDebug(@"Invalid incoming message: %@ %llu", senderId, timestamp); - return; - } - - OWSLinkedDeviceReadReceipt *_Nullable readReceipt = - [OWSLinkedDeviceReadReceipt findLinkedDeviceReadReceiptWithSenderId:senderId - messageIdTimestamp:timestamp - transaction:transaction]; - if (!readReceipt) { - return; - } - - [message markAsReadAtTimestamp:readReceipt.readTimestamp sendReadReceipt:NO transaction:transaction]; - [readReceipt removeWithTransaction:transaction]; - */ -} - -- (void)processReadReceiptsFromLinkedDevice:(NSArray *)readReceiptProtos - readTimestamp:(uint64_t)readTimestamp - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - // TODO TODO TODO - - /* - OWSAssertDebug(readReceiptProtos); - OWSAssertDebug(transaction); - - for (SNProtoSyncMessageRead *readReceiptProto in readReceiptProtos) { - NSString *_Nullable senderId = readReceiptProto.sender; - uint64_t messageIdTimestamp = readReceiptProto.timestamp; - - if (senderId.length == 0) { - OWSFailDebug(@"senderId was unexpectedly nil"); - continue; - } - - if (messageIdTimestamp == 0) { - OWSFailDebug(@"messageIdTimestamp was unexpectedly 0"); - continue; - } - - NSArray *messages - = (NSArray *)[TSInteraction interactionsWithTimestamp:messageIdTimestamp - ofClass:[TSIncomingMessage class] - withTransaction:transaction]; - if (messages.count > 0) { - for (TSIncomingMessage *message in messages) { - NSTimeInterval secondsSinceRead = [NSDate new].timeIntervalSince1970 - readTimestamp / 1000; - OWSAssertDebug([message isKindOfClass:[TSIncomingMessage class]]); - OWSLogDebug(@"read on linked device %f seconds ago", secondsSinceRead); - [self markAsReadOnLinkedDevice:message readTimestamp:readTimestamp transaction:transaction]; - } - } else { - // Received read receipt for unknown incoming message. - // Persist in case we receive the incoming message later. - OWSLinkedDeviceReadReceipt *readReceipt = - [[OWSLinkedDeviceReadReceipt alloc] initWithSenderId:senderId - messageIdTimestamp:messageIdTimestamp - readTimestamp:readTimestamp]; - [readReceipt saveWithTransaction:transaction]; - } - } - */ -} - -- (void)markAsReadOnLinkedDevice:(TSIncomingMessage *)message - readTimestamp:(uint64_t)readTimestamp - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(message); - OWSAssertDebug(transaction); - - // Always re-mark the message as read to ensure any earlier read time is applied to disappearing messages. - [message markAsReadAtTimestamp:readTimestamp sendReadReceipt:NO transaction:transaction]; - - // Also mark any unread messages appearing earlier in the thread as read as well. - [self markAsReadBeforeSortId:message.sortId - thread:[message threadWithTransaction:transaction] - readTimestamp:readTimestamp - wasLocal:NO - transaction:transaction]; -} - #pragma mark - Mark As Read - (void)markAsReadBeforeSortId:(uint64_t)sortId @@ -470,22 +324,12 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE wasLocal:(BOOL)wasLocal transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(sortId > 0); - OWSAssertDebug(thread); - OWSAssertDebug(transaction); - NSMutableArray> *newlyReadList = [NSMutableArray new]; [[TSDatabaseView unseenDatabaseViewExtension:transaction] enumerateKeysAndObjectsInGroup:thread.uniqueId usingBlock:^(NSString *collection, NSString *key, id object, NSUInteger index, BOOL *stop) { if (![object conformsToProtocol:@protocol(OWSReadTracking)]) { - OWSFailDebug( - @"Expected to conform to OWSReadTracking: object with class: %@ collection: %@ " - @"key: %@", - [object class], - collection, - key); return; } id possiblyRead = (id)object; @@ -498,7 +342,6 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE // there is a bug that can somehow cause it to be false leading to conversations permanently being // stuck with "unread" messages. - OWSAssertDebug(possiblyRead.expireStartedAt == 0); if (!possiblyRead.read) { [newlyReadList addObject:possiblyRead]; } @@ -507,12 +350,7 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE if (newlyReadList.count < 1) { return; } - - if (wasLocal) { - OWSLogError(@"Marking %lu messages as read locally.", (unsigned long)newlyReadList.count); - } else { - OWSLogError(@"Marking %lu messages as read by linked device.", (unsigned long)newlyReadList.count); - } + for (id readItem in newlyReadList) { [readItem markAsReadAtTimestamp:readTimestamp sendReadReceipt:wasLocal transaction:transaction]; } @@ -539,8 +377,6 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE - (void)setAreReadReceiptsEnabled:(BOOL)value { - OWSLogInfo(@"setAreReadReceiptsEnabled: %d.", value); - [self.dbConnection setBool:value forKey:OWSReadReceiptManagerAreReadReceiptsEnabled inCollection:OWSReadReceiptManagerCollection]; diff --git a/SignalUtilitiesKit/Messaging/Read Tracking/OWSReadTracking.h b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadTracking.h similarity index 100% rename from SignalUtilitiesKit/Messaging/Read Tracking/OWSReadTracking.h rename to SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadTracking.h diff --git a/SignalUtilitiesKit/Messaging/Read Tracking/TSUnreadIndicatorInteraction.h b/SessionMessagingKit/Sending & Receiving/Read Tracking/TSUnreadIndicatorInteraction.h similarity index 87% rename from SignalUtilitiesKit/Messaging/Read Tracking/TSUnreadIndicatorInteraction.h rename to SessionMessagingKit/Sending & Receiving/Read Tracking/TSUnreadIndicatorInteraction.h index 06b75058e..4545e6d99 100644 --- a/SignalUtilitiesKit/Messaging/Read Tracking/TSUnreadIndicatorInteraction.h +++ b/SessionMessagingKit/Sending & Receiving/Read Tracking/TSUnreadIndicatorInteraction.h @@ -2,7 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Messaging/Read Tracking/TSUnreadIndicatorInteraction.m b/SessionMessagingKit/Sending & Receiving/Read Tracking/TSUnreadIndicatorInteraction.m similarity index 100% rename from SignalUtilitiesKit/Messaging/Read Tracking/TSUnreadIndicatorInteraction.m rename to SessionMessagingKit/Sending & Receiving/Read Tracking/TSUnreadIndicatorInteraction.m diff --git a/SignalUtilitiesKit/Messaging/Typing Indicators/TypingIndicators.swift b/SessionMessagingKit/Sending & Receiving/Typing Indicators/TypingIndicators.swift similarity index 87% rename from SignalUtilitiesKit/Messaging/Typing Indicators/TypingIndicators.swift rename to SessionMessagingKit/Sending & Receiving/Typing Indicators/TypingIndicators.swift index 7e8e64bdb..2ac63c633 100644 --- a/SignalUtilitiesKit/Messaging/Typing Indicators/TypingIndicators.swift +++ b/SessionMessagingKit/Sending & Receiving/Typing Indicators/TypingIndicators.swift @@ -62,34 +62,22 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { } private func setup() { - AssertIsOnMainThread() - - _areTypingIndicatorsEnabled = primaryStorage.dbReadConnection.bool(forKey: kDatabaseKey_TypingIndicatorsEnabled, inCollection: kDatabaseCollection, defaultValue: true) - } - - // MARK: - Dependencies - - private var primaryStorage: OWSPrimaryStorage { - return SSKEnvironment.shared.primaryStorage + _areTypingIndicatorsEnabled = OWSPrimaryStorage.shared().dbReadConnection.bool(forKey: kDatabaseKey_TypingIndicatorsEnabled, inCollection: kDatabaseCollection, defaultValue: true) } // MARK: - @objc public func setTypingIndicatorsEnabled(value: Bool) { - AssertIsOnMainThread() - Logger.info("\(_areTypingIndicatorsEnabled) -> \(value)") _areTypingIndicatorsEnabled = value - primaryStorage.dbReadWriteConnection.setBool(value, forKey: kDatabaseKey_TypingIndicatorsEnabled, inCollection: kDatabaseCollection) + OWSPrimaryStorage.shared().dbReadWriteConnection.setBool(value, forKey: kDatabaseKey_TypingIndicatorsEnabled, inCollection: kDatabaseCollection) NotificationCenter.default.postNotificationNameAsync(TypingIndicatorsImpl.typingIndicatorStateDidChange, object: nil) } @objc public func areTypingIndicatorsEnabled() -> Bool { - AssertIsOnMainThread() - return _areTypingIndicatorsEnabled } @@ -97,9 +85,7 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { @objc public func didStartTypingOutgoingInput(inThread thread: TSThread) { - AssertIsOnMainThread() guard let outgoingIndicators = ensureOutgoingIndicators(forThread: thread) else { - owsFailDebug("Could not locate outgoing indicators state") return } outgoingIndicators.didStartTypingOutgoingInput() @@ -107,9 +93,7 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { @objc public func didStopTypingOutgoingInput(inThread thread: TSThread) { - AssertIsOnMainThread() guard let outgoingIndicators = ensureOutgoingIndicators(forThread: thread) else { - owsFailDebug("Could not locate outgoing indicators state") return } outgoingIndicators.didStopTypingOutgoingInput() @@ -117,9 +101,7 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { @objc public func didSendOutgoingMessage(inThread thread: TSThread) { - AssertIsOnMainThread() guard let outgoingIndicators = ensureOutgoingIndicators(forThread: thread) else { - owsFailDebug("Could not locate outgoing indicators state") return } outgoingIndicators.didSendOutgoingMessage() @@ -127,32 +109,24 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { @objc public func didReceiveTypingStartedMessage(inThread thread: TSThread, recipientId: String, deviceId: UInt) { - AssertIsOnMainThread() - Logger.info("") let incomingIndicators = ensureIncomingIndicators(forThread: thread, recipientId: recipientId, deviceId: deviceId) incomingIndicators.didReceiveTypingStartedMessage() } @objc public func didReceiveTypingStoppedMessage(inThread thread: TSThread, recipientId: String, deviceId: UInt) { - AssertIsOnMainThread() - Logger.info("") let incomingIndicators = ensureIncomingIndicators(forThread: thread, recipientId: recipientId, deviceId: deviceId) incomingIndicators.didReceiveTypingStoppedMessage() } @objc public func didReceiveIncomingMessage(inThread thread: TSThread, recipientId: String, deviceId: UInt) { - AssertIsOnMainThread() - Logger.info("") let incomingIndicators = ensureIncomingIndicators(forThread: thread, recipientId: recipientId, deviceId: deviceId) incomingIndicators.didReceiveIncomingMessage() } @objc public func typingRecipientId(forThread thread: TSThread) -> String? { - AssertIsOnMainThread() - guard areTypingIndicatorsEnabled() else { return nil } @@ -170,7 +144,6 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { continue } guard let startedTypingTimestamp = incomingIndicators.startedTypingTimestamp else { - owsFailDebug("Typing device is missing start timestamp.") continue } if let firstTimestamp = firstTimestamp, @@ -191,10 +164,7 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { private var outgoingIndicatorsMap = [String: OutgoingIndicators]() private func ensureOutgoingIndicators(forThread thread: TSThread) -> OutgoingIndicators? { - AssertIsOnMainThread() - guard let threadId = thread.uniqueId else { - owsFailDebug("Thread missing id") return nil } if let outgoingIndicators = outgoingIndicatorsMap[threadId] { @@ -223,8 +193,6 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { // MARK: - func didStartTypingOutgoingInput() { - AssertIsOnMainThread() - if sendRefreshTimer == nil { // If the user types a character into the compose box, and the sendRefresh timer isn’t running: @@ -249,8 +217,6 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { } func didStopTypingOutgoingInput() { - AssertIsOnMainThread() - sendTypingMessageIfNecessary(forThread: thread, action: .stopped) sendRefreshTimer?.invalidate() @@ -262,8 +228,6 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { @objc func sendPauseTimerDidFire() { - AssertIsOnMainThread() - sendTypingMessageIfNecessary(forThread: thread, action: .stopped) sendRefreshTimer?.invalidate() @@ -275,8 +239,6 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { @objc func sendRefreshTimerDidFire() { - AssertIsOnMainThread() - sendTypingMessageIfNecessary(forThread: thread, action: .started) sendRefreshTimer?.invalidate() @@ -288,8 +250,6 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { } func didSendOutgoingMessage() { - AssertIsOnMainThread() - sendRefreshTimer?.invalidate() sendRefreshTimer = nil @@ -299,7 +259,6 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { private func sendTypingMessageIfNecessary(forThread thread: TSThread, action: TypingIndicator.Kind) { guard let delegate = delegate else { - owsFailDebug("Missing delegate.") return } // `areTypingIndicatorsEnabled` reflects the user-facing setting in the app preferences. @@ -336,8 +295,6 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { } private func ensureIncomingIndicators(forThread thread: TSThread, recipientId: String, deviceId: UInt) -> IncomingIndicators { - AssertIsOnMainThread() - let threadKey = incomingIndicatorsKey(forThread: thread) let deviceKey = incomingIndicatorsKey(recipientId: recipientId, deviceId: deviceId) guard let deviceMap = incomingIndicatorsMap[threadKey] else { @@ -366,12 +323,8 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { var isTyping = false { didSet { - AssertIsOnMainThread() - let didChange = oldValue != isTyping if didChange { - Logger.debug("isTyping changed: \(oldValue) -> \(self.isTyping)") - notifyIfNecessary() } } @@ -386,8 +339,6 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { } func didReceiveTypingStartedMessage() { - AssertIsOnMainThread() - displayTypingTimer?.invalidate() displayTypingTimer = Timer.weakScheduledTimer(withTimeInterval: 5, target: self, @@ -401,27 +352,19 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { } func didReceiveTypingStoppedMessage() { - AssertIsOnMainThread() - clearTyping() } @objc func displayTypingTimerDidFire() { - AssertIsOnMainThread() - clearTyping() } func didReceiveIncomingMessage() { - AssertIsOnMainThread() - clearTyping() } private func clearTyping() { - AssertIsOnMainThread() - displayTypingTimer?.invalidate() displayTypingTimer = nil startedTypingTimestamp = nil @@ -429,10 +372,7 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { } private func notifyIfNecessary() { - Logger.verbose("") - guard let delegate = delegate else { - owsFailDebug("Missing delegate.") return } // `areTypingIndicatorsEnabled` reflects the user-facing setting in the app preferences. @@ -442,7 +382,6 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { return } guard let threadId = thread.uniqueId else { - owsFailDebug("Thread is missing id.") return } NotificationCenter.default.postNotificationNameAsync(TypingIndicatorsImpl.typingIndicatorStateDidChange, object: threadId) diff --git a/SessionMessagingKit/Threads/Notification+Thread.swift b/SessionMessagingKit/Threads/Notification+Thread.swift new file mode 100644 index 000000000..4254aff63 --- /dev/null +++ b/SessionMessagingKit/Threads/Notification+Thread.swift @@ -0,0 +1,10 @@ + +public extension Notification.Name { + + static let groupThreadUpdated = Notification.Name("groupThreadUpdated") +} + +@objc public extension NSNotification { + + @objc static let groupThreadUpdated = Notification.Name.groupThreadUpdated.rawValue as NSString +} diff --git a/SignalUtilitiesKit/Threads/TSContactThread.h b/SessionMessagingKit/Threads/TSContactThread.h similarity index 85% rename from SignalUtilitiesKit/Threads/TSContactThread.h rename to SessionMessagingKit/Threads/TSContactThread.h index 15c63d31f..c24278fbe 100644 --- a/SignalUtilitiesKit/Threads/TSContactThread.h +++ b/SessionMessagingKit/Threads/TSContactThread.h @@ -2,17 +2,14 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN extern NSString *const TSContactThreadPrefix; -typedef NS_ENUM(NSInteger, SNSessionRestorationStatus); - @interface TSContactThread : TSThread -@property (atomic) SNSessionRestorationStatus sessionRestorationStatus; @property (nonatomic) BOOL hasDismissedOffers; - (instancetype)initWithContactId:(NSString *)contactId; diff --git a/SignalUtilitiesKit/Threads/TSContactThread.m b/SessionMessagingKit/Threads/TSContactThread.m similarity index 83% rename from SignalUtilitiesKit/Threads/TSContactThread.m rename to SessionMessagingKit/Threads/TSContactThread.m index 93efedf57..f97ab07be 100644 --- a/SignalUtilitiesKit/Threads/TSContactThread.m +++ b/SessionMessagingKit/Threads/TSContactThread.m @@ -3,12 +3,9 @@ // #import "TSContactThread.h" -#import "NotificationsProtocol.h" -#import "OWSIdentityManager.h" -#import "SSKEnvironment.h" -#import -#import -#import +#import +#import +#import NS_ASSUME_NONNULL_BEGIN @@ -19,19 +16,13 @@ NSString *const TSContactThreadPrefix = @"c"; - (instancetype)initWithContactId:(NSString *)contactId { NSString *uniqueIdentifier = [[self class] threadIdFromContactId:contactId]; - OWSAssertDebug(contactId.length > 0); - self = [super initWithUniqueId:uniqueIdentifier]; - _sessionRestorationStatus = SNSessionRestorationStatusNone; - return self; } + (instancetype)getOrCreateThreadWithContactId:(NSString *)contactId transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(contactId.length > 0); - TSContactThread *thread = [self fetchObjectWithUniqueID:[self threadIdFromContactId:contactId] transaction:transaction]; @@ -45,8 +36,6 @@ NSString *const TSContactThreadPrefix = @"c"; + (instancetype)getOrCreateThreadWithContactId:(NSString *)contactId { - OWSAssertDebug(contactId.length > 0); - __block TSContactThread *thread; [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { thread = [self getOrCreateThreadWithContactId:contactId transaction:transaction]; @@ -80,7 +69,7 @@ NSString *const TSContactThreadPrefix = @"c"; - (NSString *)name { - return [SSKEnvironment.shared.profileManager profileNameForRecipientWithID:self.contactIdentifier avoidingWriteTransaction:YES]; + return [SSKEnvironment.shared.profileManager profileNameForRecipientWithID:self.contactIdentifier avoidingWriteTransaction:YES] ?: self.contactIdentifier; } + (NSString *)threadIdFromContactId:(NSString *)contactId { diff --git a/SignalUtilitiesKit/Threads/TSGroupModel.h b/SessionMessagingKit/Threads/TSGroupModel.h similarity index 96% rename from SignalUtilitiesKit/Threads/TSGroupModel.h rename to SessionMessagingKit/Threads/TSGroupModel.h index 0855a2880..6467d216d 100644 --- a/SignalUtilitiesKit/Threads/TSGroupModel.h +++ b/SessionMessagingKit/Threads/TSGroupModel.h @@ -2,9 +2,8 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // +#import #import -#import - NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Threads/TSGroupModel.m b/SessionMessagingKit/Threads/TSGroupModel.m similarity index 97% rename from SignalUtilitiesKit/Threads/TSGroupModel.m rename to SessionMessagingKit/Threads/TSGroupModel.m index fac56262a..fbf20a269 100644 --- a/SignalUtilitiesKit/Threads/TSGroupModel.m +++ b/SessionMessagingKit/Threads/TSGroupModel.m @@ -3,10 +3,8 @@ // #import "TSGroupModel.h" -#import "FunctionalUtil.h" -#import "NSString+SSK.h" -#import -#import "OWSIdentityManager.h" +#import +#import NS_ASSUME_NONNULL_BEGIN @@ -30,8 +28,6 @@ const int32_t kGroupIdLength = 16; groupType:(GroupType)groupType adminIds:(NSArray *)adminIds { - OWSAssertDebug(memberIds); - _groupName = title; _groupMemberIds = [memberIds copy]; _groupImage = image; // image is stored in DB diff --git a/SignalUtilitiesKit/Threads/TSGroupThread.h b/SessionMessagingKit/Threads/TSGroupThread.h similarity index 94% rename from SignalUtilitiesKit/Threads/TSGroupThread.h rename to SessionMessagingKit/Threads/TSGroupThread.h index 7abf873f3..452ef5550 100644 --- a/SignalUtilitiesKit/Threads/TSGroupThread.h +++ b/SessionMessagingKit/Threads/TSGroupThread.h @@ -2,9 +2,8 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import -#import -#import +#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Threads/TSGroupThread.m b/SessionMessagingKit/Threads/TSGroupThread.m similarity index 88% rename from SignalUtilitiesKit/Threads/TSGroupThread.m rename to SessionMessagingKit/Threads/TSGroupThread.m index ba2d23403..bf80e185f 100644 --- a/SignalUtilitiesKit/Threads/TSGroupThread.m +++ b/SessionMessagingKit/Threads/TSGroupThread.m @@ -5,11 +5,10 @@ #import "TSGroupThread.h" #import "TSAttachmentStream.h" #import -#import -#import -#import -#import -#import "OWSPrimaryStorage.h" +#import +#import +#import +#import NS_ASSUME_NONNULL_BEGIN @@ -22,14 +21,6 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific - (instancetype)initWithGroupModel:(TSGroupModel *)groupModel { - OWSAssertDebug(groupModel); - OWSAssertDebug(groupModel.groupId.length > 0); - OWSAssertDebug(groupModel.groupMemberIds.count > 0); - - for (NSString *recipientId in groupModel.groupMemberIds) { - OWSAssertDebug(recipientId.length > 0); - } - NSString *uniqueIdentifier = [[self class] threadIdFromGroupId:groupModel.groupId]; self = [super initWithUniqueId:uniqueIdentifier]; @@ -44,10 +35,7 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific - (instancetype)initWithGroupId:(NSData *)groupId groupType:(GroupType)groupType { - OWSAssertDebug(groupId.length > 0); - NSString *localNumber = [TSAccountManager localNumber]; - OWSAssertDebug(localNumber.length > 0); TSGroupModel *groupModel = [[TSGroupModel alloc] initWithTitle:nil memberIds:@[ localNumber ] @@ -67,8 +55,6 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific + (nullable instancetype)threadWithGroupId:(NSData *)groupId transaction:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(groupId.length > 0); - return [self fetchObjectWithUniqueID:[self threadIdFromGroupId:groupId] transaction:transaction]; } @@ -76,9 +62,6 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific groupType:(GroupType)groupType transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(groupId.length > 0); - OWSAssertDebug(transaction); - TSGroupThread *thread = [self fetchObjectWithUniqueID:[self threadIdFromGroupId:groupId] transaction:transaction]; if (!thread) { @@ -91,8 +74,6 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific + (instancetype)getOrCreateThreadWithGroupId:(NSData *)groupId groupType:(GroupType)groupType { - OWSAssertDebug(groupId.length > 0); - __block TSGroupThread *thread; [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { @@ -104,10 +85,6 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific + (instancetype)getOrCreateThreadWithGroupModel:(TSGroupModel *)groupModel transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(groupModel); - OWSAssertDebug(groupModel.groupId.length > 0); - OWSAssertDebug(transaction); - TSGroupThread *thread = [self fetchObjectWithUniqueID:[self threadIdFromGroupId:groupModel.groupId] transaction:transaction]; @@ -121,9 +98,6 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific + (instancetype)getOrCreateThreadWithGroupModel:(TSGroupModel *)groupModel { - OWSAssertDebug(groupModel); - OWSAssertDebug(groupModel.groupId.length > 0); - __block TSGroupThread *thread; [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { @@ -135,15 +109,11 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific + (NSString *)threadIdFromGroupId:(NSData *)groupId { - OWSAssertDebug(groupId.length > 0); - return [TSGroupThreadPrefix stringByAppendingString:[[LKGroupUtilities getDecodedGroupIDAsData:groupId] base64EncodedString]]; } + (NSData *)groupIdFromThreadId:(NSString *)threadId { - OWSAssertDebug(threadId.length > 0); - return [NSData dataFromBase64String:[threadId substringWithRange:NSMakeRange(1, threadId.length - 1)]]; } @@ -167,9 +137,6 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific + (NSArray *)groupThreadsWithRecipientId:(NSString *)recipientId transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(recipientId.length > 0); - OWSAssertDebug(transaction); - NSMutableArray *groupThreads = [NSMutableArray new]; [self enumerateCollectionObjectsWithTransaction:transaction usingBlock:^(id obj, BOOL *stop) { @@ -276,9 +243,6 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific - (void)updateAvatarWithAttachmentStream:(TSAttachmentStream *)attachmentStream transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(attachmentStream); - OWSAssertDebug(transaction); - self.groupModel.groupImage = [attachmentStream thumbnailImageSmallSync]; [self saveWithTransaction:transaction]; @@ -294,8 +258,6 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific - (void)fireAvatarChangedNotification { - OWSAssertIsOnMainThread(); - NSDictionary *userInfo = @{ TSGroupThread_NotificationKey_UniqueId : self.uniqueId }; [[NSNotificationCenter defaultCenter] postNotificationName:TSGroupThreadAvatarChangedNotification diff --git a/SignalUtilitiesKit/Threads/TSThread.h b/SessionMessagingKit/Threads/TSThread.h similarity index 100% rename from SignalUtilitiesKit/Threads/TSThread.h rename to SessionMessagingKit/Threads/TSThread.h diff --git a/SignalUtilitiesKit/Threads/TSThread.m b/SessionMessagingKit/Threads/TSThread.m similarity index 90% rename from SignalUtilitiesKit/Threads/TSThread.m rename to SessionMessagingKit/Threads/TSThread.m index a142b4805..11fca049e 100644 --- a/SignalUtilitiesKit/Threads/TSThread.m +++ b/SessionMessagingKit/Threads/TSThread.m @@ -3,22 +3,13 @@ // #import "TSThread.h" -#import "NSString+SSK.h" #import "OWSDisappearingMessagesConfiguration.h" -#import "OWSPrimaryStorage.h" -#import "OWSReadTracking.h" -#import "SSKEnvironment.h" -#import "TSAccountManager.h" -#import "TSDatabaseView.h" -#import "TSIncomingMessage.h" -#import "TSInfoMessage.h" -#import "TSInteraction.h" -#import "TSInvalidIdentityKeyReceivingErrorMessage.h" -#import "TSOutgoingMessage.h" #import #import -#import +#import #import +#import +#import NS_ASSUME_NONNULL_BEGIN @@ -50,8 +41,6 @@ BOOL IsNoteToSelfEnabled(void) - (TSAccountManager *)tsAccountManager { - OWSAssertDebug(SSKEnvironment.shared.tsAccountManager); - return SSKEnvironment.shared.tsAccountManager; } @@ -120,13 +109,10 @@ BOOL IsNoteToSelfEnabled(void) // or when deleting them. NSMutableArray *interactionIds = [NSMutableArray new]; YapDatabaseViewTransaction *interactionsByThread = [transaction ext:TSMessageDatabaseViewExtensionName]; - OWSAssertDebug(interactionsByThread); __block BOOL didDetectCorruption = NO; [interactionsByThread enumerateKeysInGroup:self.uniqueId usingBlock:^(NSString *collection, NSString *key, NSUInteger index, BOOL *stop) { if (![key isKindOfClass:[NSString class]] || key.length < 1) { - OWSFailDebug( - @"invalid key in thread interactions: %@, %@.", key, [key class]); didDetectCorruption = YES; return; } @@ -134,7 +120,6 @@ BOOL IsNoteToSelfEnabled(void) }]; if (didDetectCorruption) { - OWSLogWarn(@"incrementing version of: %@", TSMessageDatabaseViewExtensionName); [OWSPrimaryStorage incrementVersionOfDatabaseExtension:TSMessageDatabaseViewExtensionName]; } @@ -143,7 +128,6 @@ BOOL IsNoteToSelfEnabled(void) TSInteraction *_Nullable interaction = [TSInteraction fetchObjectWithUniqueID:interactionId transaction:transaction]; if (!interaction) { - OWSFailDebug(@"couldn't load thread's interaction for deletion."); continue; } [interaction removeWithTransaction:transaction]; @@ -160,8 +144,6 @@ BOOL IsNoteToSelfEnabled(void) #pragma mark - To be subclassed. - (BOOL)isGroupThread { - OWSAbstractMethod(); - return NO; } @@ -172,15 +154,11 @@ BOOL IsNoteToSelfEnabled(void) } - (NSString *)name { - OWSAbstractMethod(); - return nil; } - (NSArray *)recipientIdentifiers { - OWSAbstractMethod(); - return @[]; } @@ -259,7 +237,7 @@ BOOL IsNoteToSelfEnabled(void) [errorMessages addObject:(TSInvalidIdentityKeyReceivingErrorMessage *)interaction]; } } @catch (NSException *exception) { - OWSFailDebug(@"exception: %@", exception); + } } }]; @@ -285,7 +263,6 @@ BOOL IsNoteToSelfEnabled(void) enumerateKeysAndObjectsInGroup:self.uniqueId usingBlock:^(NSString *collection, NSString *key, id object, NSUInteger index, BOOL *stop) { if (![object conformsToProtocol:@protocol(OWSReadTracking)]) { - OWSFailDebug(@"Unexpected object in unseen messages: %@", [object class]); return; } id unread = (id)object; @@ -307,7 +284,6 @@ BOOL IsNoteToSelfEnabled(void) [unreadMessages enumerateKeysAndObjectsInGroup:self.uniqueId usingBlock:^(NSString *collection, NSString *key, id object, NSUInteger index, BOOL *stop) { if (![object conformsToProtocol:@protocol(OWSReadTracking)]) { - OWSFailDebug(@"Unexpected object in unread messages: %@", [object class]); return; } id unread = (id)object; @@ -326,23 +302,16 @@ BOOL IsNoteToSelfEnabled(void) for (id message in [self unseenMessagesWithTransaction:transaction]) { [message markAsReadAtTimestamp:[NSDate ows_millisecondTimeStamp] sendReadReceipt:YES transaction:transaction]; } - - // Just to be defensive, we'll also check for unread messages. - OWSAssertDebug([self unseenMessagesWithTransaction:transaction].count < 1); } - (nullable TSInteraction *)lastInteractionForInboxWithTransaction:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(transaction); - __block NSUInteger missedCount = 0; __block TSInteraction *last = nil; [[transaction ext:TSMessageDatabaseViewExtensionName] enumerateKeysAndObjectsInGroup:self.uniqueId withOptions:NSEnumerationReverse usingBlock:^(NSString *collection, NSString *key, id object, NSUInteger index, BOOL *stop) { - OWSAssertDebug([object isKindOfClass:[TSInteraction class]]); - missedCount++; TSInteraction *interaction = (TSInteraction *)object; @@ -354,10 +323,7 @@ BOOL IsNoteToSelfEnabled(void) // members who's test devices are constantly reinstalled. We could add a // purpose-built DB view, but I think in the real world this is rare to be a // hotspot. - if (missedCount > 50) { - OWSLogWarn(@"found last interaction for inbox after skipping %lu items", - (unsigned long)missedCount); - } + *stop = YES; } }]; @@ -378,8 +344,6 @@ BOOL IsNoteToSelfEnabled(void) // Returns YES IFF the interaction should show up in the inbox as the last message. + (BOOL)shouldInteractionAppearInInbox:(TSInteraction *)interaction { - OWSAssertDebug(interaction); - if (interaction.isDynamicInteraction) { return NO; } @@ -397,9 +361,6 @@ BOOL IsNoteToSelfEnabled(void) } - (void)updateWithLastMessage:(TSInteraction *)lastMessage transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(lastMessage); - OWSAssertDebug(transaction); - if (![self.class shouldInteractionAppearInInbox:lastMessage]) { return; } diff --git a/SignalUtilitiesKit/To Do/DisplayNameUtilities.swift b/SessionMessagingKit/To Do/DisplayNameUtilities.swift similarity index 100% rename from SignalUtilitiesKit/To Do/DisplayNameUtilities.swift rename to SessionMessagingKit/To Do/DisplayNameUtilities.swift diff --git a/SignalUtilitiesKit/OWSRecipientIdentity.h b/SessionMessagingKit/To Do/OWSRecipientIdentity.h similarity index 97% rename from SignalUtilitiesKit/OWSRecipientIdentity.h rename to SessionMessagingKit/To Do/OWSRecipientIdentity.h index fec840379..18f225156 100644 --- a/SignalUtilitiesKit/OWSRecipientIdentity.h +++ b/SessionMessagingKit/To Do/OWSRecipientIdentity.h @@ -46,10 +46,6 @@ SNProtoVerified *_Nullable BuildVerifiedProtoWithRecipientId(NSString *destinati createdAt:(NSDate *)createdAt verificationState:(OWSVerificationState)verificationState NS_DESIGNATED_INITIALIZER; -#pragma mark - debug - -+ (void)printAllIdentities; - @end NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/OWSRecipientIdentity.m b/SessionMessagingKit/To Do/OWSRecipientIdentity.m similarity index 81% rename from SignalUtilitiesKit/OWSRecipientIdentity.m rename to SessionMessagingKit/To Do/OWSRecipientIdentity.m index 55bd13414..31ed11171 100644 --- a/SignalUtilitiesKit/OWSRecipientIdentity.m +++ b/SessionMessagingKit/To Do/OWSRecipientIdentity.m @@ -4,10 +4,9 @@ #import "OWSRecipientIdentity.h" #import "OWSIdentityManager.h" -#import "OWSPrimaryStorage+SessionStore.h" #import "OWSPrimaryStorage.h" #import -#import +#import #import NS_ASSUME_NONNULL_BEGIN @@ -41,11 +40,6 @@ SNProtoVerified *_Nullable BuildVerifiedProtoWithRecipientId(NSString *destinati OWSVerificationState verificationState, NSUInteger paddingBytesLength) { - OWSCAssertDebug(identityKey.length == kIdentityKeyLength); - OWSCAssertDebug(destinationRecipientId.length > 0); - // we only sync user's marking as un/verified. Never sync the conflicted state, the sibling device - // will figure that out on it's own. - OWSCAssertDebug(verificationState != OWSVerificationStateNoLongerVerified); SNProtoVerifiedBuilder *verifiedBuilder = [SNProtoVerified builderWithDestination:destinationRecipientId]; verifiedBuilder.identityKey = identityKey; @@ -63,7 +57,6 @@ SNProtoVerified *_Nullable BuildVerifiedProtoWithRecipientId(NSString *destinati NSError *error; SNProtoVerified *_Nullable verifiedProto = [verifiedBuilder buildAndReturnError:&error]; if (error || !verifiedProto) { - OWSCFailDebug(@"%@ could not build protobuf: %@", @"[BuildVerifiedProtoWithRecipientId]", error); return nil; } return verifiedProto; @@ -119,8 +112,6 @@ SNProtoVerified *_Nullable BuildVerifiedProtoWithRecipientId(NSString *destinati - (void)updateWithVerificationState:(OWSVerificationState)verificationState transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - // Ensure changes are persisted without clobbering any work done on another thread or instance. [self updateWithChangeBlock:^(OWSRecipientIdentity *_Nonnull obj) { obj.verificationState = verificationState; @@ -131,8 +122,6 @@ SNProtoVerified *_Nullable BuildVerifiedProtoWithRecipientId(NSString *destinati - (void)updateWithChangeBlock:(void (^)(OWSRecipientIdentity *obj))changeBlock transaction:(YapDatabaseReadWriteTransaction *)transaction { - OWSAssertDebug(transaction); - changeBlock(self); OWSRecipientIdentity *latest = [[self class] fetchObjectWithUniqueID:self.uniqueId transaction:transaction]; @@ -161,24 +150,6 @@ SNProtoVerified *_Nullable BuildVerifiedProtoWithRecipientId(NSString *destinati }]; } -#pragma mark - debug - -+ (void)printAllIdentities -{ - OWSLogInfo(@"### All Recipient Identities ###"); - __block int count = 0; - [self enumerateCollectionObjectsUsingBlock:^(id obj, BOOL *stop) { - count++; - if (![obj isKindOfClass:[self class]]) { - OWSFailDebug(@"unexpected object in collection: %@", obj); - return; - } - OWSRecipientIdentity *recipientIdentity = (OWSRecipientIdentity *)obj; - - OWSLogInfo(@"Identity %d: %@", count, recipientIdentity.debugDescription); - }]; -} - @end NS_ASSUME_NONNULL_END diff --git a/SessionMessagingKit/To Do/OWSUDManager.swift b/SessionMessagingKit/To Do/OWSUDManager.swift new file mode 100644 index 000000000..6a8f4226a --- /dev/null +++ b/SessionMessagingKit/To Do/OWSUDManager.swift @@ -0,0 +1,71 @@ + +@objc +public enum UnidentifiedAccessMode: Int { + case unknown + case enabled + case disabled + case unrestricted +} + +@objc +public class OWSUDAccess: NSObject { + @objc + public let udAccessKey: SMKUDAccessKey + + @objc + public let udAccessMode: UnidentifiedAccessMode + + @objc + public let isRandomKey: Bool + + @objc + public required init(udAccessKey: SMKUDAccessKey, + udAccessMode: UnidentifiedAccessMode, + isRandomKey: Bool) { + self.udAccessKey = udAccessKey + self.udAccessMode = udAccessMode + self.isRandomKey = isRandomKey + } +} + +@objc public protocol OWSUDManager: class { + + @objc func setup() + + @objc func trustRoot() -> ECPublicKey + + @objc func isUDVerboseLoggingEnabled() -> Bool + + // MARK: - Recipient State + + @objc + func setUnidentifiedAccessMode(_ mode: UnidentifiedAccessMode, recipientId: String) + + @objc + func unidentifiedAccessMode(forRecipientId recipientId: String) -> UnidentifiedAccessMode + + @objc + func udAccessKey(forRecipientId recipientId: String) -> SMKUDAccessKey? + + @objc + func udAccess(forRecipientId recipientId: String, + requireSyncAccess: Bool) -> OWSUDAccess? + + // MARK: Sender Certificate + + // We use completion handlers instead of a promise so that message sending + // logic can access the strongly typed certificate data. + @objc + func ensureSenderCertificate(success:@escaping (SMKSenderCertificate) -> Void, + failure:@escaping (Error) -> Void) + + // MARK: Unrestricted Access + + @objc + func shouldAllowUnrestrictedAccessLocal() -> Bool + @objc + func setShouldAllowUnrestrictedAccessLocal(_ value: Bool) + + @objc + func getSenderCertificate() -> SMKSenderCertificate? +} diff --git a/SignalUtilitiesKit/To Do/ProfileManagerProtocol.h b/SessionMessagingKit/To Do/ProfileManagerProtocol.h similarity index 100% rename from SignalUtilitiesKit/To Do/ProfileManagerProtocol.h rename to SessionMessagingKit/To Do/ProfileManagerProtocol.h diff --git a/SignalUtilitiesKit/TSAccountManager.h b/SessionMessagingKit/To Do/TSAccountManager.h similarity index 99% rename from SignalUtilitiesKit/TSAccountManager.h rename to SessionMessagingKit/To Do/TSAccountManager.h index 979c9526f..d660f5801 100644 --- a/SignalUtilitiesKit/TSAccountManager.h +++ b/SessionMessagingKit/To Do/TSAccountManager.h @@ -2,7 +2,7 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/TSAccountManager.m b/SessionMessagingKit/To Do/TSAccountManager.m similarity index 99% rename from SignalUtilitiesKit/TSAccountManager.m rename to SessionMessagingKit/To Do/TSAccountManager.m index 4114a65fb..e30b00917 100644 --- a/SignalUtilitiesKit/TSAccountManager.m +++ b/SessionMessagingKit/To Do/TSAccountManager.m @@ -9,10 +9,8 @@ #import "NSURLSessionDataTask+StatusCode.h" #import "OWSError.h" #import "OWSPrimaryStorage+SessionStore.h" - #import "ProfileManagerProtocol.h" #import "SSKEnvironment.h" - #import "TSPreKeyManager.h" #import "YapDatabaseConnection+OWS.h" #import "YapDatabaseTransaction+OWS.h" @@ -20,7 +18,7 @@ #import #import #import -#import +#import #import #import "SSKAsserts.h" diff --git a/SignalUtilitiesKit/AppReadiness.h b/SessionMessagingKit/Utilities/AppReadiness.h similarity index 100% rename from SignalUtilitiesKit/AppReadiness.h rename to SessionMessagingKit/Utilities/AppReadiness.h diff --git a/SignalUtilitiesKit/AppReadiness.m b/SessionMessagingKit/Utilities/AppReadiness.m similarity index 97% rename from SignalUtilitiesKit/AppReadiness.m rename to SessionMessagingKit/Utilities/AppReadiness.m index 4424e177e..7370141b1 100755 --- a/SignalUtilitiesKit/AppReadiness.m +++ b/SessionMessagingKit/Utilities/AppReadiness.m @@ -5,6 +5,8 @@ #import "AppReadiness.h" #import "AppContext.h" #import "SSKAsserts.h" +#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/FullTextSearchFinder.swift b/SessionMessagingKit/Utilities/FullTextSearchFinder.swift similarity index 97% rename from SignalUtilitiesKit/FullTextSearchFinder.swift rename to SessionMessagingKit/Utilities/FullTextSearchFinder.swift index c12258a1a..83ff10ea8 100644 --- a/SignalUtilitiesKit/FullTextSearchFinder.swift +++ b/SessionMessagingKit/Utilities/FullTextSearchFinder.swift @@ -3,7 +3,6 @@ // import Foundation -import libPhoneNumber_iOS // Create a searchable index for objects of type T public class SearchIndexer { @@ -88,14 +87,11 @@ public class FullTextSearchFinder: NSObject { public func enumerateObjects(searchText: String, transaction: YapDatabaseReadTransaction, block: @escaping (Any, String) -> Void) { guard let ext: YapDatabaseFullTextSearchTransaction = ext(transaction: transaction) else { - owsFailDebug("ext was unexpectedly nil") return } let query = FullTextSearchFinder.query(searchText: searchText) - Logger.verbose("query: \(query)") - let maxSearchResults = 500 var searchResultCount = 0 let snippetOptions = YapDatabaseFullTextSearchSnippetOptions() @@ -206,8 +202,6 @@ public class FullTextSearchFinder: NSObject { return self.contactThreadIndexer.index(contactThread, transaction: transaction) } else if let message = object as? TSMessage { return self.messageIndexer.index(message, transaction: transaction) - } else if let signalAccount = object as? SignalAccount { - return self.recipientIndexer.index(signalAccount.recipientId, transaction: transaction) } else { return nil } @@ -236,8 +230,6 @@ public class FullTextSearchFinder: NSObject { } private class var dbExtensionConfig: YapDatabaseFullTextSearch { - AssertIsOnMainThread() - let contentColumnName = "content" let handler = YapDatabaseFullTextSearchHandler.withObjectBlock { (transaction: YapDatabaseReadTransaction, dict: NSMutableDictionary, _: String, _: String, object: Any) in diff --git a/SignalUtilitiesKit/Utilities/GeneralUtilities.swift b/SessionMessagingKit/Utilities/GeneralUtilities.swift similarity index 100% rename from SignalUtilitiesKit/Utilities/GeneralUtilities.swift rename to SessionMessagingKit/Utilities/GeneralUtilities.swift diff --git a/SignalUtilitiesKit/OWSBackgroundTask.h b/SessionMessagingKit/Utilities/OWSBackgroundTask.h similarity index 100% rename from SignalUtilitiesKit/OWSBackgroundTask.h rename to SessionMessagingKit/Utilities/OWSBackgroundTask.h diff --git a/SignalUtilitiesKit/OWSBackgroundTask.m b/SessionMessagingKit/Utilities/OWSBackgroundTask.m similarity index 93% rename from SignalUtilitiesKit/OWSBackgroundTask.m rename to SessionMessagingKit/Utilities/OWSBackgroundTask.m index b9d8b17cc..cd14f1b5f 100644 --- a/SignalUtilitiesKit/OWSBackgroundTask.m +++ b/SessionMessagingKit/Utilities/OWSBackgroundTask.m @@ -5,7 +5,8 @@ #import "OWSBackgroundTask.h" #import "AppContext.h" #import -#import "SSKAsserts.h" +#import +#import NS_ASSUME_NONNULL_BEGIN @@ -55,8 +56,6 @@ typedef NSNumber *OWSTaskId; - (instancetype)initDefault { - OWSAssertIsOnMainThread(); - self = [super init]; if (!self) { @@ -68,8 +67,6 @@ typedef NSNumber *OWSTaskId; self.idCounter = 0; self.isAppActive = CurrentAppContext().isMainAppAndActive; - OWSSingletonAssert(); - return self; } @@ -95,8 +92,6 @@ typedef NSNumber *OWSTaskId; - (void)applicationDidBecomeActive:(UIApplication *)application { - OWSAssertIsOnMainThread(); - @synchronized(self) { self.isAppActive = YES; @@ -107,8 +102,6 @@ typedef NSNumber *OWSTaskId; - (void)applicationWillResignActive:(UIApplication *)application { - OWSAssertIsOnMainThread(); - @synchronized(self) { self.isAppActive = NO; @@ -126,8 +119,6 @@ typedef NSNumber *OWSTaskId; // In that case expirationBlock will not be called. - (nullable OWSTaskId)addTaskWithExpirationBlock:(BackgroundTaskExpirationBlock)expirationBlock { - OWSAssertDebug(expirationBlock); - OWSTaskId _Nullable taskId; @synchronized(self) @@ -150,12 +141,8 @@ typedef NSNumber *OWSTaskId; - (void)removeTask:(OWSTaskId)taskId { - OWSAssertDebug(taskId); - @synchronized(self) { - OWSAssertDebug(self.expirationMap[taskId] != nil); - [self.expirationMap removeObjectForKey:taskId]; // This timer will ensure that we keep the background task active (if necessary) @@ -196,11 +183,9 @@ typedef NSNumber *OWSTaskId; // Current state is correct. return YES; } else if (shouldHaveBackgroundTask) { - OWSLogInfo(@"Starting background task."); return [self startBackgroundTask]; } else { // Need to end background task. - OWSLogInfo(@"Ending background task."); UIBackgroundTaskIdentifier backgroundTaskId = self.backgroundTaskId; self.backgroundTaskId = UIBackgroundTaskInvalid; [CurrentAppContext() endBackgroundTask:backgroundTaskId]; @@ -212,12 +197,8 @@ typedef NSNumber *OWSTaskId; // Returns NO if the background task cannot be begun. - (BOOL)startBackgroundTask { - OWSAssertDebug(CurrentAppContext().isMainApp); - @synchronized(self) { - OWSAssertDebug(self.backgroundTaskId == UIBackgroundTaskInvalid); - self.backgroundTaskId = [CurrentAppContext() beginBackgroundTaskWithExpirationHandler:^{ // Supposedly [UIApplication beginBackgroundTaskWithExpirationHandler]'s handler // will always be called on the main thread, but in practice we've observed @@ -225,15 +206,12 @@ typedef NSNumber *OWSTaskId; // // See: // https://developer.apple.com/documentation/uikit/uiapplication/1623031-beginbackgroundtaskwithexpiratio) - OWSAssertDebug([NSThread isMainThread]); [self backgroundTaskExpired]; }]; // If the background task could not begin, return NO to indicate that. if (self.backgroundTaskId == UIBackgroundTaskInvalid) { - OWSLogError(@"background task could not be started."); - return NO; } return YES; @@ -304,8 +282,6 @@ typedef NSNumber *OWSTaskId; + (OWSBackgroundTask *)backgroundTaskWithLabelStr:(const char *)labelStr { - OWSAssertDebug(labelStr); - NSString *label = [NSString stringWithFormat:@"%s", labelStr]; return [[OWSBackgroundTask alloc] initWithLabel:label completionBlock:nil]; } @@ -314,8 +290,6 @@ typedef NSNumber *OWSTaskId; completionBlock:(BackgroundTaskCompletionBlock)completionBlock { - OWSAssertDebug(labelStr); - NSString *label = [NSString stringWithFormat:@"%s", labelStr]; return [[OWSBackgroundTask alloc] initWithLabel:label completionBlock:completionBlock]; } @@ -339,8 +313,6 @@ typedef NSNumber *OWSTaskId; return self; } - OWSAssertDebug(label.length > 0); - _label = label; self.completionBlock = completionBlock; @@ -363,7 +335,6 @@ typedef NSNumber *OWSTaskId; if (!strongSelf) { return; } - OWSLogVerbose(@"task expired"); // Make a local copy of completionBlock to ensure that it is called // exactly once. @@ -374,7 +345,6 @@ typedef NSNumber *OWSTaskId; if (!strongSelf.taskId) { return; } - OWSLogInfo(@"%@ background task expired.", strongSelf.label); strongSelf.taskId = nil; completionBlock = strongSelf.completionBlock; @@ -389,7 +359,6 @@ typedef NSNumber *OWSTaskId; // If a background task could not be begun, call the completion block. if (!self.taskId) { - OWSLogError(@"%@ background task could not be started.", self.label); // Make a local copy of completionBlock to ensure that it is called // exactly once. diff --git a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesFinder.h b/SessionMessagingKit/Utilities/OWSDisappearingMessagesFinder.h similarity index 100% rename from SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesFinder.h rename to SessionMessagingKit/Utilities/OWSDisappearingMessagesFinder.h diff --git a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesFinder.m b/SessionMessagingKit/Utilities/OWSDisappearingMessagesFinder.m similarity index 91% rename from SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesFinder.m rename to SessionMessagingKit/Utilities/OWSDisappearingMessagesFinder.m index 7cb3b7d47..3cd9f7518 100644 --- a/SignalUtilitiesKit/Messaging/Disappearing Messages/OWSDisappearingMessagesFinder.m +++ b/SessionMessagingKit/Utilities/OWSDisappearingMessagesFinder.m @@ -25,8 +25,6 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess - (NSArray *)fetchUnstartedExpiringMessageIdsInThread:(TSThread *)thread transaction:(YapDatabaseReadTransaction *_Nonnull)transaction { - OWSAssertDebug(transaction); - NSMutableArray *messageIds = [NSMutableArray new]; NSString *formattedString = [NSString stringWithFormat:@"WHERE %@ = 0 AND %@ = \"%@\"", OWSDisappearingMessageFinderExpiresAtColumn, @@ -45,8 +43,6 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess - (NSArray *)fetchMessageIdsWhichFailedToStartExpiring:(YapDatabaseReadTransaction *_Nonnull)transaction { - OWSAssertDebug(transaction); - NSMutableArray *messageIds = [NSMutableArray new]; NSString *formattedString = [NSString stringWithFormat:@"WHERE %@ = 0", OWSDisappearingMessageFinderExpiresAtColumn]; @@ -56,13 +52,9 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess enumerateKeysAndObjectsMatchingQuery:query usingBlock:^void(NSString *collection, NSString *key, id object, BOOL *stop) { if (![object isKindOfClass:[TSMessage class]]) { - OWSFailDebug(@"Object was unexpected class: %@", [object class]); return; } - // We'll need to update if we ever support expiring other message types - OWSAssertDebug([object isKindOfClass:[TSOutgoingMessage class]] || [object isKindOfClass:[TSIncomingMessage class]]); - TSMessage *message = (TSMessage *)object; if ([message shouldStartExpireTimerWithTransaction:transaction]) { if ([message isKindOfClass:[TSIncomingMessage class]]) { @@ -80,8 +72,6 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess - (NSArray *)fetchExpiredMessageIdsWithTransaction:(YapDatabaseReadTransaction *_Nonnull)transaction { - OWSAssertDebug(transaction); - NSMutableArray *messageIds = [NSMutableArray new]; uint64_t now = [NSDate ows_millisecondTimeStamp]; @@ -102,8 +92,6 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess - (nullable NSNumber *)nextExpirationTimestampWithTransaction:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(transaction); - NSString *formattedString = [NSString stringWithFormat:@"WHERE %@ > 0 ORDER BY %@ ASC", OWSDisappearingMessageFinderExpiresAtColumn, OWSDisappearingMessageFinderExpiresAtColumn]; @@ -128,15 +116,11 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess block:(void (^_Nonnull)(TSMessage *message))block transaction:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(transaction); - for (NSString *expiringMessageId in [self fetchUnstartedExpiringMessageIdsInThread:thread transaction:transaction]) { TSMessage *_Nullable message = [TSMessage fetchObjectWithUniqueID:expiringMessageId transaction:transaction]; if ([message isKindOfClass:[TSMessage class]]) { block(message); - } else { - OWSFailDebug(@"unexpected object: %@", [message class]); } } } @@ -144,18 +128,14 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess - (void)enumerateMessagesWhichFailedToStartExpiringWithBlock:(void (^_Nonnull)(TSMessage *message))block transaction:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(transaction); - for (NSString *expiringMessageId in [self fetchMessageIdsWhichFailedToStartExpiring:transaction]) { TSMessage *_Nullable message = [TSMessage fetchObjectWithUniqueID:expiringMessageId transaction:transaction]; if (![message isKindOfClass:[TSMessage class]]) { - OWSFailDebug(@"unexpected object: %@", [message class]); continue; } if (![message shouldStartExpireTimerWithTransaction:transaction]) { - OWSFailDebug(@"object: %@ shouldn't expire.", message); continue; } @@ -170,8 +150,6 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess - (NSArray *)fetchUnstartedExpiringMessagesInThread:(TSThread *)thread transaction:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(transaction); - NSMutableArray *messages = [NSMutableArray new]; [self enumerateUnstartedExpiringMessagesInThread:thread block:^(TSMessage *message) { @@ -186,16 +164,12 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess - (void)enumerateExpiredMessagesWithBlock:(void (^_Nonnull)(TSMessage *message))block transaction:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(transaction); - // Since we can't directly mutate the enumerated expired messages, we store only their ids in hopes of saving a // little memory and then enumerate the (larger) TSMessage objects one at a time. for (NSString *expiredMessageId in [self fetchExpiredMessageIdsWithTransaction:transaction]) { TSMessage *_Nullable message = [TSMessage fetchObjectWithUniqueID:expiredMessageId transaction:transaction]; if ([message isKindOfClass:[TSMessage class]]) { block(message); - } else { - OWSLogError(@"unexpected object: %@", message); } } } @@ -206,8 +180,6 @@ static NSString *const OWSDisappearingMessageFinderExpiresAtIndex = @"index_mess */ - (NSArray *)fetchExpiredMessagesWithTransaction:(YapDatabaseReadTransaction *)transaction { - OWSAssertDebug(transaction); - NSMutableArray *messages = [NSMutableArray new]; [self enumerateExpiredMessagesWithBlock:^(TSMessage *message) { [messages addObject:message]; diff --git a/SignalUtilitiesKit/OWSIdentityManager.h b/SessionMessagingKit/Utilities/OWSIdentityManager.h similarity index 89% rename from SignalUtilitiesKit/OWSIdentityManager.h rename to SessionMessagingKit/Utilities/OWSIdentityManager.h index 149362b9a..cb7a23c72 100644 --- a/SignalUtilitiesKit/OWSIdentityManager.h +++ b/SessionMessagingKit/Utilities/OWSIdentityManager.h @@ -2,8 +2,10 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import #import +#import + +@class OWSPrimaryStorage; NS_ASSUME_NONNULL_BEGIN @@ -53,10 +55,6 @@ extern const NSUInteger kStoredIdentityKeyLength; */ - (nullable OWSRecipientIdentity *)untrustedIdentityForSendingToRecipientId:(NSString *)recipientId; -// This method can be called from any thread. -- (void)throws_processIncomingSyncMessage:(SNProtoVerified *)verified - transaction:(YapDatabaseReadWriteTransaction *)transaction; - - (BOOL)saveRemoteIdentity:(NSData *)identityKey recipientId:(NSString *)recipientId; - (nullable ECKeyPair *)identityKeyPair; diff --git a/SignalUtilitiesKit/OWSIdentityManager.m b/SessionMessagingKit/Utilities/OWSIdentityManager.m similarity index 56% rename from SignalUtilitiesKit/OWSIdentityManager.m rename to SessionMessagingKit/Utilities/OWSIdentityManager.m index 46651537e..a2031410c 100644 --- a/SignalUtilitiesKit/OWSIdentityManager.m +++ b/SessionMessagingKit/Utilities/OWSIdentityManager.m @@ -22,7 +22,7 @@ #import #import #import -#import +#import #import #import "SSKAsserts.h" @@ -225,9 +225,6 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa verificationState:OWSVerificationStateDefault] saveWithTransaction:transaction]; - // Cancel any pending verification state sync messages for this recipient. - [self clearSyncMessageForRecipientId:recipientId transaction:transaction]; - [self fireIdentityStateChangeNotification]; return NO; @@ -249,7 +246,6 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa recipientId, OWSVerificationStateToString(existingIdentity.verificationState), OWSVerificationStateToString(verificationState)); - [self createIdentityChangeInfoMessageForRecipientId:recipientId transaction:transaction]; [[[OWSRecipientIdentity alloc] initWithRecipientId:recipientId identityKey:identityKey @@ -259,9 +255,6 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa [self.primaryStorage archiveAllSessionsForContact:recipientId protocolContext:protocolContext]; - // Cancel any pending verification state sync messages for this recipient. - [self clearSyncMessageForRecipientId:recipientId transaction:transaction]; - [self fireIdentityStateChangeNotification]; return YES; @@ -407,286 +400,6 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa } } -- (void)createIdentityChangeInfoMessageForRecipientId:(NSString *)recipientId - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(recipientId.length > 0); - OWSAssertDebug(transaction); - - NSMutableArray *messages = [NSMutableArray new]; - - TSContactThread *contactThread = - [TSContactThread getOrCreateThreadWithContactId:recipientId transaction:transaction]; - OWSAssertDebug(contactThread != nil); - - TSErrorMessage *errorMessage = - [TSErrorMessage nonblockingIdentityChangeInThread:contactThread recipientId:recipientId]; - [messages addObject:errorMessage]; - - for (TSGroupThread *groupThread in [TSGroupThread groupThreadsWithRecipientId:recipientId transaction:transaction]) { - [messages addObject:[TSErrorMessage nonblockingIdentityChangeInThread:groupThread recipientId:recipientId]]; - } - - // MJK TODO - why not save immediately, why build up this array? - for (TSMessage *message in messages) { - [message saveWithTransaction:transaction]; - } - - [SSKEnvironment.shared.notificationsManager notifyUserForErrorMessage:errorMessage - thread:contactThread - transaction:transaction]; -} - -- (void)enqueueSyncMessageForVerificationStateForRecipientId:(NSString *)recipientId - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(recipientId.length > 0); - OWSAssertDebug(transaction); - - [transaction setObject:recipientId - forKey:recipientId - inCollection:OWSIdentityManager_QueuedVerificationStateSyncMessages]; - - dispatch_async(dispatch_get_main_queue(), ^{ - [self tryToSyncQueuedVerificationStates]; - }); -} - -- (void)tryToSyncQueuedVerificationStates -{ - OWSAssertIsOnMainThread(); - - [AppReadiness runNowOrWhenAppDidBecomeReady:^{ - [self syncQueuedVerificationStates]; - }]; -} - -- (void)syncQueuedVerificationStates -{ - /* - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - NSMutableArray *recipientIds = [NSMutableArray new]; - [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { - [transaction - enumerateKeysAndObjectsInCollection:OWSIdentityManager_QueuedVerificationStateSyncMessages - usingBlock:^( - NSString *_Nonnull recipientId, id _Nonnull object, BOOL *_Nonnull stop) { - [recipientIds addObject:recipientId]; - }]; - }]; - - NSMutableArray *messages = [NSMutableArray new]; - for (NSString *recipientId in recipientIds) { - OWSRecipientIdentity *recipientIdentity = [OWSRecipientIdentity fetchObjectWithUniqueID:recipientId]; - if (!recipientIdentity) { - OWSFailDebug(@"Could not load recipient identity for recipientId: %@", recipientId); - continue; - } - if (recipientIdentity.recipientId.length < 1) { - OWSFailDebug(@"Invalid recipient identity for recipientId: %@", recipientId); - continue; - } - - // Prepend key type for transit. - // TODO we should just be storing the key type so we don't have to juggle re-adding it. - NSData *identityKey = [recipientIdentity.identityKey prependKeyType]; - if (identityKey.length != kIdentityKeyLength) { - OWSFailDebug(@"Invalid recipient identitykey for recipientId: %@ key: %@", recipientId, identityKey); - continue; - } - if (recipientIdentity.verificationState == OWSVerificationStateNoLongerVerified) { - // We don't want to sync "no longer verified" state. Other clients can - // figure this out from the /profile/ endpoint, and this can cause data - // loss as a user's devices overwrite each other's verification. - OWSFailDebug(@"Queue verification state had unexpected value: %@ recipientId: %@", - OWSVerificationStateToString(recipientIdentity.verificationState), - recipientId); - continue; - } - OWSVerificationStateSyncMessage *message = - [[OWSVerificationStateSyncMessage alloc] initWithVerificationState:recipientIdentity.verificationState - identityKey:identityKey - verificationForRecipientId:recipientIdentity.recipientId]; - [messages addObject:message]; - } - if (messages.count > 0) { - for (OWSVerificationStateSyncMessage *message in messages) { - [self sendSyncVerificationStateMessage:message]; - } - } - }); - */ -} - -- (void)clearSyncMessageForRecipientId:(NSString *)recipientId - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(recipientId.length > 0); - OWSAssertDebug(transaction); - - [transaction removeObjectForKey:recipientId inCollection:OWSIdentityManager_QueuedVerificationStateSyncMessages]; -} - -- (void)throws_processIncomingSyncMessage:(SNProtoVerified *)verified - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(verified); - OWSAssertDebug(transaction); - - NSString *recipientId = verified.destination; - if (recipientId.length < 1) { - OWSFailDebug(@"Verification state sync message missing recipientId."); - return; - } - NSData *rawIdentityKey = verified.identityKey; - if (rawIdentityKey.length != kIdentityKeyLength) { - OWSFailDebug(@"Verification state sync message for recipient: %@ with malformed identityKey: %@", - recipientId, - rawIdentityKey); - return; - } - NSData *identityKey = [rawIdentityKey throws_removeKeyType]; - - switch (verified.state) { - case SNProtoVerifiedStateDefault: - [self tryToApplyVerificationStateFromSyncMessage:OWSVerificationStateDefault - recipientId:recipientId - identityKey:identityKey - overwriteOnConflict:NO - transaction:transaction]; - break; - case SNProtoVerifiedStateVerified: - [self tryToApplyVerificationStateFromSyncMessage:OWSVerificationStateVerified - recipientId:recipientId - identityKey:identityKey - overwriteOnConflict:YES - transaction:transaction]; - break; - case SNProtoVerifiedStateUnverified: - OWSFailDebug(@"Verification state sync message for recipientId: %@ has unexpected value: %@.", - recipientId, - OWSVerificationStateToString(OWSVerificationStateNoLongerVerified)); - return; - } - - [self fireIdentityStateChangeNotification]; -} - -- (void)tryToApplyVerificationStateFromSyncMessage:(OWSVerificationState)verificationState - recipientId:(NSString *)recipientId - identityKey:(NSData *)identityKey - overwriteOnConflict:(BOOL)overwriteOnConflict - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(recipientId.length > 0); - OWSAssertDebug(transaction); - - if (recipientId.length < 1) { - OWSFailDebug(@"Verification state sync message missing recipientId."); - return; - } - - if (identityKey.length != kStoredIdentityKeyLength) { - OWSFailDebug(@"Verification state sync message missing identityKey: %@", recipientId); - return; - } - - OWSRecipientIdentity *_Nullable recipientIdentity = [OWSRecipientIdentity fetchObjectWithUniqueID:recipientId - transaction:transaction]; - if (!recipientIdentity) { - // There's no existing recipient identity for this recipient. - // We should probably create one. - - if (verificationState == OWSVerificationStateDefault) { - // There's no point in creating a new recipient identity just to - // set its verification state to default. - return; - } - - // Ensure a remote identity exists for this key. We may be learning about - // it for the first time. - [self saveRemoteIdentity:identityKey recipientId:recipientId protocolContext:transaction]; - - recipientIdentity = [OWSRecipientIdentity fetchObjectWithUniqueID:recipientId - transaction:transaction]; - - if (recipientIdentity == nil) { - OWSFailDebug(@"Missing expected identity: %@", recipientId); - return; - } - - if (![recipientIdentity.recipientId isEqualToString:recipientId]) { - OWSFailDebug(@"recipientIdentity has unexpected recipientId: %@", recipientId); - return; - } - - if (![recipientIdentity.identityKey isEqualToData:identityKey]) { - OWSFailDebug(@"recipientIdentity has unexpected identityKey: %@", recipientId); - return; - } - - if (recipientIdentity.verificationState == verificationState) { - return; - } - - OWSLogInfo(@"setVerificationState: %@ (%@ -> %@)", - recipientId, - OWSVerificationStateToString(recipientIdentity.verificationState), - OWSVerificationStateToString(verificationState)); - - [recipientIdentity updateWithVerificationState:verificationState - transaction:transaction]; - - // No need to call [saveChangeMessagesForRecipientId:..] since this is - // a new recipient. - } else { - // There's an existing recipient identity for this recipient. - // We should update it. - if (![recipientIdentity.recipientId isEqualToString:recipientId]) { - OWSFailDebug(@"recipientIdentity has unexpected recipientId: %@", recipientId); - return; - } - - if (![recipientIdentity.identityKey isEqualToData:identityKey]) { - // The conflict case where we receive a verification sync message - // whose identity key disagrees with the local identity key for - // this recipient. - if (!overwriteOnConflict) { - OWSLogWarn(@"recipientIdentity has non-matching identityKey: %@", recipientId); - return; - } - - OWSLogWarn(@"recipientIdentity has non-matching identityKey; overwriting: %@", recipientId); - [self saveRemoteIdentity:identityKey recipientId:recipientId protocolContext:transaction]; - - recipientIdentity = [OWSRecipientIdentity fetchObjectWithUniqueID:recipientId - transaction:transaction]; - - if (recipientIdentity == nil) { - OWSFailDebug(@"Missing expected identity: %@", recipientId); - return; - } - - if (![recipientIdentity.recipientId isEqualToString:recipientId]) { - OWSFailDebug(@"recipientIdentity has unexpected recipientId: %@", recipientId); - return; - } - - if (![recipientIdentity.identityKey isEqualToData:identityKey]) { - OWSFailDebug(@"recipientIdentity has unexpected identityKey: %@", recipientId); - return; - } - } - - if (recipientIdentity.verificationState == verificationState) { - return; - } - - [recipientIdentity updateWithVerificationState:verificationState - transaction:transaction]; - } -} - #pragma mark - Debug #if DEBUG @@ -749,13 +462,7 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa - (void)applicationDidBecomeActive:(NSNotification *)notification { - OWSAssertIsOnMainThread(); - - // We want to defer this so that we never call this method until - // [UIApplicationDelegate applicationDidBecomeActive:] is complete. - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)1.f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ - [self tryToSyncQueuedVerificationStates]; - }); + } @end diff --git a/SignalUtilitiesKit/Messaging/Utilities/OWSIncomingMessageFinder.h b/SessionMessagingKit/Utilities/OWSIncomingMessageFinder.h similarity index 100% rename from SignalUtilitiesKit/Messaging/Utilities/OWSIncomingMessageFinder.h rename to SessionMessagingKit/Utilities/OWSIncomingMessageFinder.h diff --git a/SignalUtilitiesKit/Messaging/Utilities/OWSIncomingMessageFinder.m b/SessionMessagingKit/Utilities/OWSIncomingMessageFinder.m similarity index 94% rename from SignalUtilitiesKit/Messaging/Utilities/OWSIncomingMessageFinder.m rename to SessionMessagingKit/Utilities/OWSIncomingMessageFinder.m index f9c60ca9d..3b9d32274 100644 --- a/SignalUtilitiesKit/Messaging/Utilities/OWSIncomingMessageFinder.m +++ b/SessionMessagingKit/Utilities/OWSIncomingMessageFinder.m @@ -32,8 +32,6 @@ NSString *const OWSIncomingMessageFinderColumnSourceDeviceId = @"OWSIncomingMess - (instancetype)init { - OWSAssertDebug([OWSPrimaryStorage sharedManager]); - return [self initWithPrimaryStorage:[OWSPrimaryStorage sharedManager]]; } @@ -100,7 +98,6 @@ NSString *const OWSIncomingMessageFinderColumnSourceDeviceId = @"OWSIncomingMess + (void)asyncRegisterExtensionWithPrimaryStorage:(OWSStorage *)storage { - OWSLogInfo(@"registering async."); [storage asyncRegisterExtension:self.indexExtension withName:OWSIncomingMessageFinderExtensionName]; } @@ -108,7 +105,6 @@ NSString *const OWSIncomingMessageFinderColumnSourceDeviceId = @"OWSIncomingMess // We should not normally hit this, as we should have prefer registering async, but it is useful for testing. - (void)registerExtension { - OWSLogError(@"registering SYNC. We should prefer async when possible."); [self.primaryStorage registerExtension:self.class.indexExtension withName:OWSIncomingMessageFinderExtensionName]; } #endif @@ -122,7 +118,6 @@ NSString *const OWSIncomingMessageFinderColumnSourceDeviceId = @"OWSIncomingMess { #ifdef DEBUG if (![self.primaryStorage registeredExtension:OWSIncomingMessageFinderExtensionName]) { - OWSFailDebug(@"but extension is not registered"); // we should be initializing this at startup rather than have an unexpectedly slow lazy setup at random. [self registerExtension]; @@ -139,7 +134,6 @@ NSString *const OWSIncomingMessageFinderColumnSourceDeviceId = @"OWSIncomingMess NSUInteger count; BOOL success = [[transaction ext:OWSIncomingMessageFinderExtensionName] getNumberOfRows:&count matchingQuery:query]; if (!success) { - OWSFailDebug(@"Could not execute query"); return NO; } diff --git a/SignalUtilitiesKit/OWSMediaGalleryFinder.h b/SessionMessagingKit/Utilities/OWSMediaGalleryFinder.h similarity index 100% rename from SignalUtilitiesKit/OWSMediaGalleryFinder.h rename to SessionMessagingKit/Utilities/OWSMediaGalleryFinder.h diff --git a/SignalUtilitiesKit/OWSMediaGalleryFinder.m b/SessionMessagingKit/Utilities/OWSMediaGalleryFinder.m similarity index 92% rename from SignalUtilitiesKit/OWSMediaGalleryFinder.m rename to SessionMessagingKit/Utilities/OWSMediaGalleryFinder.m index 55bd348cb..34face9e7 100644 --- a/SignalUtilitiesKit/OWSMediaGalleryFinder.m +++ b/SessionMessagingKit/Utilities/OWSMediaGalleryFinder.m @@ -12,7 +12,7 @@ #import #import #import -#import "TSAttachment+Albums.h" +#import "TSAttachment.h" NS_ASSUME_NONNULL_BEGIN @@ -60,8 +60,6 @@ static NSString *const OWSMediaGalleryFinderExtensionName = @"OWSMediaGalleryFin return nil; } - OWSAssertDebug([self.mediaGroup isEqual:groupId]); - return @(index); } @@ -89,7 +87,6 @@ static NSString *const OWSMediaGalleryFinderExtensionName = @"OWSMediaGalleryFin id _Nonnull object, NSUInteger index, BOOL *_Nonnull stop) { - OWSAssertDebug([object isKindOfClass:[TSAttachment class]]); attachmentBlock((TSAttachment *)object); }]; } @@ -98,7 +95,6 @@ static NSString *const OWSMediaGalleryFinderExtensionName = @"OWSMediaGalleryFin dbConnection:(YapDatabaseConnection *)dbConnection { YapDatabaseAutoViewConnection *extConnection = [dbConnection ext:OWSMediaGalleryFinderExtensionName]; - OWSAssert(extConnection); return [extConnection hasChangesForGroup:self.mediaGroup inNotifications:notifications]; } @@ -108,8 +104,7 @@ static NSString *const OWSMediaGalleryFinderExtensionName = @"OWSMediaGalleryFin - (YapDatabaseAutoViewTransaction *)galleryExtensionWithTransaction:(YapDatabaseReadTransaction *)transaction { YapDatabaseAutoViewTransaction *extension = [transaction extension:OWSMediaGalleryFinderExtensionName]; - OWSAssertDebug(extension); - + return extension; } @@ -148,13 +143,11 @@ static NSString *const OWSMediaGalleryFinderExtensionName = @"OWSMediaGalleryFin NSString *_Nonnull key2, id _Nonnull object2) { if (![object1 isKindOfClass:[TSAttachment class]]) { - OWSFailDebug(@"Unexpected object while sorting: %@", [object1 class]); return NSOrderedSame; } TSAttachment *attachment1 = (TSAttachment *)object1; if (![object2 isKindOfClass:[TSAttachment class]]) { - OWSFailDebug(@"Unexpected object while sorting: %@", [object2 class]); return NSOrderedSame; } TSAttachment *attachment2 = (TSAttachment *)object2; @@ -162,7 +155,6 @@ static NSString *const OWSMediaGalleryFinderExtensionName = @"OWSMediaGalleryFin TSMessage *_Nullable message1 = [attachment1 fetchAlbumMessageWithTransaction:transaction]; TSMessage *_Nullable message2 = [attachment2 fetchAlbumMessageWithTransaction:transaction]; if (message1 == nil || message2 == nil) { - OWSFailDebug(@"couldn't find albumMessage"); return NSOrderedSame; } @@ -171,7 +163,6 @@ static NSString *const OWSMediaGalleryFinderExtensionName = @"OWSMediaGalleryFin NSUInteger index2 = [message1.attachmentIds indexOfObject:attachment2.uniqueId]; if (index1 == NSNotFound || index2 == NSNotFound) { - OWSFailDebug(@"couldn't find attachmentId in it's albumMessage"); return NSOrderedSame; } return [@(index1) compare:@(index2)]; @@ -201,7 +192,6 @@ static NSString *const OWSMediaGalleryFinderExtensionName = @"OWSMediaGalleryFin TSMessage *message = [attachment fetchAlbumMessageWithTransaction:transaction]; if (message == nil) { - OWSFailDebug(@"message was unexpectedly nil"); return nil; } diff --git a/SignalUtilitiesKit/Utilities/ProtoUtils.h b/SessionMessagingKit/Utilities/ProtoUtils.h similarity index 71% rename from SignalUtilitiesKit/Utilities/ProtoUtils.h rename to SessionMessagingKit/Utilities/ProtoUtils.h index 74c6ae3a5..bda2a8e38 100644 --- a/SignalUtilitiesKit/Utilities/ProtoUtils.h +++ b/SessionMessagingKit/Utilities/ProtoUtils.h @@ -6,7 +6,6 @@ NS_ASSUME_NONNULL_BEGIN -@class SNProtoCallMessageBuilder; @class SNProtoDataMessageBuilder; @class TSThread; @@ -20,10 +19,6 @@ NS_ASSUME_NONNULL_BEGIN + (void)addLocalProfileKeyToDataMessageBuilder:(SNProtoDataMessageBuilder *)dataMessageBuilder; -+ (void)addLocalProfileKeyIfNecessary:(TSThread *)thread - recipientId:(NSString *)recipientId - callMessageBuilder:(SNProtoCallMessageBuilder *)callMessageBuilder; - @end NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/Utilities/ProtoUtils.m b/SessionMessagingKit/Utilities/ProtoUtils.m similarity index 83% rename from SignalUtilitiesKit/Utilities/ProtoUtils.m rename to SessionMessagingKit/Utilities/ProtoUtils.m index 7e98369f7..871de391c 100644 --- a/SignalUtilitiesKit/Utilities/ProtoUtils.m +++ b/SessionMessagingKit/Utilities/ProtoUtils.m @@ -7,7 +7,7 @@ #import "SSKEnvironment.h" #import "TSThread.h" #import -#import +#import NS_ASSUME_NONNULL_BEGIN @@ -28,7 +28,6 @@ NS_ASSUME_NONNULL_BEGIN + (BOOL)shouldMessageHaveLocalProfileKey:(TSThread *)thread recipientId:(NSString *_Nullable)recipientId { - OWSAssertDebug(thread); return YES; } @@ -36,9 +35,6 @@ NS_ASSUME_NONNULL_BEGIN recipientId:(NSString *_Nullable)recipientId dataMessageBuilder:(SNProtoDataMessageBuilder *)dataMessageBuilder { - OWSAssertDebug(thread); - OWSAssertDebug(dataMessageBuilder); - if ([self shouldMessageHaveLocalProfileKey:thread recipientId:recipientId]) { [dataMessageBuilder setProfileKey:self.localProfileKey.keyData]; } @@ -46,8 +42,6 @@ NS_ASSUME_NONNULL_BEGIN + (void)addLocalProfileKeyToDataMessageBuilder:(SNProtoDataMessageBuilder *)dataMessageBuilder { - OWSAssertDebug(dataMessageBuilder); - [dataMessageBuilder setProfileKey:self.localProfileKey.keyData]; } @@ -55,10 +49,6 @@ NS_ASSUME_NONNULL_BEGIN recipientId:(NSString *)recipientId callMessageBuilder:(SNProtoCallMessageBuilder *)callMessageBuilder { - OWSAssertDebug(thread); - OWSAssertDebug(recipientId.length > 0); - OWSAssertDebug(callMessageBuilder); - if ([self shouldMessageHaveLocalProfileKey:thread recipientId:recipientId]) { [callMessageBuilder setProfileKey:self.localProfileKey.keyData]; } diff --git a/SignalUtilitiesKit/Messaging/Sending & Receiving/SNProtoEnvelope+Conversion.swift b/SessionMessagingKit/Utilities/SNProtoEnvelope+Conversion.swift similarity index 100% rename from SignalUtilitiesKit/Messaging/Sending & Receiving/SNProtoEnvelope+Conversion.swift rename to SessionMessagingKit/Utilities/SNProtoEnvelope+Conversion.swift diff --git a/SignalUtilitiesKit/SSKEnvironment.h b/SessionMessagingKit/Utilities/SSKEnvironment.h similarity index 94% rename from SignalUtilitiesKit/SSKEnvironment.h rename to SessionMessagingKit/Utilities/SSKEnvironment.h index 09f9262d9..604bdafac 100644 --- a/SignalUtilitiesKit/SSKEnvironment.h +++ b/SessionMessagingKit/Utilities/SSKEnvironment.h @@ -47,8 +47,7 @@ NS_ASSUME_NONNULL_BEGIN readReceiptManager:(OWSReadReceiptManager *)readReceiptManager outgoingReceiptManager:(OWSOutgoingReceiptManager *)outgoingReceiptManager reachabilityManager:(id)reachabilityManager - typingIndicators:(id)typingIndicators - attachmentDownloads:(OWSAttachmentDownloads *)attachmentDownloads NS_DESIGNATED_INITIALIZER; + typingIndicators:(id)typingIndicators NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE; @@ -72,7 +71,6 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) OWSOutgoingReceiptManager *outgoingReceiptManager; @property (nonatomic, readonly) id reachabilityManager; @property (nonatomic, readonly) id typingIndicators; -@property (nonatomic, readonly) OWSAttachmentDownloads *attachmentDownloads; // This property is configured after Environment is created. @property (atomic, nullable) id notificationsManager; diff --git a/SignalUtilitiesKit/SSKEnvironment.m b/SessionMessagingKit/Utilities/SSKEnvironment.m similarity index 82% rename from SignalUtilitiesKit/SSKEnvironment.m rename to SessionMessagingKit/Utilities/SSKEnvironment.m index 2430e125d..e511ce354 100644 --- a/SignalUtilitiesKit/SSKEnvironment.m +++ b/SessionMessagingKit/Utilities/SSKEnvironment.m @@ -24,7 +24,6 @@ static SSKEnvironment *sharedSSKEnvironment; @property (nonatomic) OWSOutgoingReceiptManager *outgoingReceiptManager; @property (nonatomic) id reachabilityManager; @property (nonatomic) id typingIndicators; -@property (nonatomic) OWSAttachmentDownloads *attachmentDownloads; @end @@ -49,7 +48,6 @@ static SSKEnvironment *sharedSSKEnvironment; outgoingReceiptManager:(OWSOutgoingReceiptManager *)outgoingReceiptManager reachabilityManager:(id)reachabilityManager typingIndicators:(id)typingIndicators - attachmentDownloads:(OWSAttachmentDownloads *)attachmentDownloads { self = [super init]; @@ -57,19 +55,6 @@ static SSKEnvironment *sharedSSKEnvironment; return self; } - OWSAssertDebug(profileManager); - OWSAssertDebug(primaryStorage); - OWSAssertDebug(blockingManager); - OWSAssertDebug(identityManager); - OWSAssertDebug(udManager); - OWSAssertDebug(tsAccountManager); - OWSAssertDebug(disappearingMessagesJob); - OWSAssertDebug(readReceiptManager); - OWSAssertDebug(outgoingReceiptManager); - OWSAssertDebug(reachabilityManager); - OWSAssertDebug(typingIndicators); - OWSAssertDebug(attachmentDownloads); - _profileManager = profileManager; _primaryStorage = primaryStorage; _blockingManager = blockingManager; @@ -81,23 +66,17 @@ static SSKEnvironment *sharedSSKEnvironment; _outgoingReceiptManager = outgoingReceiptManager; _reachabilityManager = reachabilityManager; _typingIndicators = typingIndicators; - _attachmentDownloads = attachmentDownloads; return self; } + (instancetype)shared { - OWSAssertDebug(sharedSSKEnvironment); - return sharedSSKEnvironment; } + (void)setShared:(SSKEnvironment *)env { - OWSAssertDebug(env); - OWSAssertDebug(!sharedSSKEnvironment || CurrentAppContext().isRunningTests); - sharedSSKEnvironment = env; } @@ -111,8 +90,6 @@ static SSKEnvironment *sharedSSKEnvironment; - (nullable id)notificationsManager { @synchronized(self) { - OWSAssertDebug(_notificationsManager); - return _notificationsManager; } } @@ -120,9 +97,6 @@ static SSKEnvironment *sharedSSKEnvironment; - (void)setNotificationsManager:(nullable id)notificationsManager { @synchronized(self) { - OWSAssertDebug(notificationsManager); - OWSAssertDebug(!_notificationsManager); - _notificationsManager = notificationsManager; } } diff --git a/SignalUtilitiesKit/Utilities/SSKIncrementingIdFinder.swift b/SessionMessagingKit/Utilities/SSKIncrementingIdFinder.swift similarity index 100% rename from SignalUtilitiesKit/Utilities/SSKIncrementingIdFinder.swift rename to SessionMessagingKit/Utilities/SSKIncrementingIdFinder.swift diff --git a/SignalUtilitiesKit/SSKJobRecord.h b/SessionMessagingKit/Utilities/SSKJobRecord.h similarity index 100% rename from SignalUtilitiesKit/SSKJobRecord.h rename to SessionMessagingKit/Utilities/SSKJobRecord.h diff --git a/SignalUtilitiesKit/SSKJobRecord.m b/SessionMessagingKit/Utilities/SSKJobRecord.m similarity index 98% rename from SignalUtilitiesKit/SSKJobRecord.m rename to SessionMessagingKit/Utilities/SSKJobRecord.m index 2285b567f..71ef09139 100644 --- a/SignalUtilitiesKit/SSKJobRecord.m +++ b/SessionMessagingKit/Utilities/SSKJobRecord.m @@ -3,7 +3,7 @@ // #import "SSKJobRecord.h" -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SessionMessagingKit/Utilities/SSKJobRecordFinder.swift b/SessionMessagingKit/Utilities/SSKJobRecordFinder.swift new file mode 100644 index 000000000..8b633019a --- /dev/null +++ b/SessionMessagingKit/Utilities/SSKJobRecordFinder.swift @@ -0,0 +1,108 @@ + +@objc(SSKJobRecordFinder) +public class JobRecordFinder: NSObject, Finder { + + public typealias ExtensionType = YapDatabaseSecondaryIndex + public typealias TransactionType = YapDatabaseSecondaryIndexTransaction + + public enum JobRecordField: String { + case status, label, sortId + } + + public func getNextReady(label: String, transaction: YapDatabaseReadTransaction) -> SSKJobRecord? { + var result: SSKJobRecord? + self.enumerateJobRecords(label: label, status: .ready, transaction: transaction) { jobRecord, stopPointer in + result = jobRecord + stopPointer.pointee = true + } + return result + } + + public func allRecords(label: String, status: SSKJobRecordStatus, transaction: YapDatabaseReadTransaction) -> [SSKJobRecord] { + var result: [SSKJobRecord] = [] + self.enumerateJobRecords(label: label, status: status, transaction: transaction) { jobRecord, _ in + result.append(jobRecord) + } + return result + } + + public func enumerateJobRecords(label: String, status: SSKJobRecordStatus, transaction: YapDatabaseReadTransaction, block: @escaping (SSKJobRecord, UnsafeMutablePointer) -> Void) { + let queryFormat = String(format: "WHERE %@ = ? AND %@ = ? ORDER BY %@", JobRecordField.status.rawValue, JobRecordField.label.rawValue, JobRecordField.sortId.rawValue) + let query = YapDatabaseQuery(string: queryFormat, parameters: [status.rawValue, label]) + + self.ext(transaction: transaction).enumerateKeysAndObjects(matching: query) { _, _, object, stopPointer in + guard let jobRecord = object as? SSKJobRecord else { + owsFailDebug("expecting jobRecord but found: \(object)") + return + } + block(jobRecord, stopPointer) + } + } + + public static var dbExtensionName: String { + return "SecondaryIndexJobRecord" + } + + @objc + public class func asyncRegisterDatabaseExtensionObjC(storage: OWSStorage) { + asyncRegisterDatabaseExtension(storage: storage) + } + + public static var dbExtensionConfig: YapDatabaseSecondaryIndex { + let setup = YapDatabaseSecondaryIndexSetup() + setup.addColumn(JobRecordField.sortId.rawValue, with: .integer) + setup.addColumn(JobRecordField.status.rawValue, with: .integer) + setup.addColumn(JobRecordField.label.rawValue, with: .text) + + let block: YapDatabaseSecondaryIndexWithObjectBlock = { transaction, dict, collection, key, object in + guard let jobRecord = object as? SSKJobRecord else { + return + } + + dict[JobRecordField.sortId.rawValue] = jobRecord.sortId + dict[JobRecordField.status.rawValue] = jobRecord.status.rawValue + dict[JobRecordField.label.rawValue] = jobRecord.label + } + + let handler = YapDatabaseSecondaryIndexHandler.withObjectBlock(block) + + let options = YapDatabaseSecondaryIndexOptions() + let whitelist = YapWhitelistBlacklist(whitelist: Set([SSKJobRecord.collection()])) + options.allowedCollections = whitelist + + return YapDatabaseSecondaryIndex.init(setup: setup, handler: handler, versionTag: "2", options: options) + } +} + +protocol Finder { + associatedtype ExtensionType: YapDatabaseExtension + associatedtype TransactionType: YapDatabaseExtensionTransaction + + static var dbExtensionName: String { get } + static var dbExtensionConfig: ExtensionType { get } + + func ext(transaction: YapDatabaseReadTransaction) -> TransactionType + + static func asyncRegisterDatabaseExtension(storage: OWSStorage) + static func testingOnly_ensureDatabaseExtensionRegistered(storage: OWSStorage) +} + +extension Finder { + + public func ext(transaction: YapDatabaseReadTransaction) -> TransactionType { + return transaction.ext(type(of: self).dbExtensionName) as! TransactionType + } + + public static func asyncRegisterDatabaseExtension(storage: OWSStorage) { + storage.asyncRegister(dbExtensionConfig, withName: dbExtensionName) + } + + // Only for testing. + public static func testingOnly_ensureDatabaseExtensionRegistered(storage: OWSStorage) { + guard storage.registeredExtension(dbExtensionName) == nil else { + return + } + + storage.register(dbExtensionConfig, withName: dbExtensionName) + } +} diff --git a/SessionMessagingKit/Utilities/SSKReachabilityManager.swift b/SessionMessagingKit/Utilities/SSKReachabilityManager.swift new file mode 100644 index 000000000..9f6bea814 --- /dev/null +++ b/SessionMessagingKit/Utilities/SSKReachabilityManager.swift @@ -0,0 +1,15 @@ +import Reachability + +@objc(SSKReachabilityType) +public enum ReachabilityType: Int { + case any, wifi, cellular +} + +@objc +public protocol SSKReachabilityManager { + var observationContext: AnyObject { get } + func setup() + + var isReachable: Bool { get } + func isReachable(via reachabilityType: ReachabilityType) -> Bool +} diff --git a/SignalUtilitiesKit/Database/YapDatabase/YapDatabaseConnection+OWS.h b/SessionMessagingKit/Utilities/YapDatabaseConnection+OWS.h similarity index 100% rename from SignalUtilitiesKit/Database/YapDatabase/YapDatabaseConnection+OWS.h rename to SessionMessagingKit/Utilities/YapDatabaseConnection+OWS.h diff --git a/SignalUtilitiesKit/Database/YapDatabase/YapDatabaseConnection+OWS.m b/SessionMessagingKit/Utilities/YapDatabaseConnection+OWS.m similarity index 90% rename from SignalUtilitiesKit/Database/YapDatabase/YapDatabaseConnection+OWS.m rename to SessionMessagingKit/Utilities/YapDatabaseConnection+OWS.m index 27358c51c..b58c37f1d 100644 --- a/SignalUtilitiesKit/Database/YapDatabase/YapDatabaseConnection+OWS.m +++ b/SessionMessagingKit/Utilities/YapDatabaseConnection+OWS.m @@ -13,17 +13,11 @@ NS_ASSUME_NONNULL_BEGIN - (BOOL)hasObjectForKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - return nil != [self objectForKey:key inCollection:collection]; } - (nullable id)objectForKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - __block NSString *_Nullable object; [self readWithBlock:^(YapDatabaseReadTransaction *transaction) { @@ -36,7 +30,6 @@ NS_ASSUME_NONNULL_BEGIN - (nullable id)objectForKey:(NSString *)key inCollection:(NSString *)collection ofExpectedType:(Class)class { id _Nullable value = [self objectForKey:key inCollection:collection]; - OWSAssertDebug(!value || [value isKindOfClass:class]); return value; } @@ -123,9 +116,6 @@ NS_ASSUME_NONNULL_BEGIN - (void)setObject:(id)object forKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - [self readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [transaction setObject:object forKey:key inCollection:collection]; }]; @@ -133,9 +123,6 @@ NS_ASSUME_NONNULL_BEGIN - (void)setBool:(BOOL)value forKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - NSNumber *_Nullable oldValue = [self objectForKey:key inCollection:collection ofExpectedType:[NSNumber class]]; if (oldValue && [@(value) isEqual:oldValue]) { // Skip redundant writes. @@ -147,17 +134,11 @@ NS_ASSUME_NONNULL_BEGIN - (void)setDouble:(double)value forKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - [self setObject:@(value) forKey:key inCollection:collection]; } - (void)removeObjectForKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - [self readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [transaction removeObjectForKey:key inCollection:collection]; }]; @@ -165,9 +146,6 @@ NS_ASSUME_NONNULL_BEGIN - (void)setInt:(int)value forKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - [self setObject:@(value) forKey:key inCollection:collection]; } diff --git a/SignalUtilitiesKit/Database/YapDatabase/YapDatabaseTransaction+OWS.h b/SessionMessagingKit/Utilities/YapDatabaseTransaction+OWS.h similarity index 100% rename from SignalUtilitiesKit/Database/YapDatabase/YapDatabaseTransaction+OWS.h rename to SessionMessagingKit/Utilities/YapDatabaseTransaction+OWS.h diff --git a/SignalUtilitiesKit/Database/YapDatabase/YapDatabaseTransaction+OWS.m b/SessionMessagingKit/Utilities/YapDatabaseTransaction+OWS.m similarity index 77% rename from SignalUtilitiesKit/Database/YapDatabase/YapDatabaseTransaction+OWS.m rename to SessionMessagingKit/Utilities/YapDatabaseTransaction+OWS.m index ef505701e..dbfad0a86 100644 --- a/SignalUtilitiesKit/Database/YapDatabase/YapDatabaseTransaction+OWS.m +++ b/SessionMessagingKit/Utilities/YapDatabaseTransaction+OWS.m @@ -11,93 +11,59 @@ NS_ASSUME_NONNULL_BEGIN @implementation YapDatabaseReadTransaction (OWS) - (nullable id)objectForKey:(NSString *)key inCollection:(NSString *)collection ofExpectedType:(Class) class { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - id _Nullable value = [self objectForKey:key inCollection:collection]; - OWSAssertDebug(!value || [value isKindOfClass:class]); return value; } - (nullable NSDictionary *)dictionaryForKey : (NSString *)key inCollection : (NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - return [self objectForKey:key inCollection:collection ofExpectedType:[NSDictionary class]]; } - (nullable NSString *)stringForKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - return [self objectForKey:key inCollection:collection ofExpectedType:[NSString class]]; } - (BOOL)boolForKey:(NSString *)key inCollection:(NSString *)collection defaultValue:(BOOL)defaultValue { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - NSNumber *_Nullable value = [self objectForKey:key inCollection:collection ofExpectedType:[NSNumber class]]; return value ? [value boolValue] : defaultValue; } - (nullable NSData *)dataForKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - return [self objectForKey:key inCollection:collection ofExpectedType:[NSData class]]; } - (nullable ECKeyPair *)keyPairForKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - return [self objectForKey:key inCollection:collection ofExpectedType:[ECKeyPair class]]; } - (nullable PreKeyRecord *)preKeyRecordForKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - return [self objectForKey:key inCollection:collection ofExpectedType:[PreKeyRecord class]]; } - (nullable PreKeyBundle *)preKeyBundleForKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - return [self objectForKey:key inCollection:collection ofExpectedType:PreKeyBundle.class]; } - (nullable SignedPreKeyRecord *)signedPreKeyRecordForKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - return [self objectForKey:key inCollection:collection ofExpectedType:[SignedPreKeyRecord class]]; } - (int)intForKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - NSNumber *_Nullable number = [self objectForKey:key inCollection:collection ofExpectedType:[NSNumber class]]; return [number intValue]; } - (nullable NSDate *)dateForKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - NSNumber *_Nullable value = [self objectForKey:key inCollection:collection ofExpectedType:[NSNumber class]]; if (value) { return [NSDate dateWithTimeIntervalSince1970:value.doubleValue]; @@ -117,29 +83,20 @@ NS_ASSUME_NONNULL_BEGIN #if DEBUG - (void)snapshotCollection:(NSString *)collection snapshotFilePath:(NSString *)snapshotFilePath { - OWSAssertDebug(collection.length > 0); - OWSAssertDebug(snapshotFilePath.length > 0); - NSMutableDictionary *snapshot = [NSMutableDictionary new]; [self enumerateKeysAndObjectsInCollection:collection usingBlock:^(NSString *_Nonnull key, id _Nonnull value, BOOL *_Nonnull stop) { snapshot[key] = value; }]; NSData *_Nullable data = [NSKeyedArchiver archivedDataWithRootObject:snapshot]; - OWSAssertDebug(data); BOOL success = [data writeToFile:snapshotFilePath atomically:YES]; - OWSAssertDebug(success); } - (void)restoreSnapshotOfCollection:(NSString *)collection snapshotFilePath:(NSString *)snapshotFilePath { - OWSAssertDebug(collection.length > 0); - OWSAssertDebug(snapshotFilePath.length > 0); NSData *_Nullable data = [NSData dataWithContentsOfFile:snapshotFilePath]; - OWSAssertDebug(data); NSMutableDictionary *_Nullable snapshot = [NSKeyedUnarchiver unarchiveObjectWithData:data]; - OWSAssertDebug(snapshot); [self removeAllObjectsInCollection:collection]; [snapshot enumerateKeysAndObjectsUsingBlock:^(NSString *_Nonnull key, id _Nonnull value, BOOL *_Nonnull stop) { @@ -150,9 +107,6 @@ NS_ASSUME_NONNULL_BEGIN - (void)setBool:(BOOL)value forKey:(NSString *)key inCollection:(NSString *)collection { - OWSAssertDebug(key.length > 0); - OWSAssertDebug(collection.length > 0); - NSNumber *_Nullable oldValue = [self objectForKey:key inCollection:collection ofExpectedType:[NSNumber class]]; if (oldValue && [@(value) isEqual:oldValue]) { // Skip redundant writes. diff --git a/SessionProtocolKit/Meta/SessionProtocolKit.h b/SessionProtocolKit/Meta/SessionProtocolKit.h index ef52ae984..75a2d0606 100644 --- a/SessionProtocolKit/Meta/SessionProtocolKit.h +++ b/SessionProtocolKit/Meta/SessionProtocolKit.h @@ -7,6 +7,7 @@ FOUNDATION_EXPORT const unsigned char SessionProtocolKitVersionString[]; #import #import #import +#import #import #import #import diff --git a/SessionShareExtension/Meta/SignalShareExtension-Bridging-Header.h b/SessionShareExtension/Meta/SignalShareExtension-Bridging-Header.h index 7ec01ed1e..4299a4862 100644 --- a/SessionShareExtension/Meta/SignalShareExtension-Bridging-Header.h +++ b/SessionShareExtension/Meta/SignalShareExtension-Bridging-Header.h @@ -20,7 +20,7 @@ #import #import #import -#import +#import #import #import -#import +#import diff --git a/SessionShareExtension/ShareAppExtensionContext.m b/SessionShareExtension/ShareAppExtensionContext.m index ba02a50cb..be237eac7 100644 --- a/SessionShareExtension/ShareAppExtensionContext.m +++ b/SessionShareExtension/ShareAppExtensionContext.m @@ -4,7 +4,7 @@ #import "ShareAppExtensionContext.h" #import -#import +#import #import #import diff --git a/SignalUtilitiesKit/Database/Storage/Storage+OnionRequests.swift b/SessionSnodeKit/Storage+OnionRequests.swift similarity index 98% rename from SignalUtilitiesKit/Database/Storage/Storage+OnionRequests.swift rename to SessionSnodeKit/Storage+OnionRequests.swift index e308b96b7..456507b7e 100644 --- a/SignalUtilitiesKit/Database/Storage/Storage+OnionRequests.swift +++ b/SessionSnodeKit/Storage+OnionRequests.swift @@ -1,3 +1,4 @@ +import SessionUtilitiesKit extension Storage { diff --git a/SignalUtilitiesKit/Database/Storage/Storage+SnodeAPI.swift b/SessionSnodeKit/Storage+SnodeAPI.swift similarity index 99% rename from SignalUtilitiesKit/Database/Storage/Storage+SnodeAPI.swift rename to SessionSnodeKit/Storage+SnodeAPI.swift index 0c681f71b..85cc28d29 100644 --- a/SignalUtilitiesKit/Database/Storage/Storage+SnodeAPI.swift +++ b/SessionSnodeKit/Storage+SnodeAPI.swift @@ -1,3 +1,4 @@ +import SessionUtilitiesKit extension Storage { diff --git a/SignalUtilitiesKit/Utilities/BuildConfiguration.swift b/SessionUtilitiesKit/BuildConfiguration.swift similarity index 100% rename from SignalUtilitiesKit/Utilities/BuildConfiguration.swift rename to SessionUtilitiesKit/BuildConfiguration.swift diff --git a/SignalUtilitiesKit/ContentProxy.swift b/SessionUtilitiesKit/ContentProxy.swift similarity index 95% rename from SignalUtilitiesKit/ContentProxy.swift rename to SessionUtilitiesKit/ContentProxy.swift index 12cf3eb2a..4dd641ae4 100644 --- a/SignalUtilitiesKit/ContentProxy.swift +++ b/SessionUtilitiesKit/ContentProxy.swift @@ -2,6 +2,7 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // +import AFNetworking import Foundation @objc @@ -33,7 +34,6 @@ public class ContentProxy: NSObject { return AFHTTPSessionManager(baseURL: nil, sessionConfiguration: sessionConfiguration()) } guard let baseUrl = URL(string: baseUrlString) else { - owsFailDebug("Invalid base URL.") return nil } let sessionManager = AFHTTPSessionManager(baseURL: baseUrl, @@ -44,7 +44,6 @@ public class ContentProxy: NSObject { @objc public class func jsonSessionManager(baseUrl: String) -> AFHTTPSessionManager? { guard let sessionManager = self.sessionManager(baseUrl: baseUrl) else { - owsFailDebug("Could not create session manager") return nil } sessionManager.requestSerializer = AFJSONRequestSerializer() @@ -77,14 +76,12 @@ public class ContentProxy: NSObject { forUrl urlString: String) -> Bool { guard let url = URL(string: urlString, relativeTo: sessionManager.baseURL) else { - owsFailDebug("Invalid URL query: \(urlString).") return false } var request = URLRequest(url: url) guard configureProxiedRequest(request: &request) else { - owsFailDebug("Invalid URL query: \(urlString).") return false } diff --git a/SignalUtilitiesKit/Utilities/ECKeyPair+Hexadecimal.swift b/SessionUtilitiesKit/ECKeyPair+Hexadecimal.swift similarity index 97% rename from SignalUtilitiesKit/Utilities/ECKeyPair+Hexadecimal.swift rename to SessionUtilitiesKit/ECKeyPair+Hexadecimal.swift index aa563044e..2adc83430 100644 --- a/SignalUtilitiesKit/Utilities/ECKeyPair+Hexadecimal.swift +++ b/SessionUtilitiesKit/ECKeyPair+Hexadecimal.swift @@ -1,3 +1,4 @@ +import Curve25519Kit public extension ECKeyPair { diff --git a/SignalUtilitiesKit/Threads/LKGroupUtilities.h b/SessionUtilitiesKit/LKGroupUtilities.h similarity index 100% rename from SignalUtilitiesKit/Threads/LKGroupUtilities.h rename to SessionUtilitiesKit/LKGroupUtilities.h diff --git a/SignalUtilitiesKit/Threads/LKGroupUtilities.m b/SessionUtilitiesKit/LKGroupUtilities.m similarity index 95% rename from SignalUtilitiesKit/Threads/LKGroupUtilities.m rename to SessionUtilitiesKit/LKGroupUtilities.m index 78c79b86b..a291ec6d7 100644 --- a/SignalUtilitiesKit/Threads/LKGroupUtilities.m +++ b/SessionUtilitiesKit/LKGroupUtilities.m @@ -1,5 +1,4 @@ #import "LKGroupUtilities.h" -#import @implementation LKGroupUtilities @@ -44,7 +43,6 @@ +(NSString *)getDecodedGroupID:(NSData *)groupID { - OWSAssertDebug(groupID.length > 0); NSString *encodedGroupID = [[NSString alloc] initWithData:groupID encoding:NSUTF8StringEncoding]; if ([encodedGroupID componentsSeparatedByString:@"!"].count > 1) { return [encodedGroupID componentsSeparatedByString:@"!"][1]; diff --git a/SignalUtilitiesKit/Utilities/LKUserDefaults.swift b/SessionUtilitiesKit/LKUserDefaults.swift similarity index 100% rename from SignalUtilitiesKit/Utilities/LKUserDefaults.swift rename to SessionUtilitiesKit/LKUserDefaults.swift diff --git a/SignalUtilitiesKit/Utilities/LRUCache.swift b/SessionUtilitiesKit/LRUCache.swift similarity index 95% rename from SignalUtilitiesKit/Utilities/LRUCache.swift rename to SessionUtilitiesKit/LRUCache.swift index 436b4e365..8e2dde882 100644 --- a/SignalUtilitiesKit/Utilities/LRUCache.swift +++ b/SessionUtilitiesKit/LRUCache.swift @@ -54,14 +54,10 @@ public class LRUCache { } @objc func didEnterBackground() { - AssertIsOnMainThread() - clear() } @objc func didReceiveMemoryWarning() { - AssertIsOnMainThread() - clear() } @@ -89,7 +85,6 @@ public class LRUCache { while cacheOrder.count > maxSize { guard let staleKey = cacheOrder.first else { - owsFailDebug("Cache ordering unexpectedly empty") return } cacheOrder.removeFirst() diff --git a/SessionUtilitiesKit/Meta/SessionUtilitiesKit.h b/SessionUtilitiesKit/Meta/SessionUtilitiesKit.h index 672951858..5f076cd3c 100644 --- a/SessionUtilitiesKit/Meta/SessionUtilitiesKit.h +++ b/SessionUtilitiesKit/Meta/SessionUtilitiesKit.h @@ -5,10 +5,14 @@ FOUNDATION_EXPORT const unsigned char SessionUtilitiesKitVersionString[]; #import #import +#import #import +#import #import #import +#import #import +#import #import #import #import diff --git a/SignalUtilitiesKit/Utilities/NSArray+Functional.h b/SessionUtilitiesKit/NSArray+Functional.h similarity index 100% rename from SignalUtilitiesKit/Utilities/NSArray+Functional.h rename to SessionUtilitiesKit/NSArray+Functional.h diff --git a/SignalUtilitiesKit/Utilities/NSArray+Functional.m b/SessionUtilitiesKit/NSArray+Functional.m similarity index 100% rename from SignalUtilitiesKit/Utilities/NSArray+Functional.m rename to SessionUtilitiesKit/NSArray+Functional.m diff --git a/SignalUtilitiesKit/NSNotificationCenter+OWS.h b/SessionUtilitiesKit/NSNotificationCenter+OWS.h similarity index 100% rename from SignalUtilitiesKit/NSNotificationCenter+OWS.h rename to SessionUtilitiesKit/NSNotificationCenter+OWS.h diff --git a/SignalUtilitiesKit/NSNotificationCenter+OWS.m b/SessionUtilitiesKit/NSNotificationCenter+OWS.m similarity index 100% rename from SignalUtilitiesKit/NSNotificationCenter+OWS.m rename to SessionUtilitiesKit/NSNotificationCenter+OWS.m diff --git a/SignalUtilitiesKit/Utilities/NSRegularExpression+SSK.swift b/SessionUtilitiesKit/NSRegularExpression+SSK.swift similarity index 93% rename from SignalUtilitiesKit/Utilities/NSRegularExpression+SSK.swift rename to SessionUtilitiesKit/NSRegularExpression+SSK.swift index 288f6f263..0704a86cb 100644 --- a/SignalUtilitiesKit/Utilities/NSRegularExpression+SSK.swift +++ b/SessionUtilitiesKit/NSRegularExpression+SSK.swift @@ -25,13 +25,11 @@ public extension NSRegularExpression { } let matchRange = match.range(at: 1) guard let textRange = Range(matchRange, in: text) else { - owsFailDebug("Invalid match.") return nil } let substring = String(text[textRange]) return substring } catch { - Logger.error("Error: \(error)") return nil } } @@ -46,7 +44,6 @@ public extension NSRegularExpression { } let matchRange = match.range(at: 1) guard let textRange = Range(matchRange, in: text) else { - owsFailDebug("Invalid match.") return nil } let substring = String(text[textRange]) diff --git a/SignalUtilitiesKit/Utilities/NSUserDefaults+OWS.h b/SessionUtilitiesKit/NSUserDefaults+OWS.h similarity index 100% rename from SignalUtilitiesKit/Utilities/NSUserDefaults+OWS.h rename to SessionUtilitiesKit/NSUserDefaults+OWS.h diff --git a/SignalUtilitiesKit/Utilities/NSUserDefaults+OWS.m b/SessionUtilitiesKit/NSUserDefaults+OWS.m similarity index 88% rename from SignalUtilitiesKit/Utilities/NSUserDefaults+OWS.m rename to SessionUtilitiesKit/NSUserDefaults+OWS.m index 4fa8b7b80..1bf02767e 100644 --- a/SignalUtilitiesKit/Utilities/NSUserDefaults+OWS.m +++ b/SessionUtilitiesKit/NSUserDefaults+OWS.m @@ -4,7 +4,6 @@ #import "NSUserDefaults+OWS.h" #import "AppContext.h" -#import "TSConstants.h" #import NS_ASSUME_NONNULL_BEGIN @@ -18,14 +17,11 @@ NS_ASSUME_NONNULL_BEGIN + (void)migrateToSharedUserDefaults { - OWSLogInfo(@""); - NSUserDefaults *appUserDefaults = self.appUserDefaults; NSDictionary *dictionary = [NSUserDefaults standardUserDefaults].dictionaryRepresentation; for (NSString *key in dictionary) { id value = dictionary[key]; - OWSAssertDebug(value); [appUserDefaults setObject:value forKey:key]; } } @@ -38,8 +34,6 @@ NS_ASSUME_NONNULL_BEGIN - (void)removeAll { - OWSAssertDebug(CurrentAppContext().isMainApp); - NSDictionary *dictionary = self.dictionaryRepresentation; for (NSString *key in dictionary) { [self removeObjectForKey:key]; diff --git a/SignalUtilitiesKit/ProxiedContentDownloader.swift b/SessionUtilitiesKit/ProxiedContentDownloader.swift similarity index 90% rename from SignalUtilitiesKit/ProxiedContentDownloader.swift rename to SessionUtilitiesKit/ProxiedContentDownloader.swift index 5b6d2f23e..f01286dd6 100644 --- a/SignalUtilitiesKit/ProxiedContentDownloader.swift +++ b/SessionUtilitiesKit/ProxiedContentDownloader.swift @@ -28,7 +28,6 @@ open class ProxiedContentAssetDescription: NSObject { self.fileExtension = fileExtension } else { guard let pathExtension = url.pathExtension else { - owsFailDebug("URL has not path extension.") return nil } self.fileExtension = pathExtension @@ -57,11 +56,7 @@ public class ProxiedContentAssetSegment: NSObject { public let redundantLength: UInt // This state should only be accessed on the main thread. - public var state: ProxiedContentAssetSegmentState = .waiting { - didSet { - AssertIsOnMainThread() - } - } + public var state: ProxiedContentAssetSegmentState = .waiting // This state is accessed off the main thread. // @@ -88,7 +83,6 @@ public class ProxiedContentAssetSegment: NSObject { public func append(data: Data) { guard state == .downloading else { - owsFailDebug("appending data in invalid state: \(state)") return } @@ -97,11 +91,9 @@ public class ProxiedContentAssetSegment: NSObject { public func mergeData(assetData: inout Data) -> Bool { guard state == .complete else { - owsFailDebug("merging data in invalid state: \(state)") return false } guard UInt(segmentData.count) == segmentLength else { - owsFailDebug("segment data length: \(segmentData.count) doesn't match expected length: \(segmentLength)") return false } @@ -159,7 +151,6 @@ public class ProxiedContentAssetRequest: NSObject { public var state: ProxiedContentAssetRequestState = .waiting public var contentLength: Int = 0 { didSet { - AssertIsOnMainThread() assert(oldValue == 0) assert(contentLength > 0) } @@ -179,11 +170,9 @@ public class ProxiedContentAssetRequest: NSObject { } private func segmentSize() -> UInt { - AssertIsOnMainThread() let contentLength = UInt(self.contentLength) guard contentLength > 0 else { - owsFailDebug("asset missing contentLength") requestDidFail() return 0 } @@ -203,8 +192,6 @@ public class ProxiedContentAssetRequest: NSObject { } fileprivate func createSegments(withInitialData initialData: Data) { - AssertIsOnMainThread() - let segmentLength = segmentSize() guard segmentLength > 0 else { return @@ -245,11 +232,8 @@ public class ProxiedContentAssetRequest: NSObject { } private func firstSegmentWithState(state: ProxiedContentAssetSegmentState) -> ProxiedContentAssetSegment? { - AssertIsOnMainThread() - for segment in segments { guard segment.state != .failed else { - owsFailDebug("unexpected failed segment.") continue } if segment.state == state { @@ -260,18 +244,13 @@ public class ProxiedContentAssetRequest: NSObject { } public func firstWaitingSegment() -> ProxiedContentAssetSegment? { - AssertIsOnMainThread() - return firstSegmentWithState(state: .waiting) } public func downloadingSegmentsCount() -> UInt { - AssertIsOnMainThread() - var result: UInt = 0 for segment in segments { guard segment.state != .failed else { - owsFailDebug("unexpected failed segment.") continue } if segment.state == .downloading { @@ -282,8 +261,6 @@ public class ProxiedContentAssetRequest: NSObject { } public func areAllSegmentsComplete() -> Bool { - AssertIsOnMainThread() - for segment in segments { guard segment.state == .complete else { return false @@ -297,48 +274,37 @@ public class ProxiedContentAssetRequest: NSObject { var assetData = Data() for segment in segments { guard segment.state == .complete else { - owsFailDebug("unexpected incomplete segment.") return nil } guard segment.totalDataSize() > 0 else { - owsFailDebug("could not merge empty segment.") return nil } guard segment.mergeData(assetData: &assetData) else { - owsFailDebug("failed to merge segment data.") return nil } } guard assetData.count == contentLength else { - owsFailDebug("asset data has unexpected length.") return nil } guard assetData.count > 0 else { - owsFailDebug("could not write empty asset to disk.") return nil } let fileExtension = assetDescription.fileExtension let fileName = (NSUUID().uuidString as NSString).appendingPathExtension(fileExtension)! let filePath = (downloadFolderPath as NSString).appendingPathComponent(fileName) - - Logger.verbose("filePath: \(filePath).") - do { try assetData.write(to: NSURL.fileURL(withPath: filePath), options: .atomicWrite) let asset = ProxiedContentAsset(assetDescription: assetDescription, filePath: filePath) return asset } catch let error as NSError { - owsFailDebug("file write failed: \(filePath), \(error)") return nil } } public func cancel() { - AssertIsOnMainThread() - wasCancelled = true contentLengthTask?.cancel() contentLengthTask = nil @@ -352,15 +318,11 @@ public class ProxiedContentAssetRequest: NSObject { } private func clearCallbacks() { - AssertIsOnMainThread() - success = nil failure = nil } public func requestDidSucceed(asset: ProxiedContentAsset) { - AssertIsOnMainThread() - success?(self, asset) // Only one of the callbacks should be called, and only once. @@ -368,8 +330,6 @@ public class ProxiedContentAssetRequest: NSObject { } public func requestDidFail() { - AssertIsOnMainThread() - failure?(self) // Only one of the callbacks should be called, and only once. @@ -407,7 +367,7 @@ public class ProxiedContentAsset: NSObject { let fileManager = FileManager.default try fileManager.removeItem(atPath: filePathCopy) } catch let error as NSError { - owsFailDebug("file cleanup failed: \(filePathCopy), \(error)") + } } } @@ -454,14 +414,10 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio // Force usage as a singleton public required init(downloadFolderName: String) { - AssertIsOnMainThread() - self.downloadFolderName = downloadFolderName super.init() - SwiftSingletons.register(self) - ensureDownloadFolder() } @@ -470,8 +426,6 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio } private lazy var downloadSession: URLSession = { - AssertIsOnMainThread() - let configuration = ContentProxy.sessionConfiguration() // Don't use any caching to protect privacy of these requests. @@ -505,11 +459,8 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio priority: ProxiedContentRequestPriority, success:@escaping ((ProxiedContentAssetRequest?, ProxiedContentAsset) -> Void), failure:@escaping ((ProxiedContentAssetRequest) -> Void)) -> ProxiedContentAssetRequest? { - AssertIsOnMainThread() - if let asset = assetMap.get(key: assetDescription.url) { // Synchronous cache hit. - Logger.verbose("asset cache hit: \(assetDescription.url)") success(nil, asset) return nil } @@ -517,7 +468,6 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio // Cache miss. // // Asset requests are done queued and performed asynchronously. - Logger.verbose("asset cache miss: \(assetDescription.url)") let assetRequest = ProxiedContentAssetRequest(assetDescription: assetDescription, priority: priority, success: success, @@ -532,10 +482,6 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio } public func cancelAllRequests() { - AssertIsOnMainThread() - - Logger.verbose("cancelAllRequests") - self.assetRequestQueue.forEach { $0.cancel() } self.assetRequestQueue = [] } @@ -552,8 +498,6 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio // Returns true if the request is completed. private func tryToCompleteRequest(assetRequest: ProxiedContentAssetRequest) -> Bool { - AssertIsOnMainThread() - guard assetRequest.areAllSegmentsComplete() else { return false } @@ -565,7 +509,6 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio // Move write off main thread. DispatchQueue.global().async { guard let downloadFolderPath = self.downloadFolderPath else { - owsFailDebug("Missing downloadFolderPath") return } guard let asset = assetRequest.writeAssetToFile(downloadFolderPath: downloadFolderPath) else { @@ -607,10 +550,7 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio } private func removeAssetRequestFromQueue(assetRequest: ProxiedContentAssetRequest) { - AssertIsOnMainThread() - guard assetRequestQueue.contains(assetRequest) else { - Logger.warn("could not remove asset request from queue: \(assetRequest.assetDescription.url)") return } @@ -630,8 +570,6 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio // * Complete/cancel asset requests if possible. // private func processRequestQueueSync() { - AssertIsOnMainThread() - guard let assetRequest = popNextAssetRequest() else { return } @@ -687,7 +625,6 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio // Start a download task. guard let assetSegment = assetRequest.firstWaitingSegment() else { - owsFailDebug("queued asset request does not have a waiting segment.") return } assetSegment.state = .downloading @@ -723,13 +660,11 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio } guard let data = data, data.count > 0 else { - owsFailDebug("Asset size response missing data.") assetRequest.state = .failed self.assetRequestDidFail(assetRequest: assetRequest) return } guard let httpResponse = response as? HTTPURLResponse else { - owsFailDebug("Asset size response is invalid.") assetRequest.state = .failed self.assetRequestDidFail(assetRequest: assetRequest) return @@ -737,7 +672,6 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio var firstContentRangeString: String? for header in httpResponse.allHeaderFields.keys { guard let headerString = header as? String else { - owsFailDebug("Invalid header: \(header)") continue } if headerString.lowercased() == "content-range" { @@ -745,7 +679,6 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio } } guard let contentRangeString = firstContentRangeString else { - owsFailDebug("Asset size response is missing content range.") assetRequest.state = .failed self.assetRequestDidFail(assetRequest: assetRequest) return @@ -753,21 +686,18 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio // Example: content-range: bytes 0-1023/7630 guard let contentLengthString = NSRegularExpression.parseFirstMatch(pattern: "^bytes \\d+\\-\\d+/(\\d+)$", - text: contentRangeString) else { - owsFailDebug("Asset size response has invalid content range.") + text: contentRangeString) else { assetRequest.state = .failed self.assetRequestDidFail(assetRequest: assetRequest) return } guard contentLengthString.count > 0, let contentLength = Int(contentLengthString) else { - owsFailDebug("Asset size response has unparsable content length.") assetRequest.state = .failed self.assetRequestDidFail(assetRequest: assetRequest) return } guard contentLength > 0 else { - owsFailDebug("Asset size response has invalid content length.") assetRequest.state = .failed self.assetRequestDidFail(assetRequest: assetRequest) return @@ -789,8 +719,6 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio // * Need to download the content length. // * Need to download at least one of its segments. private func popNextAssetRequest() -> ProxiedContentAssetRequest? { - AssertIsOnMainThread() - let kMaxAssetRequestCount: UInt = 3 let kMaxAssetRequestsPerAssetCount: UInt = kMaxAssetRequestCount - 1 @@ -874,23 +802,19 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio return } if let error = error { - Logger.error("download failed with error: \(error)") segmentRequestDidFail(assetRequest: assetRequest, assetSegment: assetSegment) return } guard let httpResponse = task.response as? HTTPURLResponse else { - Logger.error("missing or unexpected response: \(String(describing: task.response))") segmentRequestDidFail(assetRequest: assetRequest, assetSegment: assetSegment) return } let statusCode = httpResponse.statusCode guard statusCode >= 200 && statusCode < 400 else { - Logger.error("response has invalid status code: \(statusCode)") segmentRequestDidFail(assetRequest: assetRequest, assetSegment: assetSegment) return } guard assetSegment.totalDataSize() == assetSegment.segmentLength else { - Logger.error("segment is missing data: \(statusCode)") segmentRequestDidFail(assetRequest: assetRequest, assetSegment: assetSegment) return } @@ -925,7 +849,6 @@ open class ProxiedContentDownloader: NSObject, URLSessionTaskDelegate, URLSessio // Don't back up ProxiedContent downloads. OWSFileSystem.protectFileOrFolder(atPath: dirPath) } catch let error as NSError { - owsFailDebug("ensureTempFolder failed: \(dirPath), \(error)") downloadFolderPath = tempDirPath } } diff --git a/SignalUtilitiesKit/Database/Keychain/SSKKeychainStorage.swift b/SessionUtilitiesKit/SSKKeychainStorage.swift similarity index 97% rename from SignalUtilitiesKit/Database/Keychain/SSKKeychainStorage.swift rename to SessionUtilitiesKit/SSKKeychainStorage.swift index 168609bed..e9243901f 100644 --- a/SignalUtilitiesKit/Database/Keychain/SSKKeychainStorage.swift +++ b/SessionUtilitiesKit/SSKKeychainStorage.swift @@ -34,8 +34,6 @@ public class SSKDefaultKeychainStorage: NSObject, SSKKeychainStorage { // Force usage as a singleton override private init() { super.init() - - SwiftSingletons.register(self) } @objc public func string(forService service: String, key: String) throws -> String { @@ -96,7 +94,6 @@ public class SSKDefaultKeychainStorage: NSObject, SSKKeychainStorage { if let error = error { // If deletion failed because the specified item could not be found in the keychain, consider it success. if error.code == errSecItemNotFound { - Logger.info("Keychain delete failed; item not found.") return } throw KeychainStorageError.failure(description: "\(logTag) error removing data: \(error)") diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 4df8c5640..0f4163221 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -238,13 +238,10 @@ B82B4090239DD75000A248E7 /* RestoreVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B82B408F239DD75000A248E7 /* RestoreVC.swift */; }; B82B4094239DF15900A248E7 /* ConversationTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B82B4093239DF15900A248E7 /* ConversationTitleView.swift */; }; B83F2B88240CB75A000A54AB /* UIImage+Scaling.swift in Sources */ = {isa = PBXBuildFile; fileRef = B83F2B87240CB75A000A54AB /* UIImage+Scaling.swift */; }; - B84072962565E9F50037CB17 /* TSOutgoingMessage+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = B84072952565E9F50037CB17 /* TSOutgoingMessage+Conversion.swift */; }; - B84072A02565F1670037CB17 /* Quote+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = B840729F2565F1670037CB17 /* Quote+Conversion.swift */; }; B84664F5235022F30083A1CD /* MentionUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B84664F4235022F30083A1CD /* MentionUtilities.swift */; }; B85357BF23A1AE0800AAF6CD /* SeedReminderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B85357BE23A1AE0800AAF6CD /* SeedReminderView.swift */; }; B85357C323A1BD1200AAF6CD /* SeedVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B85357C223A1BD1200AAF6CD /* SeedVC.swift */; }; B8544E3323D50E4900299F14 /* AppearanceUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8544E3223D50E4900299F14 /* AppearanceUtilities.swift */; }; - B867665825663BBA00B197C5 /* MessageSenderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B867665725663BBA00B197C5 /* MessageSenderDelegate.swift */; }; B86BD08423399ACF000F5AE3 /* Modal.swift in Sources */ = {isa = PBXBuildFile; fileRef = B86BD08323399ACF000F5AE3 /* Modal.swift */; }; B86BD08623399CEF000F5AE3 /* SeedModal.swift in Sources */ = {isa = PBXBuildFile; fileRef = B86BD08523399CEF000F5AE3 /* SeedModal.swift */; }; B8783E9E23EB948D00404FB8 /* UILabel+Interaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8783E9D23EB948D00404FB8 /* UILabel+Interaction.swift */; }; @@ -265,21 +262,6 @@ B8CCF6432397711F0091D419 /* SettingsVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8CCF6422397711F0091D419 /* SettingsVC.swift */; }; B8D797B2256B25A1007C59DF /* TSAttachmentPointer+Backups.m in Sources */ = {isa = PBXBuildFile; fileRef = B8D797B1256B25A1007C59DF /* TSAttachmentPointer+Backups.m */; }; B8D797C3256B25A8007C59DF /* TSAttachmentPointer+Backups.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D797B0256B2590007C59DF /* TSAttachmentPointer+Backups.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B8D797D5256B2715007C59DF /* TSAttachment+Albums.m in Sources */ = {isa = PBXBuildFile; fileRef = B8D797D4256B2715007C59DF /* TSAttachment+Albums.m */; }; - B8D797DF256B2737007C59DF /* TSAttachment+Albums.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D797DE256B2732007C59DF /* TSAttachment+Albums.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B8D8F0F32565F98E0092EF10 /* LKUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB6B255A580F00E217F9 /* LKUserDefaults.swift */; }; - B8D8F0F42565F98E0092EF10 /* PushNotificationAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBDE255A581900E217F9 /* PushNotificationAPI.swift */; }; - B8D8F1382566120F0092EF10 /* Storage+ClosedGroups.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F1372566120F0092EF10 /* Storage+ClosedGroups.swift */; }; - B8D8F16A256615DE0092EF10 /* Storage+Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F0A5FD255C988A007BE2A3 /* Storage+Shared.swift */; }; - B8D8F16B256615DE0092EF10 /* Storage+VolumeSamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31F812525258FB000DD9FD9 /* Storage+VolumeSamples.swift */; }; - B8D8F16C256615DE0092EF10 /* Storage+SnodeAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F0A607255C98A6007BE2A3 /* Storage+SnodeAPI.swift */; }; - B8D8F17725661AFA0092EF10 /* Storage+Jobs.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F17625661AFA0092EF10 /* Storage+Jobs.swift */; }; - B8D8F18925661BA50092EF10 /* Storage+OpenGroups.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F18825661BA50092EF10 /* Storage+OpenGroups.swift */; }; - B8D8F19325661BF80092EF10 /* Storage+Messaging.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F19225661BF80092EF10 /* Storage+Messaging.swift */; }; - B8D8F1BD25661C6F0092EF10 /* Storage+OnionRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F1BC25661C6F0092EF10 /* Storage+OnionRequests.swift */; }; - B8D8F1E6256620DD0092EF10 /* MessageReceiverDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D697492564DEDC004AF766 /* MessageReceiverDelegate.swift */; }; - B8D8F1F0256621180092EF10 /* MessageSenderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F1EF256621180092EF10 /* MessageSenderDelegate.swift */; }; - B8D8F21A25662A4D0092EF10 /* OpenGroupAPIDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F21925662A4D0092EF10 /* OpenGroupAPIDelegate.swift */; }; B90418E6183E9DD40038554A /* DateUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = B90418E5183E9DD40038554A /* DateUtil.m */; }; B9EB5ABD1884C002007CBB57 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9EB5ABC1884C002007CBB57 /* MessageUI.framework */; }; C300A5B22554AF9800555489 /* VisibleMessage+Profile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C300A5B12554AF9800555489 /* VisibleMessage+Profile.swift */; }; @@ -299,6 +281,119 @@ C31D1DE9252172D4005D4DA8 /* ContactUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31D1DE8252172D4005D4DA8 /* ContactUtilities.swift */; }; C31FFE57254A5FFE00F19441 /* KeyPairUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31FFE56254A5FFE00F19441 /* KeyPairUtilities.swift */; }; C329FEEC24F7277900B1C64C /* LightModeSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C329FEEB24F7277900B1C64C /* LightModeSheet.swift */; }; + C32C598A256D0664003C73A2 /* SNProtoEnvelope+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EEF09255B49A8007E1867 /* SNProtoEnvelope+Conversion.swift */; }; + C32C599E256DB02B003C73A2 /* TypingIndicators.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA87255A57FC00E217F9 /* TypingIndicators.swift */; }; + C32C59C0256DB41F003C73A2 /* TSThread.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAD3255A580300E217F9 /* TSThread.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C59C1256DB41F003C73A2 /* TSGroupThread.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC01255A581C00E217F9 /* TSGroupThread.m */; }; + C32C59C2256DB41F003C73A2 /* TSContactThread.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAB3255A580000E217F9 /* TSContactThread.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C59C3256DB41F003C73A2 /* TSGroupModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB73255A581000E217F9 /* TSGroupModel.m */; }; + C32C59C4256DB41F003C73A2 /* TSContactThread.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF9255A580600E217F9 /* TSContactThread.m */; }; + C32C59C5256DB41F003C73A2 /* TSGroupModel.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB0A255A580700E217F9 /* TSGroupModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C59C6256DB41F003C73A2 /* TSGroupThread.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA79255A57FB00E217F9 /* TSGroupThread.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C59C7256DB41F003C73A2 /* TSThread.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBB8255A581600E217F9 /* TSThread.m */; }; + C32C5A02256DB658003C73A2 /* MessageSender+Handling.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F1EF256621180092EF10 /* MessageSender+Handling.swift */; }; + C32C5A13256DB7A5003C73A2 /* PushNotificationAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBDE255A581900E217F9 /* PushNotificationAPI.swift */; }; + C32C5A24256DB7DB003C73A2 /* LKUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB6B255A580F00E217F9 /* LKUserDefaults.swift */; }; + C32C5A2D256DB849003C73A2 /* LKGroupUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBE1255A581A00E217F9 /* LKGroupUtilities.m */; }; + C32C5A36256DB856003C73A2 /* LKGroupUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBCA255A581700E217F9 /* LKGroupUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5A47256DB8F0003C73A2 /* ECKeyPair+Hexadecimal.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA73255A57FA00E217F9 /* ECKeyPair+Hexadecimal.swift */; }; + C32C5A48256DB8F0003C73A2 /* BuildConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAA8255A57FF00E217F9 /* BuildConfiguration.swift */; }; + C32C5A75256DBBCF003C73A2 /* TSAttachmentPointer+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C379DCFD25673DBC0002D4EB /* TSAttachmentPointer+Conversion.swift */; }; + C32C5A76256DBBCF003C73A2 /* SignalAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF224255B6D5D007E1867 /* SignalAttachment.swift */; }; + C32C5A88256DBCF9003C73A2 /* MessageReceiver+Handling.swift in Sources */ = {isa = PBXBuildFile; fileRef = C32C5A87256DBCF9003C73A2 /* MessageReceiver+Handling.swift */; }; + C32C5AAA256DBE8F003C73A2 /* TSIncomingMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB9C255A581300E217F9 /* TSIncomingMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5AAB256DBE8F003C73A2 /* TSIncomingMessage+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3B7845C25649DA600ADB2E7 /* TSIncomingMessage+Conversion.swift */; }; + C32C5AAC256DBE8F003C73A2 /* TSInfoMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDADD255A580400E217F9 /* TSInfoMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5AAD256DBE8F003C73A2 /* TSInfoMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC0C255A581E00E217F9 /* TSInfoMessage.m */; }; + C32C5AAE256DBE8F003C73A2 /* TSInteraction.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBE9255A581A00E217F9 /* TSInteraction.m */; }; + C32C5AAF256DBE8F003C73A2 /* TSMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA70255A57FA00E217F9 /* TSMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5AB0256DBE8F003C73A2 /* TSOutgoingMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB56255A580D00E217F9 /* TSOutgoingMessage.m */; }; + C32C5AB1256DBE8F003C73A2 /* TSIncomingMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA97255A57FE00E217F9 /* TSIncomingMessage.m */; }; + C32C5AB2256DBE8F003C73A2 /* TSMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB60255A580E00E217F9 /* TSMessage.m */; }; + C32C5AB3256DBE8F003C73A2 /* TSInteraction.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAE6255A580400E217F9 /* TSInteraction.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5AB4256DBE8F003C73A2 /* TSOutgoingMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB48255A580C00E217F9 /* TSOutgoingMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5AB5256DBE8F003C73A2 /* TSOutgoingMessage+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = B84072952565E9F50037CB17 /* TSOutgoingMessage+Conversion.swift */; }; + C32C5ADF256DBFAA003C73A2 /* OWSReadTracking.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAE1255A580400E217F9 /* OWSReadTracking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5AF8256DC051003C73A2 /* OWSDisappearingMessagesConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBA4255A581400E217F9 /* OWSDisappearingMessagesConfiguration.m */; }; + C32C5B0A256DC076003C73A2 /* OWSDisappearingMessagesConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAD9255A580300E217F9 /* OWSDisappearingMessagesConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5B1C256DC19D003C73A2 /* TSQuotedMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB83255A581100E217F9 /* TSQuotedMessage.m */; }; + C32C5B2D256DC1A1003C73A2 /* TSQuotedMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAD5255A580300E217F9 /* TSQuotedMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5B3F256DC1DF003C73A2 /* TSQuotedMessage+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C32C5B3E256DC1DF003C73A2 /* TSQuotedMessage+Conversion.swift */; }; + C32C5B48256DC211003C73A2 /* NSNotificationCenter+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB6C255A580F00E217F9 /* NSNotificationCenter+OWS.m */; }; + C32C5B51256DC219003C73A2 /* NSNotificationCenter+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB3B255A580B00E217F9 /* NSNotificationCenter+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5B62256DC333003C73A2 /* OWSDisappearingConfigurationUpdateInfoMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA6B255A57FA00E217F9 /* OWSDisappearingConfigurationUpdateInfoMessage.m */; }; + C32C5B6B256DC357003C73A2 /* OWSDisappearingConfigurationUpdateInfoMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDADA255A580400E217F9 /* OWSDisappearingConfigurationUpdateInfoMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5B84256DC54F003C73A2 /* SSKEnvironment.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF4255A580600E217F9 /* SSKEnvironment.m */; }; + C32C5B8D256DC565003C73A2 /* SSKEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB31255A580A00E217F9 /* SSKEnvironment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5B9F256DC739003C73A2 /* OWSBlockingManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA68255A57F900E217F9 /* OWSBlockingManager.m */; }; + C32C5BB0256DC73D003C73A2 /* OWSBlockingManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBEB255A581B00E217F9 /* OWSBlockingManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5BBA256DC7E3003C73A2 /* ProfileManagerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBB9255A581600E217F9 /* ProfileManagerProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5BCC256DC830003C73A2 /* Storage+ClosedGroups.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F1372566120F0092EF10 /* Storage+ClosedGroups.swift */; }; + C32C5BDD256DC88D003C73A2 /* OWSReadReceiptManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA71255A57FA00E217F9 /* OWSReadReceiptManager.m */; }; + C32C5BE6256DC891003C73A2 /* OWSReadReceiptManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB1D255A580900E217F9 /* OWSReadReceiptManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5BEF256DC8EE003C73A2 /* OWSDisappearingMessagesJob.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBDD255A581900E217F9 /* OWSDisappearingMessagesJob.m */; }; + C32C5BF8256DC8F6003C73A2 /* OWSDisappearingMessagesJob.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA80255A57FC00E217F9 /* OWSDisappearingMessagesJob.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5C01256DC9A0003C73A2 /* OWSIdentityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBA9255A581500E217F9 /* OWSIdentityManager.m */; }; + C32C5C0A256DC9B4003C73A2 /* OWSIdentityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBF1255A581B00E217F9 /* OWSIdentityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5C1B256DC9E0003C73A2 /* GeneralUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBC1255A581700E217F9 /* GeneralUtilities.swift */; }; + C32C5C24256DCB30003C73A2 /* NotificationsProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB7A255A581000E217F9 /* NotificationsProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5C3D256DCBAF003C73A2 /* AppReadiness.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB75255A581000E217F9 /* AppReadiness.m */; }; + C32C5C46256DCBB2003C73A2 /* AppReadiness.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB01255A580700E217F9 /* AppReadiness.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5C4F256DCC36003C73A2 /* Storage+OpenGroups.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F18825661BA50092EF10 /* Storage+OpenGroups.swift */; }; + C32C5C88256DD0D2003C73A2 /* Storage+Messaging.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F19225661BF80092EF10 /* Storage+Messaging.swift */; }; + C32C5C89256DD0D2003C73A2 /* Storage+Jobs.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F17625661AFA0092EF10 /* Storage+Jobs.swift */; }; + C32C5C93256DD12D003C73A2 /* OWSUDManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C32C5C92256DD12D003C73A2 /* OWSUDManager.swift */; }; + C32C5CA4256DD1DC003C73A2 /* TSAccountManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB88255A581200E217F9 /* TSAccountManager.m */; }; + C32C5CAD256DD1DF003C73A2 /* TSAccountManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB94255A581300E217F9 /* TSAccountManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5CBE256DD282003C73A2 /* Storage+OnionRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F1BC25661C6F0092EF10 /* Storage+OnionRequests.swift */; }; + C32C5CBF256DD282003C73A2 /* Storage+SnodeAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F0A607255C98A6007BE2A3 /* Storage+SnodeAPI.swift */; }; + C32C5CF0256DD3E4003C73A2 /* Storage+Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F0A5FD255C988A007BE2A3 /* Storage+Shared.swift */; }; + C32C5D19256DD493003C73A2 /* OWSLinkPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBA8255A581500E217F9 /* OWSLinkPreview.swift */; }; + C32C5D23256DD4C0003C73A2 /* Mention.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA7E255A57FB00E217F9 /* Mention.swift */; }; + C32C5D24256DD4C0003C73A2 /* MentionsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA81255A57FC00E217F9 /* MentionsManager.swift */; }; + C32C5D2E256DD4EA003C73A2 /* TSUnreadIndicatorInteraction.m in Sources */ = {isa = PBXBuildFile; fileRef = C38EF2C1255B6DA6007E1867 /* TSUnreadIndicatorInteraction.m */; }; + C32C5D37256DD4ED003C73A2 /* TSUnreadIndicatorInteraction.h in Headers */ = {isa = PBXBuildFile; fileRef = C38EF2BE255B6DA6007E1867 /* TSUnreadIndicatorInteraction.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5D40256DD51E003C73A2 /* Storage+VolumeSamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31F812525258FB000DD9FD9 /* Storage+VolumeSamples.swift */; }; + C32C5D83256DD5B6003C73A2 /* SSKKeychainStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBBC255A581600E217F9 /* SSKKeychainStorage.swift */; }; + C32C5D9C256DD6DC003C73A2 /* OWSOutgoingReceiptManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB6F255A580F00E217F9 /* OWSOutgoingReceiptManager.m */; }; + C32C5DA5256DD6E5003C73A2 /* OWSOutgoingReceiptManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDABD255A580100E217F9 /* OWSOutgoingReceiptManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5DBE256DD743003C73A2 /* OpenGroupPoller.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA8C255A57FD00E217F9 /* OpenGroupPoller.swift */; }; + C32C5DBF256DD743003C73A2 /* ClosedGroupPoller.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB34255A580B00E217F9 /* ClosedGroupPoller.swift */; }; + C32C5DC0256DD743003C73A2 /* Poller.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB3A255A580B00E217F9 /* Poller.swift */; }; + C32C5DC9256DD935003C73A2 /* ProxiedContentDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF2255A580500E217F9 /* ProxiedContentDownloader.swift */; }; + C32C5DD2256DD9E5003C73A2 /* LRUCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAFD255A580600E217F9 /* LRUCache.swift */; }; + C32C5DDB256DD9FF003C73A2 /* ContentProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB68255A580F00E217F9 /* ContentProxy.swift */; }; + C32C5E0C256DDAFA003C73A2 /* NSRegularExpression+SSK.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA7A255A57FB00E217F9 /* NSRegularExpression+SSK.swift */; }; + C32C5E15256DDC78003C73A2 /* SSKPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA69255A57F900E217F9 /* SSKPreferences.swift */; }; + C32C5E5B256DDF45003C73A2 /* OWSStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAB1255A580000E217F9 /* OWSStorage.m */; }; + C32C5E64256DDFD6003C73A2 /* OWSStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAFE255A580600E217F9 /* OWSStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5E75256DE020003C73A2 /* YapDatabaseTransaction+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB5B255A580E00E217F9 /* YapDatabaseTransaction+OWS.m */; }; + C32C5E7E256DE023003C73A2 /* YapDatabaseTransaction+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA88255A57FD00E217F9 /* YapDatabaseTransaction+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5E97256DE0CB003C73A2 /* OWSPrimaryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC02255A581D00E217F9 /* OWSPrimaryStorage.m */; }; + C32C5EA0256DE0D6003C73A2 /* OWSPrimaryStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA67255A57F900E217F9 /* OWSPrimaryStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5EB9256DE130003C73A2 /* OWSQuotedReplyModel+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = B840729F2565F1670037CB17 /* OWSQuotedReplyModel+Conversion.swift */; }; + C32C5EBA256DE130003C73A2 /* OWSQuotedReplyModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C38EF39A255B6DD9007E1867 /* OWSQuotedReplyModel.m */; }; + C32C5EC3256DE133003C73A2 /* OWSQuotedReplyModel.h in Headers */ = {isa = PBXBuildFile; fileRef = C38EF398255B6DD9007E1867 /* OWSQuotedReplyModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5EDC256DF501003C73A2 /* YapDatabaseConnection+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB43255A580C00E217F9 /* YapDatabaseConnection+OWS.m */; }; + C32C5EE5256DF506003C73A2 /* YapDatabaseConnection+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB5F255A580E00E217F9 /* YapDatabaseConnection+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5EEE256DF54E003C73A2 /* TSDatabaseView.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB46255A580C00E217F9 /* TSDatabaseView.m */; }; + C32C5EF7256DF567003C73A2 /* TSDatabaseView.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB2C255A580A00E217F9 /* TSDatabaseView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5F08256DF5C8003C73A2 /* DisplayNameUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAFF255A580600E217F9 /* DisplayNameUtilities.swift */; }; + C32C5F11256DF79A003C73A2 /* SSKIncrementingIdFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB32255A580A00E217F9 /* SSKIncrementingIdFinder.swift */; }; + C32C5F1A256DFCAD003C73A2 /* TSErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAE7255A580500E217F9 /* TSErrorMessage.m */; }; + C32C5F23256DFCC0003C73A2 /* TSErrorMessage_privateConstructor.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB5D255A580E00E217F9 /* TSErrorMessage_privateConstructor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5F34256DFCC4003C73A2 /* TSErrorMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBB0255A581500E217F9 /* TSErrorMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5F45256DFD2B003C73A2 /* TSInvalidIdentityKeyReceivingErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBCB255A581800E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.m */; }; + C32C5F4E256DFD58003C73A2 /* TSInvalidIdentityKeyReceivingErrorMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA7B255A57FB00E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5F5F256DFD90003C73A2 /* TSInvalidIdentityKeyErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB74255A581000E217F9 /* TSInvalidIdentityKeyErrorMessage.m */; }; + C32C5F68256DFDAA003C73A2 /* TSInvalidIdentityKeyErrorMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB8C255A581200E217F9 /* TSInvalidIdentityKeyErrorMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5FA1256DFED5003C73A2 /* NSArray+Functional.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAB8255A580100E217F9 /* NSArray+Functional.m */; }; + C32C5FAA256DFED9003C73A2 /* NSArray+Functional.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB5C255A580E00E217F9 /* NSArray+Functional.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5FBB256E0206003C73A2 /* OWSBackgroundTask.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC1B255A581F00E217F9 /* OWSBackgroundTask.m */; }; + C32C5FC4256E0209003C73A2 /* OWSBackgroundTask.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB38255A580B00E217F9 /* OWSBackgroundTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C32C5FD6256E0346003C73A2 /* Notification+Thread.swift in Sources */ = {isa = PBXBuildFile; fileRef = C32C5FD5256E0346003C73A2 /* Notification+Thread.swift */; }; + C32C600F256E07F5003C73A2 /* NSUserDefaults+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB77255A581000E217F9 /* NSUserDefaults+OWS.m */; }; + C32C6018256E07F9003C73A2 /* NSUserDefaults+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB51255A580D00E217F9 /* NSUserDefaults+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33100082558FF6D00070591 /* NewConversationButtonSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B83F2B85240C7B8F000A54AB /* NewConversationButtonSet.swift */; }; C33100092558FF6D00070591 /* UserCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31D1DDC25217014005D4DA8 /* UserCell.swift */; }; C33100142558FFC200070591 /* UIImage+Tinting.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33100132558FFC200070591 /* UIImage+Tinting.swift */; }; @@ -331,207 +426,104 @@ C33FD9C3255A54EF00E217F9 /* SessionProtocolKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3C2A8622553B41A00C340D1 /* SessionProtocolKit.framework */; }; C33FD9C4255A54EF00E217F9 /* SessionSnodeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3C2A59F255385C100C340D1 /* SessionSnodeKit.framework */; }; C33FD9C5255A54EF00E217F9 /* SessionUtilitiesKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3C2A679255388CC00C340D1 /* SessionUtilitiesKit.framework */; }; - C33FDC21255A581F00E217F9 /* OWSPrimaryStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA67255A57F900E217F9 /* OWSPrimaryStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC22255A581F00E217F9 /* OWSBlockingManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA68255A57F900E217F9 /* OWSBlockingManager.m */; }; - C33FDC23255A581F00E217F9 /* SSKPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA69255A57F900E217F9 /* SSKPreferences.swift */; }; - C33FDC25255A581F00E217F9 /* OWSDisappearingConfigurationUpdateInfoMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA6B255A57FA00E217F9 /* OWSDisappearingConfigurationUpdateInfoMessage.m */; }; - C33FDC26255A581F00E217F9 /* ProtoUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA6C255A57FA00E217F9 /* ProtoUtils.m */; }; C33FDC27255A581F00E217F9 /* YapDatabase+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA6D255A57FA00E217F9 /* YapDatabase+Promise.swift */; }; C33FDC29255A581F00E217F9 /* ReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA6F255A57FA00E217F9 /* ReachabilityManager.swift */; }; - C33FDC2A255A581F00E217F9 /* TSMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA70255A57FA00E217F9 /* TSMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC2B255A581F00E217F9 /* OWSReadReceiptManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA71255A57FA00E217F9 /* OWSReadReceiptManager.m */; }; C33FDC2C255A581F00E217F9 /* OWSFailedAttachmentDownloadsJob.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA72255A57FA00E217F9 /* OWSFailedAttachmentDownloadsJob.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC2D255A581F00E217F9 /* ECKeyPair+Hexadecimal.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA73255A57FA00E217F9 /* ECKeyPair+Hexadecimal.swift */; }; C33FDC2F255A581F00E217F9 /* OWSSyncManagerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA75255A57FB00E217F9 /* OWSSyncManagerProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC33255A581F00E217F9 /* TSGroupThread.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA79255A57FB00E217F9 /* TSGroupThread.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC34255A581F00E217F9 /* NSRegularExpression+SSK.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA7A255A57FB00E217F9 /* NSRegularExpression+SSK.swift */; }; - C33FDC35255A581F00E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA7B255A57FB00E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC38255A581F00E217F9 /* Mention.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA7E255A57FB00E217F9 /* Mention.swift */; }; C33FDC39255A581F00E217F9 /* OWSRecordTranscriptJob.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA7F255A57FC00E217F9 /* OWSRecordTranscriptJob.m */; }; - C33FDC3A255A581F00E217F9 /* OWSDisappearingMessagesJob.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA80255A57FC00E217F9 /* OWSDisappearingMessagesJob.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC3B255A581F00E217F9 /* MentionsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA81255A57FC00E217F9 /* MentionsManager.swift */; }; - C33FDC40255A581F00E217F9 /* OWSDisappearingMessagesFinder.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA86255A57FC00E217F9 /* OWSDisappearingMessagesFinder.m */; }; - C33FDC41255A581F00E217F9 /* TypingIndicators.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA87255A57FC00E217F9 /* TypingIndicators.swift */; }; - C33FDC42255A581F00E217F9 /* YapDatabaseTransaction+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA88255A57FD00E217F9 /* YapDatabaseTransaction+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC45255A581F00E217F9 /* AppVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA8B255A57FD00E217F9 /* AppVersion.m */; }; - C33FDC46255A581F00E217F9 /* OpenGroupPoller.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA8C255A57FD00E217F9 /* OpenGroupPoller.swift */; }; C33FDC4F255A582000E217F9 /* OWSChunkedOutputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA95255A57FE00E217F9 /* OWSChunkedOutputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC50255A582000E217F9 /* OWSDispatch.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA96255A57FE00E217F9 /* OWSDispatch.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC51255A582000E217F9 /* TSIncomingMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA97255A57FE00E217F9 /* TSIncomingMessage.m */; }; C33FDC52255A582000E217F9 /* RotateSignedKeyOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA98255A57FE00E217F9 /* RotateSignedKeyOperation.swift */; }; C33FDC53255A582000E217F9 /* OutageDetection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA99255A57FE00E217F9 /* OutageDetection.swift */; }; C33FDC57255A582000E217F9 /* OWSContactsOutputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA9D255A57FF00E217F9 /* OWSContactsOutputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC58255A582000E217F9 /* ReverseDispatchQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA9E255A57FF00E217F9 /* ReverseDispatchQueue.swift */; }; - C33FDC5A255A582000E217F9 /* OWSRecipientIdentity.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAA0255A57FF00E217F9 /* OWSRecipientIdentity.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC61255A582000E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAA7255A57FF00E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC62255A582000E217F9 /* BuildConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAA8255A57FF00E217F9 /* BuildConfiguration.swift */; }; C33FDC64255A582000E217F9 /* NSObject+Casting.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAAA255A580000E217F9 /* NSObject+Casting.m */; }; - C33FDC6B255A582000E217F9 /* OWSStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAB1255A580000E217F9 /* OWSStorage.m */; }; - C33FDC6D255A582000E217F9 /* TSContactThread.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAB3255A580000E217F9 /* TSContactThread.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC71255A582000E217F9 /* OWSFailedMessagesJob.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAB7255A580100E217F9 /* OWSFailedMessagesJob.m */; }; - C33FDC72255A582000E217F9 /* NSArray+Functional.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAB8255A580100E217F9 /* NSArray+Functional.m */; }; C33FDC73255A582000E217F9 /* OWSStorage+Subclass.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAB9255A580100E217F9 /* OWSStorage+Subclass.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC75255A582000E217F9 /* OWSGroupsOutputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDABB255A580100E217F9 /* OWSGroupsOutputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC77255A582000E217F9 /* OWSOutgoingReceiptManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDABD255A580100E217F9 /* OWSOutgoingReceiptManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC78255A582000E217F9 /* TSConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDABE255A580100E217F9 /* TSConstants.m */; }; - C33FDC7A255A582000E217F9 /* OWSIncomingMessageFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAC0255A580100E217F9 /* OWSIncomingMessageFinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC7B255A582000E217F9 /* NSSet+Functional.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAC1255A580100E217F9 /* NSSet+Functional.m */; }; C33FDC7D255A582000E217F9 /* OWSDispatch.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAC3255A580200E217F9 /* OWSDispatch.m */; }; - C33FDC87255A582000E217F9 /* SSKJobRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDACD255A580200E217F9 /* SSKJobRecord.m */; }; C33FDC89255A582000E217F9 /* OWSAttachmentDownloads.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDACF255A580300E217F9 /* OWSAttachmentDownloads.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC8D255A582000E217F9 /* TSThread.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAD3255A580300E217F9 /* TSThread.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC8F255A582000E217F9 /* TSQuotedMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAD5255A580300E217F9 /* TSQuotedMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC92255A582000E217F9 /* OWSGroupsOutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAD8255A580300E217F9 /* OWSGroupsOutputStream.m */; }; - C33FDC93255A582000E217F9 /* OWSDisappearingMessagesConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAD9255A580300E217F9 /* OWSDisappearingMessagesConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC94255A582000E217F9 /* OWSDisappearingConfigurationUpdateInfoMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDADA255A580400E217F9 /* OWSDisappearingConfigurationUpdateInfoMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC95255A582000E217F9 /* OWSFailedMessagesJob.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDADB255A580400E217F9 /* OWSFailedMessagesJob.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC96255A582000E217F9 /* NSObject+Casting.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDADC255A580400E217F9 /* NSObject+Casting.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC97255A582000E217F9 /* TSInfoMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDADD255A580400E217F9 /* TSInfoMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC98255A582000E217F9 /* SwiftSingletons.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDADE255A580400E217F9 /* SwiftSingletons.swift */; }; C33FDC99255A582000E217F9 /* PublicChatManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDADF255A580400E217F9 /* PublicChatManager.swift */; }; C33FDC9A255A582000E217F9 /* ByteParser.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAE0255A580400E217F9 /* ByteParser.m */; }; - C33FDC9B255A582000E217F9 /* OWSReadTracking.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAE1255A580400E217F9 /* OWSReadTracking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDCA0255A582000E217F9 /* TSInteraction.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAE6255A580400E217F9 /* TSInteraction.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDCA1255A582000E217F9 /* TSErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAE7255A580500E217F9 /* TSErrorMessage.m */; }; C33FDCA2255A582000E217F9 /* OWSMessageUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAE8255A580500E217F9 /* OWSMessageUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDCA3255A582000E217F9 /* SSKMessageSenderJobRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAE9255A580500E217F9 /* SSKMessageSenderJobRecord.m */; }; C33FDCA4255A582000E217F9 /* OWSBackupFragment.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAEA255A580500E217F9 /* OWSBackupFragment.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDCA6255A582000E217F9 /* SignalRecipient.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAEC255A580500E217F9 /* SignalRecipient.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDCA7255A582000E217F9 /* SSKMessageSenderJobRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAED255A580500E217F9 /* SSKMessageSenderJobRecord.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDCAC255A582000E217F9 /* ProxiedContentDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF2255A580500E217F9 /* ProxiedContentDownloader.swift */; }; C33FDCAD255A582000E217F9 /* OWSPrimaryStorage+SessionStore.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF3255A580500E217F9 /* OWSPrimaryStorage+SessionStore.m */; }; - C33FDCAE255A582000E217F9 /* SSKEnvironment.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF4255A580600E217F9 /* SSKEnvironment.m */; }; C33FDCB1255A582000E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF7255A580600E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.m */; }; - C33FDCB3255A582000E217F9 /* TSContactThread.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF9255A580600E217F9 /* TSContactThread.m */; }; - C33FDCB7255A582000E217F9 /* LRUCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAFD255A580600E217F9 /* LRUCache.swift */; }; - C33FDCB8255A582000E217F9 /* OWSStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAFE255A580600E217F9 /* OWSStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDCB9255A582000E217F9 /* DisplayNameUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAFF255A580600E217F9 /* DisplayNameUtilities.swift */; }; - C33FDCBB255A582000E217F9 /* AppReadiness.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB01255A580700E217F9 /* AppReadiness.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDCBD255A582000E217F9 /* OWSPrimaryStorage+SessionStore.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB03255A580700E217F9 /* OWSPrimaryStorage+SessionStore.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDCC1255A582000E217F9 /* OWSBackupFragment.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB07255A580700E217F9 /* OWSBackupFragment.m */; }; C33FDCC3255A582000E217F9 /* NSError+MessageSending.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB09255A580700E217F9 /* NSError+MessageSending.m */; }; - C33FDCC4255A582000E217F9 /* TSGroupModel.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB0A255A580700E217F9 /* TSGroupModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDCC7255A582000E217F9 /* NSArray+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB0D255A580800E217F9 /* NSArray+OWS.m */; }; C33FDCC8255A582000E217F9 /* NSError+MessageSending.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB0E255A580800E217F9 /* NSError+MessageSending.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDCCC255A582000E217F9 /* NSString+SSK.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB12255A580800E217F9 /* NSString+SSK.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDCCE255A582000E217F9 /* OWSMath.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB14255A580800E217F9 /* OWSMath.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDCD1255A582000E217F9 /* FunctionalUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB17255A580800E217F9 /* FunctionalUtil.m */; }; C33FDCD3255A582000E217F9 /* GroupUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB19255A580900E217F9 /* GroupUtilities.swift */; }; - C33FDCD7255A582000E217F9 /* OWSReadReceiptManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB1D255A580900E217F9 /* OWSReadReceiptManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDCD8255A582000E217F9 /* OWSIncomingMessageFinder.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB1E255A580900E217F9 /* OWSIncomingMessageFinder.m */; }; - C33FDCDA255A582000E217F9 /* TSDatabaseSecondaryIndexes.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB20255A580900E217F9 /* TSDatabaseSecondaryIndexes.m */; }; - C33FDCDF255A582000E217F9 /* TSDatabaseSecondaryIndexes.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB25255A580900E217F9 /* TSDatabaseSecondaryIndexes.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDCE6255A582000E217F9 /* TSDatabaseView.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB2C255A580A00E217F9 /* TSDatabaseView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDCEB255A582000E217F9 /* SSKEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB31255A580A00E217F9 /* SSKEnvironment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDCEC255A582000E217F9 /* SSKIncrementingIdFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB32255A580A00E217F9 /* SSKIncrementingIdFinder.swift */; }; - C33FDCEE255A582000E217F9 /* ClosedGroupPoller.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB34255A580B00E217F9 /* ClosedGroupPoller.swift */; }; - C33FDCF2255A582000E217F9 /* OWSBackgroundTask.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB38255A580B00E217F9 /* OWSBackgroundTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDCF4255A582000E217F9 /* Poller.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB3A255A580B00E217F9 /* Poller.swift */; }; - C33FDCF5255A582000E217F9 /* NSNotificationCenter+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB3B255A580B00E217F9 /* NSNotificationCenter+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDCF9255A582000E217F9 /* String+SSK.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB3F255A580C00E217F9 /* String+SSK.swift */; }; C33FDCFA255A582000E217F9 /* SignalIOSProto.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB40255A580C00E217F9 /* SignalIOSProto.swift */; }; - C33FDCFD255A582000E217F9 /* YapDatabaseConnection+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB43255A580C00E217F9 /* YapDatabaseConnection+OWS.m */; }; C33FDCFE255A582000E217F9 /* OWSContactsOutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB44255A580C00E217F9 /* OWSContactsOutputStream.m */; }; C33FDCFF255A582000E217F9 /* NSString+SSK.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB45255A580C00E217F9 /* NSString+SSK.m */; }; - C33FDD00255A582000E217F9 /* TSDatabaseView.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB46255A580C00E217F9 /* TSDatabaseView.m */; }; C33FDD01255A582000E217F9 /* OWSPrimaryStorage+PreKeyStore.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB47255A580C00E217F9 /* OWSPrimaryStorage+PreKeyStore.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDD02255A582000E217F9 /* TSOutgoingMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB48255A580C00E217F9 /* TSOutgoingMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD03255A582000E217F9 /* WeakTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB49255A580C00E217F9 /* WeakTimer.swift */; }; C33FDD05255A582000E217F9 /* OWSChunkedOutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB4B255A580C00E217F9 /* OWSChunkedOutputStream.m */; }; C33FDD06255A582000E217F9 /* AppVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB4C255A580D00E217F9 /* AppVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDD09255A582000E217F9 /* SSKJobRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB4F255A580D00E217F9 /* SSKJobRecord.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD0A255A582000E217F9 /* OWSPrimaryStorage+PreKeyStore.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB50255A580D00E217F9 /* OWSPrimaryStorage+PreKeyStore.m */; }; - C33FDD0B255A582000E217F9 /* NSUserDefaults+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB51255A580D00E217F9 /* NSUserDefaults+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD0C255A582000E217F9 /* OWSHTTPSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB52255A580D00E217F9 /* OWSHTTPSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD0D255A582000E217F9 /* PreKeyBundle+jsonDict.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB53255A580D00E217F9 /* PreKeyBundle+jsonDict.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD0F255A582000E217F9 /* TSInvalidIdentityKeySendingErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB55255A580D00E217F9 /* TSInvalidIdentityKeySendingErrorMessage.m */; }; - C33FDD10255A582000E217F9 /* TSOutgoingMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB56255A580D00E217F9 /* TSOutgoingMessage.m */; }; C33FDD12255A582000E217F9 /* OWSPrimaryStorage+Loki.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB58255A580E00E217F9 /* OWSPrimaryStorage+Loki.m */; }; C33FDD13255A582000E217F9 /* OWSFailedAttachmentDownloadsJob.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB59255A580E00E217F9 /* OWSFailedAttachmentDownloadsJob.m */; }; C33FDD14255A582000E217F9 /* OWSUDManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB5A255A580E00E217F9 /* OWSUDManager.swift */; }; - C33FDD15255A582000E217F9 /* YapDatabaseTransaction+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB5B255A580E00E217F9 /* YapDatabaseTransaction+OWS.m */; }; - C33FDD16255A582000E217F9 /* NSArray+Functional.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB5C255A580E00E217F9 /* NSArray+Functional.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDD17255A582000E217F9 /* TSErrorMessage_privateConstructor.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB5D255A580E00E217F9 /* TSErrorMessage_privateConstructor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDD19255A582000E217F9 /* YapDatabaseConnection+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB5F255A580E00E217F9 /* YapDatabaseConnection+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDD1A255A582000E217F9 /* TSMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB60255A580E00E217F9 /* TSMessage.m */; }; C33FDD1E255A582000E217F9 /* PreKeyRefreshOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB64255A580E00E217F9 /* PreKeyRefreshOperation.swift */; }; - C33FDD21255A582000E217F9 /* OWSMediaGalleryFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB67255A580F00E217F9 /* OWSMediaGalleryFinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDD22255A582000E217F9 /* ContentProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB68255A580F00E217F9 /* ContentProxy.swift */; }; C33FDD23255A582000E217F9 /* FeatureFlags.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB69255A580F00E217F9 /* FeatureFlags.swift */; }; - C33FDD26255A582000E217F9 /* NSNotificationCenter+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB6C255A580F00E217F9 /* NSNotificationCenter+OWS.m */; }; C33FDD27255A582000E217F9 /* TSPreKeyManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB6D255A580F00E217F9 /* TSPreKeyManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDD29255A582000E217F9 /* OWSOutgoingReceiptManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB6F255A580F00E217F9 /* OWSOutgoingReceiptManager.m */; }; - C33FDD2B255A582000E217F9 /* OWSMediaGalleryFinder.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB71255A581000E217F9 /* OWSMediaGalleryFinder.m */; }; - C33FDD2D255A582000E217F9 /* TSGroupModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB73255A581000E217F9 /* TSGroupModel.m */; }; - C33FDD2E255A582000E217F9 /* TSInvalidIdentityKeyErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB74255A581000E217F9 /* TSInvalidIdentityKeyErrorMessage.m */; }; - C33FDD2F255A582000E217F9 /* AppReadiness.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB75255A581000E217F9 /* AppReadiness.m */; }; - C33FDD31255A582000E217F9 /* NSUserDefaults+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB77255A581000E217F9 /* NSUserDefaults+OWS.m */; }; C33FDD32255A582000E217F9 /* OWSOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB78255A581000E217F9 /* OWSOperation.m */; }; - C33FDD34255A582000E217F9 /* NotificationsProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB7A255A581000E217F9 /* NotificationsProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD38255A582000E217F9 /* TSPreKeyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB7E255A581100E217F9 /* TSPreKeyManager.m */; }; - C33FDD39255A582000E217F9 /* FullTextSearchFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB7F255A581100E217F9 /* FullTextSearchFinder.swift */; }; C33FDD3A255A582000E217F9 /* Notification+Loki.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB80255A581100E217F9 /* Notification+Loki.swift */; }; - C33FDD3D255A582000E217F9 /* TSQuotedMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB83255A581100E217F9 /* TSQuotedMessage.m */; }; C33FDD41255A582000E217F9 /* JobQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB87255A581100E217F9 /* JobQueue.swift */; }; - C33FDD42255A582000E217F9 /* TSAccountManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB88255A581200E217F9 /* TSAccountManager.m */; }; C33FDD45255A582000E217F9 /* Storage+SessionManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB8B255A581200E217F9 /* Storage+SessionManagement.swift */; }; - C33FDD46255A582000E217F9 /* TSInvalidIdentityKeyErrorMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB8C255A581200E217F9 /* TSInvalidIdentityKeyErrorMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD49255A582000E217F9 /* ParamParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB8F255A581200E217F9 /* ParamParser.swift */; }; - C33FDD4B255A582000E217F9 /* ProtoUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB91255A581200E217F9 /* ProtoUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD4D255A582000E217F9 /* PreKeyBundle+jsonDict.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB93255A581200E217F9 /* PreKeyBundle+jsonDict.m */; }; - C33FDD4E255A582000E217F9 /* TSAccountManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB94255A581300E217F9 /* TSAccountManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD53255A582000E217F9 /* OWSPrimaryStorage+keyFromIntLong.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB99255A581300E217F9 /* OWSPrimaryStorage+keyFromIntLong.m */; }; - C33FDD56255A582000E217F9 /* TSIncomingMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB9C255A581300E217F9 /* TSIncomingMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD5A255A582000E217F9 /* TSStorageHeaders.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBA0255A581400E217F9 /* TSStorageHeaders.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD5B255A582000E217F9 /* OWSOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBA1255A581400E217F9 /* OWSOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDD5E255A582000E217F9 /* OWSDisappearingMessagesConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBA4255A581400E217F9 /* OWSDisappearingMessagesConfiguration.m */; }; C33FDD60255A582000E217F9 /* TSInvalidIdentityKeySendingErrorMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBA6255A581400E217F9 /* TSInvalidIdentityKeySendingErrorMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDD62255A582000E217F9 /* OWSLinkPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBA8255A581500E217F9 /* OWSLinkPreview.swift */; }; - C33FDD63255A582000E217F9 /* OWSIdentityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBA9255A581500E217F9 /* OWSIdentityManager.m */; }; C33FDD67255A582000E217F9 /* OWSRecordTranscriptJob.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBAD255A581500E217F9 /* OWSRecordTranscriptJob.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD68255A582000E217F9 /* SignalAccount.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBAE255A581500E217F9 /* SignalAccount.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDD6A255A582000E217F9 /* TSErrorMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBB0255A581500E217F9 /* TSErrorMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD6E255A582000E217F9 /* NSURLSessionDataTask+StatusCode.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBB4255A581600E217F9 /* NSURLSessionDataTask+StatusCode.m */; }; C33FDD71255A582000E217F9 /* SignalRecipient.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBB7255A581600E217F9 /* SignalRecipient.m */; }; - C33FDD72255A582000E217F9 /* TSThread.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBB8255A581600E217F9 /* TSThread.m */; }; - C33FDD73255A582000E217F9 /* ProfileManagerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBB9255A581600E217F9 /* ProfileManagerProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD74255A582000E217F9 /* OWSPrimaryStorage+keyFromIntLong.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBBA255A581600E217F9 /* OWSPrimaryStorage+keyFromIntLong.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD75255A582000E217F9 /* OWSPrimaryStorage+Loki.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBBB255A581600E217F9 /* OWSPrimaryStorage+Loki.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDD76255A582000E217F9 /* SSKKeychainStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBBC255A581600E217F9 /* SSKKeychainStorage.swift */; }; C33FDD79255A582000E217F9 /* OWSHTTPSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBBF255A581700E217F9 /* OWSHTTPSecurityPolicy.m */; }; - C33FDD7B255A582000E217F9 /* GeneralUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBC1255A581700E217F9 /* GeneralUtilities.swift */; }; C33FDD7C255A582000E217F9 /* SSKAsserts.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBC2255A581700E217F9 /* SSKAsserts.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD83255A582000E217F9 /* CreatePreKeysOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBC9255A581700E217F9 /* CreatePreKeysOperation.swift */; }; - C33FDD84255A582000E217F9 /* LKGroupUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBCA255A581700E217F9 /* LKGroupUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDD85255A582000E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBCB255A581800E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.m */; }; C33FDD8D255A582000E217F9 /* OWSSignalAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBD3255A581800E217F9 /* OWSSignalAddress.swift */; }; C33FDD90255A582000E217F9 /* OWSUploadOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBD6255A581900E217F9 /* OWSUploadOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD91255A582000E217F9 /* OWSMessageUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBD7255A581900E217F9 /* OWSMessageUtils.m */; }; C33FDD92255A582000E217F9 /* SignalIOS.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBD8255A581900E217F9 /* SignalIOS.pb.swift */; }; - C33FDD97255A582000E217F9 /* OWSDisappearingMessagesJob.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBDD255A581900E217F9 /* OWSDisappearingMessagesJob.m */; }; - C33FDD9B255A582000E217F9 /* LKGroupUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBE1255A581A00E217F9 /* LKGroupUtilities.m */; }; - C33FDDA3255A582000E217F9 /* TSInteraction.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBE9255A581A00E217F9 /* TSInteraction.m */; }; - C33FDDA5255A582000E217F9 /* OWSBlockingManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBEB255A581B00E217F9 /* OWSBlockingManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDDA6255A582000E217F9 /* OWSRecipientIdentity.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBEC255A581B00E217F9 /* OWSRecipientIdentity.m */; }; C33FDDA9255A582000E217F9 /* TSStorageKeys.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBEF255A581B00E217F9 /* TSStorageKeys.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDDAB255A582000E217F9 /* OWSIdentityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBF1255A581B00E217F9 /* OWSIdentityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDDAE255A582000E217F9 /* DisplayNameUtilities2.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBF4255A581B00E217F9 /* DisplayNameUtilities2.swift */; }; C33FDDB0255A582000E217F9 /* NSURLSessionDataTask+StatusCode.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBF6255A581C00E217F9 /* NSURLSessionDataTask+StatusCode.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDDB2255A582000E217F9 /* NSArray+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBF8255A581C00E217F9 /* NSArray+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDDB3255A582000E217F9 /* OWSError.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBF9255A581C00E217F9 /* OWSError.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDDB8255A582000E217F9 /* NSSet+Functional.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBFE255A581C00E217F9 /* NSSet+Functional.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDDBB255A582000E217F9 /* TSGroupThread.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC01255A581C00E217F9 /* TSGroupThread.m */; }; - C33FDDBC255A582000E217F9 /* OWSPrimaryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC02255A581D00E217F9 /* OWSPrimaryStorage.m */; }; C33FDDBD255A582000E217F9 /* ByteParser.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC03255A581D00E217F9 /* ByteParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDDBF255A582000E217F9 /* OWSDisappearingMessagesFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC05255A581D00E217F9 /* OWSDisappearingMessagesFinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDDC0255A582000E217F9 /* SignalAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC06255A581D00E217F9 /* SignalAccount.m */; }; C33FDDC5255A582000E217F9 /* OWSError.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC0B255A581D00E217F9 /* OWSError.m */; }; - C33FDDC6255A582000E217F9 /* TSInfoMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC0C255A581E00E217F9 /* TSInfoMessage.m */; }; C33FDDCC255A582000E217F9 /* TSConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC12255A581E00E217F9 /* TSConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDDCD255A582000E217F9 /* OWSAttachmentDownloads.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC13255A581E00E217F9 /* OWSAttachmentDownloads.m */; }; C33FDDD0255A582000E217F9 /* FunctionalUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC16255A581E00E217F9 /* FunctionalUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDDD3255A582000E217F9 /* OWSQueues.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC19255A581F00E217F9 /* OWSQueues.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDDD5255A582000E217F9 /* OWSBackgroundTask.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC1B255A581F00E217F9 /* OWSBackgroundTask.m */; }; C33FDDD8255A582000E217F9 /* OWSUploadOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC1E255A581F00E217F9 /* OWSUploadOperation.m */; }; C33FDDD9255A582000E217F9 /* LokiSessionRestorationImplementation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC1F255A581F00E217F9 /* LokiSessionRestorationImplementation.swift */; }; C33FDEF8255A656D00E217F9 /* Promise+Delaying.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2A5D32553860900C340D1 /* Promise+Delaying.swift */; }; @@ -573,13 +565,11 @@ C37F54BA255BB2D8002AEA92 /* SessionProtocolKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3C2A8622553B41A00C340D1 /* SessionProtocolKit.framework */; }; C37F54CB255BB53F002AEA92 /* SessionProtocolKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3C2A8622553B41A00C340D1 /* SessionProtocolKit.framework */; }; C37F54DC255BB84A002AEA92 /* SessionSnodeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3C2A59F255385C100C340D1 /* SessionSnodeKit.framework */; }; - C38EEF0A255B49A8007E1867 /* SNProtoEnvelope+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EEF09255B49A8007E1867 /* SNProtoEnvelope+Conversion.swift */; }; C38EF00C255B61CC007E1867 /* SignalUtilitiesKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C33FD9AB255A548A00E217F9 /* SignalUtilitiesKit.framework */; }; C38EF00E255B61DC007E1867 /* SignalUtilitiesKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C33FD9AB255A548A00E217F9 /* SignalUtilitiesKit.framework */; }; C38EF216255B6D3B007E1867 /* Theme.h in Headers */ = {isa = PBXBuildFile; fileRef = C38EF212255B6D3A007E1867 /* Theme.h */; settings = {ATTRIBUTES = (Public, ); }; }; C38EF218255B6D3B007E1867 /* Theme.m in Sources */ = {isa = PBXBuildFile; fileRef = C38EF214255B6D3A007E1867 /* Theme.m */; }; C38EF228255B6D5D007E1867 /* AttachmentSharing.m in Sources */ = {isa = PBXBuildFile; fileRef = C38EF223255B6D5D007E1867 /* AttachmentSharing.m */; }; - C38EF229255B6D5D007E1867 /* SignalAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF224255B6D5D007E1867 /* SignalAttachment.swift */; }; C38EF22A255B6D5D007E1867 /* AttachmentSharing.h in Headers */ = {isa = PBXBuildFile; fileRef = C38EF225255B6D5D007E1867 /* AttachmentSharing.h */; settings = {ATTRIBUTES = (Public, ); }; }; C38EF22B255B6D5D007E1867 /* ShareViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF226255B6D5D007E1867 /* ShareViewDelegate.swift */; }; C38EF22C255B6D5D007E1867 /* OWSVideoPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF227255B6D5D007E1867 /* OWSVideoPlayer.swift */; }; @@ -616,8 +606,6 @@ C38EF2A7255B6D93007E1867 /* ProfilePictureView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF2A4255B6D93007E1867 /* ProfilePictureView.swift */; }; C38EF2B3255B6D9C007E1867 /* UIViewController+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF2B1255B6D9C007E1867 /* UIViewController+Utilities.swift */; }; C38EF2B4255B6D9C007E1867 /* UIView+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF2B2255B6D9C007E1867 /* UIView+Utilities.swift */; }; - C38EF2C2255B6DA6007E1867 /* TSUnreadIndicatorInteraction.h in Headers */ = {isa = PBXBuildFile; fileRef = C38EF2BE255B6DA6007E1867 /* TSUnreadIndicatorInteraction.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C38EF2C5255B6DA6007E1867 /* TSUnreadIndicatorInteraction.m in Sources */ = {isa = PBXBuildFile; fileRef = C38EF2C1255B6DA6007E1867 /* TSUnreadIndicatorInteraction.m */; }; C38EF2D4255B6DAF007E1867 /* OWSProfileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C38EF2CF255B6DAE007E1867 /* OWSProfileManager.m */; }; C38EF2D6255B6DAF007E1867 /* OWSUserProfile.m in Sources */ = {isa = PBXBuildFile; fileRef = C38EF2D1255B6DAF007E1867 /* OWSUserProfile.m */; }; C38EF2D7255B6DAF007E1867 /* OWSProfileManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C38EF2D2255B6DAF007E1867 /* OWSProfileManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -681,8 +669,6 @@ C38EF38C255B6DD2007E1867 /* ApprovalRailCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF383255B6DD1007E1867 /* ApprovalRailCellView.swift */; }; C38EF38D255B6DD2007E1867 /* AttachmentCaptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF384255B6DD2007E1867 /* AttachmentCaptionViewController.swift */; }; C38EF39B255B6DDA007E1867 /* ThreadViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF397255B6DD9007E1867 /* ThreadViewModel.swift */; }; - C38EF39C255B6DDA007E1867 /* OWSQuotedReplyModel.h in Headers */ = {isa = PBXBuildFile; fileRef = C38EF398255B6DD9007E1867 /* OWSQuotedReplyModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C38EF39E255B6DDA007E1867 /* OWSQuotedReplyModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C38EF39A255B6DD9007E1867 /* OWSQuotedReplyModel.m */; }; C38EF3B8255B6DE7007E1867 /* ImageEditorTextViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3A8255B6DE4007E1867 /* ImageEditorTextViewController.swift */; }; C38EF3B9255B6DE7007E1867 /* ImageEditorPinchGestureRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3A9255B6DE4007E1867 /* ImageEditorPinchGestureRecognizer.swift */; }; C38EF3BA255B6DE7007E1867 /* ImageEditorItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3AA255B6DE4007E1867 /* ImageEditorItem.swift */; }; @@ -734,6 +720,23 @@ C396DAF32518408B00FF6DC5 /* Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = C396DAEC2518408A00FF6DC5 /* Description.swift */; }; C396DAF42518408B00FF6DC5 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = C396DAED2518408B00FF6DC5 /* Parser.swift */; }; C396DAF52518408B00FF6DC5 /* CSV.swift in Sources */ = {isa = PBXBuildFile; fileRef = C396DAEE2518408B00FF6DC5 /* CSV.swift */; }; + C3A3A08F256E1728004D228D /* FullTextSearchFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB7F255A581100E217F9 /* FullTextSearchFinder.swift */; }; + C3A3A099256E17B2004D228D /* SSKJobRecordFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A3A098256E17B2004D228D /* SSKJobRecordFinder.swift */; }; + C3A3A0AA256E17E6004D228D /* SSKJobRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDACD255A580200E217F9 /* SSKJobRecord.m */; }; + C3A3A0B3256E17F2004D228D /* SSKJobRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB4F255A580D00E217F9 /* SSKJobRecord.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3A3A0EC256E1949004D228D /* OWSRecipientIdentity.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBEC255A581B00E217F9 /* OWSRecipientIdentity.m */; }; + C3A3A0F5256E194C004D228D /* OWSRecipientIdentity.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAA0255A57FF00E217F9 /* OWSRecipientIdentity.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3A3A0FE256E1A3C004D228D /* TSDatabaseSecondaryIndexes.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB20255A580900E217F9 /* TSDatabaseSecondaryIndexes.m */; }; + C3A3A107256E1A5C004D228D /* OWSDisappearingMessagesFinder.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA86255A57FC00E217F9 /* OWSDisappearingMessagesFinder.m */; }; + C3A3A108256E1A5C004D228D /* OWSIncomingMessageFinder.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB1E255A580900E217F9 /* OWSIncomingMessageFinder.m */; }; + C3A3A111256E1A93004D228D /* OWSIncomingMessageFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAC0255A580100E217F9 /* OWSIncomingMessageFinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3A3A122256E1A97004D228D /* OWSDisappearingMessagesFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC05255A581D00E217F9 /* OWSDisappearingMessagesFinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3A3A12B256E1AD5004D228D /* TSDatabaseSecondaryIndexes.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB25255A580900E217F9 /* TSDatabaseSecondaryIndexes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3A3A13C256E1B27004D228D /* OWSMediaGalleryFinder.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB71255A581000E217F9 /* OWSMediaGalleryFinder.m */; }; + C3A3A145256E1B49004D228D /* OWSMediaGalleryFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB67255A580F00E217F9 /* OWSMediaGalleryFinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3A3A156256E1B91004D228D /* ProtoUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA6C255A57FA00E217F9 /* ProtoUtils.m */; }; + C3A3A15F256E1BB4004D228D /* ProtoUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB91255A581200E217F9 /* ProtoUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3A3A171256E1D25004D228D /* SSKReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A3A170256E1D25004D228D /* SSKReachabilityManager.swift */; }; C3A71D0B2558989C0043A11F /* MessageWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A71D0A2558989C0043A11F /* MessageWrapper.swift */; }; C3A71D1E25589AC30043A11F /* WebSocketProto.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A71D1C25589AC30043A11F /* WebSocketProto.swift */; }; C3A71D1F25589AC30043A11F /* WebSocketResources.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A71D1D25589AC30043A11F /* WebSocketResources.pb.swift */; }; @@ -763,10 +766,8 @@ C3A7219A2558C1660043A11F /* AnyPromise+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A721992558C1660043A11F /* AnyPromise+Conversion.swift */; }; C3A7222A2558C1E40043A11F /* DotNetAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A722292558C1E40043A11F /* DotNetAPI.swift */; }; C3A7225E2558C38D0043A11F /* Promise+Retaining.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A7225D2558C38D0043A11F /* Promise+Retaining.swift */; }; - C3A722922558C8940043A11F /* OpenGroupAPIDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A722912558C8940043A11F /* OpenGroupAPIDelegate.swift */; }; C3A7229C2558E4310043A11F /* OpenGroupMessage+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A7229B2558E4310043A11F /* OpenGroupMessage+Conversion.swift */; }; C3AABDDF2553ECF00042FF4C /* Array+Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2A5D12553860800C340D1 /* Array+Description.swift */; }; - C3B7845D25649DA600ADB2E7 /* TSIncomingMessage+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3B7845C25649DA600ADB2E7 /* TSIncomingMessage+Conversion.swift */; }; C3BBE0762554CDA60050F1E3 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3BBE0752554CDA60050F1E3 /* Configuration.swift */; }; C3BBE0802554CDD70050F1E3 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3BBE07F2554CDD70050F1E3 /* Storage.swift */; }; C3BBE0A72554D4DE0050F1E3 /* Promise+Retrying.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2A5D62553860B00C340D1 /* Promise+Retrying.swift */; }; @@ -881,11 +882,8 @@ C3CA3AB4255CDAE600F4C6D4 /* japanese.txt in Resources */ = {isa = PBXBuildFile; fileRef = C3CA3AB3255CDAE600F4C6D4 /* japanese.txt */; }; C3CA3ABE255CDB0D00F4C6D4 /* portuguese.txt in Resources */ = {isa = PBXBuildFile; fileRef = C3CA3ABD255CDB0D00F4C6D4 /* portuguese.txt */; }; C3CA3AC8255CDB2900F4C6D4 /* spanish.txt in Resources */ = {isa = PBXBuildFile; fileRef = C3CA3AC7255CDB2900F4C6D4 /* spanish.txt */; }; - C3CA3B13255CF18200F4C6D4 /* Destination+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3CA3B12255CF18200F4C6D4 /* Destination+Conversion.swift */; }; - C3CA3B1D255CF3C800F4C6D4 /* MessageSender+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3CA3B1C255CF3C800F4C6D4 /* MessageSender+Utilities.swift */; }; C3CA3B2F255CF84E00F4C6D4 /* NullMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3CA3B2E255CF84E00F4C6D4 /* NullMessage.swift */; }; C3D0972B2510499C00F6E3E4 /* BackgroundPoller.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D0972A2510499C00F6E3E4 /* BackgroundPoller.swift */; }; - C3D697382564DCE6004AF766 /* MessageReceiverDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D697372564DCE6004AF766 /* MessageReceiverDelegate.swift */; }; C3D9E35525675EE10040E4F3 /* MIMETypeUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB41255A580C00E217F9 /* MIMETypeUtil.m */; }; C3D9E35E25675F640040E4F3 /* OWSFileSystem.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA8E255A57FD00E217F9 /* OWSFileSystem.m */; }; C3D9E379256760340040E4F3 /* MIMETypeUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAFC255A580600E217F9 /* MIMETypeUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -912,7 +910,6 @@ C3D9E4FD256778E30040E4F3 /* NSData+Image.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB29255A580A00E217F9 /* NSData+Image.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3D9E50E25677A510040E4F3 /* DataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB54255A580D00E217F9 /* DataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3D9E52725677DF20040E4F3 /* OWSThumbnailService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF1255A580500E217F9 /* OWSThumbnailService.swift */; }; - C3D9E53925677F5E0040E4F3 /* Attachment+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C379DCFD25673DBC0002D4EB /* Attachment+Conversion.swift */; }; C3DAB3242480CB2B00725F25 /* SRCopyableLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DAB3232480CB2A00725F25 /* SRCopyableLabel.swift */; }; C3DFFAC623E96F0D0058DAF8 /* Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DFFAC523E96F0D0058DAF8 /* Sheet.swift */; }; C3E5C2FA251DBABB0040DFFC /* EditClosedGroupVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E5C2F9251DBABB0040DFFC /* EditClosedGroupVC.swift */; }; @@ -1346,14 +1343,13 @@ B83F2B85240C7B8F000A54AB /* NewConversationButtonSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewConversationButtonSet.swift; sourceTree = ""; }; B83F2B87240CB75A000A54AB /* UIImage+Scaling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Scaling.swift"; sourceTree = ""; }; B84072952565E9F50037CB17 /* TSOutgoingMessage+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSOutgoingMessage+Conversion.swift"; sourceTree = ""; }; - B840729F2565F1670037CB17 /* Quote+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Quote+Conversion.swift"; sourceTree = ""; }; + B840729F2565F1670037CB17 /* OWSQuotedReplyModel+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OWSQuotedReplyModel+Conversion.swift"; sourceTree = ""; }; B84664F4235022F30083A1CD /* MentionUtilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MentionUtilities.swift; sourceTree = ""; }; B847570023D568EB00759540 /* SignalServiceKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SignalServiceKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B85357BE23A1AE0800AAF6CD /* SeedReminderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeedReminderView.swift; sourceTree = ""; }; B85357C223A1BD1200AAF6CD /* SeedVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeedVC.swift; sourceTree = ""; }; B8544E3023D16CA500299F14 /* DeviceUtilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceUtilities.swift; sourceTree = ""; }; B8544E3223D50E4900299F14 /* AppearanceUtilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearanceUtilities.swift; sourceTree = ""; }; - B867665725663BBA00B197C5 /* MessageSenderDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageSenderDelegate.swift; sourceTree = ""; }; B86BD08323399ACF000F5AE3 /* Modal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Modal.swift; sourceTree = ""; }; B86BD08523399CEF000F5AE3 /* SeedModal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeedModal.swift; sourceTree = ""; }; B8783E9D23EB948D00404FB8 /* UILabel+Interaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+Interaction.swift"; sourceTree = ""; }; @@ -1387,15 +1383,12 @@ B8CCF6422397711F0091D419 /* SettingsVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsVC.swift; sourceTree = ""; }; B8D797B0256B2590007C59DF /* TSAttachmentPointer+Backups.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TSAttachmentPointer+Backups.h"; sourceTree = ""; }; B8D797B1256B25A1007C59DF /* TSAttachmentPointer+Backups.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "TSAttachmentPointer+Backups.m"; sourceTree = ""; }; - B8D797D4256B2715007C59DF /* TSAttachment+Albums.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "TSAttachment+Albums.m"; sourceTree = ""; }; - B8D797DE256B2732007C59DF /* TSAttachment+Albums.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TSAttachment+Albums.h"; sourceTree = ""; }; B8D8F1372566120F0092EF10 /* Storage+ClosedGroups.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Storage+ClosedGroups.swift"; sourceTree = ""; }; B8D8F17625661AFA0092EF10 /* Storage+Jobs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Storage+Jobs.swift"; sourceTree = ""; }; B8D8F18825661BA50092EF10 /* Storage+OpenGroups.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Storage+OpenGroups.swift"; sourceTree = ""; }; B8D8F19225661BF80092EF10 /* Storage+Messaging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Storage+Messaging.swift"; sourceTree = ""; }; B8D8F1BC25661C6F0092EF10 /* Storage+OnionRequests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Storage+OnionRequests.swift"; sourceTree = ""; }; - B8D8F1EF256621180092EF10 /* MessageSenderDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageSenderDelegate.swift; sourceTree = ""; }; - B8D8F21925662A4D0092EF10 /* OpenGroupAPIDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenGroupAPIDelegate.swift; sourceTree = ""; }; + B8D8F1EF256621180092EF10 /* MessageSender+Handling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "MessageSender+Handling.swift"; path = "../../SignalUtilitiesKit/Messaging/Sending & Receiving/MessageSender+Handling.swift"; sourceTree = ""; }; B90418E4183E9DD40038554A /* DateUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DateUtil.h; sourceTree = ""; }; B90418E5183E9DD40038554A /* DateUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DateUtil.m; sourceTree = ""; }; B9EB5ABC1884C002007CBB57 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; @@ -1419,6 +1412,10 @@ C31F812525258FB000DD9FD9 /* Storage+VolumeSamples.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Storage+VolumeSamples.swift"; sourceTree = ""; }; C31FFE56254A5FFE00F19441 /* KeyPairUtilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyPairUtilities.swift; sourceTree = ""; }; C329FEEB24F7277900B1C64C /* LightModeSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LightModeSheet.swift; sourceTree = ""; }; + C32C5A87256DBCF9003C73A2 /* MessageReceiver+Handling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageReceiver+Handling.swift"; sourceTree = ""; }; + C32C5B3E256DC1DF003C73A2 /* TSQuotedMessage+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSQuotedMessage+Conversion.swift"; sourceTree = ""; }; + C32C5C92256DD12D003C73A2 /* OWSUDManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OWSUDManager.swift; sourceTree = ""; }; + C32C5FD5256E0346003C73A2 /* Notification+Thread.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+Thread.swift"; sourceTree = ""; }; C33100132558FFC200070591 /* UIImage+Tinting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Tinting.swift"; sourceTree = ""; }; C33100272559000A00070591 /* UIView+Rendering.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Rendering.swift"; sourceTree = ""; }; C3310032255900A400070591 /* Notification+AppMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+AppMode.swift"; sourceTree = ""; }; @@ -1684,14 +1681,14 @@ C364534F252449260045C478 /* VoiceMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceMessageView.swift; sourceTree = ""; }; C364535B252467900045C478 /* AudioUtilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioUtilities.swift; sourceTree = ""; }; C379DCF3256735770002D4EB /* VisibleMessage+Attachment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "VisibleMessage+Attachment.swift"; sourceTree = ""; }; - C379DCFD25673DBC0002D4EB /* Attachment+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Attachment+Conversion.swift"; sourceTree = ""; }; + C379DCFD25673DBC0002D4EB /* TSAttachmentPointer+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSAttachmentPointer+Conversion.swift"; sourceTree = ""; }; C37F53E8255BA9BB002AEA92 /* Environment.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Environment.h; sourceTree = ""; }; C37F5402255BA9ED002AEA92 /* Environment.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Environment.m; sourceTree = ""; }; C38EEF09255B49A8007E1867 /* SNProtoEnvelope+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SNProtoEnvelope+Conversion.swift"; sourceTree = ""; }; C38EF212255B6D3A007E1867 /* Theme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Theme.h; path = SignalUtilitiesKit/UI/Theme.h; sourceTree = SOURCE_ROOT; }; C38EF214255B6D3A007E1867 /* Theme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Theme.m; path = SignalUtilitiesKit/UI/Theme.m; sourceTree = SOURCE_ROOT; }; C38EF223255B6D5D007E1867 /* AttachmentSharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AttachmentSharing.m; path = SignalUtilitiesKit/Utilities/AttachmentSharing.m; sourceTree = SOURCE_ROOT; }; - C38EF224255B6D5D007E1867 /* SignalAttachment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SignalAttachment.swift; path = SignalUtilitiesKit/Messaging/Attachments/SignalAttachment.swift; sourceTree = SOURCE_ROOT; }; + C38EF224255B6D5D007E1867 /* SignalAttachment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SignalAttachment.swift; path = "SessionMessagingKit/Sending & Receiving/Attachments/SignalAttachment.swift"; sourceTree = SOURCE_ROOT; }; C38EF225255B6D5D007E1867 /* AttachmentSharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AttachmentSharing.h; path = SignalUtilitiesKit/Utilities/AttachmentSharing.h; sourceTree = SOURCE_ROOT; }; C38EF226255B6D5D007E1867 /* ShareViewDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShareViewDelegate.swift; path = SignalUtilitiesKit/Utilities/ShareViewDelegate.swift; sourceTree = SOURCE_ROOT; }; C38EF227255B6D5D007E1867 /* OWSVideoPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OWSVideoPlayer.swift; path = SignalUtilitiesKit/Utilities/OWSVideoPlayer.swift; sourceTree = SOURCE_ROOT; }; @@ -1715,10 +1712,10 @@ C38EF270255B6D79007E1867 /* OWSDatabaseMigration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWSDatabaseMigration.m; path = SignalUtilitiesKit/Database/Migration/OWSDatabaseMigration.m; sourceTree = SOURCE_ROOT; }; C38EF271255B6D79007E1867 /* OWSDatabaseMigration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWSDatabaseMigration.h; path = SignalUtilitiesKit/Database/Migration/OWSDatabaseMigration.h; sourceTree = SOURCE_ROOT; }; C38EF281255B6D84007E1867 /* OWSAudioSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OWSAudioSession.swift; path = SignalUtilitiesKit/Utilities/OWSAudioSession.swift; sourceTree = SOURCE_ROOT; }; - C38EF282255B6D84007E1867 /* SignalKeyingStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SignalKeyingStorage.m; path = SignalUtilitiesKit/Database/Utilities/SignalKeyingStorage.m; sourceTree = SOURCE_ROOT; }; + C38EF282255B6D84007E1867 /* SignalKeyingStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SignalKeyingStorage.m; path = SignalUtilitiesKit/Database/SignalKeyingStorage.m; sourceTree = SOURCE_ROOT; }; C38EF283255B6D84007E1867 /* VersionMigrations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VersionMigrations.h; path = SignalUtilitiesKit/VersionMigrations.h; sourceTree = SOURCE_ROOT; }; C38EF284255B6D84007E1867 /* AppSetup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppSetup.h; path = SignalUtilitiesKit/AppSetup.h; sourceTree = SOURCE_ROOT; }; - C38EF285255B6D84007E1867 /* SignalKeyingStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SignalKeyingStorage.h; path = SignalUtilitiesKit/Database/Utilities/SignalKeyingStorage.h; sourceTree = SOURCE_ROOT; }; + C38EF285255B6D84007E1867 /* SignalKeyingStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SignalKeyingStorage.h; path = SignalUtilitiesKit/Database/SignalKeyingStorage.h; sourceTree = SOURCE_ROOT; }; C38EF286255B6D85007E1867 /* VersionMigrations.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VersionMigrations.m; path = SignalUtilitiesKit/VersionMigrations.m; sourceTree = SOURCE_ROOT; }; C38EF287255B6D85007E1867 /* AppSetup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppSetup.m; path = SignalUtilitiesKit/AppSetup.m; sourceTree = SOURCE_ROOT; }; C38EF288255B6D85007E1867 /* OWSSounds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWSSounds.h; path = SignalUtilitiesKit/OWSSounds.h; sourceTree = SOURCE_ROOT; }; @@ -1728,8 +1725,8 @@ C38EF2A4255B6D93007E1867 /* ProfilePictureView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ProfilePictureView.swift; path = SignalUtilitiesKit/UI/ProfilePictureView.swift; sourceTree = SOURCE_ROOT; }; C38EF2B1255B6D9C007E1867 /* UIViewController+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+Utilities.swift"; path = "SignalUtilitiesKit/UI/UIViewController+Utilities.swift"; sourceTree = SOURCE_ROOT; }; C38EF2B2255B6D9C007E1867 /* UIView+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+Utilities.swift"; path = "SignalUtilitiesKit/UI/UIView+Utilities.swift"; sourceTree = SOURCE_ROOT; }; - C38EF2BE255B6DA6007E1867 /* TSUnreadIndicatorInteraction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TSUnreadIndicatorInteraction.h; path = "SignalUtilitiesKit/Messaging/Read Tracking/TSUnreadIndicatorInteraction.h"; sourceTree = SOURCE_ROOT; }; - C38EF2C1255B6DA6007E1867 /* TSUnreadIndicatorInteraction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TSUnreadIndicatorInteraction.m; path = "SignalUtilitiesKit/Messaging/Read Tracking/TSUnreadIndicatorInteraction.m"; sourceTree = SOURCE_ROOT; }; + C38EF2BE255B6DA6007E1867 /* TSUnreadIndicatorInteraction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TSUnreadIndicatorInteraction.h; path = "SessionMessagingKit/Sending & Receiving/Read Tracking/TSUnreadIndicatorInteraction.h"; sourceTree = SOURCE_ROOT; }; + C38EF2C1255B6DA6007E1867 /* TSUnreadIndicatorInteraction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TSUnreadIndicatorInteraction.m; path = "SessionMessagingKit/Sending & Receiving/Read Tracking/TSUnreadIndicatorInteraction.m"; sourceTree = SOURCE_ROOT; }; C38EF2CF255B6DAE007E1867 /* OWSProfileManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWSProfileManager.m; path = "SignalUtilitiesKit/To Do/OWSProfileManager.m"; sourceTree = SOURCE_ROOT; }; C38EF2D1255B6DAF007E1867 /* OWSUserProfile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWSUserProfile.m; path = "SignalUtilitiesKit/To Do/OWSUserProfile.m"; sourceTree = SOURCE_ROOT; }; C38EF2D2255B6DAF007E1867 /* OWSProfileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWSProfileManager.h; path = "SignalUtilitiesKit/To Do/OWSProfileManager.h"; sourceTree = SOURCE_ROOT; }; @@ -1796,8 +1793,8 @@ C38EF383255B6DD1007E1867 /* ApprovalRailCellView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ApprovalRailCellView.swift; path = SignalUtilitiesKit/UI/ApprovalRailCellView.swift; sourceTree = SOURCE_ROOT; }; C38EF384255B6DD2007E1867 /* AttachmentCaptionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AttachmentCaptionViewController.swift; path = "SignalUtilitiesKit/UI/Attachment Approval/AttachmentCaptionViewController.swift"; sourceTree = SOURCE_ROOT; }; C38EF397255B6DD9007E1867 /* ThreadViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ThreadViewModel.swift; path = SignalUtilitiesKit/ThreadViewModel.swift; sourceTree = SOURCE_ROOT; }; - C38EF398255B6DD9007E1867 /* OWSQuotedReplyModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWSQuotedReplyModel.h; path = SignalUtilitiesKit/Messaging/Quotes/OWSQuotedReplyModel.h; sourceTree = SOURCE_ROOT; }; - C38EF39A255B6DD9007E1867 /* OWSQuotedReplyModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWSQuotedReplyModel.m; path = SignalUtilitiesKit/Messaging/Quotes/OWSQuotedReplyModel.m; sourceTree = SOURCE_ROOT; }; + C38EF398255B6DD9007E1867 /* OWSQuotedReplyModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWSQuotedReplyModel.h; path = "SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel.h"; sourceTree = SOURCE_ROOT; }; + C38EF39A255B6DD9007E1867 /* OWSQuotedReplyModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWSQuotedReplyModel.m; path = "SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel.m"; sourceTree = SOURCE_ROOT; }; C38EF3A8255B6DE4007E1867 /* ImageEditorTextViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ImageEditorTextViewController.swift; path = "SignalUtilitiesKit/UI/Image Editing/ImageEditorTextViewController.swift"; sourceTree = SOURCE_ROOT; }; C38EF3A9255B6DE4007E1867 /* ImageEditorPinchGestureRecognizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ImageEditorPinchGestureRecognizer.swift; path = "SignalUtilitiesKit/UI/Image Editing/ImageEditorPinchGestureRecognizer.swift"; sourceTree = SOURCE_ROOT; }; C38EF3AA255B6DE4007E1867 /* ImageEditorItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ImageEditorItem.swift; path = "SignalUtilitiesKit/UI/Image Editing/ImageEditorItem.swift"; sourceTree = SOURCE_ROOT; }; @@ -1814,8 +1811,8 @@ C38EF3B5255B6DE6007E1867 /* OWSViewController+ImageEditor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "OWSViewController+ImageEditor.swift"; path = "SignalUtilitiesKit/UI/OWSViewController+ImageEditor.swift"; sourceTree = SOURCE_ROOT; }; C38EF3B6255B6DE6007E1867 /* ImageEditorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ImageEditorModel.swift; path = "SignalUtilitiesKit/UI/Image Editing/ImageEditorModel.swift"; sourceTree = SOURCE_ROOT; }; C38EF3B7255B6DE6007E1867 /* ImageEditorCanvasView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ImageEditorCanvasView.swift; path = "SignalUtilitiesKit/UI/Image Editing/ImageEditorCanvasView.swift"; sourceTree = SOURCE_ROOT; }; - C38EF3D1255B6DEE007E1867 /* ThreadViewHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ThreadViewHelper.m; path = SignalUtilitiesKit/Database/Utilities/ThreadViewHelper.m; sourceTree = SOURCE_ROOT; }; - C38EF3D2255B6DEE007E1867 /* ThreadViewHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThreadViewHelper.h; path = SignalUtilitiesKit/Database/Utilities/ThreadViewHelper.h; sourceTree = SOURCE_ROOT; }; + C38EF3D1255B6DEE007E1867 /* ThreadViewHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ThreadViewHelper.m; path = SignalUtilitiesKit/Database/ThreadViewHelper.m; sourceTree = SOURCE_ROOT; }; + C38EF3D2255B6DEE007E1867 /* ThreadViewHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThreadViewHelper.h; path = SignalUtilitiesKit/Database/ThreadViewHelper.h; sourceTree = SOURCE_ROOT; }; C38EF3D3255B6DEE007E1867 /* OWSSearchBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWSSearchBar.h; path = SignalUtilitiesKit/UI/OWSSearchBar.h; sourceTree = SOURCE_ROOT; }; C38EF3D4255B6DEE007E1867 /* DisappearingTimerConfigurationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DisappearingTimerConfigurationView.swift; path = SignalUtilitiesKit/UI/DisappearingTimerConfigurationView.swift; sourceTree = SOURCE_ROOT; }; C38EF3D6255B6DEF007E1867 /* ContactCellView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ContactCellView.m; path = "SignalUtilitiesKit/To Do/ContactCellView.m"; sourceTree = SOURCE_ROOT; }; @@ -1854,6 +1851,8 @@ C396DAED2518408B00FF6DC5 /* Parser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Parser.swift; sourceTree = ""; }; C396DAEE2518408B00FF6DC5 /* CSV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSV.swift; sourceTree = ""; }; C39DD28724F3318C008590FC /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; + C3A3A098256E17B2004D228D /* SSKJobRecordFinder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SSKJobRecordFinder.swift; sourceTree = ""; }; + C3A3A170256E1D25004D228D /* SSKReachabilityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SSKReachabilityManager.swift; sourceTree = ""; }; C3A71D0A2558989C0043A11F /* MessageWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageWrapper.swift; sourceTree = ""; }; C3A71D1C25589AC30043A11F /* WebSocketProto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebSocketProto.swift; sourceTree = ""; }; C3A71D1D25589AC30043A11F /* WebSocketResources.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebSocketResources.pb.swift; sourceTree = ""; }; @@ -1883,7 +1882,6 @@ C3A721992558C1660043A11F /* AnyPromise+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AnyPromise+Conversion.swift"; sourceTree = ""; }; C3A722292558C1E40043A11F /* DotNetAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DotNetAPI.swift; sourceTree = ""; }; C3A7225D2558C38D0043A11F /* Promise+Retaining.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Promise+Retaining.swift"; sourceTree = ""; }; - C3A722912558C8940043A11F /* OpenGroupAPIDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenGroupAPIDelegate.swift; sourceTree = ""; }; C3A7229B2558E4310043A11F /* OpenGroupMessage+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OpenGroupMessage+Conversion.swift"; sourceTree = ""; }; C3AA6BB824CE8F1B002358B6 /* Migrating Translations from Android.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = "Migrating Translations from Android.md"; path = "Meta/Translations/Migrating Translations from Android.md"; sourceTree = ""; }; C3AECBEA24EF5244005743DE /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = fa.lproj/Localizable.strings; sourceTree = ""; }; @@ -2007,12 +2005,8 @@ C3CA3AB3255CDAE600F4C6D4 /* japanese.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = japanese.txt; sourceTree = ""; }; C3CA3ABD255CDB0D00F4C6D4 /* portuguese.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = portuguese.txt; sourceTree = ""; }; C3CA3AC7255CDB2900F4C6D4 /* spanish.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = spanish.txt; sourceTree = ""; }; - C3CA3B12255CF18200F4C6D4 /* Destination+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Destination+Conversion.swift"; sourceTree = ""; }; - C3CA3B1C255CF3C800F4C6D4 /* MessageSender+Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageSender+Utilities.swift"; sourceTree = ""; }; C3CA3B2E255CF84E00F4C6D4 /* NullMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NullMessage.swift; sourceTree = ""; }; C3D0972A2510499C00F6E3E4 /* BackgroundPoller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundPoller.swift; sourceTree = ""; }; - C3D697372564DCE6004AF766 /* MessageReceiverDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageReceiverDelegate.swift; sourceTree = ""; }; - C3D697492564DEDC004AF766 /* MessageReceiverDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageReceiverDelegate.swift; sourceTree = ""; }; C3D9E40B25676C100040E4F3 /* Storage+Conformances.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Storage+Conformances.swift"; sourceTree = ""; }; C3D9E41E25676C870040E4F3 /* OWSPrimaryStorageProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OWSPrimaryStorageProtocol.swift; sourceTree = ""; }; C3D9E43025676D3D0040E4F3 /* Configuration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Configuration.swift; sourceTree = ""; }; @@ -2629,6 +2623,7 @@ children = ( C3C2A74325539EB700C340D1 /* Message.swift */, C352A30825574D8400338F3E /* Message+Destination.swift */, + C32C5A99256DBDC1003C73A2 /* Signal */, C300A5C62554B02D00555489 /* Visible Messages */, C300A5C72554B03900555489 /* Control Messages */, ); @@ -2638,8 +2633,8 @@ C300A5C62554B02D00555489 /* Visible Messages */ = { isa = PBXGroup; children = ( - C3D9E3B52567685D0040E4F3 /* Attachments */, C3C2A74C2553A39700C340D1 /* VisibleMessage.swift */, + C379DCF3256735770002D4EB /* VisibleMessage+Attachment.swift */, C3C2A7552553A3AB00C340D1 /* VisibleMessage+Quote.swift */, C3C2A75E2553A3C500C340D1 /* VisibleMessage+LinkPreview.swift */, C3C2A7672553A3D900C340D1 /* VisibleMessage+Contact.swift */, @@ -2664,13 +2659,23 @@ C300A5F02554B08500555489 /* Sending & Receiving */ = { isa = PBXGroup; children = ( + C3D9E3B52567685D0040E4F3 /* Attachments */, + C32C5B9E256DC720003C73A2 /* Blocking */, + C32C5B01256DC054003C73A2 /* Expiration */, + C32C5D22256DD496003C73A2 /* Link Previews */, + C32C5D2D256DD4C4003C73A2 /* Mentions */, + C379DC6825672B5E0002D4EB /* Notifications */, + C32C59F8256DB5A6003C73A2 /* Pollers */, + C32C5B1B256DC160003C73A2 /* Quotes */, + C32C5ADE256DBF7F003C73A2 /* Read Tracking */, + C32C5995256DAF85003C73A2 /* Typing Indicators */, C3471FA32555439E00297E91 /* Notification+MessageSender.swift */, C300A5F12554B09800555489 /* MessageSender.swift */, C3471ECA2555356A00297E91 /* MessageSender+Encryption.swift */, - B867665725663BBA00B197C5 /* MessageSenderDelegate.swift */, + B8D8F1EF256621180092EF10 /* MessageSender+Handling.swift */, C300A5FB2554B0A000555489 /* MessageReceiver.swift */, C3471F4B25553AB000297E91 /* MessageReceiver+Decryption.swift */, - C3D697372564DCE6004AF766 /* MessageReceiverDelegate.swift */, + C32C5A87256DBCF9003C73A2 /* MessageReceiver+Handling.swift */, ); path = "Sending & Receiving"; sourceTree = ""; @@ -2704,6 +2709,175 @@ path = Dependencies; sourceTree = ""; }; + C32C5995256DAF85003C73A2 /* Typing Indicators */ = { + isa = PBXGroup; + children = ( + C33FDA87255A57FC00E217F9 /* TypingIndicators.swift */, + ); + path = "Typing Indicators"; + sourceTree = ""; + }; + C32C59AF256DB31A003C73A2 /* Threads */ = { + isa = PBXGroup; + children = ( + C32C5FD5256E0346003C73A2 /* Notification+Thread.swift */, + C33FDAB3255A580000E217F9 /* TSContactThread.h */, + C33FDAF9255A580600E217F9 /* TSContactThread.m */, + C33FDB0A255A580700E217F9 /* TSGroupModel.h */, + C33FDB73255A581000E217F9 /* TSGroupModel.m */, + C33FDA79255A57FB00E217F9 /* TSGroupThread.h */, + C33FDC01255A581C00E217F9 /* TSGroupThread.m */, + C33FDAD3255A580300E217F9 /* TSThread.h */, + C33FDBB8255A581600E217F9 /* TSThread.m */, + ); + path = Threads; + sourceTree = ""; + }; + C32C59F8256DB5A6003C73A2 /* Pollers */ = { + isa = PBXGroup; + children = ( + C33FDB34255A580B00E217F9 /* ClosedGroupPoller.swift */, + C33FDA8C255A57FD00E217F9 /* OpenGroupPoller.swift */, + C33FDB3A255A580B00E217F9 /* Poller.swift */, + ); + path = Pollers; + sourceTree = ""; + }; + C32C5A99256DBDC1003C73A2 /* Signal */ = { + isa = PBXGroup; + children = ( + C33FDB5D255A580E00E217F9 /* TSErrorMessage_privateConstructor.h */, + C33FDBB0255A581500E217F9 /* TSErrorMessage.h */, + C33FDAE7255A580500E217F9 /* TSErrorMessage.m */, + C33FDB9C255A581300E217F9 /* TSIncomingMessage.h */, + C33FDA97255A57FE00E217F9 /* TSIncomingMessage.m */, + C3B7845C25649DA600ADB2E7 /* TSIncomingMessage+Conversion.swift */, + C33FDADD255A580400E217F9 /* TSInfoMessage.h */, + C33FDC0C255A581E00E217F9 /* TSInfoMessage.m */, + C33FDAE6255A580400E217F9 /* TSInteraction.h */, + C33FDBE9255A581A00E217F9 /* TSInteraction.m */, + C33FDB8C255A581200E217F9 /* TSInvalidIdentityKeyErrorMessage.h */, + C33FDB74255A581000E217F9 /* TSInvalidIdentityKeyErrorMessage.m */, + C33FDA7B255A57FB00E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.h */, + C33FDBCB255A581800E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.m */, + C33FDA70255A57FA00E217F9 /* TSMessage.h */, + C33FDB60255A580E00E217F9 /* TSMessage.m */, + C33FDB48255A580C00E217F9 /* TSOutgoingMessage.h */, + C33FDB56255A580D00E217F9 /* TSOutgoingMessage.m */, + B84072952565E9F50037CB17 /* TSOutgoingMessage+Conversion.swift */, + ); + path = Signal; + sourceTree = ""; + }; + C32C5ADE256DBF7F003C73A2 /* Read Tracking */ = { + isa = PBXGroup; + children = ( + C33FDABD255A580100E217F9 /* OWSOutgoingReceiptManager.h */, + C33FDB6F255A580F00E217F9 /* OWSOutgoingReceiptManager.m */, + C33FDB1D255A580900E217F9 /* OWSReadReceiptManager.h */, + C33FDA71255A57FA00E217F9 /* OWSReadReceiptManager.m */, + C33FDAE1255A580400E217F9 /* OWSReadTracking.h */, + C38EF2BE255B6DA6007E1867 /* TSUnreadIndicatorInteraction.h */, + C38EF2C1255B6DA6007E1867 /* TSUnreadIndicatorInteraction.m */, + ); + path = "Read Tracking"; + sourceTree = ""; + }; + C32C5B01256DC054003C73A2 /* Expiration */ = { + isa = PBXGroup; + children = ( + C33FDADA255A580400E217F9 /* OWSDisappearingConfigurationUpdateInfoMessage.h */, + C33FDA6B255A57FA00E217F9 /* OWSDisappearingConfigurationUpdateInfoMessage.m */, + C33FDAD9255A580300E217F9 /* OWSDisappearingMessagesConfiguration.h */, + C33FDBA4255A581400E217F9 /* OWSDisappearingMessagesConfiguration.m */, + C33FDA80255A57FC00E217F9 /* OWSDisappearingMessagesJob.h */, + C33FDBDD255A581900E217F9 /* OWSDisappearingMessagesJob.m */, + ); + path = Expiration; + sourceTree = ""; + }; + C32C5B1B256DC160003C73A2 /* Quotes */ = { + isa = PBXGroup; + children = ( + C38EF398255B6DD9007E1867 /* OWSQuotedReplyModel.h */, + C38EF39A255B6DD9007E1867 /* OWSQuotedReplyModel.m */, + B840729F2565F1670037CB17 /* OWSQuotedReplyModel+Conversion.swift */, + C33FDAD5255A580300E217F9 /* TSQuotedMessage.h */, + C33FDB83255A581100E217F9 /* TSQuotedMessage.m */, + C32C5B3E256DC1DF003C73A2 /* TSQuotedMessage+Conversion.swift */, + ); + path = Quotes; + sourceTree = ""; + }; + C32C5B9E256DC720003C73A2 /* Blocking */ = { + isa = PBXGroup; + children = ( + C33FDBEB255A581B00E217F9 /* OWSBlockingManager.h */, + C33FDA68255A57F900E217F9 /* OWSBlockingManager.m */, + ); + path = Blocking; + sourceTree = ""; + }; + C32C5BB9256DC7C4003C73A2 /* To Do */ = { + isa = PBXGroup; + children = ( + C33FDAFF255A580600E217F9 /* DisplayNameUtilities.swift */, + C33FDAA0255A57FF00E217F9 /* OWSRecipientIdentity.h */, + C33FDBEC255A581B00E217F9 /* OWSRecipientIdentity.m */, + C32C5C92256DD12D003C73A2 /* OWSUDManager.swift */, + C33FDBB9255A581600E217F9 /* ProfileManagerProtocol.h */, + C33FDB94255A581300E217F9 /* TSAccountManager.h */, + C33FDB88255A581200E217F9 /* TSAccountManager.m */, + ); + path = "To Do"; + sourceTree = ""; + }; + C32C5BCB256DC818003C73A2 /* Database */ = { + isa = PBXGroup; + children = ( + C33FDA67255A57F900E217F9 /* OWSPrimaryStorage.h */, + C33FDC02255A581D00E217F9 /* OWSPrimaryStorage.m */, + C33FDAFE255A580600E217F9 /* OWSStorage.h */, + C33FDAB1255A580000E217F9 /* OWSStorage.m */, + B8D8F1372566120F0092EF10 /* Storage+ClosedGroups.swift */, + B8D8F17625661AFA0092EF10 /* Storage+Jobs.swift */, + B8D8F19225661BF80092EF10 /* Storage+Messaging.swift */, + B8D8F18825661BA50092EF10 /* Storage+OpenGroups.swift */, + C3F0A5FD255C988A007BE2A3 /* Storage+Shared.swift */, + C33FDA69255A57F900E217F9 /* SSKPreferences.swift */, + C33FDB25255A580900E217F9 /* TSDatabaseSecondaryIndexes.h */, + C33FDB20255A580900E217F9 /* TSDatabaseSecondaryIndexes.m */, + C33FDB2C255A580A00E217F9 /* TSDatabaseView.h */, + C33FDB46255A580C00E217F9 /* TSDatabaseView.m */, + ); + path = Database; + sourceTree = ""; + }; + C32C5D22256DD496003C73A2 /* Link Previews */ = { + isa = PBXGroup; + children = ( + C33FDBA8255A581500E217F9 /* OWSLinkPreview.swift */, + ); + path = "Link Previews"; + sourceTree = ""; + }; + C32C5D2D256DD4C4003C73A2 /* Mentions */ = { + isa = PBXGroup; + children = ( + C33FDA7E255A57FB00E217F9 /* Mention.swift */, + C33FDA81255A57FC00E217F9 /* MentionsManager.swift */, + ); + path = Mentions; + sourceTree = ""; + }; + C32C5D49256DD522003C73A2 /* Database */ = { + isa = PBXGroup; + children = ( + C31F812525258FB000DD9FD9 /* Storage+VolumeSamples.swift */, + ); + path = Database; + sourceTree = ""; + }; C331FF1C2558F9D300070591 /* SessionUIKit */ = { isa = PBXGroup; children = ( @@ -2769,11 +2943,8 @@ C3851CE3256250FA0061EEB0 /* To Do */, C3CA3B11255CF17200F4C6D4 /* Utilities */, C3851CD225624B060061EEB0 /* UI */, - C38BBA0C255E32020041B9A3 /* Threads */, C38BBA0D255E321C0041B9A3 /* Messaging */, C38BBA0E255E32440041B9A3 /* Database */, - C33FDB01255A580700E217F9 /* AppReadiness.h */, - C33FDB75255A581000E217F9 /* AppReadiness.m */, C33FDB4C255A580D00E217F9 /* AppVersion.h */, C38EF3E4255B6DF4007E1867 /* CommonStrings.swift */, C38EF397255B6DD9007E1867 /* ThreadViewModel.swift */, @@ -2789,6 +2960,8 @@ C38EF2E3255B6DB9007E1867 /* OWSUnreadIndicator.m */, C38EF2EC255B6DBA007E1867 /* ProximityMonitoringManager.swift */, C38EF2F2255B6DBC007E1867 /* Searcher.swift */, + B8C2B33B2563770800551B4D /* ThreadUtil.h */, + B8C2B331256376F000551B4D /* ThreadUtil.m */, C38EF284255B6D84007E1867 /* AppSetup.h */, C38EF287255B6D85007E1867 /* AppSetup.m */, C3F0A52F255C80BC007BE2A3 /* NoopNotificationsManager.swift */, @@ -2798,21 +2971,14 @@ C38EF283255B6D84007E1867 /* VersionMigrations.h */, C38EF286255B6D85007E1867 /* VersionMigrations.m */, C33FDA8B255A57FD00E217F9 /* AppVersion.m */, - C33FDB68255A580F00E217F9 /* ContentProxy.swift */, C33FDBC9255A581700E217F9 /* CreatePreKeysOperation.swift */, C33FDB69255A580F00E217F9 /* FeatureFlags.swift */, - C33FDB7F255A581100E217F9 /* FullTextSearchFinder.swift */, C33FDB87255A581100E217F9 /* JobQueue.swift */, - C33FDB7A255A581000E217F9 /* NotificationsProtocol.h */, C33FDB0E255A580800E217F9 /* NSError+MessageSending.h */, C33FDB09255A580700E217F9 /* NSError+MessageSending.m */, - C33FDB3B255A580B00E217F9 /* NSNotificationCenter+OWS.h */, - C33FDB6C255A580F00E217F9 /* NSNotificationCenter+OWS.m */, C33FDA99255A57FE00E217F9 /* OutageDetection.swift */, C33FDACF255A580300E217F9 /* OWSAttachmentDownloads.h */, C33FDC13255A581E00E217F9 /* OWSAttachmentDownloads.m */, - C33FDB38255A580B00E217F9 /* OWSBackgroundTask.h */, - C33FDC1B255A581F00E217F9 /* OWSBackgroundTask.m */, C33FDAEA255A580500E217F9 /* OWSBackupFragment.h */, C33FDB07255A580700E217F9 /* OWSBackupFragment.m */, C33FDA95255A57FE00E217F9 /* OWSChunkedOutputStream.h */, @@ -2831,15 +2997,9 @@ C33FDAD8255A580300E217F9 /* OWSGroupsOutputStream.m */, C33FDB52255A580D00E217F9 /* OWSHTTPSecurityPolicy.h */, C33FDBBF255A581700E217F9 /* OWSHTTPSecurityPolicy.m */, - C33FDBF1255A581B00E217F9 /* OWSIdentityManager.h */, - C33FDBA9255A581500E217F9 /* OWSIdentityManager.m */, - C33FDB67255A580F00E217F9 /* OWSMediaGalleryFinder.h */, - C33FDB71255A581000E217F9 /* OWSMediaGalleryFinder.m */, C33FDBA1255A581400E217F9 /* OWSOperation.h */, C33FDB78255A581000E217F9 /* OWSOperation.m */, C33FDC19255A581F00E217F9 /* OWSQueues.h */, - C33FDAA0255A57FF00E217F9 /* OWSRecipientIdentity.h */, - C33FDBEC255A581B00E217F9 /* OWSRecipientIdentity.m */, C33FDBAD255A581500E217F9 /* OWSRecordTranscriptJob.h */, C33FDA7F255A57FC00E217F9 /* OWSRecordTranscriptJob.m */, C33FDBD3255A581800E217F9 /* OWSSignalAddress.swift */, @@ -2850,7 +3010,6 @@ C33FDB53255A580D00E217F9 /* PreKeyBundle+jsonDict.h */, C33FDB93255A581200E217F9 /* PreKeyBundle+jsonDict.m */, C33FDB64255A580E00E217F9 /* PreKeyRefreshOperation.swift */, - C33FDAF2255A580500E217F9 /* ProxiedContentDownloader.swift */, C33FDA6F255A57FA00E217F9 /* ReachabilityManager.swift */, C33FDA98255A57FE00E217F9 /* RotateSignedKeyOperation.swift */, C33FDBAE255A581500E217F9 /* SignalAccount.h */, @@ -2859,14 +3018,8 @@ C33FDB40255A580C00E217F9 /* SignalIOSProto.swift */, C33FDAEC255A580500E217F9 /* SignalRecipient.h */, C33FDBB7255A581600E217F9 /* SignalRecipient.m */, - C33FDB31255A580A00E217F9 /* SSKEnvironment.h */, - C33FDAF4255A580600E217F9 /* SSKEnvironment.m */, - C33FDB4F255A580D00E217F9 /* SSKJobRecord.h */, - C33FDACD255A580200E217F9 /* SSKJobRecord.m */, C33FDAED255A580500E217F9 /* SSKMessageSenderJobRecord.h */, C33FDAE9255A580500E217F9 /* SSKMessageSenderJobRecord.m */, - C33FDB94255A581300E217F9 /* TSAccountManager.h */, - C33FDB88255A581200E217F9 /* TSAccountManager.m */, C33FDC12255A581E00E217F9 /* TSConstants.h */, C33FDABE255A580100E217F9 /* TSConstants.m */, C33FDB6D255A580F00E217F9 /* TSPreKeyManager.h */, @@ -2914,216 +3067,12 @@ C379DC6825672B5E0002D4EB /* Notifications */ = { isa = PBXGroup; children = ( + C33FDB7A255A581000E217F9 /* NotificationsProtocol.h */, C33FDBDE255A581900E217F9 /* PushNotificationAPI.swift */, ); path = Notifications; sourceTree = ""; }; - C379DC7125672B8F0002D4EB /* Utilities */ = { - isa = PBXGroup; - children = ( - C33FDAC0255A580100E217F9 /* OWSIncomingMessageFinder.h */, - C33FDB1E255A580900E217F9 /* OWSIncomingMessageFinder.m */, - C33FDAE8255A580500E217F9 /* OWSMessageUtils.h */, - C33FDBD7255A581900E217F9 /* OWSMessageUtils.m */, - ); - path = Utilities; - sourceTree = ""; - }; - C379DC7A25672BDB0002D4EB /* Sending & Receiving */ = { - isa = PBXGroup; - children = ( - C33FDB34255A580B00E217F9 /* ClosedGroupPoller.swift */, - C3CA3B12255CF18200F4C6D4 /* Destination+Conversion.swift */, - C3D697492564DEDC004AF766 /* MessageReceiverDelegate.swift */, - B8D8F1EF256621180092EF10 /* MessageSenderDelegate.swift */, - C3CA3B1C255CF3C800F4C6D4 /* MessageSender+Utilities.swift */, - B8D8F21925662A4D0092EF10 /* OpenGroupAPIDelegate.swift */, - C33FDA8C255A57FD00E217F9 /* OpenGroupPoller.swift */, - C33FDB3A255A580B00E217F9 /* Poller.swift */, - C38EEF09255B49A8007E1867 /* SNProtoEnvelope+Conversion.swift */, - ); - path = "Sending & Receiving"; - sourceTree = ""; - }; - C379DC7B25672C020002D4EB /* Mentions */ = { - isa = PBXGroup; - children = ( - C33FDA7E255A57FB00E217F9 /* Mention.swift */, - C33FDA81255A57FC00E217F9 /* MentionsManager.swift */, - ); - path = Mentions; - sourceTree = ""; - }; - C379DC8425672C3E0002D4EB /* Quotes */ = { - isa = PBXGroup; - children = ( - C38EF398255B6DD9007E1867 /* OWSQuotedReplyModel.h */, - C38EF39A255B6DD9007E1867 /* OWSQuotedReplyModel.m */, - B840729F2565F1670037CB17 /* Quote+Conversion.swift */, - C33FDAD5255A580300E217F9 /* TSQuotedMessage.h */, - C33FDB83255A581100E217F9 /* TSQuotedMessage.m */, - ); - path = Quotes; - sourceTree = ""; - }; - C379DC8525672C790002D4EB /* Disappearing Messages */ = { - isa = PBXGroup; - children = ( - C33FDADA255A580400E217F9 /* OWSDisappearingConfigurationUpdateInfoMessage.h */, - C33FDA6B255A57FA00E217F9 /* OWSDisappearingConfigurationUpdateInfoMessage.m */, - C33FDAD9255A580300E217F9 /* OWSDisappearingMessagesConfiguration.h */, - C33FDBA4255A581400E217F9 /* OWSDisappearingMessagesConfiguration.m */, - C33FDC05255A581D00E217F9 /* OWSDisappearingMessagesFinder.h */, - C33FDA86255A57FC00E217F9 /* OWSDisappearingMessagesFinder.m */, - C33FDA80255A57FC00E217F9 /* OWSDisappearingMessagesJob.h */, - C33FDBDD255A581900E217F9 /* OWSDisappearingMessagesJob.m */, - ); - path = "Disappearing Messages"; - sourceTree = ""; - }; - C379DC8625672CAF0002D4EB /* Link Previews */ = { - isa = PBXGroup; - children = ( - C33FDBA8255A581500E217F9 /* OWSLinkPreview.swift */, - ); - path = "Link Previews"; - sourceTree = ""; - }; - C379DC8725672CD30002D4EB /* Read Tracking */ = { - isa = PBXGroup; - children = ( - C33FDABD255A580100E217F9 /* OWSOutgoingReceiptManager.h */, - C33FDB6F255A580F00E217F9 /* OWSOutgoingReceiptManager.m */, - C33FDB1D255A580900E217F9 /* OWSReadReceiptManager.h */, - C33FDA71255A57FA00E217F9 /* OWSReadReceiptManager.m */, - C33FDAE1255A580400E217F9 /* OWSReadTracking.h */, - C38EF2BE255B6DA6007E1867 /* TSUnreadIndicatorInteraction.h */, - C38EF2C1255B6DA6007E1867 /* TSUnreadIndicatorInteraction.m */, - ); - path = "Read Tracking"; - sourceTree = ""; - }; - C379DC9025672D490002D4EB /* Blocking */ = { - isa = PBXGroup; - children = ( - C33FDBEB255A581B00E217F9 /* OWSBlockingManager.h */, - C33FDA68255A57F900E217F9 /* OWSBlockingManager.m */, - ); - path = Blocking; - sourceTree = ""; - }; - C379DCA925672DBD0002D4EB /* Typing Indicators */ = { - isa = PBXGroup; - children = ( - C33FDA87255A57FC00E217F9 /* TypingIndicators.swift */, - ); - path = "Typing Indicators"; - sourceTree = ""; - }; - C379DCAA25672E7B0002D4EB /* Core Messages */ = { - isa = PBXGroup; - children = ( - C33FDB5D255A580E00E217F9 /* TSErrorMessage_privateConstructor.h */, - C33FDBB0255A581500E217F9 /* TSErrorMessage.h */, - C33FDAE7255A580500E217F9 /* TSErrorMessage.m */, - C33FDB9C255A581300E217F9 /* TSIncomingMessage.h */, - C33FDA97255A57FE00E217F9 /* TSIncomingMessage.m */, - C3B7845C25649DA600ADB2E7 /* TSIncomingMessage+Conversion.swift */, - C33FDADD255A580400E217F9 /* TSInfoMessage.h */, - C33FDC0C255A581E00E217F9 /* TSInfoMessage.m */, - C33FDAE6255A580400E217F9 /* TSInteraction.h */, - C33FDBE9255A581A00E217F9 /* TSInteraction.m */, - C33FDB8C255A581200E217F9 /* TSInvalidIdentityKeyErrorMessage.h */, - C33FDB74255A581000E217F9 /* TSInvalidIdentityKeyErrorMessage.m */, - C33FDA7B255A57FB00E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.h */, - C33FDBCB255A581800E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.m */, - C33FDBA6255A581400E217F9 /* TSInvalidIdentityKeySendingErrorMessage.h */, - C33FDB55255A580D00E217F9 /* TSInvalidIdentityKeySendingErrorMessage.m */, - C33FDA70255A57FA00E217F9 /* TSMessage.h */, - C33FDB60255A580E00E217F9 /* TSMessage.m */, - C33FDB48255A580C00E217F9 /* TSOutgoingMessage.h */, - C33FDB56255A580D00E217F9 /* TSOutgoingMessage.m */, - B84072952565E9F50037CB17 /* TSOutgoingMessage+Conversion.swift */, - ); - path = "Core Messages"; - sourceTree = ""; - }; - C379DCC3256732800002D4EB /* Storage */ = { - isa = PBXGroup; - children = ( - C3D9E40B25676C100040E4F3 /* Storage+Conformances.swift */, - B8D8F1372566120F0092EF10 /* Storage+ClosedGroups.swift */, - B8D8F17625661AFA0092EF10 /* Storage+Jobs.swift */, - B8D8F19225661BF80092EF10 /* Storage+Messaging.swift */, - B8D8F1BC25661C6F0092EF10 /* Storage+OnionRequests.swift */, - B8D8F18825661BA50092EF10 /* Storage+OpenGroups.swift */, - C33FDB8B255A581200E217F9 /* Storage+SessionManagement.swift */, - C3F0A5FD255C988A007BE2A3 /* Storage+Shared.swift */, - C3F0A607255C98A6007BE2A3 /* Storage+SnodeAPI.swift */, - C31F812525258FB000DD9FD9 /* Storage+VolumeSamples.swift */, - ); - path = Storage; - sourceTree = ""; - }; - C379DCC4256732980002D4EB /* YapDatabase */ = { - isa = PBXGroup; - children = ( - C33FDA6D255A57FA00E217F9 /* YapDatabase+Promise.swift */, - C33FDB5F255A580E00E217F9 /* YapDatabaseConnection+OWS.h */, - C33FDB43255A580C00E217F9 /* YapDatabaseConnection+OWS.m */, - C33FDA88255A57FD00E217F9 /* YapDatabaseTransaction+OWS.h */, - C33FDB5B255A580E00E217F9 /* YapDatabaseTransaction+OWS.m */, - ); - path = YapDatabase; - sourceTree = ""; - }; - C379DCC5256732B00002D4EB /* OWSStorage */ = { - isa = PBXGroup; - children = ( - C33FDA67255A57F900E217F9 /* OWSPrimaryStorage.h */, - C33FDC02255A581D00E217F9 /* OWSPrimaryStorage.m */, - C33FDBBA255A581600E217F9 /* OWSPrimaryStorage+keyFromIntLong.h */, - C33FDB99255A581300E217F9 /* OWSPrimaryStorage+keyFromIntLong.m */, - C33FDB47255A580C00E217F9 /* OWSPrimaryStorage+PreKeyStore.h */, - C33FDB50255A580D00E217F9 /* OWSPrimaryStorage+PreKeyStore.m */, - C33FDB03255A580700E217F9 /* OWSPrimaryStorage+SessionStore.h */, - C33FDAF3255A580500E217F9 /* OWSPrimaryStorage+SessionStore.m */, - C33FDAA7255A57FF00E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.h */, - C33FDAF7255A580600E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.m */, - C33FDAFE255A580600E217F9 /* OWSStorage.h */, - C33FDAB1255A580000E217F9 /* OWSStorage.m */, - ); - path = OWSStorage; - sourceTree = ""; - }; - C379DCD6256732CE0002D4EB /* Keychain */ = { - isa = PBXGroup; - children = ( - C33FDBBC255A581600E217F9 /* SSKKeychainStorage.swift */, - ); - path = Keychain; - sourceTree = ""; - }; - C379DCE7256732EF0002D4EB /* Utilities */ = { - isa = PBXGroup; - children = ( - C38EF3D2255B6DEE007E1867 /* ThreadViewHelper.h */, - C38EF3D1255B6DEE007E1867 /* ThreadViewHelper.m */, - C38EF285255B6D84007E1867 /* SignalKeyingStorage.h */, - C38EF282255B6D84007E1867 /* SignalKeyingStorage.m */, - C33FDAB9255A580100E217F9 /* OWSStorage+Subclass.h */, - C33FDA69255A57F900E217F9 /* SSKPreferences.swift */, - C33FDB25255A580900E217F9 /* TSDatabaseSecondaryIndexes.h */, - C33FDB20255A580900E217F9 /* TSDatabaseSecondaryIndexes.m */, - C33FDB2C255A580A00E217F9 /* TSDatabaseView.h */, - C33FDB46255A580C00E217F9 /* TSDatabaseView.m */, - C33FDBA0255A581400E217F9 /* TSStorageHeaders.h */, - C33FDBEF255A581B00E217F9 /* TSStorageKeys.h */, - ); - path = Utilities; - sourceTree = ""; - }; C379DCE82567330E0002D4EB /* Migration */ = { isa = PBXGroup; children = ( @@ -3263,9 +3212,7 @@ isa = PBXGroup; children = ( C33FDB19255A580900E217F9 /* GroupUtilities.swift */, - C33FDAFF255A580600E217F9 /* DisplayNameUtilities.swift */, C33FDBF4255A581B00E217F9 /* DisplayNameUtilities2.swift */, - C33FDBB9255A581600E217F9 /* ProfileManagerProtocol.h */, C33FDADF255A580400E217F9 /* PublicChatManager.swift */, C38EF3E5255B6DF4007E1867 /* ContactCellView.h */, C38EF3D6255B6DEF007E1867 /* ContactCellView.m */, @@ -3281,53 +3228,15 @@ path = "To Do"; sourceTree = ""; }; - C38BBA0B255E31EC0041B9A3 /* Attachments */ = { - isa = PBXGroup; - children = ( - C379DCFD25673DBC0002D4EB /* Attachment+Conversion.swift */, - C38EF224255B6D5D007E1867 /* SignalAttachment.swift */, - B8D797B0256B2590007C59DF /* TSAttachmentPointer+Backups.h */, - B8D797B1256B25A1007C59DF /* TSAttachmentPointer+Backups.m */, - B8D797DE256B2732007C59DF /* TSAttachment+Albums.h */, - B8D797D4256B2715007C59DF /* TSAttachment+Albums.m */, - ); - path = Attachments; - sourceTree = ""; - }; - C38BBA0C255E32020041B9A3 /* Threads */ = { - isa = PBXGroup; - children = ( - C33FDBCA255A581700E217F9 /* LKGroupUtilities.h */, - C33FDBE1255A581A00E217F9 /* LKGroupUtilities.m */, - B8C2B33B2563770800551B4D /* ThreadUtil.h */, - B8C2B331256376F000551B4D /* ThreadUtil.m */, - C33FDAB3255A580000E217F9 /* TSContactThread.h */, - C33FDAF9255A580600E217F9 /* TSContactThread.m */, - C33FDB0A255A580700E217F9 /* TSGroupModel.h */, - C33FDB73255A581000E217F9 /* TSGroupModel.m */, - C33FDA79255A57FB00E217F9 /* TSGroupThread.h */, - C33FDC01255A581C00E217F9 /* TSGroupThread.m */, - C33FDAD3255A580300E217F9 /* TSThread.h */, - C33FDBB8255A581600E217F9 /* TSThread.m */, - ); - path = Threads; - sourceTree = ""; - }; C38BBA0D255E321C0041B9A3 /* Messaging */ = { isa = PBXGroup; children = ( - C38BBA0B255E31EC0041B9A3 /* Attachments */, - C379DC9025672D490002D4EB /* Blocking */, - C379DCAA25672E7B0002D4EB /* Core Messages */, - C379DC8525672C790002D4EB /* Disappearing Messages */, - C379DC8625672CAF0002D4EB /* Link Previews */, - C379DC7B25672C020002D4EB /* Mentions */, - C379DC6825672B5E0002D4EB /* Notifications */, - C379DC8425672C3E0002D4EB /* Quotes */, - C379DC8725672CD30002D4EB /* Read Tracking */, - C379DC7A25672BDB0002D4EB /* Sending & Receiving */, - C379DCA925672DBD0002D4EB /* Typing Indicators */, - C379DC7125672B8F0002D4EB /* Utilities */, + B8D797B0256B2590007C59DF /* TSAttachmentPointer+Backups.h */, + B8D797B1256B25A1007C59DF /* TSAttachmentPointer+Backups.m */, + C33FDBA6255A581400E217F9 /* TSInvalidIdentityKeySendingErrorMessage.h */, + C33FDB55255A580D00E217F9 /* TSInvalidIdentityKeySendingErrorMessage.m */, + C33FDAE8255A580500E217F9 /* OWSMessageUtils.h */, + C33FDBD7255A581900E217F9 /* OWSMessageUtils.m */, ); path = Messaging; sourceTree = ""; @@ -3335,12 +3244,25 @@ C38BBA0E255E32440041B9A3 /* Database */ = { isa = PBXGroup; children = ( - C379DCD6256732CE0002D4EB /* Keychain */, C379DCE82567330E0002D4EB /* Migration */, - C379DCC5256732B00002D4EB /* OWSStorage */, - C379DCC3256732800002D4EB /* Storage */, - C379DCE7256732EF0002D4EB /* Utilities */, - C379DCC4256732980002D4EB /* YapDatabase */, + C33FDBBA255A581600E217F9 /* OWSPrimaryStorage+keyFromIntLong.h */, + C33FDB99255A581300E217F9 /* OWSPrimaryStorage+keyFromIntLong.m */, + C33FDB47255A580C00E217F9 /* OWSPrimaryStorage+PreKeyStore.h */, + C33FDB50255A580D00E217F9 /* OWSPrimaryStorage+PreKeyStore.m */, + C33FDB03255A580700E217F9 /* OWSPrimaryStorage+SessionStore.h */, + C33FDAF3255A580500E217F9 /* OWSPrimaryStorage+SessionStore.m */, + C33FDAA7255A57FF00E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.h */, + C33FDAF7255A580600E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.m */, + C3D9E40B25676C100040E4F3 /* Storage+Conformances.swift */, + C33FDB8B255A581200E217F9 /* Storage+SessionManagement.swift */, + C38EF3D2255B6DEE007E1867 /* ThreadViewHelper.h */, + C38EF3D1255B6DEE007E1867 /* ThreadViewHelper.m */, + C38EF285255B6D84007E1867 /* SignalKeyingStorage.h */, + C38EF282255B6D84007E1867 /* SignalKeyingStorage.m */, + C33FDAB9255A580100E217F9 /* OWSStorage+Subclass.h */, + C33FDBA0255A581400E217F9 /* TSStorageHeaders.h */, + C33FDBEF255A581B00E217F9 /* TSStorageKeys.h */, + C33FDA6D255A57FA00E217F9 /* YapDatabase+Promise.swift */, ); path = Database; sourceTree = ""; @@ -3385,7 +3307,6 @@ children = ( C3A721372558BDFA0043A11F /* OpenGroup.swift */, C3A721352558BDF90043A11F /* OpenGroupAPI.swift */, - C3A722912558C8940043A11F /* OpenGroupAPIDelegate.swift */, C3A721362558BDFA0043A11F /* OpenGroupInfo.swift */, C3A721342558BDF90043A11F /* OpenGroupMessage.swift */, C3A7229B2558E4310043A11F /* OpenGroupMessage+Conversion.swift */, @@ -3404,10 +3325,38 @@ C3BBE0B32554F0D30050F1E3 /* Utilities */ = { isa = PBXGroup; children = ( + C33FDB01255A580700E217F9 /* AppReadiness.h */, + C33FDB75255A581000E217F9 /* AppReadiness.m */, C3A722292558C1E40043A11F /* DotNetAPI.swift */, C3BBE0C62554F1570050F1E3 /* FixedWidthInteger+BigEndian.swift */, + C33FDB7F255A581100E217F9 /* FullTextSearchFinder.swift */, + C33FDBC1255A581700E217F9 /* GeneralUtilities.swift */, C3A71D0A2558989C0043A11F /* MessageWrapper.swift */, + C33FDB38255A580B00E217F9 /* OWSBackgroundTask.h */, + C33FDC1B255A581F00E217F9 /* OWSBackgroundTask.m */, + C33FDC05255A581D00E217F9 /* OWSDisappearingMessagesFinder.h */, + C33FDA86255A57FC00E217F9 /* OWSDisappearingMessagesFinder.m */, + C33FDBF1255A581B00E217F9 /* OWSIdentityManager.h */, + C33FDBA9255A581500E217F9 /* OWSIdentityManager.m */, + C33FDAC0255A580100E217F9 /* OWSIncomingMessageFinder.h */, + C33FDB1E255A580900E217F9 /* OWSIncomingMessageFinder.m */, + C33FDB67255A580F00E217F9 /* OWSMediaGalleryFinder.h */, + C33FDB71255A581000E217F9 /* OWSMediaGalleryFinder.m */, C3BBE0B42554F0E10050F1E3 /* ProofOfWork.swift */, + C33FDB91255A581200E217F9 /* ProtoUtils.h */, + C33FDA6C255A57FA00E217F9 /* ProtoUtils.m */, + C38EEF09255B49A8007E1867 /* SNProtoEnvelope+Conversion.swift */, + C33FDB31255A580A00E217F9 /* SSKEnvironment.h */, + C33FDAF4255A580600E217F9 /* SSKEnvironment.m */, + C33FDB32255A580A00E217F9 /* SSKIncrementingIdFinder.swift */, + C33FDB4F255A580D00E217F9 /* SSKJobRecord.h */, + C33FDACD255A580200E217F9 /* SSKJobRecord.m */, + C3A3A098256E17B2004D228D /* SSKJobRecordFinder.swift */, + C3A3A170256E1D25004D228D /* SSKReachabilityManager.swift */, + C33FDB5F255A580E00E217F9 /* YapDatabaseConnection+OWS.h */, + C33FDB43255A580C00E217F9 /* YapDatabaseConnection+OWS.m */, + C33FDA88255A57FD00E217F9 /* YapDatabaseTransaction+OWS.h */, + C33FDB5B255A580E00E217F9 /* YapDatabaseTransaction+OWS.m */, ); path = Utilities; sourceTree = ""; @@ -3424,6 +3373,8 @@ C3C2A5BE255385EE00C340D1 /* SnodeAPI.swift */, C3C2A5B6255385EC00C340D1 /* SnodeMessage.swift */, C3C2A5B8255385EC00C340D1 /* Storage.swift */, + B8D8F1BC25661C6F0092EF10 /* Storage+OnionRequests.swift */, + C3F0A607255C98A6007BE2A3 /* Storage+SnodeAPI.swift */, C3C2A5CD255385F300C340D1 /* Utilities */, ); path = SessionSnodeKit; @@ -3459,24 +3410,38 @@ C33FDB8A255A581200E217F9 /* AppContext.h */, C33FDB85255A581100E217F9 /* AppContext.m */, C3C2A5D12553860800C340D1 /* Array+Description.swift */, + C33FDAA8255A57FF00E217F9 /* BuildConfiguration.swift */, C3D9E43025676D3D0040E4F3 /* Configuration.swift */, + C33FDB68255A580F00E217F9 /* ContentProxy.swift */, C33FDB54255A580D00E217F9 /* DataSource.h */, C33FDBB6255A581600E217F9 /* DataSource.m */, C3C2ABD12553C6C900C340D1 /* Data+SecureRandom.swift */, C3C2A5D52553860A00C340D1 /* Dictionary+Description.swift */, C3A71D662558A0170043A11F /* DiffieHellman.swift */, + C33FDA73255A57FA00E217F9 /* ECKeyPair+Hexadecimal.swift */, C3C2A5BC255385EE00C340D1 /* HTTP.swift */, C3C2A5D92553860B00C340D1 /* JSON.swift */, + C33FDBCA255A581700E217F9 /* LKGroupUtilities.h */, + C33FDBE1255A581A00E217F9 /* LKGroupUtilities.m */, + C33FDB6B255A580F00E217F9 /* LKUserDefaults.swift */, C3C2A5CE2553860700C340D1 /* Logging.swift */, + C33FDAFD255A580600E217F9 /* LRUCache.swift */, C33FDAFC255A580600E217F9 /* MIMETypeUtil.h */, C33FDB41255A580C00E217F9 /* MIMETypeUtil.m */, C3A71F882558BA9F0043A11F /* Mnemonic.swift */, + C33FDB5C255A580E00E217F9 /* NSArray+Functional.h */, + C33FDAB8255A580100E217F9 /* NSArray+Functional.m */, C33FDB29255A580A00E217F9 /* NSData+Image.h */, C33FDAEF255A580500E217F9 /* NSData+Image.m */, C300A6302554B68200555489 /* NSDate+Timestamp.h */, C300A6312554B6D100555489 /* NSDate+Timestamp.mm */, + C33FDB3B255A580B00E217F9 /* NSNotificationCenter+OWS.h */, + C33FDB6C255A580F00E217F9 /* NSNotificationCenter+OWS.m */, + C33FDA7A255A57FB00E217F9 /* NSRegularExpression+SSK.swift */, C352A3762557859C00338F3E /* NSTimer+Proxying.h */, C352A36C2557858D00338F3E /* NSTimer+Proxying.m */, + C33FDB51255A580D00E217F9 /* NSUserDefaults+OWS.h */, + C33FDB77255A581000E217F9 /* NSUserDefaults+OWS.m */, C33FDBAB255A581500E217F9 /* OWSFileSystem.h */, C33FDA8E255A57FD00E217F9 /* OWSFileSystem.m */, C33FDB22255A580900E217F9 /* OWSMediaUtils.swift */, @@ -3484,6 +3449,8 @@ C3C2A5D32553860900C340D1 /* Promise+Delaying.swift */, C3A7225D2558C38D0043A11F /* Promise+Retaining.swift */, C3C2A5D62553860B00C340D1 /* Promise+Retrying.swift */, + C33FDAF2255A580500E217F9 /* ProxiedContentDownloader.swift */, + C33FDBBC255A581600E217F9 /* SSKKeychainStorage.swift */, C33FDB36255A580B00E217F9 /* Storage.swift */, C3C2AC2D2553CBEB00C340D1 /* String+Trimming.swift */, C352A3A42557B5F000338F3E /* TSRequest.h */, @@ -3510,9 +3477,12 @@ children = ( C3C2A7802553AA6300C340D1 /* Protos */, C3C2A70A25539DF900C340D1 /* Meta */, + C32C5BB9256DC7C4003C73A2 /* To Do */, C3BBE0752554CDA60050F1E3 /* Configuration.swift */, C3BBE07F2554CDD70050F1E3 /* Storage.swift */, + C32C5BCB256DC818003C73A2 /* Database */, C300A5BB2554AFFB00555489 /* Messages */, + C32C59AF256DB31A003C73A2 /* Threads */, C300A5F02554B08500555489 /* Sending & Receiving */, C352A2F325574B3300338F3E /* Jobs */, C3A7215C2558C0AC0043A11F /* File Server */, @@ -3731,39 +3701,26 @@ C3CA3B11255CF17200F4C6D4 /* Utilities */ = { isa = PBXGroup; children = ( - C33FDB6B255A580F00E217F9 /* LKUserDefaults.swift */, C33FDB80255A581100E217F9 /* Notification+Loki.swift */, - C33FDBC1255A581700E217F9 /* GeneralUtilities.swift */, - C33FDA73255A57FA00E217F9 /* ECKeyPair+Hexadecimal.swift */, - C33FDAA8255A57FF00E217F9 /* BuildConfiguration.swift */, C33FDC16255A581E00E217F9 /* FunctionalUtil.h */, C33FDB17255A580800E217F9 /* FunctionalUtil.m */, C33FDB8F255A581200E217F9 /* ParamParser.swift */, - C33FDB32255A580A00E217F9 /* SSKIncrementingIdFinder.swift */, C33FDADE255A580400E217F9 /* SwiftSingletons.swift */, C33FDB49255A580C00E217F9 /* WeakTimer.swift */, C33FDB3F255A580C00E217F9 /* String+SSK.swift */, C33FDBC2255A581700E217F9 /* SSKAsserts.h */, C33FDA9E255A57FF00E217F9 /* ReverseDispatchQueue.swift */, - C33FDB91255A581200E217F9 /* ProtoUtils.h */, - C33FDA6C255A57FA00E217F9 /* ProtoUtils.m */, C33FDB14255A580800E217F9 /* OWSMath.h */, C33FDADC255A580400E217F9 /* NSObject+Casting.h */, C33FDAAA255A580000E217F9 /* NSObject+Casting.m */, - C33FDA7A255A57FB00E217F9 /* NSRegularExpression+SSK.swift */, C33FDBFE255A581C00E217F9 /* NSSet+Functional.h */, C33FDAC1255A580100E217F9 /* NSSet+Functional.m */, C33FDB12255A580800E217F9 /* NSString+SSK.h */, C33FDB45255A580C00E217F9 /* NSString+SSK.m */, C33FDBF6255A581C00E217F9 /* NSURLSessionDataTask+StatusCode.h */, C33FDBB4255A581600E217F9 /* NSURLSessionDataTask+StatusCode.m */, - C33FDB51255A580D00E217F9 /* NSUserDefaults+OWS.h */, - C33FDB77255A581000E217F9 /* NSUserDefaults+OWS.m */, - C33FDB5C255A580E00E217F9 /* NSArray+Functional.h */, - C33FDAB8255A580100E217F9 /* NSArray+Functional.m */, C33FDBF8255A581C00E217F9 /* NSArray+OWS.h */, C33FDB0D255A580800E217F9 /* NSArray+OWS.m */, - C33FDAFD255A580600E217F9 /* LRUCache.swift */, C33FDC03255A581D00E217F9 /* ByteParser.h */, C33FDAE0255A580400E217F9 /* ByteParser.m */, C38EF3DD255B6DF1007E1867 /* UIAlertController+OWS.swift */, @@ -3795,13 +3752,14 @@ isa = PBXGroup; children = ( C33FDAF1255A580500E217F9 /* OWSThumbnailService.swift */, + C38EF224255B6D5D007E1867 /* SignalAttachment.swift */, C33FDC15255A581E00E217F9 /* TSAttachment.h */, C33FDAC2255A580200E217F9 /* TSAttachment.m */, C33FDC18255A581F00E217F9 /* TSAttachmentPointer.h */, C33FDB9E255A581400E217F9 /* TSAttachmentPointer.m */, + C379DCFD25673DBC0002D4EB /* TSAttachmentPointer+Conversion.swift */, C33FDAE4255A580400E217F9 /* TSAttachmentStream.h */, C33FDAC4255A580200E217F9 /* TSAttachmentStream.m */, - C379DCF3256735770002D4EB /* VisibleMessage+Attachment.swift */, ); path = Attachments; sourceTree = ""; @@ -3921,6 +3879,7 @@ C3F0A58F255C8E3D007BE2A3 /* Meta */, C3F0A5EB255C970D007BE2A3 /* Configuration.swift */, B8CCF63B239757C10091D419 /* Components */, + C32C5D49256DD522003C73A2 /* Database */, C32B405424A961E1001117B5 /* Dependencies */, 76EB03C118170B33006006FC /* Signal */, B8CCF63C239757DB0091D419 /* Utilities */, @@ -3947,81 +3906,51 @@ C33FDD74255A582000E217F9 /* OWSPrimaryStorage+keyFromIntLong.h in Headers */, C33FDDB0255A582000E217F9 /* NSURLSessionDataTask+StatusCode.h in Headers */, C33FDCCE255A582000E217F9 /* OWSMath.h in Headers */, - C33FDD46255A582000E217F9 /* TSInvalidIdentityKeyErrorMessage.h in Headers */, C33FDDD0255A582000E217F9 /* FunctionalUtil.h in Headers */, C38EF311255B6DBF007E1867 /* OWSScrubbingLogFormatter.h in Headers */, - C33FDC77255A582000E217F9 /* OWSOutgoingReceiptManager.h in Headers */, B8C2B3442563782400551B4D /* ThreadUtil.h in Headers */, - C33FDCBB255A582000E217F9 /* AppReadiness.h in Headers */, C38EF334255B6DBF007E1867 /* UIUtil.h in Headers */, C38EF32D255B6DBF007E1867 /* BlockListUIUtils.h in Headers */, C33FDD5B255A582000E217F9 /* OWSOperation.h in Headers */, C38EF291255B6D86007E1867 /* SignalKeyingStorage.h in Headers */, C33FDC89255A582000E217F9 /* OWSAttachmentDownloads.h in Headers */, - C33FDD73255A582000E217F9 /* ProfileManagerProtocol.h in Headers */, C38EF2D8255B6DAF007E1867 /* OWSUserProfile.h in Headers */, - C33FDD17255A582000E217F9 /* TSErrorMessage_privateConstructor.h in Headers */, - C33FDC93255A582000E217F9 /* OWSDisappearingMessagesConfiguration.h in Headers */, - C38EF2C2255B6DA6007E1867 /* TSUnreadIndicatorInteraction.h in Headers */, C33FDCCC255A582000E217F9 /* NSString+SSK.h in Headers */, C38EF313255B6DBF007E1867 /* OWSUnreadIndicator.h in Headers */, C33FDD7C255A582000E217F9 /* SSKAsserts.h in Headers */, - C33FDC9B255A582000E217F9 /* OWSReadTracking.h in Headers */, - C33FDC97255A582000E217F9 /* TSInfoMessage.h in Headers */, - C33FDC6D255A582000E217F9 /* TSContactThread.h in Headers */, - C33FDC3A255A581F00E217F9 /* OWSDisappearingMessagesJob.h in Headers */, B8D797C3256B25A8007C59DF /* TSAttachmentPointer+Backups.h in Headers */, - C33FDD6A255A582000E217F9 /* TSErrorMessage.h in Headers */, C33FDDA9255A582000E217F9 /* TSStorageKeys.h in Headers */, - C33FDC7A255A582000E217F9 /* OWSIncomingMessageFinder.h in Headers */, C38EF3F6255B6DF7007E1867 /* OWSTextView.h in Headers */, - C33FDCB8255A582000E217F9 /* OWSStorage.h in Headers */, C38EF24C255B6D67007E1867 /* NSAttributedString+OWS.h in Headers */, C38EF32B255B6DBF007E1867 /* OWSFormat.h in Headers */, - C33FDD4E255A582000E217F9 /* TSAccountManager.h in Headers */, - C33FDDAB255A582000E217F9 /* OWSIdentityManager.h in Headers */, C33FDC2C255A581F00E217F9 /* OWSFailedAttachmentDownloadsJob.h in Headers */, C38EF22A255B6D5D007E1867 /* AttachmentSharing.h in Headers */, C33FDD67255A582000E217F9 /* OWSRecordTranscriptJob.h in Headers */, C33FDDB8255A582000E217F9 /* NSSet+Functional.h in Headers */, C33FDC2F255A581F00E217F9 /* OWSSyncManagerProtocol.h in Headers */, C33FDDCC255A582000E217F9 /* TSConstants.h in Headers */, - C33FDCDF255A582000E217F9 /* TSDatabaseSecondaryIndexes.h in Headers */, C33FDDBD255A582000E217F9 /* ByteParser.h in Headers */, C38EF243255B6D67007E1867 /* UIViewController+OWS.h in Headers */, C38EF36D255B6DCC007E1867 /* SharingThreadPickerViewController.h in Headers */, C38EF35D255B6DCC007E1867 /* OWSNavigationController.h in Headers */, - C33FDDBF255A582000E217F9 /* OWSDisappearingMessagesFinder.h in Headers */, - C33FDCC4255A582000E217F9 /* TSGroupModel.h in Headers */, C38EF249255B6D67007E1867 /* UIColor+OWS.h in Headers */, - C33FDD4B255A582000E217F9 /* ProtoUtils.h in Headers */, - C33FDD19255A582000E217F9 /* YapDatabaseConnection+OWS.h in Headers */, C38EF216255B6D3B007E1867 /* Theme.h in Headers */, C38EF31B255B6DBF007E1867 /* OWSPreferences.h in Headers */, C33FDD0C255A582000E217F9 /* OWSHTTPSecurityPolicy.h in Headers */, C33FDC57255A582000E217F9 /* OWSContactsOutputStream.h in Headers */, C33FDCBD255A582000E217F9 /* OWSPrimaryStorage+SessionStore.h in Headers */, C38EF3F0255B6DF7007E1867 /* ThreadViewHelper.h in Headers */, - C33FDCD7255A582000E217F9 /* OWSReadReceiptManager.h in Headers */, - C33FDD21255A582000E217F9 /* OWSMediaGalleryFinder.h in Headers */, C38EF274255B6D7A007E1867 /* OWSResaveCollectionDBMigration.h in Headers */, - C33FDD02255A582000E217F9 /* TSOutgoingMessage.h in Headers */, C33FDC95255A582000E217F9 /* OWSFailedMessagesJob.h in Headers */, C38EF3F1255B6DF7007E1867 /* OWSSearchBar.h in Headers */, C33FDD75255A582000E217F9 /* OWSPrimaryStorage+Loki.h in Headers */, - C33FDC5A255A582000E217F9 /* OWSRecipientIdentity.h in Headers */, - C33FDC42255A581F00E217F9 /* YapDatabaseTransaction+OWS.h in Headers */, C33FDCA6255A582000E217F9 /* SignalRecipient.h in Headers */, C38EF277255B6D7A007E1867 /* OWSDatabaseMigration.h in Headers */, C38EF294255B6D86007E1867 /* OWSSounds.h in Headers */, C38EF3F5255B6DF7007E1867 /* OWSTextField.h in Headers */, C38EF275255B6D7A007E1867 /* OWSDatabaseMigrationRunner.h in Headers */, C33FDCA7255A582000E217F9 /* SSKMessageSenderJobRecord.h in Headers */, - C33FDD84255A582000E217F9 /* LKGroupUtilities.h in Headers */, - C33FDC8D255A582000E217F9 /* TSThread.h in Headers */, - C33FDDA5255A582000E217F9 /* OWSBlockingManager.h in Headers */, C38EF366255B6DCC007E1867 /* ScreenLockViewController.h in Headers */, - C33FDD16255A582000E217F9 /* NSArray+Functional.h in Headers */, C38EF35B255B6DCC007E1867 /* SelectThreadViewController.h in Headers */, C33FDDD3255A582000E217F9 /* OWSQueues.h in Headers */, C33FDC96255A582000E217F9 /* NSObject+Casting.h in Headers */, @@ -4029,51 +3958,34 @@ C33FDDB3255A582000E217F9 /* OWSError.h in Headers */, C33FDCC8255A582000E217F9 /* NSError+MessageSending.h in Headers */, C38EF403255B6DF7007E1867 /* ContactCellView.h in Headers */, - C33FDCA0255A582000E217F9 /* TSInteraction.h in Headers */, - B8D797DF256B2737007C59DF /* TSAttachment+Albums.h in Headers */, C33FDD68255A582000E217F9 /* SignalAccount.h in Headers */, C38EF35E255B6DCC007E1867 /* OWSViewController.h in Headers */, C33FDC4F255A582000E217F9 /* OWSChunkedOutputStream.h in Headers */, C37F5396255B95BD002AEA92 /* OWSAnyTouchGestureRecognizer.h in Headers */, C38EF325255B6DBF007E1867 /* OWSWindowManager.h in Headers */, - C33FDCF2255A582000E217F9 /* OWSBackgroundTask.h in Headers */, - C38EF39C255B6DDA007E1867 /* OWSQuotedReplyModel.h in Headers */, C38EF404255B6DF7007E1867 /* ContactTableViewCell.h in Headers */, C38EF24A255B6D67007E1867 /* UIView+OWS.h in Headers */, C33FDDB2255A582000E217F9 /* NSArray+OWS.h in Headers */, C38EF322255B6DBF007E1867 /* DebugLogger.h in Headers */, - C33FDC2A255A581F00E217F9 /* TSMessage.h in Headers */, - C33FDD09255A582000E217F9 /* SSKJobRecord.h in Headers */, - C33FDC94255A582000E217F9 /* OWSDisappearingConfigurationUpdateInfoMessage.h in Headers */, C38EF2D7255B6DAF007E1867 /* OWSProfileManager.h in Headers */, - C33FDC21255A581F00E217F9 /* OWSPrimaryStorage.h in Headers */, C38EF290255B6D86007E1867 /* AppSetup.h in Headers */, C37F5385255B94F6002AEA92 /* SelectRecipientViewController.h in Headers */, C33FDC61255A582000E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.h in Headers */, C38EF367255B6DCC007E1867 /* OWSTableViewController.h in Headers */, - C33FDCEB255A582000E217F9 /* SSKEnvironment.h in Headers */, C38EF246255B6D67007E1867 /* UIFont+OWS.h in Headers */, C37F53A7255B96E0002AEA92 /* OWSAudioPlayer.h in Headers */, - C33FDC35255A581F00E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.h in Headers */, C33FDD0D255A582000E217F9 /* PreKeyBundle+jsonDict.h in Headers */, C33FDD60255A582000E217F9 /* TSInvalidIdentityKeySendingErrorMessage.h in Headers */, - C33FDCF5255A582000E217F9 /* NSNotificationCenter+OWS.h in Headers */, - C33FDD34255A582000E217F9 /* NotificationsProtocol.h in Headers */, C33FD9AF255A548A00E217F9 /* SignalUtilitiesKit.h in Headers */, C33FDC50255A582000E217F9 /* OWSDispatch.h in Headers */, C33FDD06255A582000E217F9 /* AppVersion.h in Headers */, C33FDD90255A582000E217F9 /* OWSUploadOperation.h in Headers */, - C33FDC8F255A582000E217F9 /* TSQuotedMessage.h in Headers */, C33FDC73255A582000E217F9 /* OWSStorage+Subclass.h in Headers */, C33FDCA4255A582000E217F9 /* OWSBackupFragment.h in Headers */, C33FDD27255A582000E217F9 /* TSPreKeyManager.h in Headers */, - C33FDD0B255A582000E217F9 /* NSUserDefaults+OWS.h in Headers */, - C33FDD56255A582000E217F9 /* TSIncomingMessage.h in Headers */, C37F53E9255BA9CE002AEA92 /* Environment.h in Headers */, - C33FDCE6255A582000E217F9 /* TSDatabaseView.h in Headers */, C33FDD5A255A582000E217F9 /* TSStorageHeaders.h in Headers */, C33FDCA2255A582000E217F9 /* OWSMessageUtils.h in Headers */, - C33FDC33255A581F00E217F9 /* TSGroupThread.h in Headers */, C33FDD01255A582000E217F9 /* OWSPrimaryStorage+PreKeyStore.h in Headers */, C38EF28F255B6D86007E1867 /* VersionMigrations.h in Headers */, ); @@ -4091,17 +4003,21 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + C32C5FAA256DFED9003C73A2 /* NSArray+Functional.h in Headers */, C3D9E3FA25676BCE0040E4F3 /* TSYapDatabaseObject.h in Headers */, C3D9E3A4256763DE0040E4F3 /* AppContext.h in Headers */, C3D9E38A256760390040E4F3 /* OWSFileSystem.h in Headers */, C352A3B72557B6ED00338F3E /* TSRequest.h in Headers */, + C32C5A36256DB856003C73A2 /* LKGroupUtilities.h in Headers */, C3D9E379256760340040E4F3 /* MIMETypeUtil.h in Headers */, C3D9E50E25677A510040E4F3 /* DataSource.h in Headers */, C3D9E4FD256778E30040E4F3 /* NSData+Image.h in Headers */, C300A63B2554B72200555489 /* NSDate+Timestamp.h in Headers */, C3D9E4E3256778720040E4F3 /* UIImage+OWS.h in Headers */, C352A3772557864000338F3E /* NSTimer+Proxying.h in Headers */, + C32C5B51256DC219003C73A2 /* NSNotificationCenter+OWS.h in Headers */, C3C2A67D255388CC00C340D1 /* SessionUtilitiesKit.h in Headers */, + C32C6018256E07F9003C73A2 /* NSUserDefaults+OWS.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4110,9 +4026,51 @@ buildActionMask = 2147483647; files = ( C3D9E485256775D20040E4F3 /* TSAttachment.h in Headers */, + C32C5EE5256DF506003C73A2 /* YapDatabaseConnection+OWS.h in Headers */, + C32C5AAF256DBE8F003C73A2 /* TSMessage.h in Headers */, + C32C5B8D256DC565003C73A2 /* SSKEnvironment.h in Headers */, + C32C5F34256DFCC4003C73A2 /* TSErrorMessage.h in Headers */, + C32C59C6256DB41F003C73A2 /* TSGroupThread.h in Headers */, C3C2A6F425539DE700C340D1 /* SessionMessagingKit.h in Headers */, + C32C59C2256DB41F003C73A2 /* TSContactThread.h in Headers */, + C32C5B2D256DC1A1003C73A2 /* TSQuotedMessage.h in Headers */, + C32C59C5256DB41F003C73A2 /* TSGroupModel.h in Headers */, + C32C5C46256DCBB2003C73A2 /* AppReadiness.h in Headers */, C3D9E487256775D20040E4F3 /* TSAttachmentStream.h in Headers */, + C3A3A122256E1A97004D228D /* OWSDisappearingMessagesFinder.h in Headers */, + C32C5F4E256DFD58003C73A2 /* TSInvalidIdentityKeyReceivingErrorMessage.h in Headers */, + C3A3A12B256E1AD5004D228D /* TSDatabaseSecondaryIndexes.h in Headers */, + C32C5FC4256E0209003C73A2 /* OWSBackgroundTask.h in Headers */, + C32C5C24256DCB30003C73A2 /* NotificationsProtocol.h in Headers */, + C32C59C0256DB41F003C73A2 /* TSThread.h in Headers */, + C32C5AB3256DBE8F003C73A2 /* TSInteraction.h in Headers */, + C32C5DA5256DD6E5003C73A2 /* OWSOutgoingReceiptManager.h in Headers */, + C32C5B0A256DC076003C73A2 /* OWSDisappearingMessagesConfiguration.h in Headers */, + C32C5D37256DD4ED003C73A2 /* TSUnreadIndicatorInteraction.h in Headers */, + C32C5ADF256DBFAA003C73A2 /* OWSReadTracking.h in Headers */, C3D9E486256775D20040E4F3 /* TSAttachmentPointer.h in Headers */, + C32C5EF7256DF567003C73A2 /* TSDatabaseView.h in Headers */, + C3A3A0B3256E17F2004D228D /* SSKJobRecord.h in Headers */, + C32C5BE6256DC891003C73A2 /* OWSReadReceiptManager.h in Headers */, + C32C5EC3256DE133003C73A2 /* OWSQuotedReplyModel.h in Headers */, + C32C5BF8256DC8F6003C73A2 /* OWSDisappearingMessagesJob.h in Headers */, + C32C5AAA256DBE8F003C73A2 /* TSIncomingMessage.h in Headers */, + C32C5B6B256DC357003C73A2 /* OWSDisappearingConfigurationUpdateInfoMessage.h in Headers */, + C32C5F23256DFCC0003C73A2 /* TSErrorMessage_privateConstructor.h in Headers */, + C32C5BBA256DC7E3003C73A2 /* ProfileManagerProtocol.h in Headers */, + C32C5E7E256DE023003C73A2 /* YapDatabaseTransaction+OWS.h in Headers */, + C32C5CAD256DD1DF003C73A2 /* TSAccountManager.h in Headers */, + C3A3A0F5256E194C004D228D /* OWSRecipientIdentity.h in Headers */, + C32C5AB4256DBE8F003C73A2 /* TSOutgoingMessage.h in Headers */, + C32C5EA0256DE0D6003C73A2 /* OWSPrimaryStorage.h in Headers */, + C3A3A111256E1A93004D228D /* OWSIncomingMessageFinder.h in Headers */, + C32C5AAC256DBE8F003C73A2 /* TSInfoMessage.h in Headers */, + C32C5BB0256DC73D003C73A2 /* OWSBlockingManager.h in Headers */, + C3A3A15F256E1BB4004D228D /* ProtoUtils.h in Headers */, + C3A3A145256E1B49004D228D /* OWSMediaGalleryFinder.h in Headers */, + C32C5C0A256DC9B4003C73A2 /* OWSIdentityManager.h in Headers */, + C32C5F68256DFDAA003C73A2 /* TSInvalidIdentityKeyErrorMessage.h in Headers */, + C32C5E64256DDFD6003C73A2 /* OWSStorage.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4963,26 +4921,19 @@ C33FDD45255A582000E217F9 /* Storage+SessionManagement.swift in Sources */, C33FDCA3255A582000E217F9 /* SSKMessageSenderJobRecord.m in Sources */, C38EF3C3255B6DE7007E1867 /* ImageEditorTextItem.swift in Sources */, - B8D8F16B256615DE0092EF10 /* Storage+VolumeSamples.swift in Sources */, - C33FDC41255A581F00E217F9 /* TypingIndicators.swift in Sources */, C33FDC7D255A582000E217F9 /* OWSDispatch.m in Sources */, - B84072962565E9F50037CB17 /* TSOutgoingMessage+Conversion.swift in Sources */, C38EF247255B6D67007E1867 /* NSAttributedString+OWS.m in Sources */, C33FDC99255A582000E217F9 /* PublicChatManager.swift in Sources */, - C33FDCB9255A582000E217F9 /* DisplayNameUtilities.swift in Sources */, C33FDD49255A582000E217F9 /* ParamParser.swift in Sources */, - B8D8F19325661BF80092EF10 /* Storage+Messaging.swift in Sources */, C38EF35F255B6DCC007E1867 /* SelectRecipientViewController.m in Sources */, C38EF3C5255B6DE7007E1867 /* OWSViewController+ImageEditor.swift in Sources */, C33FDDCD255A582000E217F9 /* OWSAttachmentDownloads.m in Sources */, - C33FDD97255A582000E217F9 /* OWSDisappearingMessagesJob.m in Sources */, C33FDD0F255A582000E217F9 /* TSInvalidIdentityKeySendingErrorMessage.m in Sources */, C38EF320255B6DBF007E1867 /* OWSScrubbingLogFormatter.m in Sources */, C38EF39B255B6DDA007E1867 /* ThreadViewModel.swift in Sources */, C38EF2A5255B6D93007E1867 /* Identicon+ObjC.swift in Sources */, C38EF330255B6DBF007E1867 /* OWSWindowManager.m in Sources */, C33FDD79255A582000E217F9 /* OWSHTTPSecurityPolicy.m in Sources */, - C33FDD3D255A582000E217F9 /* TSQuotedMessage.m in Sources */, C38EF273255B6D7A007E1867 /* OWSDatabaseMigrationRunner.m in Sources */, C33FDD12255A582000E217F9 /* OWSPrimaryStorage+Loki.m in Sources */, C3D9E40C25676C100040E4F3 /* Storage+Conformances.swift in Sources */, @@ -4990,85 +4941,60 @@ C38EF36C255B6DCC007E1867 /* SharingThreadPickerViewController.m in Sources */, C38EF244255B6D67007E1867 /* UIDevice+featureSupport.swift in Sources */, C38EF385255B6DD2007E1867 /* AttachmentTextToolbar.swift in Sources */, - C33FDC87255A582000E217F9 /* SSKJobRecord.m in Sources */, C33FDD23255A582000E217F9 /* FeatureFlags.swift in Sources */, C38EF297255B6D86007E1867 /* OWSSounds.m in Sources */, - B8D8F18925661BA50092EF10 /* Storage+OpenGroups.swift in Sources */, - C33FDCAE255A582000E217F9 /* SSKEnvironment.m in Sources */, C33FDCF9255A582000E217F9 /* String+SSK.swift in Sources */, C38EF389255B6DD2007E1867 /* AttachmentTextView.swift in Sources */, C38EF321255B6DBF007E1867 /* OWSAudioPlayer.m in Sources */, C33FDD0A255A582000E217F9 /* OWSPrimaryStorage+PreKeyStore.m in Sources */, - C33FDD1A255A582000E217F9 /* TSMessage.m in Sources */, C38EF3FF255B6DF7007E1867 /* TappableView.swift in Sources */, C38EF3C2255B6DE7007E1867 /* ImageEditorPaletteView.swift in Sources */, C38EF245255B6D67007E1867 /* UIFont+OWS.m in Sources */, - C33FDD26255A582000E217F9 /* NSNotificationCenter+OWS.m in Sources */, C38EF36F255B6DCC007E1867 /* OWSViewController.m in Sources */, - C33FDD42255A582000E217F9 /* TSAccountManager.m in Sources */, - B8D8F1E6256620DD0092EF10 /* MessageReceiverDelegate.swift in Sources */, C38EF3FB255B6DF7007E1867 /* UIAlertController+OWS.swift in Sources */, C33FDC53255A582000E217F9 /* OutageDetection.swift in Sources */, C38EF30C255B6DBF007E1867 /* OWSScreenLock.swift in Sources */, C38EF363255B6DCC007E1867 /* ModalActivityIndicatorViewController.swift in Sources */, C38EF38A255B6DD2007E1867 /* AttachmentCaptionToolbar.swift in Sources */, - C33FDD00255A582000E217F9 /* TSDatabaseView.m in Sources */, C33FDD83255A582000E217F9 /* CreatePreKeysOperation.swift in Sources */, - C33FDDD5255A582000E217F9 /* OWSBackgroundTask.m in Sources */, - B84072A02565F1670037CB17 /* Quote+Conversion.swift in Sources */, - C33FDC62255A582000E217F9 /* BuildConfiguration.swift in Sources */, C38EF40A255B6DF7007E1867 /* OWSFlatButton.swift in Sources */, C33FDCD1255A582000E217F9 /* FunctionalUtil.m in Sources */, C38EF402255B6DF7007E1867 /* CommonStrings.swift in Sources */, C38EF3C1255B6DE7007E1867 /* ImageEditorBrushViewController.swift in Sources */, C33FDCC7255A582000E217F9 /* NSArray+OWS.m in Sources */, C38EF3EF255B6DF7007E1867 /* ThreadViewHelper.m in Sources */, - C33FDD72255A582000E217F9 /* TSThread.m in Sources */, C33FDC71255A582000E217F9 /* OWSFailedMessagesJob.m in Sources */, C33FDD32255A582000E217F9 /* OWSOperation.m in Sources */, C3F0A530255C80BC007BE2A3 /* NoopNotificationsManager.swift in Sources */, C33FDD8D255A582000E217F9 /* OWSSignalAddress.swift in Sources */, C33FDCB1255A582000E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.m in Sources */, - C38EF2C5255B6DA6007E1867 /* TSUnreadIndicatorInteraction.m in Sources */, C33FDC64255A582000E217F9 /* NSObject+Casting.m in Sources */, C38EF388255B6DD2007E1867 /* AttachmentApprovalViewController.swift in Sources */, C33FDD53255A582000E217F9 /* OWSPrimaryStorage+keyFromIntLong.m in Sources */, - C33FDC72255A582000E217F9 /* NSArray+Functional.m in Sources */, C33FDD38255A582000E217F9 /* TSPreKeyManager.m in Sources */, C38EF2A7255B6D93007E1867 /* ProfilePictureView.swift in Sources */, C38EF22C255B6D5D007E1867 /* OWSVideoPlayer.swift in Sources */, C33FDC29255A581F00E217F9 /* ReachabilityManager.swift in Sources */, C38EF407255B6DF7007E1867 /* Toast.swift in Sources */, C38EF38C255B6DD2007E1867 /* ApprovalRailCellView.swift in Sources */, - B8D8F0F32565F98E0092EF10 /* LKUserDefaults.swift in Sources */, C38EF409255B6DF7007E1867 /* ContactTableViewCell.m in Sources */, C38EF32A255B6DBF007E1867 /* UIUtil.m in Sources */, C38EF333255B6DBF007E1867 /* DeviceSleepManager.swift in Sources */, C33FDC52255A582000E217F9 /* RotateSignedKeyOperation.swift in Sources */, - C33FDCDA255A582000E217F9 /* TSDatabaseSecondaryIndexes.m in Sources */, C38EF335255B6DBF007E1867 /* BlockListCache.swift in Sources */, C38EF2A6255B6D93007E1867 /* PlaceholderIcon.swift in Sources */, C38EF316255B6DBF007E1867 /* ProximityMonitoringManager.swift in Sources */, C38EF371255B6DCC007E1867 /* MessageApprovalViewController.swift in Sources */, C33FDD71255A582000E217F9 /* SignalRecipient.m in Sources */, - C33FDD39255A582000E217F9 /* FullTextSearchFinder.swift in Sources */, - C38EEF0A255B49A8007E1867 /* SNProtoEnvelope+Conversion.swift in Sources */, C33FDD92255A582000E217F9 /* SignalIOS.pb.swift in Sources */, - C33FDCB3255A582000E217F9 /* TSContactThread.m in Sources */, C33FDC45255A581F00E217F9 /* AppVersion.m in Sources */, C38EF3C7255B6DE7007E1867 /* ImageEditorCanvasView.swift in Sources */, - B8D8F16A256615DE0092EF10 /* Storage+Shared.swift in Sources */, - C33FDC46255A581F00E217F9 /* OpenGroupPoller.swift in Sources */, C38EF400255B6DF7007E1867 /* GalleryRailView.swift in Sources */, C38EF32E255B6DBF007E1867 /* ImageCache.swift in Sources */, - C33FDC34255A581F00E217F9 /* NSRegularExpression+SSK.swift in Sources */, C38EF32F255B6DBF007E1867 /* OWSFormat.m in Sources */, C38EF218255B6D3B007E1867 /* Theme.m in Sources */, C38EF3BA255B6DE7007E1867 /* ImageEditorItem.swift in Sources */, - B8D8F1382566120F0092EF10 /* Storage+ClosedGroups.swift in Sources */, C38EF3F7255B6DF7007E1867 /* OWSNavigationBar.swift in Sources */, - C33FDD76255A582000E217F9 /* SSKKeychainStorage.swift in Sources */, - C33FDDA6255A582000E217F9 /* OWSRecipientIdentity.m in Sources */, C37F5403255BA9ED002AEA92 /* Environment.m in Sources */, C38EF2D4255B6DAF007E1867 /* OWSProfileManager.m in Sources */, C38EF248255B6D67007E1867 /* UIViewController+OWS.m in Sources */, @@ -5078,114 +5004,69 @@ C38EF370255B6DCC007E1867 /* OWSNavigationController.m in Sources */, C38EF24E255B6D67007E1867 /* Collection+OWS.swift in Sources */, C33FDD05255A582000E217F9 /* OWSChunkedOutputStream.m in Sources */, - C33FDD10255A582000E217F9 /* TSOutgoingMessage.m in Sources */, C33FDCFA255A582000E217F9 /* SignalIOSProto.swift in Sources */, C33FDCC3255A582000E217F9 /* NSError+MessageSending.m in Sources */, - C33FDD2D255A582000E217F9 /* TSGroupModel.m in Sources */, - C33FDD9B255A582000E217F9 /* LKGroupUtilities.m in Sources */, - C38EF229255B6D5D007E1867 /* SignalAttachment.swift in Sources */, C33FDD13255A582000E217F9 /* OWSFailedAttachmentDownloadsJob.m in Sources */, C38EF24D255B6D67007E1867 /* UIView+OWS.swift in Sources */, - C3CA3B13255CF18200F4C6D4 /* Destination+Conversion.swift in Sources */, C33FDD4D255A582000E217F9 /* PreKeyBundle+jsonDict.m in Sources */, C38EF24B255B6D67007E1867 /* UIView+OWS.m in Sources */, - C33FDC51255A582000E217F9 /* TSIncomingMessage.m in Sources */, C38EF408255B6DF7007E1867 /* OWSSearchBar.m in Sources */, C38EF327255B6DBF007E1867 /* BlockListUIUtils.m in Sources */, C33FDCFF255A582000E217F9 /* NSString+SSK.m in Sources */, - C33FDD22255A582000E217F9 /* ContentProxy.swift in Sources */, C38EF310255B6DBF007E1867 /* DebugLogger.m in Sources */, C38EF38B255B6DD2007E1867 /* AttachmentPrepViewController.swift in Sources */, - C33FDD2F255A582000E217F9 /* AppReadiness.m in Sources */, - C33FDCEC255A582000E217F9 /* SSKIncrementingIdFinder.swift in Sources */, C33FDC7B255A582000E217F9 /* NSSet+Functional.m in Sources */, - C33FDCB7255A582000E217F9 /* LRUCache.swift in Sources */, - B8D8F1F0256621180092EF10 /* MessageSenderDelegate.swift in Sources */, C38EF405255B6DF7007E1867 /* OWSButton.swift in Sources */, C38EF3C4255B6DE7007E1867 /* ImageEditorContents.swift in Sources */, - C33FDC3B255A581F00E217F9 /* MentionsManager.swift in Sources */, - C33FDCFD255A582000E217F9 /* YapDatabaseConnection+OWS.m in Sources */, C38EF3BC255B6DE7007E1867 /* ImageEditorPanGestureRecognizer.swift in Sources */, - C33FDC23255A581F00E217F9 /* SSKPreferences.swift in Sources */, C38EF372255B6DCC007E1867 /* MediaMessageView.swift in Sources */, C38EF387255B6DD2007E1867 /* AttachmentItemCollection.swift in Sources */, C38EF22B255B6D5D007E1867 /* ShareViewDelegate.swift in Sources */, - C33FDC38255A581F00E217F9 /* Mention.swift in Sources */, C38EF3BF255B6DE7007E1867 /* ImageEditorView.swift in Sources */, C38EF365255B6DCC007E1867 /* OWSTableViewController.m in Sources */, - C33FDC25255A581F00E217F9 /* OWSDisappearingConfigurationUpdateInfoMessage.m in Sources */, C38EF36B255B6DCC007E1867 /* ScreenLockViewController.m in Sources */, C33FDC39255A581F00E217F9 /* OWSRecordTranscriptJob.m in Sources */, C38EF228255B6D5D007E1867 /* AttachmentSharing.m in Sources */, - B8D8F16C256615DE0092EF10 /* Storage+SnodeAPI.swift in Sources */, C33FDD1E255A582000E217F9 /* PreKeyRefreshOperation.swift in Sources */, - C3B7845D25649DA600ADB2E7 /* TSIncomingMessage+Conversion.swift in Sources */, - C33FDCF4255A582000E217F9 /* Poller.swift in Sources */, C38EF332255B6DBF007E1867 /* OWSPreferences.m in Sources */, - C33FDC26255A581F00E217F9 /* ProtoUtils.m in Sources */, - C38EF39E255B6DDA007E1867 /* OWSQuotedReplyModel.m in Sources */, - B8D8F17725661AFA0092EF10 /* Storage+Jobs.swift in Sources */, - C33FDD85255A582000E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.m in Sources */, - C33FDD2E255A582000E217F9 /* TSInvalidIdentityKeyErrorMessage.m in Sources */, - C33FDDBB255A582000E217F9 /* TSGroupThread.m in Sources */, C38EF40C255B6DF7007E1867 /* GradientView.swift in Sources */, C33FDD14255A582000E217F9 /* OWSUDManager.swift in Sources */, - C33FDC6B255A582000E217F9 /* OWSStorage.m in Sources */, C38EF28D255B6D86007E1867 /* OWSAudioSession.swift in Sources */, - C33FDD7B255A582000E217F9 /* GeneralUtilities.swift in Sources */, C33FDCC1255A582000E217F9 /* OWSBackupFragment.m in Sources */, C33FDDAE255A582000E217F9 /* DisplayNameUtilities2.swift in Sources */, - C33FDD15255A582000E217F9 /* YapDatabaseTransaction+OWS.m in Sources */, - C33FDD63255A582000E217F9 /* OWSIdentityManager.m in Sources */, C38EF35C255B6DCC007E1867 /* SelectThreadViewController.m in Sources */, C38EF2D6255B6DAF007E1867 /* OWSUserProfile.m in Sources */, C38EF30E255B6DBF007E1867 /* FullTextSearcher.swift in Sources */, C33FDDD9255A582000E217F9 /* LokiSessionRestorationImplementation.swift in Sources */, - C33FDD31255A582000E217F9 /* NSUserDefaults+OWS.m in Sources */, C38EF3FA255B6DF7007E1867 /* DirectionalPanGestureRecognizer.swift in Sources */, C38EF3BB255B6DE7007E1867 /* ImageEditorStrokeItem.swift in Sources */, - C33FDCA1255A582000E217F9 /* TSErrorMessage.m in Sources */, C38EF3C0255B6DE7007E1867 /* ImageEditorCropViewController.swift in Sources */, C38EF401255B6DF7007E1867 /* VideoPlayerView.swift in Sources */, - C33FDC22255A581F00E217F9 /* OWSBlockingManager.m in Sources */, C38EF3FE255B6DF7007E1867 /* OWSTextField.m in Sources */, - C33FDC40255A581F00E217F9 /* OWSDisappearingMessagesFinder.m in Sources */, - B8D8F21A25662A4D0092EF10 /* OpenGroupAPIDelegate.swift in Sources */, - C33FDCEE255A582000E217F9 /* ClosedGroupPoller.swift in Sources */, C38EF3BD255B6DE7007E1867 /* ImageEditorTransform.swift in Sources */, C38EF24F255B6D67007E1867 /* UIColor+OWS.m in Sources */, - B8D797D5256B2715007C59DF /* TSAttachment+Albums.m in Sources */, C33FDC9A255A582000E217F9 /* ByteParser.m in Sources */, C38EF293255B6D86007E1867 /* AppSetup.m in Sources */, C33FDDC0255A582000E217F9 /* SignalAccount.m in Sources */, C33FDC58255A582000E217F9 /* ReverseDispatchQueue.swift in Sources */, - C3D9E53925677F5E0040E4F3 /* Attachment+Conversion.swift in Sources */, C38EF3F4255B6DF7007E1867 /* ContactCellView.m in Sources */, - C33FDD29255A582000E217F9 /* OWSOutgoingReceiptManager.m in Sources */, - B8D8F0F42565F98E0092EF10 /* PushNotificationAPI.swift in Sources */, C33FDC78255A582000E217F9 /* TSConstants.m in Sources */, C38EF324255B6DBF007E1867 /* Bench.swift in Sources */, C38EF292255B6D86007E1867 /* VersionMigrations.m in Sources */, - C33FDD5E255A582000E217F9 /* OWSDisappearingMessagesConfiguration.m in Sources */, C38EF3F2255B6DF7007E1867 /* DisappearingTimerConfigurationView.swift in Sources */, - C33FDCD8255A582000E217F9 /* OWSIncomingMessageFinder.m in Sources */, C38EF3F9255B6DF7007E1867 /* OWSLayerView.swift in Sources */, - C33FDCAC255A582000E217F9 /* ProxiedContentDownloader.swift in Sources */, C33FDD03255A582000E217F9 /* WeakTimer.swift in Sources */, C33FDD41255A582000E217F9 /* JobQueue.swift in Sources */, C38EF3B9255B6DE7007E1867 /* ImageEditorPinchGestureRecognizer.swift in Sources */, C33FDC98255A582000E217F9 /* SwiftSingletons.swift in Sources */, C33FDC27255A581F00E217F9 /* YapDatabase+Promise.swift in Sources */, C33FDCFE255A582000E217F9 /* OWSContactsOutputStream.m in Sources */, - C33FDDBC255A582000E217F9 /* OWSPrimaryStorage.m in Sources */, C33FDCD3255A582000E217F9 /* GroupUtilities.swift in Sources */, - C33FDC2B255A581F00E217F9 /* OWSReadReceiptManager.m in Sources */, C38EF326255B6DBF007E1867 /* ConversationStyle.swift in Sources */, C38EF3B8255B6DE7007E1867 /* ImageEditorTextViewController.swift in Sources */, C33FDD91255A582000E217F9 /* OWSMessageUtils.m in Sources */, B8C2B332256376F000551B4D /* ThreadUtil.m in Sources */, C38EF40B255B6DF7007E1867 /* TappableStackView.swift in Sources */, - C3CA3B1D255CF3C800F4C6D4 /* MessageSender+Utilities.swift in Sources */, C38EF31D255B6DBF007E1867 /* UIImage+OWS.swift in Sources */, C38EF359255B6DCC007E1867 /* SheetViewController.swift in Sources */, C33FDCAD255A582000E217F9 /* OWSPrimaryStorage+SessionStore.m in Sources */, @@ -5194,22 +5075,16 @@ C38EF28E255B6D86007E1867 /* SignalKeyingStorage.m in Sources */, B8C2B2C82563685C00551B4D /* CircleView.swift in Sources */, C38EF406255B6DF7007E1867 /* OWSAlerts.swift in Sources */, - C33FDD62255A582000E217F9 /* OWSLinkPreview.swift in Sources */, - C33FDDA3255A582000E217F9 /* TSInteraction.m in Sources */, C38EF331255B6DBF007E1867 /* UIGestureRecognizer+OWS.swift in Sources */, C33FDDD8255A582000E217F9 /* OWSUploadOperation.m in Sources */, C33FDDC5255A582000E217F9 /* OWSError.m in Sources */, C38EF38D255B6DD2007E1867 /* AttachmentCaptionViewController.swift in Sources */, - C33FDC2D255A581F00E217F9 /* ECKeyPair+Hexadecimal.swift in Sources */, - C33FDDC6255A582000E217F9 /* TSInfoMessage.m in Sources */, B8D797B2256B25A1007C59DF /* TSAttachmentPointer+Backups.m in Sources */, C38EF319255B6DBF007E1867 /* Weak.swift in Sources */, C38EF31C255B6DBF007E1867 /* Searcher.swift in Sources */, C38EF2B3255B6D9C007E1867 /* UIViewController+Utilities.swift in Sources */, C38EF3BE255B6DE7007E1867 /* OrderedDictionary.swift in Sources */, - B8D8F1BD25661C6F0092EF10 /* Storage+OnionRequests.swift in Sources */, C33FDD6E255A582000E217F9 /* NSURLSessionDataTask+StatusCode.m in Sources */, - C33FDD2B255A582000E217F9 /* OWSMediaGalleryFinder.m in Sources */, C38EF2B4255B6D9C007E1867 /* UIView+Utilities.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -5222,7 +5097,9 @@ C3C2A5BF255385EE00C340D1 /* SnodeMessage.swift in Sources */, C3C2A5C0255385EE00C340D1 /* Snode.swift in Sources */, C3C2A5C7255385EE00C340D1 /* SnodeAPI.swift in Sources */, + C32C5CBF256DD282003C73A2 /* Storage+SnodeAPI.swift in Sources */, C3C2A5C6255385EE00C340D1 /* Notification+OnionRequestAPI.swift in Sources */, + C32C5CBE256DD282003C73A2 /* Storage+OnionRequests.swift in Sources */, C3C2A5DC2553860B00C340D1 /* Promise+Threading.swift in Sources */, C3C2A5C4255385EE00C340D1 /* OnionRequestAPI+Encryption.swift in Sources */, C3C2A5DE2553860B00C340D1 /* String+Utilities.swift in Sources */, @@ -5239,29 +5116,41 @@ buildActionMask = 2147483647; files = ( C3AABDDF2553ECF00042FF4C /* Array+Description.swift in Sources */, + C32C5A47256DB8F0003C73A2 /* ECKeyPair+Hexadecimal.swift in Sources */, C3D9E41525676C320040E4F3 /* Storage.swift in Sources */, + C32C5D83256DD5B6003C73A2 /* SSKKeychainStorage.swift in Sources */, C3D9E39B256763C20040E4F3 /* AppContext.m in Sources */, C3BBE0A82554D4DE0050F1E3 /* JSON.swift in Sources */, C352A36D2557858E00338F3E /* NSTimer+Proxying.m in Sources */, + C32C5A2D256DB849003C73A2 /* LKGroupUtilities.m in Sources */, C3C2ABD22553C6C900C340D1 /* Data+SecureRandom.swift in Sources */, + C32C5DC9256DD935003C73A2 /* ProxiedContentDownloader.swift in Sources */, C3D9E4C02567767F0040E4F3 /* DataSource.m in Sources */, C3D9E43125676D3D0040E4F3 /* Configuration.swift in Sources */, + C32C5DD2256DD9E5003C73A2 /* LRUCache.swift in Sources */, C3A7211A2558BCA10043A11F /* DiffieHellman.swift in Sources */, + C32C5FA1256DFED5003C73A2 /* NSArray+Functional.m in Sources */, C3A7225E2558C38D0043A11F /* Promise+Retaining.swift in Sources */, C3D9E4D12567777D0040E4F3 /* OWSMediaUtils.swift in Sources */, C3BBE0AA2554D4DE0050F1E3 /* Dictionary+Description.swift in Sources */, C3D9E4DA256778410040E4F3 /* UIImage+OWS.m in Sources */, + C32C600F256E07F5003C73A2 /* NSUserDefaults+OWS.m in Sources */, C3D9E35E25675F640040E4F3 /* OWSFileSystem.m in Sources */, C3C2AC2E2553CBEB00C340D1 /* String+Trimming.swift in Sources */, + C32C5B48256DC211003C73A2 /* NSNotificationCenter+OWS.m in Sources */, C3D9E3C925676AF30040E4F3 /* TSYapDatabaseObject.m in Sources */, C352A3A62557B60D00338F3E /* TSRequest.m in Sources */, C3471ED42555386B00297E91 /* AESGCM.swift in Sources */, + C32C5DDB256DD9FF003C73A2 /* ContentProxy.swift in Sources */, C3A71F892558BA9F0043A11F /* Mnemonic.swift in Sources */, C33FDEF8255A656D00E217F9 /* Promise+Delaying.swift in Sources */, + C32C5A24256DB7DB003C73A2 /* LKUserDefaults.swift in Sources */, C3D9E41F25676C870040E4F3 /* OWSPrimaryStorageProtocol.swift in Sources */, C3BBE0A72554D4DE0050F1E3 /* Promise+Retrying.swift in Sources */, C3D9E4F4256778AF0040E4F3 /* NSData+Image.m in Sources */, + C32C5E0C256DDAFA003C73A2 /* NSRegularExpression+SSK.swift in Sources */, C3BBE0A92554D4DE0050F1E3 /* HTTP.swift in Sources */, + C32C5A48256DB8F0003C73A2 /* BuildConfiguration.swift in Sources */, C300A60D2554B31900555489 /* Logging.swift in Sources */, C3D9E35525675EE10040E4F3 /* MIMETypeUtil.m in Sources */, C3A7219A2558C1660043A11F /* AnyPromise+Conversion.swift in Sources */, @@ -5274,56 +5163,122 @@ buildActionMask = 2147483647; files = ( C3A7229C2558E4310043A11F /* OpenGroupMessage+Conversion.swift in Sources */, + C32C5DBE256DD743003C73A2 /* OpenGroupPoller.swift in Sources */, C3471F4C25553AB000297E91 /* MessageReceiver+Decryption.swift in Sources */, C300A5D32554B05A00555489 /* TypingIndicator.swift in Sources */, + C3A3A156256E1B91004D228D /* ProtoUtils.m in Sources */, C3CA3B2F255CF84E00F4C6D4 /* NullMessage.swift in Sources */, C3471ECB2555356A00297E91 /* MessageSender+Encryption.swift in Sources */, C352A32F2557549C00338F3E /* NotifyPNServerJob.swift in Sources */, C300A5F22554B09800555489 /* MessageSender.swift in Sources */, C3C2A74D2553A39700C340D1 /* VisibleMessage.swift in Sources */, + C32C5AAD256DBE8F003C73A2 /* TSInfoMessage.m in Sources */, + C32C5A13256DB7A5003C73A2 /* PushNotificationAPI.swift in Sources */, C352A3932557883D00338F3E /* JobDelegate.swift in Sources */, + C32C5B84256DC54F003C73A2 /* SSKEnvironment.m in Sources */, + C3A3A108256E1A5C004D228D /* OWSIncomingMessageFinder.m in Sources */, C352A31325574F5200338F3E /* MessageReceiveJob.swift in Sources */, + C32C5BDD256DC88D003C73A2 /* OWSReadReceiptManager.m in Sources */, C3D9E3BF25676AD70040E4F3 /* TSAttachmentStream.m in Sources */, - C3A722922558C8940043A11F /* OpenGroupAPIDelegate.swift in Sources */, C3C2A7562553A3AB00C340D1 /* VisibleMessage+Quote.swift in Sources */, + C32C5C89256DD0D2003C73A2 /* Storage+Jobs.swift in Sources */, C300A5FC2554B0A000555489 /* MessageReceiver.swift in Sources */, + C32C5A76256DBBCF003C73A2 /* SignalAttachment.swift in Sources */, + C32C5CA4256DD1DC003C73A2 /* TSAccountManager.m in Sources */, C3A7213B2558BDFA0043A11F /* OpenGroup.swift in Sources */, C352A3892557876500338F3E /* JobQueue.swift in Sources */, C3BBE0B52554F0E10050F1E3 /* ProofOfWork.swift in Sources */, C3A721902558C0CD0043A11F /* FileServerAPI.swift in Sources */, + C32C59C1256DB41F003C73A2 /* TSGroupThread.m in Sources */, + C32C5F45256DFD2B003C73A2 /* TSInvalidIdentityKeyReceivingErrorMessage.m in Sources */, + C3A3A08F256E1728004D228D /* FullTextSearchFinder.swift in Sources */, + C32C5B9F256DC739003C73A2 /* OWSBlockingManager.m in Sources */, C3D9E52725677DF20040E4F3 /* OWSThumbnailService.swift in Sources */, + C32C5E75256DE020003C73A2 /* YapDatabaseTransaction+OWS.m in Sources */, C3BBE0802554CDD70050F1E3 /* Storage.swift in Sources */, C379DCF4256735770002D4EB /* VisibleMessage+Attachment.swift in Sources */, + C32C5AB1256DBE8F003C73A2 /* TSIncomingMessage.m in Sources */, + C3A3A107256E1A5C004D228D /* OWSDisappearingMessagesFinder.m in Sources */, + C32C59C3256DB41F003C73A2 /* TSGroupModel.m in Sources */, C3C2A7842553AAF300C340D1 /* SNProto.swift in Sources */, + C32C5DC0256DD743003C73A2 /* Poller.swift in Sources */, C3C2A7682553A3D900C340D1 /* VisibleMessage+Contact.swift in Sources */, + C3A3A171256E1D25004D228D /* SSKReachabilityManager.swift in Sources */, C3A721392558BDFA0043A11F /* OpenGroupAPI.swift in Sources */, C3A71D0B2558989C0043A11F /* MessageWrapper.swift in Sources */, - B867665825663BBA00B197C5 /* MessageSenderDelegate.swift in Sources */, + C32C5D24256DD4C0003C73A2 /* MentionsManager.swift in Sources */, C3A71D1E25589AC30043A11F /* WebSocketProto.swift in Sources */, C3A721382558BDFA0043A11F /* OpenGroupMessage.swift in Sources */, C3C2A7852553AAF300C340D1 /* SessionProtos.pb.swift in Sources */, + C32C5B3F256DC1DF003C73A2 /* TSQuotedMessage+Conversion.swift in Sources */, C3C2A7712553A41E00C340D1 /* ControlMessage.swift in Sources */, + C32C5D19256DD493003C73A2 /* OWSLinkPreview.swift in Sources */, + C32C5CF0256DD3E4003C73A2 /* Storage+Shared.swift in Sources */, C300A5BD2554B00D00555489 /* ReadReceipt.swift in Sources */, + C32C5AB5256DBE8F003C73A2 /* TSOutgoingMessage+Conversion.swift in Sources */, + C32C5E5B256DDF45003C73A2 /* OWSStorage.m in Sources */, + C32C5E15256DDC78003C73A2 /* SSKPreferences.swift in Sources */, + C32C5D9C256DD6DC003C73A2 /* OWSOutgoingReceiptManager.m in Sources */, + C32C5C4F256DCC36003C73A2 /* Storage+OpenGroups.swift in Sources */, + C3A3A099256E17B2004D228D /* SSKJobRecordFinder.swift in Sources */, + C32C5EDC256DF501003C73A2 /* YapDatabaseConnection+OWS.m in Sources */, C3BBE0762554CDA60050F1E3 /* Configuration.swift in Sources */, + C32C5F5F256DFD90003C73A2 /* TSInvalidIdentityKeyErrorMessage.m in Sources */, C3D9E3BE25676AD70040E4F3 /* TSAttachmentPointer.m in Sources */, + C32C5AAB256DBE8F003C73A2 /* TSIncomingMessage+Conversion.swift in Sources */, + C32C5A88256DBCF9003C73A2 /* MessageReceiver+Handling.swift in Sources */, + C32C5C1B256DC9E0003C73A2 /* GeneralUtilities.swift in Sources */, + C32C5A02256DB658003C73A2 /* MessageSender+Handling.swift in Sources */, + C32C5D2E256DD4EA003C73A2 /* TSUnreadIndicatorInteraction.m in Sources */, + C32C599E256DB02B003C73A2 /* TypingIndicators.swift in Sources */, C300A5DD2554B06600555489 /* ClosedGroupUpdate.swift in Sources */, C3471FA42555439E00297E91 /* Notification+MessageSender.swift in Sources */, + C32C5BEF256DC8EE003C73A2 /* OWSDisappearingMessagesJob.m in Sources */, C3A7222A2558C1E40043A11F /* DotNetAPI.swift in Sources */, + C32C5E97256DE0CB003C73A2 /* OWSPrimaryStorage.m in Sources */, + C32C5EB9256DE130003C73A2 /* OWSQuotedReplyModel+Conversion.swift in Sources */, C3A71D1F25589AC30043A11F /* WebSocketResources.pb.swift in Sources */, + C32C5BCC256DC830003C73A2 /* Storage+ClosedGroups.swift in Sources */, + C3A3A0EC256E1949004D228D /* OWSRecipientIdentity.m in Sources */, + C32C5AB2256DBE8F003C73A2 /* TSMessage.m in Sources */, + C3A3A0FE256E1A3C004D228D /* TSDatabaseSecondaryIndexes.m in Sources */, + C32C5B1C256DC19D003C73A2 /* TSQuotedMessage.m in Sources */, C352A349255781F400338F3E /* AttachmentDownloadJob.swift in Sources */, C352A30925574D8500338F3E /* Message+Destination.swift in Sources */, C300A5E72554B07300555489 /* ExpirationTimerUpdate.swift in Sources */, C3D9E3C025676AD70040E4F3 /* TSAttachment.m in Sources */, - C3D697382564DCE6004AF766 /* MessageReceiverDelegate.swift in Sources */, + C32C598A256D0664003C73A2 /* SNProtoEnvelope+Conversion.swift in Sources */, C352A2FF25574B6300338F3E /* MessageSendJob.swift in Sources */, C3C2A75F2553A3C500C340D1 /* VisibleMessage+LinkPreview.swift in Sources */, + C32C5FBB256E0206003C73A2 /* OWSBackgroundTask.m in Sources */, + C32C5C93256DD12D003C73A2 /* OWSUDManager.swift in Sources */, + C32C5C3D256DCBAF003C73A2 /* AppReadiness.m in Sources */, C3C2A74425539EB700C340D1 /* Message.swift in Sources */, + C32C5F11256DF79A003C73A2 /* SSKIncrementingIdFinder.swift in Sources */, + C32C5DBF256DD743003C73A2 /* ClosedGroupPoller.swift in Sources */, + C32C5EEE256DF54E003C73A2 /* TSDatabaseView.m in Sources */, C300A5C92554B04E00555489 /* SessionRequest.swift in Sources */, C3A7213A2558BDFA0043A11F /* OpenGroupInfo.swift in Sources */, C352A35B2557824E00338F3E /* AttachmentUploadJob.swift in Sources */, + C3A3A13C256E1B27004D228D /* OWSMediaGalleryFinder.m in Sources */, + C32C5AAE256DBE8F003C73A2 /* TSInteraction.m in Sources */, + C32C5D23256DD4C0003C73A2 /* Mention.swift in Sources */, + C32C5FD6256E0346003C73A2 /* Notification+Thread.swift in Sources */, C3BBE0C72554F1570050F1E3 /* FixedWidthInteger+BigEndian.swift in Sources */, + C32C5C88256DD0D2003C73A2 /* Storage+Messaging.swift in Sources */, + C32C59C7256DB41F003C73A2 /* TSThread.m in Sources */, + C32C5F08256DF5C8003C73A2 /* DisplayNameUtilities.swift in Sources */, C300A5B22554AF9800555489 /* VisibleMessage+Profile.swift in Sources */, + C32C5F1A256DFCAD003C73A2 /* TSErrorMessage.m in Sources */, + C32C5A75256DBBCF003C73A2 /* TSAttachmentPointer+Conversion.swift in Sources */, + C32C5AF8256DC051003C73A2 /* OWSDisappearingMessagesConfiguration.m in Sources */, + C32C5EBA256DE130003C73A2 /* OWSQuotedReplyModel.m in Sources */, + C32C5B62256DC333003C73A2 /* OWSDisappearingConfigurationUpdateInfoMessage.m in Sources */, C352A2F525574B4700338F3E /* Job.swift in Sources */, + C32C5C01256DC9A0003C73A2 /* OWSIdentityManager.m in Sources */, + C32C59C4256DB41F003C73A2 /* TSContactThread.m in Sources */, + C3A3A0AA256E17E6004D228D /* SSKJobRecord.m in Sources */, + C32C5AB0256DBE8F003C73A2 /* TSOutgoingMessage.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5500,6 +5455,7 @@ 4CFE6B6C21F92BA700006701 /* LegacyNotificationsAdaptee.swift in Sources */, B8CCF6432397711F0091D419 /* SettingsVC.swift in Sources */, C354E75A23FE2A7600CE22E3 /* BaseVC.swift in Sources */, + C32C5D40256DD51E003C73A2 /* Storage+VolumeSamples.swift in Sources */, 3441FD9F21A3604F00BB9542 /* BackupRestoreViewController.swift in Sources */, 45AE48511E0732D6004D96C2 /* TurnServerInfo.swift in Sources */, 45C0DC1B1E68FE9000E04C47 /* UIApplication+OWS.swift in Sources */, diff --git a/SignalUtilitiesKit/AppSetup.m b/SignalUtilitiesKit/AppSetup.m index 189933e35..1266dd04a 100644 --- a/SignalUtilitiesKit/AppSetup.m +++ b/SignalUtilitiesKit/AppSetup.m @@ -9,18 +9,17 @@ #import #import #import -#import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import +#import #import -#import -#import +#import +#import #import - NS_ASSUME_NONNULL_BEGIN @implementation AppSetup @@ -67,7 +66,6 @@ NS_ASSUME_NONNULL_BEGIN [[OWSOutgoingReceiptManager alloc] initWithPrimaryStorage:primaryStorage]; id reachabilityManager = [SSKReachabilityManagerImpl new]; id typingIndicators = [[OWSTypingIndicatorsImpl alloc] init]; - OWSAttachmentDownloads *attachmentDownloads = [[OWSAttachmentDownloads alloc] init]; OWSAudioSession *audioSession = [OWSAudioSession new]; OWSSounds *sounds = [[OWSSounds alloc] initWithPrimaryStorage:primaryStorage]; @@ -90,8 +88,7 @@ NS_ASSUME_NONNULL_BEGIN readReceiptManager:readReceiptManager outgoingReceiptManager:outgoingReceiptManager reachabilityManager:reachabilityManager - typingIndicators:typingIndicators - attachmentDownloads:attachmentDownloads]]; + typingIndicators:typingIndicators]]; appSpecificSingletonBlock(); diff --git a/SignalUtilitiesKit/Database/Migration/OWSDatabaseMigration.m b/SignalUtilitiesKit/Database/Migration/OWSDatabaseMigration.m index edd205151..5e78fa2b9 100644 --- a/SignalUtilitiesKit/Database/Migration/OWSDatabaseMigration.m +++ b/SignalUtilitiesKit/Database/Migration/OWSDatabaseMigration.m @@ -3,8 +3,8 @@ // #import "OWSDatabaseMigration.h" -#import -#import +#import +#import #import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+PreKeyStore.h b/SignalUtilitiesKit/Database/OWSPrimaryStorage+PreKeyStore.h similarity index 90% rename from SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+PreKeyStore.h rename to SignalUtilitiesKit/Database/OWSPrimaryStorage+PreKeyStore.h index 19733f962..abbc0a555 100644 --- a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+PreKeyStore.h +++ b/SignalUtilitiesKit/Database/OWSPrimaryStorage+PreKeyStore.h @@ -2,7 +2,7 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // -#import +#import #import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+PreKeyStore.m b/SignalUtilitiesKit/Database/OWSPrimaryStorage+PreKeyStore.m similarity index 100% rename from SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+PreKeyStore.m rename to SignalUtilitiesKit/Database/OWSPrimaryStorage+PreKeyStore.m diff --git a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+SessionStore.h b/SignalUtilitiesKit/Database/OWSPrimaryStorage+SessionStore.h similarity index 92% rename from SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+SessionStore.h rename to SignalUtilitiesKit/Database/OWSPrimaryStorage+SessionStore.h index 25a043bcc..3f60b1a97 100644 --- a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+SessionStore.h +++ b/SignalUtilitiesKit/Database/OWSPrimaryStorage+SessionStore.h @@ -2,7 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import #import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+SessionStore.m b/SignalUtilitiesKit/Database/OWSPrimaryStorage+SessionStore.m similarity index 100% rename from SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+SessionStore.m rename to SignalUtilitiesKit/Database/OWSPrimaryStorage+SessionStore.m diff --git a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+SignedPreKeyStore.h b/SignalUtilitiesKit/Database/OWSPrimaryStorage+SignedPreKeyStore.h similarity index 95% rename from SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+SignedPreKeyStore.h rename to SignalUtilitiesKit/Database/OWSPrimaryStorage+SignedPreKeyStore.h index 2082d9509..a994d2e18 100644 --- a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+SignedPreKeyStore.h +++ b/SignalUtilitiesKit/Database/OWSPrimaryStorage+SignedPreKeyStore.h @@ -2,7 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import #import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+SignedPreKeyStore.m b/SignalUtilitiesKit/Database/OWSPrimaryStorage+SignedPreKeyStore.m similarity index 100% rename from SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+SignedPreKeyStore.m rename to SignalUtilitiesKit/Database/OWSPrimaryStorage+SignedPreKeyStore.m diff --git a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+keyFromIntLong.h b/SignalUtilitiesKit/Database/OWSPrimaryStorage+keyFromIntLong.h similarity index 81% rename from SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+keyFromIntLong.h rename to SignalUtilitiesKit/Database/OWSPrimaryStorage+keyFromIntLong.h index 2f13afe30..bb84530c0 100644 --- a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+keyFromIntLong.h +++ b/SignalUtilitiesKit/Database/OWSPrimaryStorage+keyFromIntLong.h @@ -2,7 +2,7 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+keyFromIntLong.m b/SignalUtilitiesKit/Database/OWSPrimaryStorage+keyFromIntLong.m similarity index 100% rename from SignalUtilitiesKit/Database/OWSStorage/OWSPrimaryStorage+keyFromIntLong.m rename to SignalUtilitiesKit/Database/OWSPrimaryStorage+keyFromIntLong.m diff --git a/SignalUtilitiesKit/Database/Utilities/OWSStorage+Subclass.h b/SignalUtilitiesKit/Database/OWSStorage+Subclass.h similarity index 93% rename from SignalUtilitiesKit/Database/Utilities/OWSStorage+Subclass.h rename to SignalUtilitiesKit/Database/OWSStorage+Subclass.h index ac1e88ec7..9f3fd0be1 100644 --- a/SignalUtilitiesKit/Database/Utilities/OWSStorage+Subclass.h +++ b/SignalUtilitiesKit/Database/OWSStorage+Subclass.h @@ -2,7 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Database/Utilities/SignalKeyingStorage.h b/SignalUtilitiesKit/Database/SignalKeyingStorage.h similarity index 100% rename from SignalUtilitiesKit/Database/Utilities/SignalKeyingStorage.h rename to SignalUtilitiesKit/Database/SignalKeyingStorage.h diff --git a/SignalUtilitiesKit/Database/Utilities/SignalKeyingStorage.m b/SignalUtilitiesKit/Database/SignalKeyingStorage.m similarity index 95% rename from SignalUtilitiesKit/Database/Utilities/SignalKeyingStorage.m rename to SignalUtilitiesKit/Database/SignalKeyingStorage.m index c8ad2a659..21e06a677 100644 --- a/SignalUtilitiesKit/Database/Utilities/SignalKeyingStorage.m +++ b/SignalUtilitiesKit/Database/SignalKeyingStorage.m @@ -3,8 +3,8 @@ // #import "SignalKeyingStorage.h" -#import -#import +#import +#import #import #define SignalKeyingCollection @"SignalKeyingCollection" diff --git a/SignalUtilitiesKit/Database/Storage/Storage+Conformances.swift b/SignalUtilitiesKit/Database/Storage+Conformances.swift similarity index 100% rename from SignalUtilitiesKit/Database/Storage/Storage+Conformances.swift rename to SignalUtilitiesKit/Database/Storage+Conformances.swift diff --git a/SignalUtilitiesKit/Database/Storage/Storage+SessionManagement.swift b/SignalUtilitiesKit/Database/Storage+SessionManagement.swift similarity index 100% rename from SignalUtilitiesKit/Database/Storage/Storage+SessionManagement.swift rename to SignalUtilitiesKit/Database/Storage+SessionManagement.swift diff --git a/SignalUtilitiesKit/Database/Utilities/TSStorageHeaders.h b/SignalUtilitiesKit/Database/TSStorageHeaders.h similarity index 79% rename from SignalUtilitiesKit/Database/Utilities/TSStorageHeaders.h rename to SignalUtilitiesKit/Database/TSStorageHeaders.h index d9cea198b..ddbbd179b 100644 --- a/SignalUtilitiesKit/Database/Utilities/TSStorageHeaders.h +++ b/SignalUtilitiesKit/Database/TSStorageHeaders.h @@ -4,11 +4,11 @@ #ifndef Signal_TSStorageHeaders_h #define Signal_TSStorageHeaders_h -#import +#import #import #import #import #import -#import +#import #endif diff --git a/SignalUtilitiesKit/Database/Utilities/TSStorageKeys.h b/SignalUtilitiesKit/Database/TSStorageKeys.h similarity index 100% rename from SignalUtilitiesKit/Database/Utilities/TSStorageKeys.h rename to SignalUtilitiesKit/Database/TSStorageKeys.h diff --git a/SignalUtilitiesKit/Database/Utilities/ThreadViewHelper.h b/SignalUtilitiesKit/Database/ThreadViewHelper.h similarity index 100% rename from SignalUtilitiesKit/Database/Utilities/ThreadViewHelper.h rename to SignalUtilitiesKit/Database/ThreadViewHelper.h diff --git a/SignalUtilitiesKit/Database/Utilities/ThreadViewHelper.m b/SignalUtilitiesKit/Database/ThreadViewHelper.m similarity index 97% rename from SignalUtilitiesKit/Database/Utilities/ThreadViewHelper.m rename to SignalUtilitiesKit/Database/ThreadViewHelper.m index 970b55803..f70aa319a 100644 --- a/SignalUtilitiesKit/Database/Utilities/ThreadViewHelper.m +++ b/SignalUtilitiesKit/Database/ThreadViewHelper.m @@ -4,10 +4,10 @@ #import "ThreadViewHelper.h" #import -#import -#import -#import -#import +#import +#import +#import +#import #import #import #import diff --git a/SignalUtilitiesKit/Database/YapDatabase/YapDatabase+Promise.swift b/SignalUtilitiesKit/Database/YapDatabase+Promise.swift similarity index 100% rename from SignalUtilitiesKit/Database/YapDatabase/YapDatabase+Promise.swift rename to SignalUtilitiesKit/Database/YapDatabase+Promise.swift diff --git a/SignalUtilitiesKit/JobQueue.swift b/SignalUtilitiesKit/JobQueue.swift index 366c9992c..7c4f90f92 100644 --- a/SignalUtilitiesKit/JobQueue.swift +++ b/SignalUtilitiesKit/JobQueue.swift @@ -301,111 +301,3 @@ public extension JobQueue { operation.jobRecord.saveAsPermanentlyFailed(transaction: transaction) } } - -@objc(SSKJobRecordFinder) -public class JobRecordFinder: NSObject, Finder { - - typealias ExtensionType = YapDatabaseSecondaryIndex - typealias TransactionType = YapDatabaseSecondaryIndexTransaction - - enum JobRecordField: String { - case status, label, sortId - } - - func getNextReady(label: String, transaction: YapDatabaseReadTransaction) -> SSKJobRecord? { - var result: SSKJobRecord? - self.enumerateJobRecords(label: label, status: .ready, transaction: transaction) { jobRecord, stopPointer in - result = jobRecord - stopPointer.pointee = true - } - return result - } - - func allRecords(label: String, status: SSKJobRecordStatus, transaction: YapDatabaseReadTransaction) -> [SSKJobRecord] { - var result: [SSKJobRecord] = [] - self.enumerateJobRecords(label: label, status: status, transaction: transaction) { jobRecord, _ in - result.append(jobRecord) - } - return result - } - - func enumerateJobRecords(label: String, status: SSKJobRecordStatus, transaction: YapDatabaseReadTransaction, block: @escaping (SSKJobRecord, UnsafeMutablePointer) -> Void) { - let queryFormat = String(format: "WHERE %@ = ? AND %@ = ? ORDER BY %@", JobRecordField.status.rawValue, JobRecordField.label.rawValue, JobRecordField.sortId.rawValue) - let query = YapDatabaseQuery(string: queryFormat, parameters: [status.rawValue, label]) - - self.ext(transaction: transaction).enumerateKeysAndObjects(matching: query) { _, _, object, stopPointer in - guard let jobRecord = object as? SSKJobRecord else { - owsFailDebug("expecting jobRecord but found: \(object)") - return - } - block(jobRecord, stopPointer) - } - } - - static var dbExtensionName: String { - return "SecondaryIndexJobRecord" - } - - @objc - public class func asyncRegisterDatabaseExtensionObjC(storage: OWSStorage) { - asyncRegisterDatabaseExtension(storage: storage) - } - - static var dbExtensionConfig: YapDatabaseSecondaryIndex { - let setup = YapDatabaseSecondaryIndexSetup() - setup.addColumn(JobRecordField.sortId.rawValue, with: .integer) - setup.addColumn(JobRecordField.status.rawValue, with: .integer) - setup.addColumn(JobRecordField.label.rawValue, with: .text) - - let block: YapDatabaseSecondaryIndexWithObjectBlock = { transaction, dict, collection, key, object in - guard let jobRecord = object as? SSKJobRecord else { - return - } - - dict[JobRecordField.sortId.rawValue] = jobRecord.sortId - dict[JobRecordField.status.rawValue] = jobRecord.status.rawValue - dict[JobRecordField.label.rawValue] = jobRecord.label - } - - let handler = YapDatabaseSecondaryIndexHandler.withObjectBlock(block) - - let options = YapDatabaseSecondaryIndexOptions() - let whitelist = YapWhitelistBlacklist(whitelist: Set([SSKJobRecord.collection()])) - options.allowedCollections = whitelist - - return YapDatabaseSecondaryIndex.init(setup: setup, handler: handler, versionTag: "2", options: options) - } -} - -protocol Finder { - associatedtype ExtensionType: YapDatabaseExtension - associatedtype TransactionType: YapDatabaseExtensionTransaction - - static var dbExtensionName: String { get } - static var dbExtensionConfig: ExtensionType { get } - - func ext(transaction: YapDatabaseReadTransaction) -> TransactionType - - static func asyncRegisterDatabaseExtension(storage: OWSStorage) - static func testingOnly_ensureDatabaseExtensionRegistered(storage: OWSStorage) -} - -extension Finder { - - func ext(transaction: YapDatabaseReadTransaction) -> TransactionType { - return transaction.ext(type(of: self).dbExtensionName) as! TransactionType - } - - static func asyncRegisterDatabaseExtension(storage: OWSStorage) { - storage.asyncRegister(dbExtensionConfig, withName: dbExtensionName) - } - - // Only for testing. - static func testingOnly_ensureDatabaseExtensionRegistered(storage: OWSStorage) { - guard storage.registeredExtension(dbExtensionName) == nil else { - return - } - - storage.register(dbExtensionConfig, withName: dbExtensionName) - } -} diff --git a/SignalUtilitiesKit/LokiSessionRestorationImplementation.swift b/SignalUtilitiesKit/LokiSessionRestorationImplementation.swift index 720723ca9..c828082b5 100644 --- a/SignalUtilitiesKit/LokiSessionRestorationImplementation.swift +++ b/SignalUtilitiesKit/LokiSessionRestorationImplementation.swift @@ -29,7 +29,7 @@ public final class SessionRestorationImplementation : NSObject, SessionRestorati Storage.read { transaction in thread = TSContactThread.getWithContactId(publicKey, transaction: transaction) } - return thread?.sessionRestorationStatus ?? .none + return .none } public func handleNewSessionAdopted(for publicKey: String, using transaction: Any) { @@ -42,7 +42,6 @@ public final class SessionRestorationImplementation : NSObject, SessionRestorati let infoMessage = TSInfoMessage(timestamp: NSDate.ows_millisecondTimeStamp(), in: thread, messageType: .typeLokiSessionResetDone) infoMessage.save(with: transaction) // Update the session reset status - thread.sessionRestorationStatus = .none thread.save(with: transaction) } } diff --git a/SignalUtilitiesKit/Messaging/Attachments/TSAttachment+Albums.h b/SignalUtilitiesKit/Messaging/Attachments/TSAttachment+Albums.h deleted file mode 100644 index 946791856..000000000 --- a/SignalUtilitiesKit/Messaging/Attachments/TSAttachment+Albums.h +++ /dev/null @@ -1,18 +0,0 @@ -#import -#import "TSMessage.h" - -#ifndef TSAttachment_Albums_h -#define TSAttachment_Albums_h - -@interface TSAttachment (Albums) - -- (nullable TSMessage *)fetchAlbumMessageWithTransaction:(YapDatabaseReadTransaction *)transaction; - -// `migrateAlbumMessageId` is only used in the migration to the new multi-attachment message scheme, -// and shouldn't be used as a general purpose setter. Instead, `albumMessageId` should be passed as -// an initializer param. -- (void)migrateAlbumMessageId:(NSString *)albumMesssageId; - -@end - -#endif diff --git a/SignalUtilitiesKit/Messaging/Attachments/TSAttachment+Albums.m b/SignalUtilitiesKit/Messaging/Attachments/TSAttachment+Albums.m deleted file mode 100644 index 83999453c..000000000 --- a/SignalUtilitiesKit/Messaging/Attachments/TSAttachment+Albums.m +++ /dev/null @@ -1,18 +0,0 @@ -#import "TSAttachment+Albums.h" - -@implementation TSAttachment (Albums) - -- (nullable TSMessage *)fetchAlbumMessageWithTransaction:(YapDatabaseReadTransaction *)transaction -{ - if (self.albumMessageId == nil) { - return nil; - } - return [TSMessage fetchObjectWithUniqueID:self.albumMessageId transaction:transaction]; -} - -- (void)migrateAlbumMessageId:(NSString *)albumMesssageId -{ - self.albumMessageId = albumMesssageId; -} - -@end diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSMessage.m b/SignalUtilitiesKit/Messaging/Core Messages/TSMessage.m deleted file mode 100644 index 53ab3c0b5..000000000 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSMessage.m +++ /dev/null @@ -1,437 +0,0 @@ -// -// Copyright (c) 2019 Open Whisper Systems. All rights reserved. -// - -#import "TSMessage.h" -#import "AppContext.h" -#import "MIMETypeUtil.h" -#import "NSString+SSK.h" - -#import "OWSDisappearingMessagesConfiguration.h" -#import "TSAttachment.h" -#import "TSAttachmentStream.h" -#import "TSQuotedMessage.h" -#import "TSThread.h" -#import -#import -#import -#import -#import "OWSPrimaryStorage+Loki.h" -#import "TSContactThread.h" - -NS_ASSUME_NONNULL_BEGIN - -static const NSUInteger OWSMessageSchemaVersion = 4; - -#pragma mark - - -@interface TSMessage () - -@property (nonatomic, nullable) NSString *body; -@property (nonatomic) uint32_t expiresInSeconds; -@property (nonatomic) uint64_t expireStartedAt; - -/** - * The version of the model class's schema last used to serialize this model. Use this to manage data migrations during - * object de/serialization. - * - * e.g. - * - * - (id)initWithCoder:(NSCoder *)coder - * { - * self = [super initWithCoder:coder]; - * if (!self) { return self; } - * if (_schemaVersion < 2) { - * _newName = [coder decodeObjectForKey:@"oldName"] - * } - * ... - * _schemaVersion = 2; - * } - */ -@property (nonatomic, readonly) NSUInteger schemaVersion; - -@end - -#pragma mark - - -@implementation TSMessage - -- (instancetype)initMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread - messageBody:(nullable NSString *)body - attachmentIds:(NSArray *)attachmentIds - expiresInSeconds:(uint32_t)expiresInSeconds - expireStartedAt:(uint64_t)expireStartedAt - quotedMessage:(nullable TSQuotedMessage *)quotedMessage - linkPreview:(nullable OWSLinkPreview *)linkPreview -{ - self = [super initInteractionWithTimestamp:timestamp inThread:thread]; - - if (!self) { - return self; - } - - _schemaVersion = OWSMessageSchemaVersion; - - _body = body; - _attachmentIds = attachmentIds ? [attachmentIds mutableCopy] : [NSMutableArray new]; - _expiresInSeconds = expiresInSeconds; - _expireStartedAt = expireStartedAt; - [self updateExpiresAt]; - _quotedMessage = quotedMessage; - _linkPreview = linkPreview; - _openGroupServerMessageID = -1; - - return self; -} - -- (nullable instancetype)initWithCoder:(NSCoder *)coder -{ - self = [super initWithCoder:coder]; - if (!self) { - return self; - } - - if (_schemaVersion < 2) { - // renamed _attachments to _attachmentIds - if (!_attachmentIds) { - _attachmentIds = [coder decodeObjectForKey:@"attachments"]; - } - } - - if (_schemaVersion < 3) { - _expiresInSeconds = 0; - _expireStartedAt = 0; - _expiresAt = 0; - } - - if (_schemaVersion < 4) { - // Wipe out the body field on these legacy attachment messages. - // - // Explantion: Historically, a message sent from iOS could be an attachment XOR a text message, - // but now we support sending an attachment+caption as a single message. - // - // Other clients have supported sending attachment+caption in a single message for a long time. - // So the way we used to handle receiving them was to make it look like they'd sent two messages: - // first the attachment+caption (we'd ignore this caption when rendering), followed by a separate - // message with just the caption (which we'd render as a simple independent text message), for - // which we'd offset the timestamp by a little bit to get the desired ordering. - // - // Now that we can properly render an attachment+caption message together, these legacy "dummy" text - // messages are not only unnecessary, but worse, would be rendered redundantly. For safety, rather - // than building the logic to try to find and delete the redundant "dummy" text messages which users - // have been seeing and interacting with, we delete the body field from the attachment message, - // which iOS users have never seen directly. - if (_attachmentIds.count > 0) { - _body = nil; - } - } - - if (!_attachmentIds) { - _attachmentIds = [NSMutableArray new]; - } - - _schemaVersion = OWSMessageSchemaVersion; - - return self; -} - -- (void)setExpiresInSeconds:(uint32_t)expiresInSeconds -{ - uint32_t maxExpirationDuration = [OWSDisappearingMessagesConfiguration maxDurationSeconds]; - if (expiresInSeconds > maxExpirationDuration) { - OWSFailDebug(@"using `maxExpirationDuration` instead of: %u", maxExpirationDuration); - } - - _expiresInSeconds = MIN(expiresInSeconds, maxExpirationDuration); - [self updateExpiresAt]; -} - -- (void)setExpireStartedAt:(uint64_t)expireStartedAt -{ - if (_expireStartedAt != 0 && _expireStartedAt < expireStartedAt) { - OWSLogDebug(@"ignoring later startedAt time"); - return; - } - - uint64_t now = [NSDate ows_millisecondTimeStamp]; - if (expireStartedAt > now) { - OWSLogWarn(@"using `now` instead of future time"); - } - - _expireStartedAt = MIN(now, expireStartedAt); - [self updateExpiresAt]; -} - -- (BOOL)shouldStartExpireTimerWithTransaction:(YapDatabaseReadTransaction *)transaction -{ - return self.isExpiringMessage; -} - -// TODO a downloaded media doesn't start counting until download is complete. -- (void)updateExpiresAt -{ - if (_expiresInSeconds > 0 && _expireStartedAt > 0) { - _expiresAt = _expireStartedAt + _expiresInSeconds * 1000; - } else { - _expiresAt = 0; - } -} - -- (BOOL)hasAttachments -{ - return self.attachmentIds ? (self.attachmentIds.count > 0) : NO; -} - -- (NSArray *)allAttachmentIds -{ - NSMutableArray *result = [NSMutableArray new]; - if (self.attachmentIds.count > 0) { - [result addObjectsFromArray:self.attachmentIds]; - } - - if (self.quotedMessage) { - [result addObjectsFromArray:self.quotedMessage.thumbnailAttachmentStreamIds]; - } - - if (self.linkPreview.imageAttachmentId) { - [result addObject:self.linkPreview.imageAttachmentId]; - } - - return [result copy]; -} - -- (NSArray *)attachmentsWithTransaction:(YapDatabaseReadTransaction *)transaction -{ - NSMutableArray *attachments = [NSMutableArray new]; - for (NSString *attachmentId in self.attachmentIds) { - TSAttachment *_Nullable attachment = - [TSAttachment fetchObjectWithUniqueID:attachmentId transaction:transaction]; - if (attachment) { - [attachments addObject:attachment]; - } - } - return [attachments copy]; -} - -- (NSArray *)attachmentsWithTransaction:(YapDatabaseReadTransaction *)transaction - contentType:(NSString *)contentType -{ - NSArray *attachments = [self attachmentsWithTransaction:transaction]; - return [attachments filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(TSAttachment *evaluatedObject, - NSDictionary *_Nullable bindings) { - return [evaluatedObject.contentType isEqualToString:contentType]; - }]]; -} - -- (NSArray *)attachmentsWithTransaction:(YapDatabaseReadTransaction *)transaction - exceptContentType:(NSString *)contentType -{ - NSArray *attachments = [self attachmentsWithTransaction:transaction]; - return [attachments filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(TSAttachment *evaluatedObject, - NSDictionary *_Nullable bindings) { - return ![evaluatedObject.contentType isEqualToString:contentType]; - }]]; -} - -- (void)removeAttachment:(TSAttachment *)attachment transaction:(YapDatabaseReadWriteTransaction *)transaction; -{ - OWSAssertDebug([self.attachmentIds containsObject:attachment.uniqueId]); - [attachment removeWithTransaction:transaction]; - - [self.attachmentIds removeObject:attachment.uniqueId]; - - [self saveWithTransaction:transaction]; -} - -- (void)addAttachmentWithID:(NSString *)attachmentID in:(YapDatabaseReadWriteTransaction *)transaction { - if (!self.attachmentIds) { return; } - [self.attachmentIds addObject:attachmentID]; - [self saveWithTransaction:transaction]; -} - -- (NSString *)debugDescription -{ - if ([self hasAttachments] && self.body.length > 0) { - NSString *attachmentId = self.attachmentIds[0]; - return [NSString - stringWithFormat:@"Media Message with attachmentId: %@ and caption: '%@'", attachmentId, self.body]; - } else if ([self hasAttachments]) { - NSString *attachmentId = self.attachmentIds[0]; - return [NSString stringWithFormat:@"Media Message with attachmentId: %@", attachmentId]; - } else { - return [NSString stringWithFormat:@"%@ with body: %@", [self class], self.body]; - } -} - -- (nullable TSAttachment *)oversizeTextAttachmentWithTransaction:(YapDatabaseReadTransaction *)transaction -{ - return [self attachmentsWithTransaction:transaction contentType:OWSMimeTypeOversizeTextMessage].firstObject; -} - -- (NSArray *)mediaAttachmentsWithTransaction:(YapDatabaseReadTransaction *)transaction -{ - return [self attachmentsWithTransaction:transaction exceptContentType:OWSMimeTypeOversizeTextMessage]; -} - -- (nullable NSString *)oversizeTextWithTransaction:(YapDatabaseReadTransaction *)transaction -{ - TSAttachment *_Nullable attachment = [self oversizeTextAttachmentWithTransaction:transaction]; - if (!attachment) { - return nil; - } - - if (![attachment isKindOfClass:TSAttachmentStream.class]) { - return nil; - } - - TSAttachmentStream *attachmentStream = (TSAttachmentStream *)attachment; - - NSData *_Nullable data = [NSData dataWithContentsOfFile:attachmentStream.originalFilePath]; - if (!data) { - OWSFailDebug(@"Can't load oversize text data."); - return nil; - } - NSString *_Nullable text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - if (!text) { - OWSFailDebug(@"Can't parse oversize text data."); - return nil; - } - return text.filterStringForDisplay; -} - -- (nullable NSString *)bodyTextWithTransaction:(YapDatabaseReadTransaction *)transaction -{ - NSString *_Nullable oversizeText = [self oversizeTextWithTransaction:transaction]; - if (oversizeText) { - return oversizeText; - } - - if (self.body.length > 0) { - return self.body.filterStringForDisplay; - } - - return nil; -} - -// TODO: This method contains view-specific logic and probably belongs in NotificationsManager, not in SSK. -- (NSString *)previewTextWithTransaction:(YapDatabaseReadTransaction *)transaction -{ - NSString *_Nullable bodyDescription = nil; - if (self.body.length > 0) { - bodyDescription = self.body; - } - - if (bodyDescription == nil) { - TSAttachment *_Nullable oversizeTextAttachment = [self oversizeTextAttachmentWithTransaction:transaction]; - if ([oversizeTextAttachment isKindOfClass:[TSAttachmentStream class]]) { - TSAttachmentStream *oversizeTextAttachmentStream = (TSAttachmentStream *)oversizeTextAttachment; - NSData *_Nullable data = [NSData dataWithContentsOfFile:oversizeTextAttachmentStream.originalFilePath]; - if (data) { - NSString *_Nullable text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - if (text) { - bodyDescription = text.filterStringForDisplay; - } - } - } - } - - NSString *_Nullable attachmentDescription = nil; - TSAttachment *_Nullable mediaAttachment = [self mediaAttachmentsWithTransaction:transaction].firstObject; - if (mediaAttachment != nil) { - attachmentDescription = mediaAttachment.description; - } - - if (attachmentDescription.length > 0 && bodyDescription.length > 0) { - // Attachment with caption. - if ([CurrentAppContext() isRTL]) { - return [[bodyDescription stringByAppendingString:@": "] stringByAppendingString:attachmentDescription]; - } else { - return [[attachmentDescription stringByAppendingString:@": "] stringByAppendingString:bodyDescription]; - } - } else if (bodyDescription.length > 0) { - return bodyDescription; - } else if (attachmentDescription.length > 0) { - return attachmentDescription; - } else { - // TODO: We should do better here. - return @""; - } -} - -- (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction -{ - [super removeWithTransaction:transaction]; - - for (NSString *attachmentId in self.allAttachmentIds) { - // We need to fetch each attachment, since [TSAttachment removeWithTransaction:] does important work. - TSAttachment *_Nullable attachment = - [TSAttachment fetchObjectWithUniqueID:attachmentId transaction:transaction]; - if (!attachment) { - OWSFailDebug(@"couldn't load interaction's attachment for deletion."); - continue; - } - [attachment removeWithTransaction:transaction]; - }; -} - -- (BOOL)isExpiringMessage -{ - return self.expiresInSeconds > 0; -} - -- (uint64_t)timestampForLegacySorting -{ - if ([self shouldUseReceiptDateForSorting] && self.receivedAtTimestamp > 0) { - return self.receivedAtTimestamp; - } else { - OWSAssertDebug(self.timestamp > 0); - return self.timestamp; - } -} - -- (BOOL)shouldUseReceiptDateForSorting -{ - return YES; -} - -- (nullable NSString *)body -{ - return _body.filterStringForDisplay; -} - -- (void)setQuotedMessageThumbnailAttachmentStream:(TSAttachmentStream *)attachmentStream -{ - OWSAssertDebug([attachmentStream isKindOfClass:[TSAttachmentStream class]]); - OWSAssertDebug(self.quotedMessage); - OWSAssertDebug(self.quotedMessage.quotedAttachments.count == 1); - - [self.quotedMessage setThumbnailAttachmentStream:attachmentStream]; -} - -#pragma mark - Update With... Methods - -- (void)updateWithExpireStartedAt:(uint64_t)expireStartedAt transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(expireStartedAt > 0); - - [self applyChangeToSelfAndLatestCopy:transaction - changeBlock:^(TSMessage *message) { - [message setExpireStartedAt:expireStartedAt]; - }]; -} - -- (void)updateWithLinkPreview:(OWSLinkPreview *)linkPreview transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(linkPreview); - OWSAssertDebug(transaction); - - [self applyChangeToSelfAndLatestCopy:transaction - changeBlock:^(TSMessage *message) { - [message setLinkPreview:linkPreview]; - }]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/Messaging/Utilities/OWSMessageUtils.h b/SignalUtilitiesKit/Messaging/OWSMessageUtils.h similarity index 100% rename from SignalUtilitiesKit/Messaging/Utilities/OWSMessageUtils.h rename to SignalUtilitiesKit/Messaging/OWSMessageUtils.h diff --git a/SignalUtilitiesKit/Messaging/Utilities/OWSMessageUtils.m b/SignalUtilitiesKit/Messaging/OWSMessageUtils.m similarity index 100% rename from SignalUtilitiesKit/Messaging/Utilities/OWSMessageUtils.m rename to SignalUtilitiesKit/Messaging/OWSMessageUtils.m diff --git a/SignalUtilitiesKit/Messaging/Sending & Receiving/Destination+Conversion.swift b/SignalUtilitiesKit/Messaging/Sending & Receiving/Destination+Conversion.swift deleted file mode 100644 index 8e7358635..000000000 --- a/SignalUtilitiesKit/Messaging/Sending & Receiving/Destination+Conversion.swift +++ /dev/null @@ -1,18 +0,0 @@ - -public extension Message.Destination { - - static func from(_ thread: TSThread) -> Message.Destination { - if let thread = thread as? TSContactThread { - return .contact(publicKey: thread.contactIdentifier()) - } else if let thread = thread as? TSGroupThread, thread.usesSharedSenderKeys { - let groupID = thread.groupModel.groupId - let groupPublicKey = LKGroupUtilities.getDecodedGroupID(groupID) - return .closedGroup(groupPublicKey: groupPublicKey) - } else if let thread = thread as? TSGroupThread, thread.isOpenGroup { - let openGroup = Storage.shared.getOpenGroup(for: thread.uniqueId!)! - return .openGroup(channel: openGroup.channel, server: openGroup.server) - } else { - preconditionFailure("TODO: Handle legacy closed groups.") - } - } -} diff --git a/SignalUtilitiesKit/Messaging/Sending & Receiving/MessageSenderDelegate.swift b/SignalUtilitiesKit/Messaging/Sending & Receiving/MessageSender+Handling.swift similarity index 87% rename from SignalUtilitiesKit/Messaging/Sending & Receiving/MessageSenderDelegate.swift rename to SignalUtilitiesKit/Messaging/Sending & Receiving/MessageSender+Handling.swift index bf9d2b33a..21ed34b6f 100644 --- a/SignalUtilitiesKit/Messaging/Sending & Receiving/MessageSenderDelegate.swift +++ b/SignalUtilitiesKit/Messaging/Sending & Receiving/MessageSender+Handling.swift @@ -1,42 +1,44 @@ +import SessionProtocolKit import PromiseKit -@objc(SNMessageSenderDelegate) -public final class MessageSenderDelegate : NSObject, SessionMessagingKit.MessageSenderDelegate, SharedSenderKeysDelegate { +extension MessageSender : SharedSenderKeysDelegate { - // MARK: Error - public enum Error : LocalizedError { - case noThread - case noPrivateKey - case invalidUpdate - - public var errorDescription: String? { - switch self { - case .noThread: return "Couldn't find a thread associated with the given group public key." - case .noPrivateKey: return "Couldn't find a private key associated with the given group public key." - case .invalidUpdate: return "Invalid group update." + @objc(send:withAttachments:inThread:usingTransaction:) + static func send(_ message: Message, with attachments: [SignalAttachment] = [], in thread: TSThread, using transaction: YapDatabaseReadWriteTransaction) { + if let message = message as? VisibleMessage { + guard let tsMessage = TSOutgoingMessage.find(withTimestamp: message.sentTimestamp!) else { + #if DEBUG + preconditionFailure() + #endif + return } + var streams: [TSAttachmentStream] = [] + attachments.forEach { + let stream = TSAttachmentStream(contentType: $0.mimeType, byteCount: UInt32($0.dataLength), sourceFilename: $0.sourceFilename, + caption: $0.captionText, albumMessageId: tsMessage.uniqueId!) + streams.append(stream) + stream.write($0.dataSource) + stream.save(with: transaction) + } + message.attachmentIDs = streams.map { $0.uniqueId! } } - } - - // MARK: Initialization - public static let shared = MessageSenderDelegate() - - private override init() { } - - // MARK: Sending - public func handleSuccessfulMessageSend(_ message: Message, using transaction: Any) { - guard let tsMessage = TSOutgoingMessage.find(withTimestamp: message.sentTimestamp!) else { return } - tsMessage.openGroupServerMessageID = message.openGroupServerMessageID ?? 0 - tsMessage.isOpenGroupMessage = tsMessage.openGroupServerMessageID != 0 - tsMessage.update(withSentRecipient: message.recipient!, wasSentByUD: true, transaction: transaction as! YapDatabaseReadWriteTransaction) + message.threadID = thread.uniqueId! + let destination = Message.Destination.from(thread) + let job = MessageSendJob(message: message, destination: destination) + JobQueue.shared.add(job, using: transaction) } - public func handleFailedMessageSend(_ message: Message, with error: Swift.Error, using transaction: Any) { - guard let tsMessage = TSOutgoingMessage.find(withTimestamp: message.sentTimestamp!) else { return } - tsMessage.update(sendingError: error, transaction: transaction as! YapDatabaseReadWriteTransaction) + @objc(sendNonDurably:inThread:usingTransaction:) + static func objc_sendNonDurably(_ message: Message, in thread: TSThread, using transaction: YapDatabaseReadWriteTransaction) -> AnyPromise { + return AnyPromise.from(sendNonDurably(message, in: thread, using: transaction)) } - - // MARK: Closed Groups + + static func sendNonDurably(_ message: Message, in thread: TSThread, using transaction: YapDatabaseReadWriteTransaction) -> Promise { + message.threadID = thread.uniqueId! + let destination = Message.Destination.from(thread) + return MessageSender.send(message, to: destination, using: transaction) + } + public static func createClosedGroup(name: String, members: Set, transaction: YapDatabaseReadWriteTransaction) -> Promise { // Prepare var members = members @@ -110,7 +112,7 @@ public final class MessageSenderDelegate : NSObject, SessionMessagingKit.Message if wasAnyUserRemoved { if isUserLeaving && removedMembers.count != 1 { SNLog("Can't remove self and others simultaneously.") - return Promise(error: Error.invalidUpdate) + return Promise(error: Error.invalidClosedGroupUpdate) } // Send the update to the existing members using established channels (don't include new ratchets as everyone should regenerate new ratchets individually) let promises: [Promise] = oldMembers.map { member in @@ -229,7 +231,7 @@ public final class MessageSenderDelegate : NSObject, SessionMessagingKit.Message return update(groupPublicKey, with: newMembers, name: group.groupName!, transaction: transaction) } - public func requestSenderKey(for groupPublicKey: String, senderPublicKey: String, using transaction: Any) { + public func requestSenderKey(for groupPublicKey: String, senderPublicKey: String, using transaction: Any) { // FIXME: This should be static SNLog("Requesting sender key for group public key: \(groupPublicKey), sender public key: \(senderPublicKey).") let transaction = transaction as! YapDatabaseReadWriteTransaction let thread = TSContactThread.getOrCreateThread(withContactId: senderPublicKey, transaction: transaction) diff --git a/SignalUtilitiesKit/Messaging/Sending & Receiving/MessageSender+Utilities.swift b/SignalUtilitiesKit/Messaging/Sending & Receiving/MessageSender+Utilities.swift deleted file mode 100644 index b473294fe..000000000 --- a/SignalUtilitiesKit/Messaging/Sending & Receiving/MessageSender+Utilities.swift +++ /dev/null @@ -1,40 +0,0 @@ -import PromiseKit - -public extension MessageSender { - - @objc(send:withAttachments:inThread:usingTransaction:) - static func send(_ message: Message, with attachments: [SignalAttachment] = [], in thread: TSThread, using transaction: YapDatabaseReadWriteTransaction) { - if let message = message as? VisibleMessage { - guard let tsMessage = TSOutgoingMessage.find(withTimestamp: message.sentTimestamp!) else { - #if DEBUG - preconditionFailure() - #endif - return - } - var streams: [TSAttachmentStream] = [] - attachments.forEach { - let stream = TSAttachmentStream(contentType: $0.mimeType, byteCount: UInt32($0.dataLength), sourceFilename: $0.sourceFilename, - caption: $0.captionText, albumMessageId: tsMessage.uniqueId!) - streams.append(stream) - stream.write($0.dataSource) - stream.save(with: transaction) - } - message.attachmentIDs = streams.map { $0.uniqueId! } - } - message.threadID = thread.uniqueId! - let destination = Message.Destination.from(thread) - let job = MessageSendJob(message: message, destination: destination) - SessionMessagingKit.JobQueue.shared.add(job, using: transaction) - } - - @objc(sendNonDurably:inThread:usingTransaction:) - static func objc_sendNonDurably(_ message: Message, in thread: TSThread, using transaction: YapDatabaseReadWriteTransaction) -> AnyPromise { - return AnyPromise.from(sendNonDurably(message, in: thread, using: transaction)) - } - - static func sendNonDurably(_ message: Message, in thread: TSThread, using transaction: YapDatabaseReadWriteTransaction) -> Promise { - message.threadID = thread.uniqueId! - let destination = Message.Destination.from(thread) - return MessageSender.send(message, to: destination, using: transaction) - } -} diff --git a/SignalUtilitiesKit/Messaging/Sending & Receiving/OpenGroupAPIDelegate.swift b/SignalUtilitiesKit/Messaging/Sending & Receiving/OpenGroupAPIDelegate.swift deleted file mode 100644 index e13fae704..000000000 --- a/SignalUtilitiesKit/Messaging/Sending & Receiving/OpenGroupAPIDelegate.swift +++ /dev/null @@ -1,38 +0,0 @@ - -public final class OpenGroupAPIDelegate : SessionMessagingKit.OpenGroupAPIDelegate { - - public static let shared = OpenGroupAPIDelegate() - - public func updateProfileIfNeeded(for channel: UInt64, on server: String, from info: OpenGroupInfo) { - let openGroupID = "\(server).\(channel)" - Storage.write { transaction in - // Update user count - Storage.shared.setUserCount(to: info.memberCount, forOpenGroupWithID: openGroupID, using: transaction) - let thread = TSGroupThread.getOrCreateThread(withGroupId: openGroupID.data(using: .utf8)!, groupType: .openGroup, transaction: transaction) - // Update display name if needed - let model = thread.groupModel - if model.groupName != info.displayName { - let newGroupModel = TSGroupModel(title: info.displayName, memberIds: model.groupMemberIds, image: model.groupImage, groupId: model.groupId, groupType: model.groupType, adminIds: model.groupAdminIds) - thread.groupModel = newGroupModel - thread.save(with: transaction) - } - // Download and update profile picture if needed - let oldProfilePictureURL = Storage.shared.getProfilePictureURL(forOpenGroupWithID: openGroupID) - if oldProfilePictureURL != info.profilePictureURL || model.groupImage == nil { - Storage.shared.setProfilePictureURL(to: info.profilePictureURL, forOpenGroupWithID: openGroupID, using: transaction) - if let profilePictureURL = info.profilePictureURL { - var sanitizedServerURL = server - while sanitizedServerURL.hasSuffix("/") { sanitizedServerURL.removeLast() } - var sanitizedProfilePictureURL = profilePictureURL - while sanitizedProfilePictureURL.hasPrefix("/") { sanitizedProfilePictureURL.removeFirst() } - let url = "\(sanitizedServerURL)/\(sanitizedProfilePictureURL)" - FileServerAPI.downloadAttachment(from: url).map2 { data in - let attachmentStream = TSAttachmentStream(contentType: OWSMimeTypeImageJpeg, byteCount: UInt32(data.count), sourceFilename: nil, caption: nil, albumMessageId: nil) - try attachmentStream.write(data) - thread.updateAvatar(with: attachmentStream) - } - } - } - } - } -} diff --git a/SignalUtilitiesKit/Messaging/Attachments/TSAttachmentPointer+Backups.h b/SignalUtilitiesKit/Messaging/TSAttachmentPointer+Backups.h similarity index 100% rename from SignalUtilitiesKit/Messaging/Attachments/TSAttachmentPointer+Backups.h rename to SignalUtilitiesKit/Messaging/TSAttachmentPointer+Backups.h diff --git a/SignalUtilitiesKit/Messaging/Attachments/TSAttachmentPointer+Backups.m b/SignalUtilitiesKit/Messaging/TSAttachmentPointer+Backups.m similarity index 100% rename from SignalUtilitiesKit/Messaging/Attachments/TSAttachmentPointer+Backups.m rename to SignalUtilitiesKit/Messaging/TSAttachmentPointer+Backups.m diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeySendingErrorMessage.h b/SignalUtilitiesKit/Messaging/TSInvalidIdentityKeySendingErrorMessage.h similarity index 90% rename from SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeySendingErrorMessage.h rename to SignalUtilitiesKit/Messaging/TSInvalidIdentityKeySendingErrorMessage.h index e16dea665..3357153ca 100644 --- a/SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeySendingErrorMessage.h +++ b/SignalUtilitiesKit/Messaging/TSInvalidIdentityKeySendingErrorMessage.h @@ -2,7 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeySendingErrorMessage.m b/SignalUtilitiesKit/Messaging/TSInvalidIdentityKeySendingErrorMessage.m similarity index 100% rename from SignalUtilitiesKit/Messaging/Core Messages/TSInvalidIdentityKeySendingErrorMessage.m rename to SignalUtilitiesKit/Messaging/TSInvalidIdentityKeySendingErrorMessage.m diff --git a/SignalUtilitiesKit/Meta/SignalUtilitiesKit.h b/SignalUtilitiesKit/Meta/SignalUtilitiesKit.h index 2a123cb5f..4594d9af8 100644 --- a/SignalUtilitiesKit/Meta/SignalUtilitiesKit.h +++ b/SignalUtilitiesKit/Meta/SignalUtilitiesKit.h @@ -8,47 +8,32 @@ FOUNDATION_EXPORT const unsigned char SignalUtilitiesKitVersionString[]; @import SessionSnodeKit; @import SessionUtilitiesKit; -#import #import #import #import #import #import -#import -#import -#import #import #import -#import #import #import -#import #import #import #import -#import #import -#import -#import -#import -#import #import #import #import #import -#import #import #import #import #import -#import #import #import #import #import #import -#import -#import #import #import #import @@ -58,7 +43,6 @@ FOUNDATION_EXPORT const unsigned char SignalUtilitiesKitVersionString[]; #import #import #import -#import #import #import #import @@ -66,29 +50,14 @@ FOUNDATION_EXPORT const unsigned char SignalUtilitiesKitVersionString[]; #import #import #import -#import #import #import #import -#import #import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import +#import #import -#import -#import #import #import #import #import #import -#import -#import diff --git a/SignalUtilitiesKit/OWSFailedAttachmentDownloadsJob.m b/SignalUtilitiesKit/OWSFailedAttachmentDownloadsJob.m index c8483d415..e653a69c1 100644 --- a/SignalUtilitiesKit/OWSFailedAttachmentDownloadsJob.m +++ b/SignalUtilitiesKit/OWSFailedAttachmentDownloadsJob.m @@ -25,11 +25,6 @@ static NSString *const OWSFailedAttachmentDownloadsJobAttachmentStateIndex = @"i @implementation OWSFailedAttachmentDownloadsJob -- (OWSAttachmentDownloads *)attachmentDownloads -{ - return SSKEnvironment.shared.attachmentDownloads; -} - - (instancetype)initWithPrimaryStorage:(OWSPrimaryStorage *)primaryStorage { self = [super init]; diff --git a/SignalUtilitiesKit/OWSPreferences.m b/SignalUtilitiesKit/OWSPreferences.m index c1bf374ec..1b3fb3b5f 100644 --- a/SignalUtilitiesKit/OWSPreferences.m +++ b/SignalUtilitiesKit/OWSPreferences.m @@ -4,13 +4,13 @@ #import "OWSPreferences.h" #import -#import -#import +#import +#import #import -#import +#import #import -#import -#import +#import +#import #import #import "SSKAsserts.h" diff --git a/SignalUtilitiesKit/OWSRecordTranscriptJob.m b/SignalUtilitiesKit/OWSRecordTranscriptJob.m index 165734e75..e98fe2cd8 100644 --- a/SignalUtilitiesKit/OWSRecordTranscriptJob.m +++ b/SignalUtilitiesKit/OWSRecordTranscriptJob.m @@ -37,11 +37,6 @@ NS_ASSUME_NONNULL_BEGIN return SSKEnvironment.shared.readReceiptManager; } -+ (OWSAttachmentDownloads *)attachmentDownloads -{ - return SSKEnvironment.shared.attachmentDownloads; -} - #pragma mark - + (void)processIncomingSentMessageTranscript:(OWSIncomingSentMessageTranscript *)transcript diff --git a/SignalUtilitiesKit/OWSSounds.m b/SignalUtilitiesKit/OWSSounds.m index edff6751d..59d5cca10 100644 --- a/SignalUtilitiesKit/OWSSounds.m +++ b/SignalUtilitiesKit/OWSSounds.m @@ -7,9 +7,9 @@ #import "OWSAudioPlayer.h" #import #import -#import -#import -#import +#import +#import +#import #import #import "SSKAsserts.h" diff --git a/SignalUtilitiesKit/OWSUDManager.swift b/SignalUtilitiesKit/OWSUDManager.swift index 3e46d010f..f9a5106b9 100644 --- a/SignalUtilitiesKit/OWSUDManager.swift +++ b/SignalUtilitiesKit/OWSUDManager.swift @@ -21,14 +21,6 @@ public enum OWSUDCertificateExpirationPolicy: Int { case permissive } -@objc -public enum UnidentifiedAccessMode: Int { - case unknown - case enabled - case disabled - case unrestricted -} - private func string(forUnidentifiedAccessMode mode: UnidentifiedAccessMode) -> String { switch mode { case .unknown: @@ -42,69 +34,6 @@ private func string(forUnidentifiedAccessMode mode: UnidentifiedAccessMode) -> S } } -@objc -public class OWSUDAccess: NSObject { - @objc - public let udAccessKey: SMKUDAccessKey - - @objc - public let udAccessMode: UnidentifiedAccessMode - - @objc - public let isRandomKey: Bool - - @objc - public required init(udAccessKey: SMKUDAccessKey, - udAccessMode: UnidentifiedAccessMode, - isRandomKey: Bool) { - self.udAccessKey = udAccessKey - self.udAccessMode = udAccessMode - self.isRandomKey = isRandomKey - } -} - -@objc public protocol OWSUDManager: class { - - @objc func setup() - - @objc func trustRoot() -> ECPublicKey - - @objc func isUDVerboseLoggingEnabled() -> Bool - - // MARK: - Recipient State - - @objc - func setUnidentifiedAccessMode(_ mode: UnidentifiedAccessMode, recipientId: String) - - @objc - func unidentifiedAccessMode(forRecipientId recipientId: String) -> UnidentifiedAccessMode - - @objc - func udAccessKey(forRecipientId recipientId: String) -> SMKUDAccessKey? - - @objc - func udAccess(forRecipientId recipientId: String, - requireSyncAccess: Bool) -> OWSUDAccess? - - // MARK: Sender Certificate - - // We use completion handlers instead of a promise so that message sending - // logic can access the strongly typed certificate data. - @objc - func ensureSenderCertificate(success:@escaping (SMKSenderCertificate) -> Void, - failure:@escaping (Error) -> Void) - - // MARK: Unrestricted Access - - @objc - func shouldAllowUnrestrictedAccessLocal() -> Bool - @objc - func setShouldAllowUnrestrictedAccessLocal(_ value: Bool) - - @objc - func getSenderCertificate() -> SMKSenderCertificate? -} - // MARK: - @objc diff --git a/SignalUtilitiesKit/ReachabilityManager.swift b/SignalUtilitiesKit/ReachabilityManager.swift index bea630d5c..90e7d2e34 100644 --- a/SignalUtilitiesKit/ReachabilityManager.swift +++ b/SignalUtilitiesKit/ReachabilityManager.swift @@ -5,20 +5,6 @@ import Foundation import Reachability -@objc(SSKReachabilityType) -public enum ReachabilityType: Int { - case any, wifi, cellular -} - -@objc -public protocol SSKReachabilityManager { - var observationContext: AnyObject { get } - func setup() - - var isReachable: Bool { get } - func isReachable(via reachabilityType: ReachabilityType) -> Bool -} - @objc public class SSKReachabilityManagerImpl: NSObject, SSKReachabilityManager { diff --git a/SignalUtilitiesKit/SSKMessageSenderJobRecord.h b/SignalUtilitiesKit/SSKMessageSenderJobRecord.h index 2f0f9c983..75d831ce3 100644 --- a/SignalUtilitiesKit/SSKMessageSenderJobRecord.h +++ b/SignalUtilitiesKit/SSKMessageSenderJobRecord.h @@ -2,7 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/TSPreKeyManager.h b/SignalUtilitiesKit/TSPreKeyManager.h index f6e76f45a..76c0cdaed 100644 --- a/SignalUtilitiesKit/TSPreKeyManager.h +++ b/SignalUtilitiesKit/TSPreKeyManager.h @@ -2,7 +2,7 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/Threads/ThreadUtil.h b/SignalUtilitiesKit/ThreadUtil.h similarity index 100% rename from SignalUtilitiesKit/Threads/ThreadUtil.h rename to SignalUtilitiesKit/ThreadUtil.h diff --git a/SignalUtilitiesKit/Threads/ThreadUtil.m b/SignalUtilitiesKit/ThreadUtil.m similarity index 97% rename from SignalUtilitiesKit/Threads/ThreadUtil.m rename to SignalUtilitiesKit/ThreadUtil.m index b42ffda76..2fcd05655 100644 --- a/SignalUtilitiesKit/Threads/ThreadUtil.m +++ b/SignalUtilitiesKit/ThreadUtil.m @@ -7,16 +7,16 @@ #import "OWSUnreadIndicator.h" #import "TSUnreadIndicatorInteraction.h" #import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import #import diff --git a/SignalUtilitiesKit/To Do/ContactCellView.m b/SignalUtilitiesKit/To Do/ContactCellView.m index 38a45d2cb..e94959315 100644 --- a/SignalUtilitiesKit/To Do/ContactCellView.m +++ b/SignalUtilitiesKit/To Do/ContactCellView.m @@ -6,11 +6,11 @@ #import "UIFont+OWS.h" #import "UIView+OWS.h" #import -#import +#import #import -#import -#import -#import +#import +#import +#import #import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/To Do/OWSPrimaryStorage+Loki.h b/SignalUtilitiesKit/To Do/OWSPrimaryStorage+Loki.h index 686cf092c..9dd7bef9d 100644 --- a/SignalUtilitiesKit/To Do/OWSPrimaryStorage+Loki.h +++ b/SignalUtilitiesKit/To Do/OWSPrimaryStorage+Loki.h @@ -1,4 +1,4 @@ -#import +#import #import #import diff --git a/SignalUtilitiesKit/To Do/OWSProfileManager.h b/SignalUtilitiesKit/To Do/OWSProfileManager.h index 5741620aa..05e4dad1b 100644 --- a/SignalUtilitiesKit/To Do/OWSProfileManager.h +++ b/SignalUtilitiesKit/To Do/OWSProfileManager.h @@ -2,7 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/To Do/OWSProfileManager.m b/SignalUtilitiesKit/To Do/OWSProfileManager.m index 07bf55f90..292ee2f05 100644 --- a/SignalUtilitiesKit/To Do/OWSProfileManager.m +++ b/SignalUtilitiesKit/To Do/OWSProfileManager.m @@ -9,21 +9,21 @@ #import #import "UIUtil.h" #import -#import +#import #import #import -#import +#import #import -#import +#import #import #import -#import -#import -#import -#import +#import +#import +#import +#import #import #import -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/To Do/OWSUserProfile.m b/SignalUtilitiesKit/To Do/OWSUserProfile.m index 36113d034..8d308ae8e 100644 --- a/SignalUtilitiesKit/To Do/OWSUserProfile.m +++ b/SignalUtilitiesKit/To Do/OWSUserProfile.m @@ -7,13 +7,13 @@ #import -#import +#import #import #import -#import -#import +#import +#import #import -#import +#import #import #import diff --git a/SignalUtilitiesKit/UI/BlockListUIUtils.m b/SignalUtilitiesKit/UI/BlockListUIUtils.m index 179384411..c6c9ab310 100644 --- a/SignalUtilitiesKit/UI/BlockListUIUtils.m +++ b/SignalUtilitiesKit/UI/BlockListUIUtils.m @@ -4,10 +4,10 @@ #import "BlockListUIUtils.h" #import "TSContactThread.h" -#import +#import #import -#import -#import +#import +#import #import #import #import "UIView+OWS.h" diff --git a/SignalUtilitiesKit/UI/SelectRecipientViewController.m b/SignalUtilitiesKit/UI/SelectRecipientViewController.m index 35571e317..74b4a7c61 100644 --- a/SignalUtilitiesKit/UI/SelectRecipientViewController.m +++ b/SignalUtilitiesKit/UI/SelectRecipientViewController.m @@ -12,7 +12,7 @@ #import #import #import -#import +#import #import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/UI/SelectThreadViewController.m b/SignalUtilitiesKit/UI/SelectThreadViewController.m index c697301cf..415b0074c 100644 --- a/SignalUtilitiesKit/UI/SelectThreadViewController.m +++ b/SignalUtilitiesKit/UI/SelectThreadViewController.m @@ -14,9 +14,9 @@ #import #import #import -#import -#import -#import +#import +#import +#import #import #import diff --git a/SignalUtilitiesKit/UI/SharingThreadPickerViewController.m b/SignalUtilitiesKit/UI/SharingThreadPickerViewController.m index 50e9c85ae..2d36a09c3 100644 --- a/SignalUtilitiesKit/UI/SharingThreadPickerViewController.m +++ b/SignalUtilitiesKit/UI/SharingThreadPickerViewController.m @@ -10,7 +10,7 @@ #import #import #import -#import +#import #import NS_ASSUME_NONNULL_BEGIN diff --git a/SignalUtilitiesKit/UI/Theme.m b/SignalUtilitiesKit/UI/Theme.m index f12849ef0..7f298eb6d 100644 --- a/SignalUtilitiesKit/UI/Theme.m +++ b/SignalUtilitiesKit/UI/Theme.m @@ -5,9 +5,9 @@ #import "Theme.h" #import "UIColor+OWS.h" #import "UIUtil.h" -#import -#import -#import +#import +#import +#import #import diff --git a/SignalUtilitiesKit/Utilities/Notification+Loki.swift b/SignalUtilitiesKit/Utilities/Notification+Loki.swift index e696caf26..5f1d9f101 100644 --- a/SignalUtilitiesKit/Utilities/Notification+Loki.swift +++ b/SignalUtilitiesKit/Utilities/Notification+Loki.swift @@ -4,7 +4,6 @@ public extension Notification.Name { // State changes static let blockedContactsUpdated = Notification.Name("blockedContactsUpdated") static let contactOnlineStatusChanged = Notification.Name("contactOnlineStatusChanged") - static let groupThreadUpdated = Notification.Name("groupThreadUpdated") static let threadDeleted = Notification.Name("threadDeleted") static let threadSessionRestoreDevicesChanged = Notification.Name("threadSessionRestoreDevicesChanged") // Onboarding @@ -18,7 +17,6 @@ public extension Notification.Name { // State changes @objc static let blockedContactsUpdated = Notification.Name.blockedContactsUpdated.rawValue as NSString @objc static let contactOnlineStatusChanged = Notification.Name.contactOnlineStatusChanged.rawValue as NSString - @objc static let groupThreadUpdated = Notification.Name.groupThreadUpdated.rawValue as NSString @objc static let threadDeleted = Notification.Name.threadDeleted.rawValue as NSString @objc static let threadSessionRestoreDevicesChanged = Notification.Name.threadSessionRestoreDevicesChanged.rawValue as NSString // Onboarding diff --git a/SignalUtilitiesKit/VersionMigrations.m b/SignalUtilitiesKit/VersionMigrations.m index 53d4fe530..d77495b2e 100644 --- a/SignalUtilitiesKit/VersionMigrations.m +++ b/SignalUtilitiesKit/VersionMigrations.m @@ -7,11 +7,11 @@ #import "SignalKeyingStorage.h" #import #import -#import +#import #import -#import -#import -#import +#import +#import +#import #import #import