Browse Source

Add method to hide system bar.

Caijinglong 6 years ago
parent
commit
b97770edbf

+ 32 - 17
android/src/main/java/top/kikt/ijkplayer/IjkplayerPlugin.kt

@@ -15,13 +15,13 @@ import tv.danmaku.ijk.media.player.IjkMediaPlayer
  * IjkplayerPlugin
  */
 class IjkplayerPlugin(private val registrar: Registrar) : MethodCallHandler {
-
+    
     override fun onMethodCall(call: MethodCall, result: Result) {
         IjkMediaPlayer.loadLibrariesOnce(null)
         IjkMediaPlayer.native_profileBegin("libijkplayer.so")
         handleMethodCall(call, result)
     }
-
+    
     private fun handleMethodCall(call: MethodCall, result: Result) {
         when (call.method) {
             "init" -> {
@@ -76,25 +76,40 @@ class IjkplayerPlugin(private val registrar: Registrar) : MethodCallHandler {
                 setBrightness(WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE)
                 result.success(true)
             }
+            "showStatusBar" -> {
+                val show = call.arguments<Boolean>()
+                setStatusBar(show)
+            }
             else -> result.notImplemented()
         }
     }
-
+    
+    private fun setStatusBar(show: Boolean) {
+        val window = registrar.activity()?.window ?: return
+        if (show) {
+            window.addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
+            window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
+        } else {
+            window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
+            window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN)
+        }
+    }
+    
     private fun getSystemVolume(): Int {
         val max = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC).toFloat()
         return (audioManager.getStreamVolume(AudioManager.STREAM_MUSIC).toFloat() / max * 100).toInt()
     }
-
+    
     private fun setVolume(volume: Int) {
         audioManager.apply {
             val max = getStreamMaxVolume(AudioManager.STREAM_MUSIC)
-
+            
             val step = 100.toFloat() / max.toFloat()
-
+            
             val current = getSystemVolume()
-
+            
             val progress = current * step
-
+            
             if (volume > progress) {
                 volumeDown()
             } else if (volume < progress) {
@@ -102,42 +117,42 @@ class IjkplayerPlugin(private val registrar: Registrar) : MethodCallHandler {
             }
         }
     }
-
+    
     private fun volumeUp() {
         audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND)
     }
-
+    
     private fun volumeDown() {
         audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND)
     }
-
+    
     private val audioManager: AudioManager
         get() = registrar.activity().getSystemService(Context.AUDIO_SERVICE) as AudioManager
-
+    
     private fun setBrightness(brightness: Float) {
         val window = registrar.activity().window
         val lp = window.attributes
         lp.screenBrightness = brightness
         window.attributes = lp
     }
-
+    
     private fun getBrightness(): Float {
         val window = registrar.activity().window
         val lp = window.attributes
         return lp.screenBrightness
     }
-
+    
     fun MethodCall.getLongArg(key: String): Long {
         return this.argument<Int>(key)!!.toLong()
     }
-
+    
     fun MethodCall.getLongArg(): Long {
         return this.arguments<Int>().toLong()
     }
-
+    
     companion object {
         lateinit var manager: IjkManager
-
+        
         /**
          * Plugin registration.
          */

+ 7 - 3
example/ios/Runner.xcodeproj/project.pbxproj

@@ -198,6 +198,7 @@
 			developmentRegion = English;
 			hasScannedForEncodings = 0;
 			knownRegions = (
+				English,
 				en,
 				Base,
 			);
@@ -379,7 +380,7 @@
 			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 344756CAN4;
 				ENABLE_BITCODE = NO;
 				FRAMEWORK_SEARCH_PATHS = (
@@ -392,6 +393,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Flutter",
 				);
+				MARKETING_VERSION = 1.0.0;
 				PRODUCT_BUNDLE_IDENTIFIER = top.kikt.ijkplayer.example;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				VALID_ARCHS = "arm64 arm64e";
@@ -506,7 +508,7 @@
 			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 344756CAN4;
 				ENABLE_BITCODE = NO;
 				FRAMEWORK_SEARCH_PATHS = (
@@ -519,6 +521,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Flutter",
 				);
+				MARKETING_VERSION = 1.0.0;
 				PRODUCT_BUNDLE_IDENTIFIER = top.kikt.ijkplayer.example;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				VALID_ARCHS = "arm64 arm64e";
@@ -531,7 +534,7 @@
 			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 344756CAN4;
 				ENABLE_BITCODE = NO;
 				FRAMEWORK_SEARCH_PATHS = (
@@ -544,6 +547,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Flutter",
 				);
+				MARKETING_VERSION = 1.0.0;
 				PRODUCT_BUNDLE_IDENTIFIER = top.kikt.ijkplayer.example;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				VALID_ARCHS = "arm64 arm64e";

+ 8 - 0
example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>

+ 3 - 3
example/ios/Runner/Info.plist

@@ -15,11 +15,11 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>$(FLUTTER_BUILD_NAME)</string>
+	<string>$(MARKETING_VERSION)</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>$(FLUTTER_BUILD_NUMBER)</string>
+	<string>$(CURRENT_PROJECT_VERSION)</string>
 	<key>LSRequiresIPhoneOS</key>
 	<true/>
 	<key>NSPhotoLibraryUsageDescription</key>
@@ -47,6 +47,6 @@
 		<string>UIInterfaceOrientationLandscapeRight</string>
 	</array>
 	<key>UIViewControllerBasedStatusBarAppearance</key>
-	<false/>
+	<true/>
 </dict>
 </plist>

+ 2 - 0
example/lib/page/developing/develop_index.dart

@@ -1,4 +1,5 @@
 import 'package:flutter/material.dart';
+import 'package:ijkplayer_example/page/developing/test_hide_system_bar.dart';
 
 import 'crash_on_set_src_page.dart';
 import 'develop_prepare_page.dart';
@@ -25,6 +26,7 @@ class DevelopingIndexPageState extends State<DevelopingIndexPage> {
           buildButton("直播中断", LiveInterruptionPage()),
           buildButton("视频源错误", SreErrorPage()),
           buildButton("新的全屏", NewFullScreenPage()),
+          buildButton("隐藏或显示状态栏", TestHideSystemBar()),
         ],
       ),
     );

+ 34 - 0
example/lib/page/developing/test_hide_system_bar.dart

@@ -0,0 +1,34 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+
+class TestHideSystemBar extends StatefulWidget {
+  @override
+  _TestHideSystemBarState createState() => _TestHideSystemBarState();
+}
+
+class _TestHideSystemBarState extends State<TestHideSystemBar> {
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text("Test system bar"),
+      ),
+      body: Column(
+        children: <Widget>[
+          FlatButton(
+            child: Text("show"),
+            onPressed: () => show(true),
+          ),
+          FlatButton(
+            child: Text("hide"),
+            onPressed: () => show(false),
+          ),
+        ],
+      ),
+    );
+  }
+
+  show(bool show) {
+    IjkManager.showStatusBar(show);
+  }
+}

+ 19 - 0
ios/Classes/FlutterViewController+CoolStatusBarHidden.h

@@ -0,0 +1,19 @@
+//
+//  FlutterViewController+CoolViewController.h
+//  flutter_ijkplayer
+//
+//  Created by Caijinglong on 2019/11/8.
+//
+#import <Flutter/Flutter.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FlutterViewController (CoolViewController)
+
+-(void)showStatusBar;
+
+-(void)hideStatusBar;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 44 - 0
ios/Classes/FlutterViewController+CoolStatusBarHidden.m

@@ -0,0 +1,44 @@
+//
+//  FlutterViewController+CoolViewController.m
+//  flutter_ijkplayer
+//
+//  Created by Caijinglong on 2019/11/8.
+//
+
+#import "FlutterViewController+CoolStatusBarHidden.h"
+#import <objc/runtime.h>
+
+@implementation FlutterViewController (CoolViewController)
+
+-(void)showStatusBar{
+    objc_setAssociatedObject(self, @selector(showStatusBar), @"show", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+    [UIView animateWithDuration:1 animations:^{
+          [self setNeedsStatusBarAppearanceUpdate];
+    }];
+}
+
+-(void)hideStatusBar{
+    objc_setAssociatedObject(self, @selector(showStatusBar), @"hide", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+    [UIView animateWithDuration:1 animations:^{
+          [self setNeedsStatusBarAppearanceUpdate];
+    }];
+}
+
+-(BOOL)isStatusBarShow{
+    NSString *value = objc_getAssociatedObject(self, @selector(showStatusBar));
+    return ![value isEqualToString:@"hide"];
+}
+
+- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation{
+    return UIStatusBarAnimationFade;
+}
+
+-(BOOL)prefersStatusBarHidden{
+    return ![self isStatusBarShow];
+}
+
+-(void)viewDidDisappear:(BOOL)animated{
+    objc_removeAssociatedObjects(self);
+}
+
+@end

+ 47 - 2
ios/Classes/IjkplayerPlugin.m

@@ -2,6 +2,7 @@
 #import "IjkplayerPlugin.h"
 #import "CoolFlutterIjkManager.h"
 #import "CoolFlutterIJK.h"
+#import "FlutterViewController+CoolStatusBarHidden.h"
 
 NSString *flutterOrientationNotifyName = @"io.flutter.plugin.platform.SystemChromeOrientationNotificationName";
 const NSString *flutterOrientationNotifyKey = @"io.flutter.plugin.platform.SystemChromeOrientationNotificationKey";
@@ -115,6 +116,9 @@ static IjkplayerPlugin *__sharedInstance;
         } else if([@"unlockOrientation" isEqualToString:call.method]){
             [self unlockOrientation];
             result(@YES);
+        } else if([@"showStatusBar" isEqualToString:call.method]) {
+            BOOL showStatusBar = [call.arguments boolValue];
+            [self setStatusBarToShow:showStatusBar];
         } else {
             result(FlutterMethodNotImplemented);
         }
@@ -146,7 +150,7 @@ static IjkplayerPlugin *__sharedInstance;
     for (id number in orientations) {
         int value = [number intValue];
         UIDeviceOrientation orientation = [self convertIntToOrientation:value];
-        NSLog(@"orientation = %ld",orientation);
+        NSLog(@"orientation = %ld",(long)orientation);
         if (orientation == UIDeviceOrientationPortrait){
             mask |= UIInterfaceOrientationMaskPortrait;
         }else if (orientation == UIDeviceOrientationLandscapeLeft) {
@@ -306,8 +310,49 @@ static IjkplayerPlugin *__sharedInstance;
 //    [volumeView removeFromSuperview];
 }
 
--(void) hideSystemVolumeBar {
+-(void)hideSystemVolumeBar {
+    
+}
+
+-(void)setStatusBarToShow:(BOOL)show{
+    UIViewController *ctl = [self getCurrentUIViewController];
+    if([ctl isKindOfClass:[FlutterViewController class] ]){
+        FlutterViewController *fCtl = (FlutterViewController*)ctl;
+        if(show){
+            [fCtl showStatusBar];
+        }else{
+            [fCtl hideStatusBar];
+        }
+    }
+}
+
+-(UIViewController*) getCurrentUIViewController{
+    UIViewController *result = nil;
+    UIWindow *window = [[UIApplication sharedApplication] keyWindow];
+    
+    if(window.windowLevel != UIWindowLevelNormal){
+        NSArray *windows =[[UIApplication sharedApplication ]windows];
+        for(UIWindow *tmp in windows){
+            window = tmp;
+            break;
+        }
+    }
+    
+    result = window.rootViewController;
+    
+    while (result.presentedViewController) {
+        result = result.presentedViewController;
+    }
+    
+    if([result isKindOfClass:[UITabBarController class]]){
+        result = [(UITabBarController*)result selectedViewController];
+    }
+    
+    if([result isKindOfClass:[UINavigationController class]]){
+        result = [(UINavigationController*) result visibleViewController];
+    }
     
+    return result;
 }
 
 @end

+ 6 - 0
lib/src/engine/manager.dart

@@ -140,4 +140,10 @@ class IjkManager {
       _globalChannel.invokeMethod("unlockOrientation");
     }
   }
+
+  static showStatusBar(bool show) async {
+    if (Platform.isIOS || Platform.isAndroid) {
+      _globalChannel.invokeMethod("showStatusBar", show);
+    }
+  }
 }