These retain cycles are theoretical since the singleton is supposed to live for the lifetime of the application. These measures were removed earlier when the object was turned into a singleton in a previous CL, see https://chromium-review.googlesource.com/c/external/webrtc/+/527442/3..4/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m The weak self handling and unused dealloc method is mostly noise and can make a casual reader think that the object will have a limited life cycle, i.e. the code may initially look like something it is not, which could possibly be less readable. On the other hand, for people looking out for potential retain cycles, the code may be distracting since it looks like it may be leaking. BUG=b/65558647 Review-Url: https://codereview.webrtc.org/3013023002 Cr-Commit-Position: refs/heads/master@{#19811}
98 lines
3.1 KiB
Objective-C
98 lines
3.1 KiB
Objective-C
/*
|
|
* Copyright 2016 The WebRTC Project Authors. All rights reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "RTCUIApplicationStatusObserver.h"
|
|
|
|
#if defined(WEBRTC_IOS)
|
|
|
|
#import <UIKit/UIKit.h>
|
|
|
|
#include "webrtc/rtc_base/checks.h"
|
|
|
|
@interface RTCUIApplicationStatusObserver ()
|
|
|
|
@property(nonatomic, assign) BOOL initialized;
|
|
@property(nonatomic, assign) UIApplicationState state;
|
|
|
|
@end
|
|
|
|
@implementation RTCUIApplicationStatusObserver {
|
|
BOOL _initialized;
|
|
dispatch_block_t _initializeBlock;
|
|
UIApplicationState _state;
|
|
|
|
id<NSObject> _activeObserver;
|
|
id<NSObject> _backgroundObserver;
|
|
}
|
|
|
|
@synthesize initialized = _initialized;
|
|
@synthesize state = _state;
|
|
|
|
+ (instancetype)sharedInstance {
|
|
static id sharedInstance;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^{
|
|
sharedInstance = [[self alloc] init];
|
|
});
|
|
|
|
return sharedInstance;
|
|
}
|
|
|
|
- (id)init {
|
|
if (self = [super init]) {
|
|
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
|
|
__weak RTCUIApplicationStatusObserver *weakSelf = self;
|
|
_activeObserver = [center addObserverForName:UIApplicationDidBecomeActiveNotification
|
|
object:nil
|
|
queue:[NSOperationQueue mainQueue]
|
|
usingBlock:^(NSNotification *note) {
|
|
weakSelf.state =
|
|
[UIApplication sharedApplication].applicationState;
|
|
}];
|
|
|
|
_backgroundObserver = [center addObserverForName:UIApplicationDidEnterBackgroundNotification
|
|
object:nil
|
|
queue:[NSOperationQueue mainQueue]
|
|
usingBlock:^(NSNotification *note) {
|
|
weakSelf.state =
|
|
[UIApplication sharedApplication].applicationState;
|
|
}];
|
|
|
|
_initialized = NO;
|
|
_initializeBlock = dispatch_block_create(DISPATCH_BLOCK_INHERIT_QOS_CLASS, ^{
|
|
weakSelf.state = [UIApplication sharedApplication].applicationState;
|
|
weakSelf.initialized = YES;
|
|
});
|
|
|
|
dispatch_async(dispatch_get_main_queue(), _initializeBlock);
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc {
|
|
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
|
|
[center removeObserver:_activeObserver];
|
|
[center removeObserver:_backgroundObserver];
|
|
}
|
|
|
|
- (BOOL)isApplicationActive {
|
|
if (!_initialized) {
|
|
long ret = dispatch_block_wait(_initializeBlock,
|
|
dispatch_time(DISPATCH_TIME_NOW, 10.0 * NSEC_PER_SEC));
|
|
RTC_DCHECK_EQ(ret, 0);
|
|
}
|
|
return _state == UIApplicationStateActive;
|
|
}
|
|
|
|
@end
|
|
|
|
#endif // WEBRTC_IOS
|