You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by sh...@apache.org on 2014/03/13 20:58:45 UTC

[16/35] git commit: StatusBar - remove dependence of UIViewControllerBasedStatusBarAppearance Info.plist key

StatusBar - remove dependence of UIViewControllerBasedStatusBarAppearance Info.plist key



Project: http://git-wip-us.apache.org/repos/asf/cordova-statusbar/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-statusbar/commit/9c9a8ba9
Tree: http://git-wip-us.apache.org/repos/asf/cordova-statusbar/tree/9c9a8ba9
Diff: http://git-wip-us.apache.org/repos/asf/cordova-statusbar/diff/9c9a8ba9

Branch: refs/heads/master
Commit: 9c9a8ba983a8963a17c5f878e876e5956e1e3751
Parents: ea57d60
Author: Shazron Abdullah <sh...@apache.org>
Authored: Tue Oct 15 14:12:41 2013 -0700
Committer: Shazron Abdullah <sh...@apache.org>
Committed: Tue Oct 15 14:12:55 2013 -0700

----------------------------------------------------------------------
 README.md              |   7 ---
 plugin.xml             |  12 -----
 src/ios/CDVStatusBar.h |   2 +
 src/ios/CDVStatusBar.m | 123 +++++++++++++++++++++++++++++++++++++-------
 4 files changed, 107 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-statusbar/blob/9c9a8ba9/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
index 4ca7022..ca63865 100644
--- a/README.md
+++ b/README.md
@@ -4,8 +4,6 @@ StatusBar
 > The `StatusBar` object provides some functions to customize the iOS StatusBar.
 
 The plugin reads the __StatusBarOverlaysWebView__ (boolean, defaults to true) and __StatusBarBackgroundColor__ (color hex string, defaults to #000000) values from config.xml.
-
-For iOS 7, to use the statusbar style functions, you need the addition of a key in your Info.plist. See the Permissions section below.
  
 Methods
 -------
@@ -34,11 +32,6 @@ Permissions
                 <param name="ios-package" value="CDVStatusBar" onload="true" />
             </feature>
 
-#### [ProjectName]-Info.plist
-
-            <key>UIViewControllerBasedStatusBarAppearance</key>
-            <false/>
-
 StatusBar.overlaysWebView
 =================
 

http://git-wip-us.apache.org/repos/asf/cordova-statusbar/blob/9c9a8ba9/plugin.xml
----------------------------------------------------------------------
diff --git a/plugin.xml b/plugin.xml
index 13f2115..e315732 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -28,21 +28,9 @@
             <preference name="StatusBarBackgroundColor" value="#000000" />
         </config-file>
         
-        <!-- add this manually for now, crash bug - see https://issues.apache.org/jira/browse/CB-5012
-        <config-file target="*-Info.plist" parent="UIViewControllerBasedStatusBarAppearance" >
-        	<key>UIViewControllerBasedStatusBarAppearance</key>
-            <false/>
-        </config-file>        
-        -->
-
         <header-file src="src/ios/CDVStatusBar.h" />
         <source-file src="src/ios/CDVStatusBar.m" />
         
-        <info>
-Add this key and value to your project's Info.plist:
-    &lt;key&gt;UIViewControllerBasedStatusBarAppearance&lt;/key&gt;
-    &lt;false/&gt;
-		</info>
     </platform>
 
 </plugin>

http://git-wip-us.apache.org/repos/asf/cordova-statusbar/blob/9c9a8ba9/src/ios/CDVStatusBar.h
----------------------------------------------------------------------
diff --git a/src/ios/CDVStatusBar.h b/src/ios/CDVStatusBar.h
index a059e5c..2bf5d26 100644
--- a/src/ios/CDVStatusBar.h
+++ b/src/ios/CDVStatusBar.h
@@ -25,6 +25,8 @@
     BOOL _statusBarOverlaysWebView;
     @protected
     UIView* _statusBarBackgroundView;
+    @protected
+    BOOL _uiviewControllerBasedStatusBarAppearance;
 }
 
 @property (atomic, assign) BOOL statusBarOverlaysWebView;

http://git-wip-us.apache.org/repos/asf/cordova-statusbar/blob/9c9a8ba9/src/ios/CDVStatusBar.m
----------------------------------------------------------------------
diff --git a/src/ios/CDVStatusBar.m b/src/ios/CDVStatusBar.m
index 4a6efec..25c70f8 100644
--- a/src/ios/CDVStatusBar.m
+++ b/src/ios/CDVStatusBar.m
@@ -24,20 +24,57 @@
  */
 
 #import "CDVStatusBar.h"
+#import <objc/runtime.h>
+#import <Cordova/CDVViewController.h>
 
-@implementation CDVStatusBar
+static const void *kHideStatusBar = &kHideStatusBar;
+static const void *kStatusBarStyle = &kStatusBarStyle;
 
-- (id)settingForKey:(NSString*)key
+@interface CDVViewController (StatusBar)
+
+@property (nonatomic, retain) id sb_hideStatusBar;
+@property (nonatomic, retain) id sb_statusBarStyle;
+    
+@end
+
+@implementation CDVViewController (StatusBar)
+
+@dynamic sb_hideStatusBar;
+@dynamic sb_statusBarStyle;
+    
+- (id)sb_hideStatusBar {
+    return objc_getAssociatedObject(self, kHideStatusBar);
+}
+    
+- (void)setSb_hideStatusBar:(id)newHideStatusBar {
+    objc_setAssociatedObject(self, kHideStatusBar, newHideStatusBar, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+}
+
+- (id)sb_statusBarStyle {
+    return objc_getAssociatedObject(self, kStatusBarStyle);
+}
+    
+- (void)setSb_statusBarStyle:(id)newStatusBarStyle {
+    objc_setAssociatedObject(self, kStatusBarStyle, newStatusBarStyle, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+}
+    
+- (BOOL) prefersStatusBarHidden {
+    return [self.sb_hideStatusBar boolValue];
+}
+    
+- (UIStatusBarStyle)preferredStatusBarStyle
 {
-    return [self.commandDelegate.settings objectForKey:[key lowercaseString]];
+    return (UIStatusBarStyle)[self.sb_statusBarStyle intValue];
 }
+    
+@end
 
-- (void) checkInfoPlistKey
+
+@implementation CDVStatusBar
+
+- (id)settingForKey:(NSString*)key
 {
-    NSNumber* uiviewControllerBasedStatusBarAppearance = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIViewControllerBasedStatusBarAppearance"];
-    if (uiviewControllerBasedStatusBarAppearance == nil || [uiviewControllerBasedStatusBarAppearance boolValue]) {
-        NSLog(@"ERROR: To use the statusbar plugin, in your app's Info.plist, you need to add a 'UIViewControllerBasedStatusBarAppearance' key with a value of <false/>");
-    }
+    return [self.commandDelegate.settings objectForKey:[key lowercaseString]];
 }
 
 - (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
@@ -52,6 +89,12 @@
 
 - (void)pluginInitialize
 {
+    BOOL isiOS7 = (IsAtLeastiOSVersion(@"7.0"));
+                   
+    // init
+    NSNumber* uiviewControllerBasedStatusBarAppearance = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIViewControllerBasedStatusBarAppearance"];
+    _uiviewControllerBasedStatusBarAppearance = (uiviewControllerBasedStatusBarAppearance == nil || [uiviewControllerBasedStatusBarAppearance boolValue]) && isiOS7;
+    
     // observe the statusBarHidden property
     [[UIApplication sharedApplication] addObserver:self forKeyPath:@"statusBarHidden" options:NSKeyValueObservingOptionNew context:NULL];
     
@@ -126,6 +169,29 @@
     self.statusBarOverlaysWebView = [value boolValue];
 }
 
+- (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
+    }
+}
+    
+- (void) setStyleForStatusBar:(UIStatusBarStyle)style
+{
+    if (_uiviewControllerBasedStatusBarAppearance) {
+        CDVViewController* vc = (CDVViewController*)self.viewController;
+        vc.sb_statusBarStyle = [NSNumber numberWithInt:style];
+        [self refreshStatusBarAppearance];
+        
+    } else {
+        [[UIApplication sharedApplication] setStatusBarStyle:style];
+    }
+}
+    
 - (void) setStatusBarStyle:(NSString*)statusBarStyle
 {
     // default, lightContent, blackTranslucent, blackOpaque
@@ -144,26 +210,22 @@
 
 - (void) styleDefault:(CDVInvokedUrlCommand*)command
 {
-    [self checkInfoPlistKey];
-    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
+    [self setStyleForStatusBar:UIStatusBarStyleDefault];
 }
 
 - (void) styleLightContent:(CDVInvokedUrlCommand*)command
 {
-    [self checkInfoPlistKey];
-    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
+    [self setStyleForStatusBar:UIStatusBarStyleLightContent];
 }
 
 - (void) styleBlackTranslucent:(CDVInvokedUrlCommand*)command
 {
-    [self checkInfoPlistKey];
-    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent];
+    [self setStyleForStatusBar:UIStatusBarStyleBlackTranslucent];
 }
 
 - (void) styleBlackOpaque:(CDVInvokedUrlCommand*)command
 {
-    [self checkInfoPlistKey];
-    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
+    [self setStyleForStatusBar:UIStatusBarStyleBlackOpaque];
 }
 
 - (void) backgroundColorByName:(CDVInvokedUrlCommand*)command
@@ -202,6 +264,19 @@
     
     [self _backgroundColorByHexString:value];
 }
+
+- (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];
+    }
+}
     
 - (void) hide:(CDVInvokedUrlCommand*)command
 {
@@ -210,7 +285,7 @@
     if (!app.isStatusBarHidden)
     {
         self.viewController.wantsFullScreenLayout = YES;
-        [app setStatusBarHidden:YES];
+        [self hideStatusBar];
 
         if (IsAtLeastiOSVersion(@"7.0")) {
             [_statusBarBackgroundView removeFromSuperview];
@@ -220,7 +295,19 @@
         
         self.viewController.view.frame = bounds;
         self.webView.frame = bounds;
+    }
+}
+    
+- (void) showStatusBar
+{
+    if (_uiviewControllerBasedStatusBarAppearance) {
+        CDVViewController* vc = (CDVViewController*)self.viewController;
+        vc.sb_hideStatusBar = [NSNumber numberWithBool:NO];
+        [self refreshStatusBarAppearance];
 
+    } else {
+        UIApplication* app = [UIApplication sharedApplication];
+        [app setStatusBarHidden:NO];
     }
 }
     
@@ -233,7 +320,7 @@
         BOOL isIOS7 = (IsAtLeastiOSVersion(@"7.0"));
         self.viewController.wantsFullScreenLayout = isIOS7;
         
-        [app setStatusBarHidden:NO];
+        [self showStatusBar];
         
         if (isIOS7) {
             CGRect bounds = [[UIScreen mainScreen] bounds];