Retain changes from session database branch.

pull/1/head
Matthew Chen 7 years ago
parent e77c3e6717
commit 9ac2383a2c

@ -1,5 +1,5 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import "TSAttachmentStream.h" #import "TSAttachmentStream.h"
@ -205,7 +205,7 @@ NS_ASSUME_NONNULL_BEGIN
[OWSFileSystem ensureDirectoryExists:attachmentsFolder]; [OWSFileSystem ensureDirectoryExists:attachmentsFolder];
[OWSFileSystem protectFolderAtPath:attachmentsFolder]; [OWSFileSystem protectFileOrFolderAtPath:attachmentsFolder];
}); });
return attachmentsFolder; return attachmentsFolder;
} }

@ -1,11 +1,15 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import "TSNetworkManager.h" #import "TSNetworkManager.h"
#import "AppContext.h"
#import "NSURLSessionDataTask+StatusCode.h" #import "NSURLSessionDataTask+StatusCode.h"
#import "OWSGetProfileRequest.h"
#import "OWSSignalService.h" #import "OWSSignalService.h"
#import "TSAccountManager.h" #import "TSAccountManager.h"
#import "TSRecipientPrekeyRequest.h"
#import "TSSubmitMessageRequest.h"
#import "TSVerifyCodeRequest.h" #import "TSVerifyCodeRequest.h"
#import <AFNetworking/AFNetworking.h> #import <AFNetworking/AFNetworking.h>
@ -56,6 +60,17 @@ typedef void (^failureBlock)(NSURLSessionDataTask *task, NSError *error);
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failureBlock failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failureBlock
{ {
DDLogInfo(@"%@ Making request: %@", self.logTag, request); DDLogInfo(@"%@ Making request: %@", self.logTag, request);
if (!CurrentAppContext().isMainApp) {
// TODO: Discuss which of these requests to suppress.
if (![request isKindOfClass:[TSRecipientPrekeyRequest class]]
&& ![request isKindOfClass:[TSSubmitMessageRequest class]]
&& ![request isKindOfClass:[OWSGetProfileRequest class]]
&& ![request isKindOfClass:[TSContactsIntersectionRequest class]]
&& ![request isKindOfClass:[TSAllocAttachmentRequest class]]) {
// The SAE should only make requests directly related to message sending.
OWSFail(@"%@ Making request: %@", self.logTag, request);
}
}
void (^failure)(NSURLSessionDataTask *task, NSError *error) = void (^failure)(NSURLSessionDataTask *task, NSError *error) =
[TSNetworkManager errorPrettifyingForFailureBlock:failureBlock]; [TSNetworkManager errorPrettifyingForFailureBlock:failureBlock];

@ -1,5 +1,5 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import "TSSocketManager.h" #import "TSSocketManager.h"
@ -125,11 +125,11 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_
[[NSNotificationCenter defaultCenter] addObserver:self [[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidBecomeActive:) selector:@selector(applicationDidBecomeActive:)
name:UIApplicationDidBecomeActiveNotification name:OWSApplicationDidBecomeActiveNotification
object:nil]; object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self [[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillResignActive:) selector:@selector(applicationWillResignActive:)
name:UIApplicationWillResignActiveNotification name:OWSApplicationWillResignActiveNotification
object:nil]; object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self [[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(registrationStateDidChange:) selector:@selector(registrationStateDidChange:)

@ -1,5 +1,5 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import "OWSRecipientIdentity.h" #import "OWSRecipientIdentity.h"
@ -103,6 +103,37 @@ OWSSignalServiceProtosVerifiedState OWSVerificationStateToProtoState(OWSVerifica
}]; }];
} }
- (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
{
OWSAssert(transaction.connection == [OWSRecipientIdentity dbReadWriteConnection]);
[super saveWithTransaction:transaction];
}
- (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
{
OWSAssert(transaction.connection == [OWSRecipientIdentity dbReadWriteConnection]);
[super removeWithTransaction:transaction];
}
- (void)touchWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
{
OWSAssert(transaction.connection == [OWSRecipientIdentity dbReadWriteConnection]);
[super touchWithTransaction:transaction];
}
+ (nullable instancetype)fetchObjectWithUniqueID:(NSString *)uniqueID
transaction:(YapDatabaseReadTransaction *)transaction
{
OWSAssert(transaction.connection == [OWSRecipientIdentity dbReadConnection]);
return [super fetchObjectWithUniqueID:uniqueID transaction:transaction];
}
#pragma mark - Database Connections
+ (YapDatabaseConnection *)dbReadConnection + (YapDatabaseConnection *)dbReadConnection
{ {
return self.dbReadWriteConnection; return self.dbReadWriteConnection;
@ -128,33 +159,14 @@ OWSSignalServiceProtosVerifiedState OWSVerificationStateToProtoState(OWSVerifica
return sharedDBConnection; return sharedDBConnection;
} }
- (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction - (YapDatabaseConnection *)dbReadConnection
{
OWSAssert(transaction.connection == [OWSRecipientIdentity dbReadWriteConnection]);
[super saveWithTransaction:transaction];
}
- (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
{
OWSAssert(transaction.connection == [OWSRecipientIdentity dbReadWriteConnection]);
[super removeWithTransaction:transaction];
}
- (void)touchWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
{ {
OWSAssert(transaction.connection == [OWSRecipientIdentity dbReadWriteConnection]); return OWSRecipientIdentity.dbReadConnection;
[super touchWithTransaction:transaction];
} }
+ (nullable instancetype)fetchObjectWithUniqueID:(NSString *)uniqueID - (YapDatabaseConnection *)dbReadWriteConnection
transaction:(YapDatabaseReadTransaction *)transaction
{ {
OWSAssert(transaction.connection == [OWSRecipientIdentity dbReadConnection]); return OWSRecipientIdentity.dbReadWriteConnection;
return [super fetchObjectWithUniqueID:uniqueID transaction:transaction];
} }
#pragma mark - debug #pragma mark - debug

@ -1,5 +1,5 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import <YapDatabase/YapDatabaseConnection.h> #import <YapDatabase/YapDatabaseConnection.h>
@ -40,6 +40,8 @@ extern NSString *const StorageIsReadyNotification;
completionBlock:(nullable void (^)(BOOL ready))completionBlock; completionBlock:(nullable void (^)(BOOL ready))completionBlock;
- (nullable id)registeredExtension:(NSString *)extensionName; - (nullable id)registeredExtension:(NSString *)extensionName;
- (unsigned long long)databaseFileSize;
#pragma mark - Password #pragma mark - Password
/** /**

@ -596,6 +596,20 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass";
[SAMKeychain deletePasswordForService:keychainService account:keychainDBPassAccount]; [SAMKeychain deletePasswordForService:keychainService account:keychainDBPassAccount];
} }
- (unsigned long long)databaseFileSize
{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *_Nullable error;
unsigned long long fileSize =
[[fileManager attributesOfItemAtPath:self.databaseFilePath error:&error][NSFileSize] unsignedLongLongValue];
if (error) {
DDLogError(@"%@ Couldn't fetch database file size: %@", self.logTag, error);
} else {
DDLogInfo(@"%@ Database file size: %llu", self.logTag, fileSize);
}
return fileSize;
}
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

@ -1,9 +1,20 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
// These are fired whenever the corresponding "main app" or "app extension"
// notification is fired.
//
// 1. This saves you the work of observing both.
// 2. This allows us to ensure that any critical work (e.g. re-opening
// databases) has been done before app re-enters foreground, etc.
extern NSString *const OWSApplicationDidEnterBackgroundNotification;
extern NSString *const OWSApplicationWillEnterForegroundNotification;
extern NSString *const OWSApplicationWillResignActiveNotification;
extern NSString *const OWSApplicationDidBecomeActiveNotification;
typedef void (^BackgroundTaskExpirationHandler)(void); typedef void (^BackgroundTaskExpirationHandler)(void);
@class OWSAES256Key; @class OWSAES256Key;

@ -1,11 +1,16 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import "AppContext.h" #import "AppContext.h"
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
NSString *const OWSApplicationDidEnterBackgroundNotification = @"OWSApplicationDidEnterBackgroundNotification";
NSString *const OWSApplicationWillEnterForegroundNotification = @"OWSApplicationWillEnterForegroundNotification";
NSString *const OWSApplicationWillResignActiveNotification = @"OWSApplicationWillResignActiveNotification";
NSString *const OWSApplicationDidBecomeActiveNotification = @"OWSApplicationDidBecomeActiveNotification";
static id<AppContext> currentAppContext = nil; static id<AppContext> currentAppContext = nil;
id<AppContext> CurrentAppContext(void) id<AppContext> CurrentAppContext(void)

@ -1,5 +1,5 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import "AppVersion.h" #import "AppVersion.h"
@ -32,6 +32,7 @@ NSString *const kNSUserDefaults_LastCompletedLaunchAppVersion = @"kNSUserDefault
return instance; return instance;
} }
// TODO: Modify these NSUserDefaults keys for SAE.
- (void)configure { - (void)configure {
self.currentAppVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; self.currentAppVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

@ -1,117 +0,0 @@
//
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
#ifndef OWSAssert
#ifdef DEBUG
#define USE_ASSERTS
#define CONVERT_TO_STRING(X) #X
#define CONVERT_EXPR_TO_STRING(X) CONVERT_TO_STRING(X)
// OWSAssert() and OWSFail() should be used in Obj-C methods.
// OWSCAssert() and OWSCFail() should be used in free functions.
#define OWSAssert(X) \
if (!(X)) { \
DDLogError(@"%s Assertion failed: %s", __PRETTY_FUNCTION__, CONVERT_EXPR_TO_STRING(X)); \
[DDLog flushLog]; \
NSAssert(0, @"Assertion failed: %s", CONVERT_EXPR_TO_STRING(X)); \
}
#define OWSCAssert(X) \
if (!(X)) { \
DDLogError(@"%s Assertion failed: %s", __PRETTY_FUNCTION__, CONVERT_EXPR_TO_STRING(X)); \
[DDLog flushLog]; \
NSCAssert(0, @"Assertion failed: %s", CONVERT_EXPR_TO_STRING(X)); \
}
#define OWSFail(message, ...) \
{ \
NSString *formattedMessage = [NSString stringWithFormat:message, ##__VA_ARGS__]; \
DDLogError(@"%s %@", __PRETTY_FUNCTION__, formattedMessage); \
[DDLog flushLog]; \
NSAssert(0, formattedMessage); \
}
#define OWSCFail(message, ...) \
{ \
NSString *formattedMessage = [NSString stringWithFormat:message, ##__VA_ARGS__]; \
DDLogError(@"%s %@", __PRETTY_FUNCTION__, formattedMessage); \
[DDLog flushLog]; \
NSCAssert(0, formattedMessage); \
}
#define OWSFailNoFormat(message) \
{ \
DDLogError(@"%s %@", __PRETTY_FUNCTION__, message); \
[DDLog flushLog]; \
NSAssert(0, message); \
}
#define OWSCFailNoFormat(message) \
{ \
DDLogError(@"%s %@", __PRETTY_FUNCTION__, message); \
[DDLog flushLog]; \
NSCAssert(0, message); \
}
#else
#define OWSAssert(X)
#define OWSCAssert(X)
#define OWSFail(message, ...)
#define OWSCFail(message, ...)
#define OWSFailNoFormat(X)
#define OWSCFailNoFormat(X)
#endif
#endif
#define OWS_ABSTRACT_METHOD() OWSFail(@"Method needs to be implemented by subclasses.")
#pragma mark - Singleton Asserts
// The "singleton asserts" can be used to ensure
// that we only create a singleton once.
//
// The simplest way to use them is the OWSSingletonAssert() macro.
// It is intended to be used inside the singleton's initializer.
//
// If, however, a singleton has multiple possible initializers,
// you need to:
//
// 1. Use OWSSingletonAssertFlag() outside the class definition.
// 2. Use OWSSingletonAssertInit() in each initializer.
#ifndef SSK_BUILDING_FOR_TESTS
#ifdef DEBUG
#define ENFORCE_SINGLETONS
#endif
#endif
#ifdef ENFORCE_SINGLETONS
#define OWSSingletonAssertFlag() static BOOL _isSingletonCreated = NO;
#define OWSSingletonAssertInit() \
@synchronized([self class]) \
{ \
OWSAssert(!_isSingletonCreated); \
_isSingletonCreated = YES; \
}
#define OWSSingletonAssert() OWSSingletonAssertFlag() OWSSingletonAssertInit()
#else
#define OWSSingletonAssertFlag()
#define OWSSingletonAssertInit()
#define OWSSingletonAssert()
#endif

@ -1,7 +1,8 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import "AppContext.h"
#import "NSUserDefaults+OWS.h" #import "NSUserDefaults+OWS.h"
#import "TSConstants.h" #import "TSConstants.h"
@ -34,6 +35,8 @@ NS_ASSUME_NONNULL_BEGIN
- (void)removeAll - (void)removeAll
{ {
OWSAssert(CurrentAppContext().isMainApp);
NSDictionary<NSString *, id> *dictionary = self.dictionaryRepresentation; NSDictionary<NSString *, id> *dictionary = self.dictionaryRepresentation;
for (NSString *key in dictionary) { for (NSString *key in dictionary) {
[self removeObjectForKey:key]; [self removeObjectForKey:key];

@ -1,5 +1,5 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import "OWSAnalytics.h" #import "OWSAnalytics.h"
@ -101,7 +101,7 @@ NSString *NSStringForOWSAnalyticsSeverity(OWSAnalyticsSeverity severity)
object:nil]; object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self [[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidBecomeActive) selector:@selector(applicationDidBecomeActive)
name:UIApplicationDidBecomeActiveNotification name:OWSApplicationDidBecomeActiveNotification
object:nil]; object:nil];
} }

@ -1,5 +1,5 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import "OWSBackgroundTask.h" #import "OWSBackgroundTask.h"
@ -134,8 +134,6 @@
// Make a local copy of this state, since this method is called by `dealloc`. // Make a local copy of this state, since this method is called by `dealloc`.
UIBackgroundTaskIdentifier backgroundTaskId; UIBackgroundTaskIdentifier backgroundTaskId;
BackgroundTaskCompletionBlock _Nullable completionBlock; BackgroundTaskCompletionBlock _Nullable completionBlock;
NSString *logTag = self.logTag;
NSString *label = self.label;
@synchronized(self) @synchronized(self)
{ {
@ -151,13 +149,14 @@
// endBackgroundTask must be called on the main thread. // endBackgroundTask must be called on the main thread.
DispatchMainThreadSafe(^{ DispatchMainThreadSafe(^{
DDLogVerbose(@"%@ %@ background task completed.", logTag, label);
if (completionBlock) { if (completionBlock) {
completionBlock(BackgroundTaskState_Success); completionBlock(BackgroundTaskState_Success);
} }
[CurrentAppContext() endBackgroundTask:backgroundTaskId]; if (backgroundTaskId != UIBackgroundTaskInvalid) {
[CurrentAppContext() endBackgroundTask:backgroundTaskId];
}
}); });
} }

@ -1,5 +1,5 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@ -24,10 +24,4 @@ NS_ASSUME_NONNULL_BEGIN
@end @end
// This macro is intended for use in Objective-C.
#define OWSAssertIsOnMainThread() OWSCAssert([NSThread isMainThread])
// This function is intended for use in Swift.
void AssertIsOnMainThread(void);
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

@ -1,5 +1,5 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@ -8,7 +8,7 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)init NS_UNAVAILABLE; - (instancetype)init NS_UNAVAILABLE;
+ (void)protectFolderAtPath:(NSString *)path; + (void)protectFileOrFolderAtPath:(NSString *)path;
+ (NSString *)appDocumentDirectoryPath; + (NSString *)appDocumentDirectoryPath;
@ -25,6 +25,8 @@ NS_ASSUME_NONNULL_BEGIN
+ (void)deleteFile:(NSString *)filePath; + (void)deleteFile:(NSString *)filePath;
+ (void)deleteFileIfExists:(NSString *)filePath;
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

@ -1,5 +1,5 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import "OWSFileSystem.h" #import "OWSFileSystem.h"
@ -9,7 +9,7 @@ NS_ASSUME_NONNULL_BEGIN
@implementation OWSFileSystem @implementation OWSFileSystem
+ (void)protectFolderAtPath:(NSString *)path + (void)protectFileOrFolderAtPath:(NSString *)path
{ {
if (![NSFileManager.defaultManager fileExistsAtPath:path]) { if (![NSFileManager.defaultManager fileExistsAtPath:path]) {
return; return;
@ -124,6 +124,13 @@ NS_ASSUME_NONNULL_BEGIN
} }
} }
+ (void)deleteFileIfExists:(NSString *)filePath
{
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
[self deleteFile:filePath];
}
}
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

@ -1,5 +1,5 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@ -21,7 +21,7 @@
#import <SignalMessaging/VersionMigrations.h> #import <SignalMessaging/VersionMigrations.h>
#import <SignalServiceKit/AppContext.h> #import <SignalServiceKit/AppContext.h>
#import <SignalServiceKit/AppVersion.h> #import <SignalServiceKit/AppVersion.h>
#import <SignalServiceKit/Asserts.h>
#import <SignalServiceKit/NSObject+OWS.h> #import <SignalServiceKit/NSObject+OWS.h>
#import <SignalServiceKit/OWSAsserts.h>
#import <SignalServiceKit/OWSMessageSender.h> #import <SignalServiceKit/OWSMessageSender.h>
#import <SignalServiceKit/TSAccountManager.h> #import <SignalServiceKit/TSAccountManager.h>

@ -1,5 +1,5 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import <Availability.h> #import <Availability.h>
@ -15,7 +15,7 @@
static const NSUInteger ddLogLevel = DDLogLevelInfo; static const NSUInteger ddLogLevel = DDLogLevelInfo;
#endif #endif
#import <SignalServiceKit/Asserts.h> #import <SignalServiceKit/OWSAsserts.h>
#import <SignalServiceKit/Constraints.h> #import <SignalServiceKit/Constraints.h>
#import <SignalServiceKit/OWSAnalytics.h> #import <SignalServiceKit/OWSAnalytics.h>
#import <SignalServiceKit/OWSDispatch.h> #import <SignalServiceKit/OWSDispatch.h>

@ -1,5 +1,5 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import "ShareAppExtensionContext.h" #import "ShareAppExtensionContext.h"
@ -58,24 +58,43 @@ NS_ASSUME_NONNULL_BEGIN
- (void)extensionHostDidBecomeActive:(NSNotification *)notification - (void)extensionHostDidBecomeActive:(NSNotification *)notification
{ {
OWSAssertIsOnMainThread();
DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__);
[NSNotificationCenter.defaultCenter postNotificationName:OWSApplicationDidBecomeActiveNotification object:nil];
} }
- (void)extensionHostWillResignActive:(NSNotification *)notification - (void)extensionHostWillResignActive:(NSNotification *)notification
{ {
OWSAssertIsOnMainThread();
DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__);
[DDLog flushLog]; [DDLog flushLog];
[NSNotificationCenter.defaultCenter postNotificationName:OWSApplicationWillResignActiveNotification object:nil];
} }
- (void)extensionHostDidEnterBackground:(NSNotification *)notification - (void)extensionHostDidEnterBackground:(NSNotification *)notification
{ {
OWSAssertIsOnMainThread();
DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__);
[DDLog flushLog]; [DDLog flushLog];
[NSNotificationCenter.defaultCenter postNotificationName:OWSApplicationDidEnterBackgroundNotification object:nil];
} }
- (void)extensionHostWillEnterForeground:(NSNotification *)notification - (void)extensionHostWillEnterForeground:(NSNotification *)notification
{ {
OWSAssertIsOnMainThread();
DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__);
// We want to prod OWSStorage here so that all storage is valid.
[OWSStorage applicationWillEnterForeground];
[NSNotificationCenter.defaultCenter postNotificationName:OWSApplicationWillEnterForegroundNotification object:nil];
} }
#pragma mark - #pragma mark -

Loading…
Cancel
Save