rk3288 android9.0 设置界面添加状态栏按钮

前言

        我们公司是做工控机行业的,默认在android系统下是不允许有状态栏和导航栏的,之前在rk3288 android7.1.2系统下做过类似的处理,移植到rk3288 android9.0下面,两个版本在状态栏的代码差异还是比较大的,下面简单记录一下在android9.0上面添加状态栏按钮。

下面图片是完成后的状态

 当前状态栏的开启和关闭都使用广播实现

一、添加广播

1、添加系统广播首先要添加数据接口

frameworks/base/api/current.txt

     field public static final java.lang.String ACTION_ATTACH_DATA = "android.intent.action.ATTACH_DATA";
+    field public static final java.lang.String ACTION_BAR_SHOW = "android.intent.action.BAR_SHOW";
+    field public static final java.lang.String ACTION_BAR_HIDE = "android.intent.action.BAR_HIDE";
     field public static final java.lang.String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";

2、定义广播内容

frameworks/base/core/java/android/content/Intent.java
    public static final String ACTION_BAR_SHOW = "android.intent.action.BAR_SHOW";
    public static final String ACTION_BAR_HIDE = "android.intent.action.BAR_HIDE";

3、动态注册广播

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
    filter.addAction(Intent.ACTION_BAR_SHOW);
    filter.addAction(Intent.ACTION_BAR_HIDE);

4、广播接收处理

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (DEBUG) Log.v(TAG, "onReceive: " + intent);
            String action = intent.getAction();
            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
                KeyboardShortcuts.dismiss();
                if (mRemoteInputManager.getController() != null) {
                    mRemoteInputManager.getController().closeRemoteInputs();
                }
                if (mLockscreenUserManager.isCurrentProfile(getSendingUserId())) {
                    int flags = CommandQueue.FLAG_EXCLUDE_NONE;
                    String reason = intent.getStringExtra("reason");
                    if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                        flags |= CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL;
                    }
                    animateCollapsePanels(flags);
                }
            }
            else if (Intent.ACTION_BAR_SHOW.equals(action)) {
                addBarInside();
                Settings.System.putInt(mContext.getContentResolver(), Settings.System.HIDE_NAVIGATION, 0);
                Log.d(TAG, "android.intent.action.ACTION_BAR_SHOW");
            }
            else if (Intent.ACTION_BAR_HIDE.equals(action)) {
                removeBar();
                Settings.System.putInt(mContext.getContentResolver(), Settings.System.HIDE_NAVIGATION, 1);
                Log.d(TAG, "android.intent.action.ACTION_BAR_HIDE");
            }
            else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
                finishBarAnimations();
                resetUserExpandedStates();
            }
            else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) {
                mQSPanel.showDeviceMonitoringDialog();
            }
        }
    };

5、添加/移除状态栏和导航栏

  frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java 
    private boolean mBarIsAdd = true;
    private void changeBarStatus()
    {
        boolean show_systembar = Settings.System.getInt(mContext.getContentResolver(),Settings.System.HIDE_NAVIGATION,0)==1;
         if(show_systembar)
         {
             addBarInside();
         }
         else
         {
             removeBar();
         }
    }

    private void addBarInside(){
        boolean show_systembar = Settings.System.getInt(mContext.getContentResolver(),Settings.System.HIDE_NAVIGATION,0)==1;
        if (!mBarIsAdd && show_systembar){
            Log.d(TAG,"add Bar");
            createNavigationBar();
            mStatusBarWindow.setVisibility(View.VISIBLE);
            Settings.System.putInt(mContext.getContentResolver(),Settings.System.HIDE_NAVIGATION, 1);
            mBarIsAdd = true;
        }
    }

    private void removeBar(){
        if (mBarIsAdd){
            Log.d(TAG,"remove Bar");
        if (mNavigationBarView != null)
            mWindowManager.removeView(mNavigationBarView);
        if (mStatusBarWindow != null)
            mStatusBarWindow.setVisibility(View.GONE);
            mBarIsAdd = false;
        }
        Settings.System.putInt(mContext.getContentResolver(),Settings.System.HIDE_NAVIGATION, 0);
    }

6、系统初始状态栏设置

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
    @@ -909,7 +909,9 @@ public class StatusBar extends SystemUI implements DemoMode,
             boolean showNav = mWindowManagerService.hasNavigationBar();
             if (DEBUG) Log.v(TAG, "hasNavigationBar=" + showNav);
             if (showNav) {
-                createNavigationBar();
+                if (1 == Settings.System.getInt(mContext.getContentResolver(), Settings.System.HIDE_NAVIGATION, 1)) {
+                    createNavigationBar();
+                }
             }

二、保存设置到数据库

1、添加数据到数据库

frameworks/base/core/java/android/provider/Settings.java
    @@ -3525,6 +3525,16 @@ public final class Settings {
          */
         public static final Uri DEFAULT_NOTIFICATION_URI = getUriFor(NOTIFICATION_SOUND);
 
+        /**
+         * add by wuxb
+         * Whether hide navigation
+         * 0 = no
+         * 1 = yes
+         */
+        public static final String HIDE_NAVIGATION = "hide_navigation";
+        public static final Uri HIDE_NAVIGATION_URI = getUriFor(HIDE_NAVIGATION);
+        private static final Validator HIDE_NAVIGATION_VALIDATOR = URI_VALIDATOR;
+
         /** {@hide} */
         public static final String NOTIFICATION_SOUND_CACHE = "notification_sound_cache";
         /** {@hide} */
@@ -4162,6 +4172,7 @@ public final class Settings {
             RINGTONE,
             LOCK_TO_APP_ENABLED,
             NOTIFICATION_SOUND,
+            HIDE_NAVIGATION,
             ACCELEROMETER_ROTATION,
             SHOW_BATTERY_PERCENT,
             NOTIFICATION_VIBRATION_INTENSITY,
@@ -4217,6 +4228,7 @@ public final class Settings {
             PUBLIC_SETTINGS.add(VOLUME_BLUETOOTH_SCO);
             PUBLIC_SETTINGS.add(RINGTONE);
             PUBLIC_SETTINGS.add(NOTIFICATION_SOUND);
+            PUBLIC_SETTINGS.add(HIDE_NAVIGATION);
             PUBLIC_SETTINGS.add(ALARM_ALERT);
             PUBLIC_SETTINGS.add(TEXT_AUTO_REPLACE);
             PUBLIC_SETTINGS.add(TEXT_AUTO_CAPS);
@@ -4314,6 +4326,7 @@ public final class Settings {
             VALIDATORS.put(HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
             VALIDATORS.put(RINGTONE, RINGTONE_VALIDATOR);
             VALIDATORS.put(NOTIFICATION_SOUND, NOTIFICATION_SOUND_VALIDATOR);
+            VALIDATORS.put(HIDE_NAVIGATION, HIDE_NAVIGATION_VALIDATOR);
             VALIDATORS.put(ALARM_ALERT, ALARM_ALERT_VALIDATOR);
             VALIDATORS.put(TEXT_AUTO_REPLACE, TEXT_AUTO_REPLACE_VALIDATOR);
             VALIDATORS.put(TEXT_AUTO_CAPS, TEXT_AUTO_CAPS_VALIDATOR);

2、添加数据接口

frameworks/base/api/current.txt
    @@ -36778,6 +36780,7 @@ package android.provider {
     field public static final deprecated java.lang.String DEBUG_APP = "debug_app";
     field public static final android.net.Uri DEFAULT_ALARM_ALERT_URI;
     field public static final android.net.Uri DEFAULT_NOTIFICATION_URI;
+    field public static final android.net.Uri HIDE_NAVIGATION_URI;
     field public static final android.net.Uri DEFAULT_RINGTONE_URI;
     field public static final deprecated java.lang.String DEVICE_PROVISIONED = "device_provisioned";
     field public static final deprecated java.lang.String DIM_SCREEN = "dim_screen";
@@ -36799,6 +36802,7 @@ package android.provider {
     field public static final deprecated java.lang.String NETWORK_PREFERENCE = "network_preference";
     field public static final deprecated java.lang.String NEXT_ALARM_FORMATTED = "next_alarm_formatted";
     field public static final java.lang.String NOTIFICATION_SOUND = "notification_sound";
+    field public static final java.lang.String HIDE_NAVIGATION = "hide_navigation";
     field public static final deprecated java.lang.String PARENTAL_CONTROL_ENABLED = "parental_control_enabled";
     field public static final deprecated java.lang.String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update";
     field public static final deprecated java.lang.String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";

3、设置默认值

frameworks/base/packages/SettingsProvider/res/values/defaults.xml
    @@ -36,6 +36,7 @@
     <fraction name="def_window_transition_scale">100%</fraction>
     <bool name="def_haptic_feedback">true</bool>
 
+    <integer name="def_hide_navigation">0</integer>
     <bool name="def_bluetooth_on">true</bool>
     <bool name="def_wifi_display_on">false</bool>
     <bool name="def_install_non_market_apps">false</bool>

4、将默认值加入数据库

frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
        @@ -2287,6 +2287,8 @@ class DatabaseHelper extends SQLiteOpenHelper {
                     R.bool.def_dim_screen);
             loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
                     R.integer.def_screen_off_timeout);
+            loadIntegerSetting(stmt, Settings.System.HIDE_NAVIGATION,
+                    R.integer.def_hide_navigation);
 
             // Set default cdma DTMF type
             loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);

三、添加状态栏按钮

1、添加中英文标题

packages/apps/Settings/res/values-zh-rCN/strings.xml
    <string name="confirm_dialog_message">Will cancel it</string>
+	<!-- status bar -->
+    <string name="navigation_settings_title">状态栏</string>
packages/apps/Settings/res/values/strings.xml
+	<!-- status bar -->
+    <string name="navigation_settings_title">Status Bar</string>

2、开关选择按钮添加

packages/apps/Settings/res/xml/display_settings.xml
+    <SwitchPreference
+        android:key="status_bar"
+        android:title="@string/navigation_settings_title"
+        android:persistent="false"
+        settings:controller="com.android.settings.display.StatusBarPreferenceController" />

3、添加选择按钮功能

packages/apps/Settings/src/com/android/settings/display/StatusBarPreferenceController.java

package com.android.settings.display;

import static android.provider.Settings.System.HIDE_NAVIGATION;

import android.content.Context;
import android.provider.Settings;
import android.content.Intent;
import android.support.v7.preference.Preference;
import android.text.TextUtils;


import com.android.settings.R;
import android.provider.Settings.System;
import com.android.internal.logging.nano.MetricsProto;
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 com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;

public class StatusBarPreferenceController extends TogglePreferenceController implements
        PreferenceControllerMixin, Preference.OnPreferenceChangeListener, LifecycleObserver,
        OnResume, OnPause {

    private Preference mPreference;

    public StatusBarPreferenceController(Context context, String key) {
        super(context, key);
    }

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

    @Override
    public void onResume() {

    }

    @Override
    public void onPause() {

    }

    @Override
    public int getAvailabilityStatus() {
        return 0;
    }

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

    @Override
    public boolean isChecked() {
        return Settings.System.getInt(mContext.getContentResolver(), HIDE_NAVIGATION, 1) == 1;
    }

    @Override
    public boolean setChecked(boolean isChecked) {
        if (isChecked) {
            mContext.sendBroadcast(new Intent(Intent.ACTION_BAR_SHOW));
        } else {
            mContext.sendBroadcast(new Intent(Intent.ACTION_BAR_HIDE));
        }
        Settings.System.putInt(mContext.getContentResolver(), HIDE_NAVIGATION, isChecked ? 1 : 0);
        return true;
    }
}

Guess you like

Origin blog.csdn.net/qq_32645109/article/details/121251955