Android10.0 导航栏和状态栏动态控制合集

简介: Android10.0 导航栏和状态栏动态控制合集

文件清单


  add   vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/SharedConfig.java
  modified:   vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
  modified:   vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
  modified:   vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
  modified:   vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
  modified:   vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java


一、动态控制导航栏虚拟按键(Home/RecentAPP/Back)


vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/SharedConfig.java

/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed 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
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * 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.
 */
package com.android.systemui.statusbar.phone;
import android.util.Log;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
class SharedConfig {
    private SharedConfig(){};
    private static SharedConfig instance;
    private static final String CONFIG_FILE_NAME =  "CONFIG";
    private SharedPreferences sharedPreferences;
    private Editor editor;
    public static final String KEY_PANEL_BAR = "KEY_PANEL_BAR";
    public static final String KEY_PANEL_GONE = "KEY_PANEL_GONE";
    public static final String KEY_NAVIGATION_BAR = "KEY_NAVIGATION_BAR";
    public static final String KEY_NAVIGATION_BUTTON = "KEY_NAVIGATION_BUTTON";
    private SharedConfig(Context context) {
        sharedPreferences = context.getSharedPreferences(CONFIG_FILE_NAME, Context.MODE_PRIVATE);
        editor = sharedPreferences.edit();
    }
    public static SharedConfig getInstance(Context context) {
    if (instance == null) {
      instance = new SharedConfig(context);
    }
    return instance;
  }
  public boolean writeData(String key, boolean value) {
    Log.e("systemui", "put   key=" + key + "   value="+value);
    boolean result = false;
    editor.putBoolean(key, value);
    result = editor.commit();
    return result;
  }
  public boolean readBoolean(String key, boolean def) {
    boolean result = sharedPreferences.getBoolean(key, def);
    Log.e("systemui", "get   key=" + key + "   value="+result);
    return result;
  }
  public boolean writeData(String key, String value) {
    Log.e("systemui", "put   key=" + key + "   value="+value);
    boolean result = false;
    editor.putString(key, value);
    result = editor.commit();
    return result;
  }
  public String readString(String key, String def) {
    String result = sharedPreferences.getString(key, def);
    Log.e("systemui", "get   key=" + key + "   value="+result);
    return result;
  }
}

vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java

@@ -1038,6 +1060,11 @@ public class StatusBar extends SystemUI implements DemoMode,
         filter.addAction(Intent.ACTION_SCREEN_OFF);
         filter.addAction(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG);
+        // add for handle navigationbar button
+        filter.addAction(OP_BUTTON);
         context.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null);
+    private static final String OP_BUTTON = "cc.intent.systemui.SHOW_NAVIGATION_BUTTON";
     private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -2637,6 +2670,56 @@ public class StatusBar extends SystemUI implements DemoMode,
             }
             else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) {
                 mQSPanel.showDeviceMonitoringDialog();
+            }else if (OP_BUTTON.equals(action)) {
+                if(intent.hasExtra("show_navigation_button")){
+                    String buttonStr = intent.getStringExtra("show_navigation_button");
+                    SharedConfig.getInstance(mContext).writeData(SharedConfig.KEY_NAVIGATION_BUTTON, buttonStr);
+                    Log.e("StatusBar", "OP_BUTTON: " + buttonStr);
+                    NavigationBarFragment mNavigationBar = mNavigationBarController.getDefaultNavigationBarFragment();
+                    if (mNavigationBar != null) mNavigationBar.notifyNavigationBarScreenOn();
+                }else{
+                    Log.w("StatusBar","didn't contain show_navigation_button key");
+                }
             }


vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java

@@ -212,7 +212,8 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
                 buttonDispatcher = mNavigationBarView.getHomeHandle();
             }
             if (buttonDispatcher != null) {
-                buttonDispatcher.setVisibility(alpha > 0 ? View.VISIBLE : View.INVISIBLE);
+                       //annotaion don't change backButton visiblity
+                //buttonDispatcher.setVisibility(alpha > 0 ? View.VISIBLE : View.INVISIBLE);
                 buttonDispatcher.setAlpha(alpha, animate);
             }
         }
-    private void notifyNavigationBarScreenOn() {
-        mNavigationBarView.updateNavButtonIcons();
+    //change private to public
+    public void notifyNavigationBarScreenOn() {
+        if (mNavigationBarView != null) {
+            mNavigationBarView.updateNavButtonIcons();
+        }
     }

vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java

@@ -647,6 +647,18 @@ public class NavigationBarView extends FrameLayout implements
         getBackButton().setVisibility(disableBack      ? View.INVISIBLE : View.VISIBLE);
         getHomeButton().setVisibility(disableHome      ? View.INVISIBLE : View.VISIBLE);
         getRecentsButton().setVisibility(disableRecent ? View.INVISIBLE : View.VISIBLE);
+
+        invalidButtonVisibility();
+    }
+       
+       public void invalidButtonVisibility(){
+        String buttonStr = SharedConfig.getInstance(mContext).readString(SharedConfig.KEY_NAVIGATION_BUTTON,
+         "b_h_r");
+        getBackButton().setVisibility(buttonStr.contains("b") ? View.VISIBLE : View.INVISIBLE);  
+        getHomeButton().setVisibility(buttonStr.contains("h") ? View.VISIBLE : View.INVISIBLE);  
+        getRecentsButton().setVisibility(buttonStr.contains("r") ? View.VISIBLE : View.INVISIBLE);
     }

二、动态控制 NavigationBar(显示/隐藏)


vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java

@@ -155,6 +155,7 @@ public class NavigationBarController implements Callbacks {
             navBar.setAutoHideController(autoHideController);
             navBar.restoreSystemUiVisibilityState();
             mNavigationBars.append(displayId, navBar);
+            mDisplayId = displayId;
             if (result != null) {
                 navBar.setImeWindowStatus(display.getDisplayId(), result.mImeToken,
         });
     }
+    //add
+    private int mDisplayId;
+    public void removeNavigationBarView(){
+        removeNavigationBar(mDisplayId);
+    }
+
     private void removeNavigationBar(int displayId) {

vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java

@@ -623,6 +624,8 @@ public class StatusBar extends SystemUI implements DemoMode,
             AppOpsManager.OP_COARSE_LOCATION,
             AppOpsManager.OP_FINE_LOCATION};
+    RegisterStatusBarResult result = null;
+
         mCommandQueue.addCallback(this);
-        RegisterStatusBarResult result = null;
+        /*RegisterStatusBarResult result = null;*/
         try {
             result = mBarService.registerStatusBar(mCommandQueue);
         } catch (RemoteException ex) {
@@ -802,6 +805,14 @@ public class StatusBar extends SystemUI implements DemoMode,
         mStatusBarWindow.setService(this);
         mStatusBarWindow.setOnTouchListener(getStatusBarWindowTouchListener());
+        //add ,whether to show status bar[S]
+        boolean showStatusBar = SharedConfig.getInstance(mContext).readBoolean(SharedConfig.KEY_PANEL_GONE, true);
+        Log.v(TAG, "makeStatusBarView showStatusBar=" + showStatusBar);
+        if(mStatusBarWindow!=null)
+            mStatusBarWindow.setVisibility(showStatusBar ? View.VISIBLE : View.GONE);
+        //add ,whether to show status bar[E]
+
+
         putComponent(HeadsUpManager.class, mHeadsUpManager);
-        createNavigationBar(result);
+        try {
+            boolean showNav_Temp = SharedConfig.getInstance(mContext).readBoolean(SharedConfig.KEY_NAVIGATION_BAR, true);
+            
+            if (DEBUG) Log.v(TAG, "hasNavigationBar=" + showNav_Temp);
+            if (showNav_Temp) {
+                 createNavigationBar(result);
+            }
+        } catch (Exception ex) {
+            // no window manager? good luck with that
+        }
         if (ENABLE_LOCKSCREEN_WALLPAPER) {
+        filter.addAction(OP_NAVIGATION);
         context.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null);
         IntentFilter demoFilter = new IntentFilter();
+    private static final String OP_NAVIGATION = "cc.intent.systemui.WHETHER_SHOW_NAVIGATION";
     private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             }
             else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) {
                 mQSPanel.showDeviceMonitoringDialog();
+            }else if (OP_NAVIGATION.equals(action)) {
+                if(intent.hasExtra("show_navigation_bar")){
+                    boolean show = intent.getBooleanExtra("show_navigation_bar", true);
+                    Log.e("StatusBar", "OP_NAVIGATION: " + show);
+                     NavigationBarView mNavigationBarView = mNavigationBarController.getDefaultNavigationBarView();
+                    
+                    if (show) {
+                        if (mNavigationBarView != null) return;
+
+                        createNavigationBar(result);
+                        SharedConfig.getInstance(mContext).writeData(SharedConfig.KEY_NAVIGATION_BAR, true);
+                    }else{
+                        if (mNavigationBarView == null) return;
+
+                        mNavigationBarController.removeNavigationBarView();
+                        //mNavigationBarView = null;
+                        SharedConfig.getInstance(mContext).writeData(SharedConfig.KEY_NAVIGATION_BAR, false);
+                    }
+                }else{
+                    Log.w("StatusBar","didn't contain navigation_bar_show key");
+                }
+            }

三、动态控制 StatusBar(显示/隐藏/禁止下拉)


显示/隐藏


vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java

@@ -802,6 +805,14 @@ public class StatusBar extends SystemUI implements DemoMode,
         mStatusBarWindow.setService(this);
         mStatusBarWindow.setOnTouchListener(getStatusBarWindowTouchListener());
+        //add ,whether to show status bar[S]
+        boolean showStatusBar = SharedConfig.getInstance(mContext).readBoolean(SharedConfig.KEY_PANEL_GONE, true);
+        Log.v(TAG, "makeStatusBarView showStatusBar=" + showStatusBar);
+        if(mStatusBarWindow!=null)
+            mStatusBarWindow.setVisibility(showStatusBar ? View.VISIBLE : View.GONE);
+        //add ,whether to show status bar[E]
+
+
+        filter.addAction(OP_PANELBAR);
+        filter.addAction(OP_STATUSBAR);
         context.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null);
        IntentFilter demoFilter = new IntentFilter();
+    private static final String OP_PANELBAR = "cc.intent.systemui.OPEN_PANEL_ENABLED";
+    private static final String OP_STATUSBAR = "cc.intent.systemui.WHETHER_SHOW_STATUSBAR";
     private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) {
                 mQSPanel.showDeviceMonitoringDialog();
+            }else if (OP_PANELBAR.equals(action)) {
+                if(intent.hasExtra("open_panel_enabled")){
+                    boolean result = intent.getBooleanExtra("open_panel_enabled",true);
+                    SharedConfig.getInstance(mContext).writeData(SharedConfig.KEY_PANEL_BAR, result);
+                    Log.e("StatusBar", "OP_PANELBAR: " + result);
+                }else{
+                    Log.w("StatusBar","didn't contain open_panel_enabled key");
+                }
+            }else if (OP_STATUSBAR.equals(action)) {
+                if(intent.hasExtra("show_status_bar")){
+                    boolean result = intent.getBooleanExtra("show_status_bar",true);
+                    SharedConfig.getInstance(mContext).writeData(SharedConfig.KEY_PANEL_GONE, result);
+                    if(mStatusBarWindow!=null){
+                       mStatusBarWindow.setVisibility(result ? View.VISIBLE : View.GONE);
+                    }
+                    Log.e("StatusBar", "OP_STATUSBAR: " + result);
+                }else{
+                    Log.w("StatusBar","didn't contain show_status_bar key");
+                }
+            }


禁止下拉

vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java

@@ -230,7 +230,10 @@ public class PhoneStatusBarView extends PanelBar {
             }
         }
-        return barConsumedEvent || super.onTouchEvent(event);
+        // modify
+        // return barConsumedEvent || super.onTouchEvent(event);
+        boolean isEnable = SharedConfig.getInstance(mContext).readBoolean(SharedConfig.KEY_PANEL_BAR, true);
+        return isEnable ? barConsumedEvent || super.onTouchEvent(event) : isEnable;
     }


目录
相关文章
|
Java API Android开发
Android 最新实现沉浸式状态栏的效果
Android 最新实现沉浸式状态栏的效果
260 0
|
14天前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
111 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
9月前
|
Android开发
Android 状态栏WiFi图标的显示逻辑
Android 状态栏WiFi图标的显示逻辑
217 0
|
6月前
|
API Android开发 开发者
Android经典实战之用WindowInsetsControllerCompat方便的显示和隐藏状态栏和导航栏
本文介绍 `WindowInsetsControllerCompat` 类,它是 Android 提供的一种现代化工具,用于处理窗口插入如状态栏和导航栏的显示与隐藏。此类位于 `androidx.core.view` 包中,增强了跨不同 Android 版本的兼容性。主要功能包括控制状态栏与导航栏的显示、设置系统窗口行为及调整样式。通过 Kotlin 代码示例展示了如何初始化并使用此类,以及如何设置系统栏的颜色样式。
307 2
|
6月前
|
API Android开发 Kotlin
Android实战经验分享之如何获取状态栏和导航栏的高度
在Android开发中,掌握状态栏和导航栏的高度对于优化UI布局至关重要。本文介绍两种主要方法:一是通过资源名称获取,简单且兼容性好;二是利用WindowInsets,适用于新版Android,准确性高。文中提供了Kotlin代码示例,并对比了两者的优缺点及适用场景。
474 1
|
7月前
|
XML Android开发 数据格式
Android面试题之DialogFragment中隐藏导航栏
在Android中展示全屏`DialogFragment`并隐藏状态栏和导航栏,可通过设置系统UI标志实现。 记得在布局文件中添加内容,并使用`show()`方法显示`DialogFragment`。
89 2
|
8月前
|
API Android开发
31. 【Android教程】状态栏通知:Notification
31. 【Android教程】状态栏通知:Notification
634 1
|
9月前
|
XML 存储 测试技术
Android系统 添加动态控制SystemUI状态栏、导航栏和下拉菜单
Android系统 添加动态控制SystemUI状态栏、导航栏和下拉菜单
1544 1
|
9月前
|
XML Android开发 数据格式
android 9 Systemui 动态隐藏导航栏
android 9 Systemui 动态隐藏导航栏
281 0
|
9月前
|
XML Java Android开发
Android Studio App开发中工具栏Toolbar、溢出菜单OverflowMenu、标签布局TabLayout的讲解及实战(实现京东App的标签导航栏,附源码)
Android Studio App开发中工具栏Toolbar、溢出菜单OverflowMenu、标签布局TabLayout的讲解及实战(实现京东App的标签导航栏,附源码)
743 0

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 6
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 7
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 10
    Android 13 SystemUI 启动流程
  • 1
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    23
  • 2
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    21
  • 3
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    52
  • 4
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    35
  • 5
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    70
  • 6
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    111
  • 7
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
    29
  • 8
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
    264
  • 9
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
    75
  • 10
    【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    36