diff --git a/Signal/src/util/DateUtil.h b/Signal/src/util/DateUtil.h index 31b4e5c5d..8291a2aa0 100644 --- a/Signal/src/util/DateUtil.h +++ b/Signal/src/util/DateUtil.h @@ -8,6 +8,7 @@ NS_ASSUME_NONNULL_BEGIN + (NSDateFormatter *)dateFormatter; + (NSDateFormatter *)timeFormatter; + + (BOOL)dateIsOlderThanOneDay:(NSDate *)date; + (BOOL)dateIsOlderThanOneWeek:(NSDate *)date; + (BOOL)dateIsToday:(NSDate *)date; diff --git a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m index 4232a9455..0f167a592 100644 --- a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m +++ b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m @@ -265,24 +265,14 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo _finder = finder; _isDrainingQueue = NO; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(appIsReady) - name:AppIsReadyNotification - object:nil]; + // Start processing. + [AppReadiness runNowOrWhenAppIsReady:^{ + [self drainQueue]; + }]; return self; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -- (void)appIsReady -{ - [self drainQueue]; -} - #pragma mark - instance methods - (dispatch_queue_t)serialQueue @@ -308,17 +298,14 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo - (void)drainQueue { + OWSAssert(AppReadiness.isAppReady); + // Don't process incoming messages in app extensions. if (!CurrentAppContext().isMainApp) { return; } dispatch_async(self.serialQueue, ^{ - if (!AppReadiness.isAppReady) { - // We don't want to process incoming messages until storage is ready. - return; - } - if (self.isDrainingQueue) { return; } @@ -471,7 +458,13 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo // We need to persist the decrypted envelope data ASAP to prevent data loss. [self.processingQueue enqueueEnvelopeData:envelopeData plaintextData:plaintextData transaction:transaction]; - [self.processingQueue drainQueue]; + + // The new envelope won't be visible to the finder until this transaction commits, + // so drainQueue in the transaction completion. + [transaction addCompletionQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) + completionBlock:^{ + [self.processingQueue drainQueue]; + }]; } @end diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 36be5e9f6..1be57bed7 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -139,6 +139,13 @@ NS_ASSUME_NONNULL_BEGIN { if (AppReadiness.isAppReady) { [OWSMessageUtils.sharedManager updateApplicationBadgeCount]; + } else { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [AppReadiness runNowOrWhenAppIsReady:^{ + [OWSMessageUtils.sharedManager updateApplicationBadgeCount]; + }]; + }); } } diff --git a/SignalServiceKit/src/Messages/OWSMessageReceiver.m b/SignalServiceKit/src/Messages/OWSMessageReceiver.m index e555049a7..a5de76018 100644 --- a/SignalServiceKit/src/Messages/OWSMessageReceiver.m +++ b/SignalServiceKit/src/Messages/OWSMessageReceiver.m @@ -123,7 +123,8 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin - (void)addJobForEnvelope:(OWSSignalServiceProtosEnvelope *)envelope { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - [[[OWSMessageDecryptJob alloc] initWithEnvelope:envelope] saveWithTransaction:transaction]; + OWSMessageDecryptJob *job = [[OWSMessageDecryptJob alloc] initWithEnvelope:envelope]; + [job saveWithTransaction:transaction]; }]; } @@ -242,24 +243,13 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin _finder = finder; _isDrainingQueue = NO; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(appIsReady) - name:AppIsReadyNotification - object:nil]; + [AppReadiness runNowOrWhenAppIsReady:^{ + [self drainQueue]; + }]; return self; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -- (void)appIsReady -{ - [self drainQueue]; -} - #pragma mark - instance methods - (dispatch_queue_t)serialQueue @@ -279,17 +269,14 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin - (void)drainQueue { + OWSAssert(AppReadiness.isAppReady); + // Don't decrypt messages in app extensions. if (!CurrentAppContext().isMainApp) { return; } dispatch_async(self.serialQueue, ^{ - if (!AppReadiness.isAppReady) { - // We don't want to process incoming messages until storage is ready. - return; - } - if (self.isDrainingQueue) { return; } diff --git a/SignalServiceKit/src/Messages/OWSReadReceiptManager.m b/SignalServiceKit/src/Messages/OWSReadReceiptManager.m index 2560e3504..97dc644a8 100644 --- a/SignalServiceKit/src/Messages/OWSReadReceiptManager.m +++ b/SignalServiceKit/src/Messages/OWSReadReceiptManager.m @@ -177,13 +177,10 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE OWSSingletonAssert(); - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(appIsReady) - name:AppIsReadyNotification - object:nil]; - - // Try to start processing. - [self scheduleProcessing]; + // Start processing. + [AppReadiness runNowOrWhenAppIsReady:^{ + [self scheduleProcessing]; + }]; return self; } @@ -193,21 +190,14 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE [[NSNotificationCenter defaultCenter] removeObserver:self]; } -- (void)appIsReady -{ - [self scheduleProcessing]; -} - // Schedules a processing pass, unless one is already scheduled. - (void)scheduleProcessing { + OWSAssert(AppReadiness.isAppReady); + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ @synchronized(self) { - if (!AppReadiness.isAppReady) { - DDLogInfo(@"%@ Deferring read receipt processing; storage not yet ready.", self.logTag); - return; - } if (self.isProcessing) { return; } diff --git a/SignalServiceKit/src/Network/WebSockets/TSSocketManager.m b/SignalServiceKit/src/Network/WebSockets/TSSocketManager.m index a0f1115c1..b04c23944 100644 --- a/SignalServiceKit/src/Network/WebSockets/TSSocketManager.m +++ b/SignalServiceKit/src/Network/WebSockets/TSSocketManager.m @@ -610,6 +610,12 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_ OWSAssertIsOnMainThread(); if (!AppReadiness.isAppReady) { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [AppReadiness runNowOrWhenAppIsReady:^{ + [self applyDesiredSocketState]; + }]; + }); return; } diff --git a/SignalServiceKit/src/Util/AppReadiness.h b/SignalServiceKit/src/Util/AppReadiness.h index 837b13752..8a446fe93 100755 --- a/SignalServiceKit/src/Util/AppReadiness.h +++ b/SignalServiceKit/src/Util/AppReadiness.h @@ -4,8 +4,6 @@ NS_ASSUME_NONNULL_BEGIN -extern NSString *const AppIsReadyNotification; - typedef void (^AppReadyBlock)(void); @interface AppReadiness : NSObject diff --git a/SignalServiceKit/src/Util/AppReadiness.m b/SignalServiceKit/src/Util/AppReadiness.m index 5b70b1716..95ba13e7c 100755 --- a/SignalServiceKit/src/Util/AppReadiness.m +++ b/SignalServiceKit/src/Util/AppReadiness.m @@ -3,12 +3,9 @@ // #import "AppReadiness.h" -#import "NSNotificationCenter+OWS.h" NS_ASSUME_NONNULL_BEGIN -NSString *const AppIsReadyNotification = @"AppIsReadyNotification"; - @interface AppReadiness () @property (atomic) BOOL isAppReady; @@ -85,8 +82,6 @@ NSString *const AppIsReadyNotification = @"AppIsReadyNotification"; self.isAppReady = YES; [self runAppReadyBlocks]; - - [[NSNotificationCenter defaultCenter] postNotificationNameAsync:AppIsReadyNotification object:nil userInfo:nil]; } - (void)runAppReadyBlocks