diff --git a/Signal/Signal-Info.plist b/Signal/Signal-Info.plist index eddeb7c85..071ba1d2a 100644 --- a/Signal/Signal-Info.plist +++ b/Signal/Signal-Info.plist @@ -38,7 +38,7 @@ CFBundleVersion - 2.24.0.8 + 2.24.0.9 ITSAppUsesNonExemptEncryption LOGS_EMAIL diff --git a/Signal/src/ViewControllers/CallViewController.swift b/Signal/src/ViewControllers/CallViewController.swift index 106c7ecac..d9ed3dd01 100644 --- a/Signal/src/ViewControllers/CallViewController.swift +++ b/Signal/src/ViewControllers/CallViewController.swift @@ -140,17 +140,6 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver, super.init(nibName: nil, bundle: nil) allAudioSources = Set(callUIAdapter.audioService.availableInputs) - - assert(callUIAdapter.audioService.delegate == nil) - callUIAdapter.audioService.delegate = self - observeNotifications() - } - - func observeNotifications() { - NotificationCenter.default.addObserver(self, - selector: #selector(didBecomeActive), - name: NSNotification.Name.OWSApplicationDidBecomeActive, - object: nil) } deinit { @@ -208,6 +197,14 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver, call.addObserverAndSyncState(observer: self) SignalApp.shared().callService.addObserverAndSyncState(observer: self) + + assert(callUIAdapter.audioService.delegate == nil) + callUIAdapter.audioService.delegate = self + + NotificationCenter.default.addObserver(self, + selector: #selector(didBecomeActive), + name: NSNotification.Name.OWSApplicationDidBecomeActive, + object: nil) } // MARK: - Create Views diff --git a/SignalServiceKit/src/Storage/OWSPrimaryStorage.h b/SignalServiceKit/src/Storage/OWSPrimaryStorage.h index 39cc94af2..64c68ba8d 100644 --- a/SignalServiceKit/src/Storage/OWSPrimaryStorage.h +++ b/SignalServiceKit/src/Storage/OWSPrimaryStorage.h @@ -6,9 +6,6 @@ NS_ASSUME_NONNULL_BEGIN -void runSyncRegistrationsForStorage(OWSStorage *storage); -void runAsyncRegistrationsForStorage(OWSStorage *storage); - @interface OWSPrimaryStorage : OWSStorage - (instancetype)init NS_UNAVAILABLE; diff --git a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m index 307ebe66c..3329e494b 100644 --- a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m +++ b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m @@ -30,9 +30,10 @@ void runSyncRegistrationsForStorage(OWSStorage *storage) [TSDatabaseView registerCrossProcessNotifier:storage]; } -void runAsyncRegistrationsForStorage(OWSStorage *storage) +void runAsyncRegistrationsForStorage(OWSStorage *storage, dispatch_block_t completion) { OWSCAssert(storage); + OWSCAssert(completion); // Asynchronously register other extensions. // @@ -57,7 +58,9 @@ void runAsyncRegistrationsForStorage(OWSStorage *storage) [OWSFailedMessagesJob asyncRegisterDatabaseExtensionsWithPrimaryStorage:storage]; [OWSFailedAttachmentDownloadsJob asyncRegisterDatabaseExtensionsWithPrimaryStorage:storage]; [OWSMediaGalleryFinder asyncRegisterDatabaseExtensionsWithPrimaryStorage:storage]; - [TSDatabaseView asyncRegisterLazyRestoreAttachmentsDatabaseView:storage]; + // NOTE: Always pass the completion to the _LAST_ of the async database + // view registrations. + [TSDatabaseView asyncRegisterLazyRestoreAttachmentsDatabaseView:storage completion:completion]; } #pragma mark - @@ -132,41 +135,18 @@ void runAsyncRegistrationsForStorage(OWSStorage *storage) { OWSAssert(completion); - [((OWSDatabase *)self.database)collectRegistrationConnections]; + DDLogVerbose(@"%@ async registrations enqueuing.", self.logTag); - runAsyncRegistrationsForStorage(self); + runAsyncRegistrationsForStorage(self, ^{ + OWSAssertIsOnMainThread(); - DDLogVerbose(@"%@ async registrations enqueued.", self.logTag); + OWSAssert(!self.areAsyncRegistrationsComplete); - // Block until all async registrations are complete. - // - // NOTE: This has to happen on the "registration connections" for this - // database. - NSMutableSet *pendingRegistrationConnectionSet = - [[((OWSDatabase *)self.database)clearCollectedRegistrationConnections] mutableCopy]; - DDLogVerbose(@"%@ flushing registration connections: %zd.", self.logTag, pendingRegistrationConnectionSet.count); - - dispatch_async(dispatch_get_main_queue(), ^{ - for (YapDatabaseConnection *dbConnection in pendingRegistrationConnectionSet) { - [dbConnection - flushTransactionsWithCompletionQueue:dispatch_get_main_queue() - completionBlock:^{ - OWSAssertIsOnMainThread(); - OWSAssert(!self.areAsyncRegistrationsComplete); - - [pendingRegistrationConnectionSet removeObject:dbConnection]; - if (pendingRegistrationConnectionSet.count > 0) { - DDLogVerbose(@"%@ registration connection flushed.", self.logTag); - return; - } - - DDLogVerbose(@"%@ async registrations complete.", self.logTag); - - self.areAsyncRegistrationsComplete = YES; - - completion(); - }]; - } + DDLogVerbose(@"%@ async registrations complete.", self.logTag); + + self.areAsyncRegistrationsComplete = YES; + + completion(); }); } diff --git a/SignalServiceKit/src/Storage/OWSStorage.h b/SignalServiceKit/src/Storage/OWSStorage.h index 5beab984e..12198be48 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.h +++ b/SignalServiceKit/src/Storage/OWSStorage.h @@ -44,12 +44,6 @@ extern NSString *const StorageIsReadyNotification; options:(YapDatabaseOptions *)inOptions delegate:(id)delegate NS_DESIGNATED_INITIALIZER; -// Starts collecting references to the registration connections. -- (void)collectRegistrationConnections; -// Stops collecting references to the registration connections and returns -// all collected connections. -- (NSSet *)clearCollectedRegistrationConnections; - @end #pragma mark - @@ -77,6 +71,9 @@ extern NSString *const StorageIsReadyNotification; #endif - (void)asyncRegisterExtension:(YapDatabaseExtension *)extension withName:(NSString *)extensionName; +- (void)asyncRegisterExtension:(YapDatabaseExtension *)extension + withName:(NSString *)extensionName + completion:(nullable dispatch_block_t)completion; - (nullable id)registeredExtension:(NSString *)extensionName; diff --git a/SignalServiceKit/src/Storage/OWSStorage.m b/SignalServiceKit/src/Storage/OWSStorage.m index e79cc8069..75e97c45e 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.m +++ b/SignalServiceKit/src/Storage/OWSStorage.m @@ -134,8 +134,6 @@ typedef NSData *_Nullable (^CreateDatabaseMetadataBlock)(void); @property (atomic, weak) id delegate; -@property (nonatomic, readonly, nullable) NSMutableSet *registrationConnectionSet; - @end #pragma mark - @@ -185,29 +183,9 @@ typedef NSData *_Nullable (^CreateDatabaseMetadataBlock)(void); ((OWSDatabaseConnection *)connection).canWriteBeforeStorageReady = YES; #endif - [self.registrationConnectionSet addObject:connection]; - return connection; } -- (void)collectRegistrationConnections -{ - OWSAssert(!self.registrationConnectionSet); - - _registrationConnectionSet = [NSMutableSet set]; -} - -- (NSSet *)clearCollectedRegistrationConnections -{ - OWSAssert(self.registrationConnectionSet); - - NSSet *registrationConnectionSetCopy = [self.registrationConnectionSet copy]; - - _registrationConnectionSet = nil; - - return registrationConnectionSetCopy; -} - @end #pragma mark - @@ -509,6 +487,13 @@ typedef NSData *_Nullable (^CreateDatabaseMetadataBlock)(void); - (void)asyncRegisterExtension:(YapDatabaseExtension *)extension withName:(NSString *)extensionName +{ + [self asyncRegisterExtension:extension withName:extensionName completion:nil]; +} + +- (void)asyncRegisterExtension:(YapDatabaseExtension *)extension + withName:(NSString *)extensionName + completion:(nullable dispatch_block_t)completion { [self.database asyncRegisterExtension:extension withName:extensionName @@ -518,6 +503,12 @@ typedef NSData *_Nullable (^CreateDatabaseMetadataBlock)(void); } else { DDLogVerbose(@"%@ asyncRegisterExtension succeeded: %@", self.logTag, extensionName); } + + dispatch_async(dispatch_get_main_queue(), ^{ + if (completion) { + completion(); + } + }); }]; } diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.h b/SignalServiceKit/src/Storage/TSDatabaseView.h index 3e83d174b..9954804a6 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.h +++ b/SignalServiceKit/src/Storage/TSDatabaseView.h @@ -58,6 +58,7 @@ extern NSString *const TSLazyRestoreAttachmentsDatabaseViewExtensionName; + (void)asyncRegisterSecondaryDevicesDatabaseView:(OWSStorage *)storage; -+ (void)asyncRegisterLazyRestoreAttachmentsDatabaseView:(OWSStorage *)storage; ++ (void)asyncRegisterLazyRestoreAttachmentsDatabaseView:(OWSStorage *)storage + completion:(nullable dispatch_block_t)completion; @end diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.m b/SignalServiceKit/src/Storage/TSDatabaseView.m index 9e5098b61..c73cf8426 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.m +++ b/SignalServiceKit/src/Storage/TSDatabaseView.m @@ -343,6 +343,7 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" } + (void)asyncRegisterLazyRestoreAttachmentsDatabaseView:(OWSStorage *)storage + completion:(nullable dispatch_block_t)completion { YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *_Nullable( YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { @@ -391,7 +392,9 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" [[YapWhitelistBlacklist alloc] initWithWhitelist:[NSSet setWithObject:[TSAttachment collection]]]; YapDatabaseView *view = [[YapDatabaseAutoView alloc] initWithGrouping:viewGrouping sorting:viewSorting versionTag:@"3" options:options]; - [storage asyncRegisterExtension:view withName:TSLazyRestoreAttachmentsDatabaseViewExtensionName]; + [storage asyncRegisterExtension:view + withName:TSLazyRestoreAttachmentsDatabaseViewExtensionName + completion:completion]; } + (id)unseenDatabaseViewExtension:(YapDatabaseReadTransaction *)transaction diff --git a/SignalShareExtension/Info.plist b/SignalShareExtension/Info.plist index ecdc7d90a..e0996cfa7 100644 --- a/SignalShareExtension/Info.plist +++ b/SignalShareExtension/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 2.24.0 CFBundleVersion - 2.24.0.8 + 2.24.0.9 ITSAppUsesNonExemptEncryption NSAppTransportSecurity