Android11动态控制状态栏

1.setting中添加一个显示状态栏的开关控件:

  1.1 布局xml文件:

diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index a63588a..ce66eba 100755
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -4976,6 +4976,10 @@
     <string name="system_navibar">显示导航栏</string>
     <string name="system_navibar_tip">勾选打开导航栏</string>
 
+     <!--status_bar-->
+    <string name="system_statusbar">显示状态栏</string>
+    <string name="system_statusbar_tip">勾选打开状态栏栏</string>
+
     <!--hdmi settings-->
     <string name="system_rotation">"系统方向"</string>
     <string name="screen_title">"屏幕设置"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 11067d9..b611a15 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -12247,6 +12247,10 @@
     <string name="system_navibar" >navi_bar</string>
     <string name="system_navibar_tip" >Select navi_bar</string>
 
+    <!--status_bar-->
+    <string name="system_statusbar">status_bar</string>
+    <string name="system_statusbar_tip">Select status_bar</string>
+
     <!--hdmi settings-->
     <string name="hdmi_settings">HDMI</string>
     <string name="system_rotation">System Direction</string>
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index 842e1e5..a635082 100755
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -77,6 +77,12 @@
         settings:keywords="@string/system_navibar_tip"
         settings:controller="com.android.settings.display.NavigationBarController" />
 
+    <SwitchPreference
+        android:key="system_status_bar_preference"
+        android:title="@string/system_statusbar"
+        settings:keywords="@string/system_statusbar_tip"
+        settings:controller="com.android.settings.display.StatusBarController" />
+
     <Preference
         android:key="adaptive_sleep_entry"
         android:title="@string/adaptive_sleep_title"

1.2 Java代码:

packages\apps\Settings\src\com\android\settings\display\StatusBarController.java

/*
 * Copyright (C) 2016 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.settings.display;

import android.app.settings.SettingsEnums;
import android.content.Context;
import android.text.TextUtils;

import androidx.preference.Preference;

import com.android.internal.view.RotationPolicy;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.TogglePreferenceController;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.LifecycleObserver;

import android.util.Log;
import android.os.UserHandle;
import android.content.Intent;
import android.os.SystemProperties;

public class StatusBarController extends TogglePreferenceController implements
        PreferenceControllerMixin, Preference.OnPreferenceChangeListener{

    private final MetricsFeatureProvider mMetricsFeatureProvider;
    private Preference mPreference;
    private RotationPolicy.RotationPolicyListener mRotationPolicyListener;

    public StatusBarController(Context context, String key) {
        super(context, key);
        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
    }

    @Override
    public void updateState(Preference preference) {
        mPreference = preference;
        super.updateState(preference);
    }


    @Override
    public int getAvailabilityStatus() {
        return RotationPolicy.isRotationLockToggleVisible(mContext)
                ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
    }

    @Override
    public boolean isSliceable() {
        return TextUtils.equals(getPreferenceKey(), "system_status_bar_preference");
    }

    @Override
    public boolean isPublicSlice() {
        return true;
    }

    // @Override
    // public boolean isChecked() {
    //     return !RotationPolicy.isRotationLocked(mContext);
    // }

    public boolean isChecked() {
        boolean isChecked;
        String nvbval = SystemProperties.get("persist.sys.statusbar");
        if("1".equals(nvbval)){
            isChecked = true;
        }else{
            isChecked = false;
        }
        return isChecked;
    }

    @Override
    public boolean setChecked(boolean isChecked) {
        boolean value = isChecked;
        
        if (value == true)
        {
            // SystemProperties.set("persist.sys.statusbar", "1");
            Intent intent = new Intent();
            intent.setAction("com.android.StatusBar.status");
            intent.putExtra("value", true);
            mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
        }
        else{
            // SystemProperties.set("persist.sys.statusbar", "0");
            Intent intent = new Intent();
            intent.setAction("com.android.StatusBar.status");
            intent.putExtra("value", false);
            mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
        }
        
        return true;
    }
}

这里面实现了按钮的开关,发送相对应的广播给framework层,实现状态栏的显示或者隐藏。添加完成设置中显示如下:

 

 2.framework层的实现:

  2.1添加监听的广播:

diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index c20bce1..be58d18 100755
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -1294,6 +1294,7 @@ public class StatusBar extends SystemUI implements DemoMode,
         filter.addAction(Intent.ACTION_SCREEN_OFF);
         filter.addAction(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG);
         filter.addAction("com.android.navigation.status");
+        filter.addAction("com.android.StatusBar.status");
         mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, null, UserHandle.ALL);
     }
 
@@ -2826,6 +2827,12 @@ public class StatusBar extends SystemUI implements DemoMode,
                     if(mNavigationBarView != null) return;
                     createNavigationBar(mresult);                              
                 }
+            }else  if(intent.getAction().equals("com.android.StatusBar.status")){
+                if(intent.getBooleanExtra("value",false)){
+                        SystemProperties.set("persist.sys.statusbar", "1");
+                }else{
+                        SystemProperties.set("persist.sys.statusbar", "0");
+                }
             }
         }
     };

  2.2 通过读取persist.sys.statusbar属性,判断是隐藏还是显示状态栏:

  packages\SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBarView.java

 

 

onTouchEvent直接return false就可以隐藏状态栏。

其中persist.sys.nvbshow这个属性的定义是从build.prop读取的。

device/rockchip/rk356x

 

diff --git a/rk3568_r/rk3568_r.mk b/rk3568_r/rk3568_r.mk
index 9af1129..6b36938 100755
--- a/rk3568_r/rk3568_r.mk
+++ b/rk3568_r/rk3568_r.mk
@@ -47,3 +47,4 @@ PRODUCT_PROPERTY_OVERRIDES += persist.bt.power.down=true
PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.einit-1=1
PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.efull-1=true
PRODUCT_PROPERTY_OVERRIDES += persist.sys.nvbshow=0
+PRODUCT_PROPERTY_OVERRIDES += persist.sys.statusbar=0

posted @ 2022-06-14 17:24  M-kobe  阅读(259)  评论(0编辑  收藏  举报