2013-10-04 18:03:18 -07:00
|
|
|
/*
|
|
|
|
Licensed to the Apache Software Foundation (ASF) under one
|
|
|
|
or more contributor license agreements. See the NOTICE file
|
|
|
|
distributed with this work for additional information
|
|
|
|
regarding copyright ownership. The ASF licenses this file
|
|
|
|
to you under the Apache License, Version 2.0 (the
|
|
|
|
"License"); you may not use this file except in compliance
|
|
|
|
with the License. You may obtain a copy of the License at
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-04 18:03:18 -07:00
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-04 18:03:18 -07:00
|
|
|
Unless required by applicable law or agreed to in writing,
|
|
|
|
software distributed under the License is distributed on an
|
|
|
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
|
|
KIND, either express or implied. See the License for the
|
|
|
|
specific language governing permissions and limitations
|
|
|
|
under the License.
|
|
|
|
*/
|
|
|
|
|
2014-05-15 14:05:14 +02:00
|
|
|
/*
|
2013-10-04 18:03:18 -07:00
|
|
|
NOTE: plugman/cordova cli should have already installed this,
|
|
|
|
but you need the value UIViewControllerBasedStatusBarAppearance
|
|
|
|
in your Info.plist as well to set the styles in iOS 7
|
|
|
|
*/
|
|
|
|
|
|
|
|
#import "CDVStatusBar.h"
|
2013-10-15 14:12:41 -07:00
|
|
|
#import <objc/runtime.h>
|
|
|
|
#import <Cordova/CDVViewController.h>
|
2013-10-04 18:03:18 -07:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
static const void *kHideStatusBar = &kHideStatusBar;
|
|
|
|
static const void *kStatusBarStyle = &kStatusBarStyle;
|
2013-10-04 18:03:18 -07:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
@interface CDVViewController (StatusBar)
|
|
|
|
|
|
|
|
@property (nonatomic, retain) id sb_hideStatusBar;
|
|
|
|
@property (nonatomic, retain) id sb_statusBarStyle;
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation CDVViewController (StatusBar)
|
|
|
|
|
|
|
|
@dynamic sb_hideStatusBar;
|
|
|
|
@dynamic sb_statusBarStyle;
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
- (id)sb_hideStatusBar {
|
|
|
|
return objc_getAssociatedObject(self, kHideStatusBar);
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
- (void)setSb_hideStatusBar:(id)newHideStatusBar {
|
|
|
|
objc_setAssociatedObject(self, kHideStatusBar, newHideStatusBar, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
|
|
|
}
|
|
|
|
|
|
|
|
- (id)sb_statusBarStyle {
|
|
|
|
return objc_getAssociatedObject(self, kStatusBarStyle);
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
- (void)setSb_statusBarStyle:(id)newStatusBarStyle {
|
|
|
|
objc_setAssociatedObject(self, kStatusBarStyle, newStatusBarStyle, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
- (BOOL) prefersStatusBarHidden {
|
|
|
|
return [self.sb_hideStatusBar boolValue];
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
- (UIStatusBarStyle)preferredStatusBarStyle
|
2013-10-04 18:03:18 -07:00
|
|
|
{
|
2013-10-15 14:12:41 -07:00
|
|
|
return (UIStatusBarStyle)[self.sb_statusBarStyle intValue];
|
2013-10-04 18:03:18 -07:00
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
@end
|
2013-10-04 18:03:18 -07:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
|
2014-07-14 22:55:04 -04:00
|
|
|
@interface CDVStatusBar () <UIScrollViewDelegate>
|
|
|
|
- (void)fireTappedEvent;
|
|
|
|
- (void)updateIsVisible:(BOOL)visible;
|
2014-04-10 16:56:24 -07:00
|
|
|
@end
|
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
@implementation CDVStatusBar
|
|
|
|
|
|
|
|
- (id)settingForKey:(NSString*)key
|
2013-10-07 15:13:32 -07:00
|
|
|
{
|
2013-10-15 14:12:41 -07:00
|
|
|
return [self.commandDelegate.settings objectForKey:[key lowercaseString]];
|
2013-10-07 15:13:32 -07:00
|
|
|
}
|
|
|
|
|
2013-10-07 17:53:04 -07:00
|
|
|
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
|
|
|
|
{
|
|
|
|
if ([keyPath isEqual:@"statusBarHidden"]) {
|
|
|
|
NSNumber* newValue = [change objectForKey:NSKeyValueChangeNewKey];
|
2014-07-14 22:55:04 -04:00
|
|
|
[self updateIsVisible:![newValue boolValue]];
|
2013-10-07 17:53:04 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-31 18:01:26 +01:00
|
|
|
-(void)statusBarDidChangeFrame:(NSNotification*)notification
|
|
|
|
{
|
2015-11-11 13:45:13 -08:00
|
|
|
//add a small delay for iOS 7 ( 0.1 seconds )
|
2015-11-11 13:53:41 -08:00
|
|
|
__weak CDVStatusBar* weakSelf = self;
|
2015-10-31 18:01:26 +01:00
|
|
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
|
2015-11-11 13:45:13 -08:00
|
|
|
[weakSelf resizeWebView];
|
2015-10-31 18:01:26 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2013-10-04 18:03:18 -07:00
|
|
|
- (void)pluginInitialize
|
|
|
|
{
|
2013-10-15 14:12:41 -07:00
|
|
|
BOOL isiOS7 = (IsAtLeastiOSVersion(@"7.0"));
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
// init
|
|
|
|
NSNumber* uiviewControllerBasedStatusBarAppearance = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIViewControllerBasedStatusBarAppearance"];
|
|
|
|
_uiviewControllerBasedStatusBarAppearance = (uiviewControllerBasedStatusBarAppearance == nil || [uiviewControllerBasedStatusBarAppearance boolValue]) && isiOS7;
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-07 17:53:04 -07:00
|
|
|
// observe the statusBarHidden property
|
|
|
|
[[UIApplication sharedApplication] addObserver:self forKeyPath:@"statusBarHidden" options:NSKeyValueObservingOptionNew context:NULL];
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2015-10-31 18:01:26 +01:00
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarDidChangeFrame:) name: UIApplicationDidChangeStatusBarFrameNotification object:nil];
|
|
|
|
|
2013-10-04 18:03:18 -07:00
|
|
|
_statusBarOverlaysWebView = YES; // default
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-11-18 17:20:22 -08:00
|
|
|
[self initializeStatusBarBackgroundView];
|
2014-02-24 22:30:04 -08:00
|
|
|
|
2013-11-22 12:18:34 -08:00
|
|
|
self.viewController.view.autoresizesSubviews = YES;
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-07 15:13:32 -07:00
|
|
|
NSString* setting;
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-07 15:13:32 -07:00
|
|
|
setting = @"StatusBarBackgroundColor";
|
|
|
|
if ([self settingForKey:setting]) {
|
2013-10-07 17:20:36 -07:00
|
|
|
[self _backgroundColorByHexString:[self settingForKey:setting]];
|
2013-10-07 15:13:32 -07:00
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
|
|
|
setting = @"StatusBarStyle";
|
|
|
|
if ([self settingForKey:setting]) {
|
|
|
|
[self setStatusBarStyle:[self settingForKey:setting]];
|
|
|
|
}
|
2014-04-10 16:56:24 -07:00
|
|
|
|
|
|
|
// blank scroll view to intercept status bar taps
|
|
|
|
self.webView.scrollView.scrollsToTop = NO;
|
|
|
|
UIScrollView *fakeScrollView = [[UIScrollView alloc] initWithFrame:UIScreen.mainScreen.bounds];
|
|
|
|
fakeScrollView.delegate = self;
|
|
|
|
fakeScrollView.scrollsToTop = YES;
|
|
|
|
[self.viewController.view addSubview:fakeScrollView]; // Add scrollview to the view heirarchy so that it will begin accepting status bar taps
|
|
|
|
[self.viewController.view sendSubviewToBack:fakeScrollView]; // Send it to the very back of the view heirarchy
|
|
|
|
fakeScrollView.contentSize = CGSizeMake(UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.height * 2.0f); // Make the scroll view longer than the screen itself
|
|
|
|
fakeScrollView.contentOffset = CGPointMake(0.0f, UIScreen.mainScreen.bounds.size.height); // Scroll down so a tap will take scroll view back to the top
|
2013-10-04 18:03:18 -07:00
|
|
|
}
|
|
|
|
|
2014-07-14 22:55:04 -04:00
|
|
|
- (void)onReset {
|
|
|
|
_eventsCallbackId = nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)fireTappedEvent {
|
|
|
|
if (_eventsCallbackId == nil) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
NSDictionary* payload = @{@"type": @"tap"};
|
|
|
|
CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:payload];
|
|
|
|
[result setKeepCallbackAsBool:YES];
|
|
|
|
[self.commandDelegate sendPluginResult:result callbackId:_eventsCallbackId];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)updateIsVisible:(BOOL)visible {
|
|
|
|
if (_eventsCallbackId == nil) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:visible];
|
|
|
|
[result setKeepCallbackAsBool:YES];
|
|
|
|
[self.commandDelegate sendPluginResult:result callbackId:_eventsCallbackId];
|
|
|
|
}
|
|
|
|
|
2013-10-07 17:53:04 -07:00
|
|
|
- (void) _ready:(CDVInvokedUrlCommand*)command
|
|
|
|
{
|
2014-07-14 22:55:04 -04:00
|
|
|
_eventsCallbackId = command.callbackId;
|
|
|
|
[self updateIsVisible:![UIApplication sharedApplication].statusBarHidden];
|
2015-10-31 18:01:26 +01:00
|
|
|
NSString* setting = @"StatusBarOverlaysWebView";
|
|
|
|
if ([self settingForKey:setting]) {
|
|
|
|
self.statusBarOverlaysWebView = [(NSNumber*)[self settingForKey:setting] boolValue];
|
|
|
|
if (self.statusBarOverlaysWebView) {
|
|
|
|
[self resizeWebView];
|
|
|
|
}
|
|
|
|
}
|
2013-10-07 17:53:04 -07:00
|
|
|
}
|
|
|
|
|
2014-05-15 14:05:14 +02:00
|
|
|
- (void) initializeStatusBarBackgroundView
|
2013-11-18 17:20:22 -08:00
|
|
|
{
|
|
|
|
CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;
|
2015-12-30 10:16:58 +03:00
|
|
|
|
|
|
|
if ([[UIApplication sharedApplication]statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown &&
|
|
|
|
statusBarFrame.size.height + statusBarFrame.origin.y == [[UIScreen mainScreen] bounds].size.height) {
|
|
|
|
|
|
|
|
// When started in upside-down orientation on iOS 7, status bar will be bound to lower edge of the
|
|
|
|
// screen (statusBarFrame.origin.y will be somewhere around screen height). In this case we need to
|
|
|
|
// correct frame's coordinates
|
|
|
|
statusBarFrame.origin.y = 0;
|
|
|
|
}
|
|
|
|
|
2016-02-22 19:41:22 +01:00
|
|
|
statusBarFrame = [self invertFrameIfNeeded:statusBarFrame];
|
2013-11-18 17:20:22 -08:00
|
|
|
|
|
|
|
_statusBarBackgroundView = [[UIView alloc] initWithFrame:statusBarFrame];
|
2013-11-22 12:18:34 -08:00
|
|
|
_statusBarBackgroundView.backgroundColor = _statusBarBackgroundColor;
|
|
|
|
_statusBarBackgroundView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin);
|
|
|
|
_statusBarBackgroundView.autoresizesSubviews = YES;
|
2013-11-18 17:20:22 -08:00
|
|
|
}
|
|
|
|
|
2016-02-22 19:41:22 +01:00
|
|
|
- (CGRect) invertFrameIfNeeded:(CGRect)rect {
|
2014-10-06 14:43:12 -07:00
|
|
|
// landscape is where (width > height). On iOS < 8, we need to invert since frames are
|
|
|
|
// always in Portrait context
|
2015-09-14 23:04:53 +02:00
|
|
|
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) && (rect.size.width < rect.size.height)) {
|
2014-10-06 14:43:12 -07:00
|
|
|
CGFloat temp = rect.size.width;
|
|
|
|
rect.size.width = rect.size.height;
|
|
|
|
rect.size.height = temp;
|
|
|
|
rect.origin = CGPointZero;
|
|
|
|
}
|
|
|
|
|
|
|
|
return rect;
|
|
|
|
}
|
|
|
|
|
2013-10-04 18:03:18 -07:00
|
|
|
- (void) setStatusBarOverlaysWebView:(BOOL)statusBarOverlaysWebView
|
|
|
|
{
|
|
|
|
// we only care about the latest iOS version or a change in setting
|
|
|
|
if (!IsAtLeastiOSVersion(@"7.0") || statusBarOverlaysWebView == _statusBarOverlaysWebView) {
|
|
|
|
return;
|
|
|
|
}
|
2015-10-31 18:01:26 +01:00
|
|
|
|
|
|
|
_statusBarOverlaysWebView = statusBarOverlaysWebView;
|
2013-10-14 16:47:38 -07:00
|
|
|
|
2015-10-31 18:01:26 +01:00
|
|
|
[self resizeWebView];
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-04 18:03:18 -07:00
|
|
|
if (statusBarOverlaysWebView) {
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-06 00:47:33 -07:00
|
|
|
[_statusBarBackgroundView removeFromSuperview];
|
2013-10-04 18:03:18 -07:00
|
|
|
|
|
|
|
} else {
|
2013-10-14 16:47:38 -07:00
|
|
|
|
2013-11-18 17:20:22 -08:00
|
|
|
[self initializeStatusBarBackgroundView];
|
2013-10-06 00:47:33 -07:00
|
|
|
[self.webView.superview addSubview:_statusBarBackgroundView];
|
2015-10-31 18:01:26 +01:00
|
|
|
|
2013-10-04 18:03:18 -07:00
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-04 18:03:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL) statusBarOverlaysWebView
|
|
|
|
{
|
|
|
|
return _statusBarOverlaysWebView;
|
|
|
|
}
|
|
|
|
|
2013-10-07 17:20:36 -07:00
|
|
|
- (void) overlaysWebView:(CDVInvokedUrlCommand*)command
|
2013-10-04 18:03:18 -07:00
|
|
|
{
|
2015-01-23 09:49:21 -05:00
|
|
|
id value = [command argumentAtIndex:0];
|
2013-10-04 18:03:18 -07:00
|
|
|
if (!([value isKindOfClass:[NSNumber class]])) {
|
|
|
|
value = [NSNumber numberWithBool:YES];
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-04 18:03:18 -07:00
|
|
|
self.statusBarOverlaysWebView = [value boolValue];
|
|
|
|
}
|
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
- (void) refreshStatusBarAppearance
|
|
|
|
{
|
|
|
|
SEL sel = NSSelectorFromString(@"setNeedsStatusBarAppearanceUpdate");
|
|
|
|
if ([self.viewController respondsToSelector:sel]) {
|
|
|
|
#pragma clang diagnostic push
|
|
|
|
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
|
|
|
|
[self.viewController performSelector:sel withObject:nil];
|
|
|
|
#pragma clang diagnostic pop
|
|
|
|
}
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
- (void) setStyleForStatusBar:(UIStatusBarStyle)style
|
|
|
|
{
|
|
|
|
if (_uiviewControllerBasedStatusBarAppearance) {
|
|
|
|
CDVViewController* vc = (CDVViewController*)self.viewController;
|
|
|
|
vc.sb_statusBarStyle = [NSNumber numberWithInt:style];
|
|
|
|
[self refreshStatusBarAppearance];
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
} else {
|
|
|
|
[[UIApplication sharedApplication] setStatusBarStyle:style];
|
|
|
|
}
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-07 15:13:32 -07:00
|
|
|
- (void) setStatusBarStyle:(NSString*)statusBarStyle
|
|
|
|
{
|
|
|
|
// default, lightContent, blackTranslucent, blackOpaque
|
|
|
|
NSString* lcStatusBarStyle = [statusBarStyle lowercaseString];
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-07 15:13:32 -07:00
|
|
|
if ([lcStatusBarStyle isEqualToString:@"default"]) {
|
|
|
|
[self styleDefault:nil];
|
|
|
|
} else if ([lcStatusBarStyle isEqualToString:@"lightcontent"]) {
|
|
|
|
[self styleLightContent:nil];
|
|
|
|
} else if ([lcStatusBarStyle isEqualToString:@"blacktranslucent"]) {
|
|
|
|
[self styleBlackTranslucent:nil];
|
|
|
|
} else if ([lcStatusBarStyle isEqualToString:@"blackopaque"]) {
|
|
|
|
[self styleBlackOpaque:nil];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-04 18:03:18 -07:00
|
|
|
- (void) styleDefault:(CDVInvokedUrlCommand*)command
|
|
|
|
{
|
2013-10-15 14:12:41 -07:00
|
|
|
[self setStyleForStatusBar:UIStatusBarStyleDefault];
|
2013-10-04 18:03:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void) styleLightContent:(CDVInvokedUrlCommand*)command
|
|
|
|
{
|
2013-10-15 14:12:41 -07:00
|
|
|
[self setStyleForStatusBar:UIStatusBarStyleLightContent];
|
2013-10-04 18:03:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void) styleBlackTranslucent:(CDVInvokedUrlCommand*)command
|
|
|
|
{
|
2015-09-14 20:43:48 +02:00
|
|
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000
|
|
|
|
# define TRANSLUCENT_STYLE UIStatusBarStyleBlackTranslucent
|
|
|
|
#else
|
|
|
|
# define TRANSLUCENT_STYLE UIStatusBarStyleLightContent
|
|
|
|
#endif
|
|
|
|
[self setStyleForStatusBar:TRANSLUCENT_STYLE];
|
2013-10-04 18:03:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void) styleBlackOpaque:(CDVInvokedUrlCommand*)command
|
|
|
|
{
|
2015-09-14 20:43:48 +02:00
|
|
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000
|
|
|
|
# define OPAQUE_STYLE UIStatusBarStyleBlackOpaque
|
|
|
|
#else
|
|
|
|
# define OPAQUE_STYLE UIStatusBarStyleLightContent
|
|
|
|
#endif
|
|
|
|
[self setStyleForStatusBar:OPAQUE_STYLE];
|
2013-10-04 18:03:18 -07:00
|
|
|
}
|
|
|
|
|
2013-10-07 17:20:36 -07:00
|
|
|
- (void) backgroundColorByName:(CDVInvokedUrlCommand*)command
|
2013-10-06 00:47:33 -07:00
|
|
|
{
|
2015-01-23 09:49:21 -05:00
|
|
|
id value = [command argumentAtIndex:0];
|
2013-10-06 00:47:33 -07:00
|
|
|
if (!([value isKindOfClass:[NSString class]])) {
|
|
|
|
value = @"black";
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-06 00:47:33 -07:00
|
|
|
SEL selector = NSSelectorFromString([value stringByAppendingString:@"Color"]);
|
|
|
|
if ([UIColor respondsToSelector:selector]) {
|
|
|
|
_statusBarBackgroundView.backgroundColor = [UIColor performSelector:selector];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-07 17:20:36 -07:00
|
|
|
- (void) _backgroundColorByHexString:(NSString*)hexString
|
2013-10-07 15:13:32 -07:00
|
|
|
{
|
|
|
|
unsigned int rgbValue = 0;
|
|
|
|
NSScanner* scanner = [NSScanner scannerWithString:hexString];
|
|
|
|
[scanner setScanLocation:1];
|
|
|
|
[scanner scanHexInt:&rgbValue];
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-11-22 12:18:34 -08:00
|
|
|
_statusBarBackgroundColor = [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0];
|
|
|
|
_statusBarBackgroundView.backgroundColor = _statusBarBackgroundColor;
|
2013-10-07 15:13:32 -07:00
|
|
|
}
|
|
|
|
|
2013-10-07 17:20:36 -07:00
|
|
|
- (void) backgroundColorByHexString:(CDVInvokedUrlCommand*)command
|
2013-10-06 01:18:06 -07:00
|
|
|
{
|
2015-01-23 09:49:21 -05:00
|
|
|
NSString* value = [command argumentAtIndex:0];
|
2013-10-06 01:18:06 -07:00
|
|
|
if (!([value isKindOfClass:[NSString class]])) {
|
|
|
|
value = @"#000000";
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-06 01:18:06 -07:00
|
|
|
if (![value hasPrefix:@"#"] || [value length] < 7) {
|
|
|
|
return;
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-07 17:20:36 -07:00
|
|
|
[self _backgroundColorByHexString:value];
|
2013-10-06 01:18:06 -07:00
|
|
|
}
|
2013-10-15 14:12:41 -07:00
|
|
|
|
|
|
|
- (void) hideStatusBar
|
|
|
|
{
|
|
|
|
if (_uiviewControllerBasedStatusBarAppearance) {
|
|
|
|
CDVViewController* vc = (CDVViewController*)self.viewController;
|
|
|
|
vc.sb_hideStatusBar = [NSNumber numberWithBool:YES];
|
|
|
|
[self refreshStatusBarAppearance];
|
|
|
|
|
|
|
|
} else {
|
|
|
|
UIApplication* app = [UIApplication sharedApplication];
|
|
|
|
[app setStatusBarHidden:YES];
|
|
|
|
}
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-14 16:47:38 -07:00
|
|
|
- (void) hide:(CDVInvokedUrlCommand*)command
|
|
|
|
{
|
|
|
|
UIApplication* app = [UIApplication sharedApplication];
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-14 16:47:38 -07:00
|
|
|
if (!app.isStatusBarHidden)
|
|
|
|
{
|
2015-10-31 18:01:26 +01:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
[self hideStatusBar];
|
2013-10-14 16:47:38 -07:00
|
|
|
|
|
|
|
if (IsAtLeastiOSVersion(@"7.0")) {
|
|
|
|
[_statusBarBackgroundView removeFromSuperview];
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2015-10-31 18:01:26 +01:00
|
|
|
[self resizeWebView];
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-11-22 12:18:34 -08:00
|
|
|
_statusBarBackgroundView.hidden = YES;
|
2013-10-15 14:12:41 -07:00
|
|
|
}
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
- (void) showStatusBar
|
|
|
|
{
|
|
|
|
if (_uiviewControllerBasedStatusBarAppearance) {
|
|
|
|
CDVViewController* vc = (CDVViewController*)self.viewController;
|
|
|
|
vc.sb_hideStatusBar = [NSNumber numberWithBool:NO];
|
|
|
|
[self refreshStatusBarAppearance];
|
2013-10-14 16:47:38 -07:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
} else {
|
|
|
|
UIApplication* app = [UIApplication sharedApplication];
|
|
|
|
[app setStatusBarHidden:NO];
|
2013-10-14 16:47:38 -07:00
|
|
|
}
|
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-14 16:47:38 -07:00
|
|
|
- (void) show:(CDVInvokedUrlCommand*)command
|
|
|
|
{
|
|
|
|
UIApplication* app = [UIApplication sharedApplication];
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-14 16:47:38 -07:00
|
|
|
if (app.isStatusBarHidden)
|
|
|
|
{
|
|
|
|
BOOL isIOS7 = (IsAtLeastiOSVersion(@"7.0"));
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-15 14:12:41 -07:00
|
|
|
[self showStatusBar];
|
2016-03-06 11:55:49 +01:00
|
|
|
[self resizeWebView];
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-14 16:47:38 -07:00
|
|
|
if (isIOS7) {
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-14 16:47:38 -07:00
|
|
|
if (!self.statusBarOverlaysWebView) {
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-11-22 12:18:34 -08:00
|
|
|
// there is a possibility that when the statusbar was hidden, it was in a different orientation
|
|
|
|
// from the current one. Therefore we need to expand the statusBarBackgroundView as well to the
|
|
|
|
// statusBar's current size
|
2015-10-31 18:01:26 +01:00
|
|
|
CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;
|
2016-02-22 19:41:22 +01:00
|
|
|
statusBarFrame = [self invertFrameIfNeeded:statusBarFrame];
|
2013-11-22 12:18:34 -08:00
|
|
|
CGRect sbBgFrame = _statusBarBackgroundView.frame;
|
2014-10-06 14:43:12 -07:00
|
|
|
sbBgFrame.size = statusBarFrame.size;
|
2013-11-22 12:18:34 -08:00
|
|
|
_statusBarBackgroundView.frame = sbBgFrame;
|
2013-10-14 16:47:38 -07:00
|
|
|
[self.webView.superview addSubview:_statusBarBackgroundView];
|
|
|
|
|
2015-10-31 18:01:26 +01:00
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-10-14 16:47:38 -07:00
|
|
|
}
|
2014-05-15 14:05:14 +02:00
|
|
|
|
2013-11-22 12:18:34 -08:00
|
|
|
_statusBarBackgroundView.hidden = NO;
|
2013-10-14 16:47:38 -07:00
|
|
|
}
|
|
|
|
}
|
2013-10-06 01:18:06 -07:00
|
|
|
|
2016-03-06 11:55:49 +01:00
|
|
|
-(void)resizeWebView
|
|
|
|
{
|
|
|
|
BOOL isIOS7 = (IsAtLeastiOSVersion(@"7.0"));
|
|
|
|
|
|
|
|
if (isIOS7) {
|
|
|
|
CGRect bounds = [[UIScreen mainScreen] bounds];
|
|
|
|
bounds = [self invertFrameIfNeeded:bounds];
|
2015-10-31 18:01:26 +01:00
|
|
|
|
2016-03-06 11:55:49 +01:00
|
|
|
if (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])) {
|
|
|
|
self.viewController.view.frame = bounds;
|
2016-03-29 16:49:29 +03:00
|
|
|
} else if (self.viewController.presentedViewController != nil) {
|
2016-04-05 17:39:36 +03:00
|
|
|
// https://issues.apache.org/jira/browse/CB-11018
|
|
|
|
BOOL isIOS8 = (IsAtLeastiOSVersion(@"8.0"));
|
|
|
|
BOOL isIOS9 = (IsAtLeastiOSVersion(@"9.0"));
|
|
|
|
if (isIOS8 && !isIOS9) {
|
|
|
|
// iOS 8
|
|
|
|
bounds = CGRectMake(0, 0, bounds.size.width, bounds.size.height);
|
|
|
|
} else {
|
|
|
|
// iOS7, iOS9+
|
|
|
|
bounds = CGRectMake(0, 0, bounds.size.height, bounds.size.width);
|
|
|
|
}
|
2016-03-06 11:55:49 +01:00
|
|
|
}
|
|
|
|
self.webView.frame = bounds;
|
2015-10-31 18:01:26 +01:00
|
|
|
|
2016-03-06 11:55:49 +01:00
|
|
|
if (!self.statusBarOverlaysWebView) {
|
|
|
|
CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;
|
|
|
|
statusBarFrame = [self invertFrameIfNeeded:statusBarFrame];
|
|
|
|
CGRect frame = self.webView.frame;
|
|
|
|
frame.origin.y = statusBarFrame.size.height;
|
|
|
|
frame.size.height -= statusBarFrame.size.height;
|
|
|
|
self.webView.frame = frame;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
CGRect bounds = [[UIScreen mainScreen] applicationFrame];
|
|
|
|
self.viewController.view.frame = bounds;
|
2015-10-31 18:01:26 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-07 17:53:04 -07:00
|
|
|
- (void) dealloc
|
|
|
|
{
|
|
|
|
[[UIApplication sharedApplication] removeObserver:self forKeyPath:@"statusBarHidden"];
|
2016-01-16 20:23:36 +01:00
|
|
|
[[NSNotificationCenter defaultCenter]removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
|
2013-10-07 17:53:04 -07:00
|
|
|
}
|
|
|
|
|
2013-10-06 01:18:06 -07:00
|
|
|
|
2014-04-10 16:56:24 -07:00
|
|
|
#pragma mark - UIScrollViewDelegate
|
|
|
|
|
|
|
|
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
|
|
|
|
{
|
2014-07-14 22:55:04 -04:00
|
|
|
[self fireTappedEvent];
|
2014-04-10 16:56:24 -07:00
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
|
2013-10-04 18:03:18 -07:00
|
|
|
@end
|