// // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "ShareAppExtensionContext.h" #import #import NS_ASSUME_NONNULL_BEGIN @interface ShareAppExtensionContext () @property (nonatomic) UIViewController *rootViewController; @property (atomic) BOOL isSAEInBackground; @end #pragma mark - @implementation ShareAppExtensionContext - (instancetype)initWithRootViewController:(UIViewController *)rootViewController { self = [super init]; if (!self) { return self; } OWSAssert(rootViewController); _rootViewController = rootViewController; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(extensionHostDidBecomeActive:) name:NSExtensionHostDidBecomeActiveNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(extensionHostWillResignActive:) name:NSExtensionHostWillResignActiveNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(extensionHostDidEnterBackground:) name:NSExtensionHostDidEnterBackgroundNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(extensionHostWillEnterForeground:) name:NSExtensionHostWillEnterForegroundNotification object:nil]; return self; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } #pragma mark - Notifications - (void)extensionHostDidBecomeActive:(NSNotification *)notification { OWSAssertIsOnMainThread(); DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); self.isSAEInBackground = NO; [NSNotificationCenter.defaultCenter postNotificationName:OWSApplicationDidBecomeActiveNotification object:nil]; } - (void)extensionHostWillResignActive:(NSNotification *)notification { OWSAssertIsOnMainThread(); DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); [DDLog flushLog]; [NSNotificationCenter.defaultCenter postNotificationName:OWSApplicationWillResignActiveNotification object:nil]; } - (void)extensionHostDidEnterBackground:(NSNotification *)notification { OWSAssertIsOnMainThread(); DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); [DDLog flushLog]; self.isSAEInBackground = YES; [NSNotificationCenter.defaultCenter postNotificationName:OWSApplicationDidEnterBackgroundNotification object:nil]; } - (void)extensionHostWillEnterForeground:(NSNotification *)notification { OWSAssertIsOnMainThread(); DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); self.isSAEInBackground = NO; [NSNotificationCenter.defaultCenter postNotificationName:OWSApplicationWillEnterForegroundNotification object:nil]; } #pragma mark - - (BOOL)isMainApp { return NO; } - (BOOL)isMainAppAndActive { return NO; } - (BOOL)isRTL { // Borrowed from PureLayout's AppExtension compatible RTL support. // App Extensions may not access -[UIApplication sharedApplication]; fall back to checking the bundle's preferred // localization character direction return [NSLocale characterDirectionForLanguage:[[NSBundle mainBundle] preferredLocalizations][0]] == NSLocaleLanguageDirectionRightToLeft; } - (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle { DDLogInfo(@"Ignoring request to set status bar style since we're in an app extension"); } - (void)setStatusBarHidden:(BOOL)isHidden animated:(BOOL)isAnimated { DDLogInfo(@"Ignoring request to show/hide status bar style since we're in an app extension"); } - (BOOL)isInBackground { return self.isSAEInBackground; } - (UIApplicationState)mainApplicationState { OWSFail(@"%@ called %s.", self.logTag, __PRETTY_FUNCTION__); return UIApplicationStateBackground; } - (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler: (BackgroundTaskExpirationHandler)expirationHandler { return UIBackgroundTaskInvalid; } - (void)endBackgroundTask:(UIBackgroundTaskIdentifier)backgroundTaskIdentifier { OWSAssert(backgroundTaskIdentifier == UIBackgroundTaskInvalid); } - (void)ensureSleepBlocking:(BOOL)shouldBeBlocking blockingObjects:(NSArray *)blockingObjects { DDLogDebug(@"%@ Ignoring request to block sleep.", self.logTag); } - (void)setMainAppBadgeNumber:(NSInteger)value { OWSFail(@"%@ called %s.", self.logTag, __PRETTY_FUNCTION__); } - (nullable UIViewController *)frontmostViewController { OWSAssert(self.rootViewController); return [self.rootViewController findFrontmostViewController:YES]; } - (nullable UIView *)rootReferenceView { return self.rootViewController.view; } - (nullable UIAlertAction *)openSystemSettingsAction { return nil; } - (void)doMultiDeviceUpdateWithProfileKey:(OWSAES256Key *)profileKey { OWSFail(@"%@ called %s.", self.logTag, __PRETTY_FUNCTION__); } - (BOOL)isRunningTests { // We don't need to distinguish this in the SAE. return NO; } - (void)setNetworkActivityIndicatorVisible:(BOOL)value { OWSFail(@"%@ called %s.", self.logTag, __PRETTY_FUNCTION__); } @end NS_ASSUME_NONNULL_END