RK3576 Android14 状态栏和导航栏增加显示控制功能
问题背景因为RK3576 Android14用户需要手动控制状态栏和导航栏显示隐藏控制包括对锁屏后下拉状态栏的屏蔽在设置功能里增加此功能的控制故参考一些博客完成此功能以下是具体代码路径的修改内容。解决方案1、修改系统默认配置代码位置device/rockchip/rk3576/device.mkPRODUCT_PROPERTY_OVERRIDES \ persist.sys.statusbar.enabletrue \ persist.sys.navigationbar.enabletrue2、修改SystemUIandroid/frameworks/base/packages/SystemUI/AndroidManifest.xmlprotected-broadcast android:namecom.android.systemui.action.ACTION_LAUNCH_MEDIA_OUTPUT_BROADCAST_DIALOG / !-- For statusbar show or not -- protected-broadcast android:namecom.systemui.statusbar.show / protected-broadcast android:namecom.systemui.statusbar.hide / !-- For NavigationBar show or not -- protected-broadcast android:namecom.systemui.navigationbar.show / protected-broadcast android:namecom.systemui.navigationbar.hide / application android:name.SystemUIApplication android:persistenttrueframeworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.javaimport android.content.res.Resources; public static final int FADE_KEYGUARD_DURATION 300; public static final int FADE_KEYGUARD_DURATION_PULSING 96; private static final String ACTION_HIDE_STATUS_BAR com.systemui.statusbar.hide; private static final String ACTION_SHOW_STATUS_BAR com.systemui.statusbar.show; private static final String ACTION_HIDE_NAVIGATION_BAR com.systemui.navigationbar.hide; private static final String ACTION_SHOW_NAVIGATION_BAR com.systemui.navigationbar.show; public static final String SYS_PROPERTY_STATUS_BAR persist.sys.statusbar.enable; public static final String SYS_PROPERTY_NAVIGATION_BAR persist.sys.navigationbar.enable; Override public void start() { mScreenLifecycle.addObserver(mScreenObserver); .......................... mConfigurationController.addCallback(mConfigurationListener); mBatteryController.observe(mLifecycle, mBatteryStateChangeCallback); mLifecycle.setCurrentState(RESUMED); //根据系统设置参数控制状态栏显示隐藏 boolean statusBarDisplaySystemProperties.getBoolean(SYS_PROPERTY_STATUS_BAR, false); Log.d(TAG, ----------default---------statusBarDisplay:statusBarDisplay); if (!statusBarDisplay) { mStatusBarWindowController.setBarVisibility(View.GONE); } } mAccessibilityFloatingMenuController.init(); ........................... // protected void makeStatusBarView(Nullable RegisterStatusBarResult result) { ....................... mStatusBarInitializer.initializeStatusBar( mCentralSurfacesComponent::createCollapsedStatusBarFragment); mStatusBarTouchableRegionManager.setup(this, getNotificationShadeWindowView()); //createNavigationBar(result); //根据系统设置参数控制导航栏显示隐藏 boolean navigationBarDisplaySystemProperties.getBoolean(SYS_PROPERTY_NAVIGATION_BAR, false); Log.d(TAG, ----------default---------navigationBarDisplay:navigationBarDisplay); if (navigationBarDisplay) { createNavigationBar(result); } // VisibleForTesting protected void registerBroadcastReceiver() { IntentFilter filter new IntentFilter(); .................. filter.addAction(ACTION_HIDE_NAVIGATION_BAR); filter.addAction(ACTION_SHOW_NAVIGATION_BAR); filter.addAction(ACTION_HIDE_STATUS_BAR); filter.addAction(ACTION_SHOW_STATUS_BAR); filter.addAction(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG); context.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null); // 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 (ACTION_HIDE_NAVIGATION_BAR.equals(action)) { Log.d(TAG, ---ACTION_HIDE_NAVIGATION_BAR---); SystemProperties.set(SYS_PROPERTY_NAVIGATION_BAR, false); mNavigationBarController.onDisplayRemoved(mDisplayId); } else if (ACTION_SHOW_NAVIGATION_BAR.equals(action)) { Log.d(TAG, ---ACTION_SHOW_NAVIGATION_BAR---); SystemProperties.set(SYS_PROPERTY_NAVIGATION_BAR, true); mNavigationBarController.onDisplayReady(mDisplayId); } else if (ACTION_HIDE_STATUS_BAR.equals(action)) { Log.d(TAG, ---ACTION_HIDE_STATUS_BAR---); SystemProperties.set(SYS_PROPERTY_STATUS_BAR, false); mStatusBarWindowController.setBarVisibility(View.GONE); } else if (ACTION_SHOW_STATUS_BAR.equals(action)) { Log.d(TAG, ---ACTION_SHOW_STATUS_BAR---); SystemProperties.set(SYS_PROPERTY_STATUS_BAR, true); mStatusBarWindowController.setBarVisibility(View.VISIBLE); } } };frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java /** * Sets the visibility of the status bar window. * 设置状态栏的可见性 */ public void setBarVisibility(int visibility) { mStatusBarWindowView.setVisibility(visibility); }frameworks/base/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java 修改三个方法此类主要是锁屏后状态栏处理import android.os.SystemProperties; import com.android.systemui.statusbar.phone.CentralSurfacesImpl; // private void setExpandedHeightInternal(float h) { .................................. if (mExpandedHeight 1f mExpandedHeight ! 0f mClosing) { mExpandedHeight 0f; if (mHeightAnimator ! null) { mHeightAnimator.end(); } } mExpandedFraction Math.min(1f, maxPanelHeight 0 ? 0 : mExpandedHeight / maxPanelHeight); int barState getBarState(); //根据系统设置参数控制锁平后面板是否显示 禁止对状态栏布局设置 boolean statusBarDisplaySystemProperties.getBoolean(CentralSurfacesImpl.SYS_PROPERTY_STATUS_BAR, false); //非锁屏的状态栏状态栏下拉面板隐藏处理 if (!statusBarDisplay barState!KEYGUARD) { mExpandedFraction0; } mQsController.setShadeExpansion(mExpandedHeight, mExpandedFraction); mExpansionDragDownAmountPx h; mAmbientState.setExpansionFraction(mExpandedFraction); // public final class TouchHandler implements View.OnTouchListener, Gefingerpoken { private long mLastTouchDownTime -1L; /** see ViewGroup#onInterceptTouchEvent(MotionEvent) */ Override public boolean onInterceptTouchEvent(MotionEvent event) { .............................. if (!mQsController.shouldQuickSettingsIntercept(mDownX, mDownY, 0) mPulseExpansionHandler.onInterceptTouchEvent(event)) { mShadeLog.v(NotificationPanelViewController MotionEvent intercepted: PulseExpansionHandler); return true; } //根据系统设置参数控制锁平后面板是否显示 拦截触摸事件分发 boolean statusBarDisplaySystemProperties.getBoolean(CentralSurfacesImpl.SYS_PROPERTY_STATUS_BAR, false); if (!statusBarDisplay !isFullyCollapsed() mQsController.onIntercept(event)) { debugLog(onQsIntercept true); mShadeLog.v(NotificationPanelViewController MotionEvent intercepted: QsIntercept); // Override public boolean onTouchEvent(MotionEvent event) { .................................... if (mListenForHeadsUp !mHeadsUpTouchHelper.isTrackingHeadsUp() !mNotificationStackScrollLayoutController.isLongPressInProgress() mHeadsUpTouchHelper.onInterceptTouchEvent(event)) { mMetricsLogger.count(COUNTER_PANEL_OPEN_PEEK, 1); } boolean handled mHeadsUpTouchHelper.onTouchEvent(event); //根据系统设置参数控制状态栏下拉面板显示隐藏屏蔽状态了下滑事件 boolean statusBarDisplaySystemProperties.getBoolean(CentralSurfacesImpl.SYS_PROPERTY_STATUS_BAR, false); if (statusBarDisplay !mHeadsUpTouchHelper.isTrackingHeadsUp() mQsController.handleTouch( event, isFullyCollapsed(), isShadeOrQsHeightAnimationRunning())) { if (event.getActionMasked() ! MotionEvent.ACTION_MOVE) { mShadeLog.logMotionEvent(event, onTouch: handleQsTouch handled event); .......................................3、修改Settings APPandroid/packages/apps/Settings/res/values-zh-rCN/strings.xml !--状态栏和导航栏开关设置 -- string namectrl_statusbar状态栏/string string namectrl_navigationbar导航栏/string /resourcesandroid/packages/apps/Settings/res/values/strings.xml !--状态栏和导航栏开关设置 -- string namectrl_statusbarStatusBar/string string namectrl_navigationbarNavigationBar/string /resourcesandroid/packages/apps/Settings/res/xml/display_settings.xmlsettings:userRestrictionno_config_brightness intent android:actioncom.android.intent.action.SHOW_BRIGHTNESS_DIALOG / /com.android.settingslib.RestrictedPreference SwitchPreference android:keyctrl_statusbar android:titlestring/ctrl_statusbar/ SwitchPreference android:keyctrl_navigationbar android:titlestring/ctrl_navigationbar/ com.android.settings.display.NightDisplayPreference android:keynight_displayandroid/packages/apps/Settings/src/com/android/settings/DisplaySettings.javaimport com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.search.SearchIndexable; import com.android.settings.display.StatusBarPreferenceController; import com.android.settings.display.NavigationBarPreferenceController; import java.util.ArrayList; import java.util.List; controllers.add(new AwEnhanceModePreferenceController(context)); controllers.add(new AwSmartBacklightPreferenceController(context)); controllers.add(new AwColorTemperaturePreferenceController(context)); controllers.add(new StatusBarPreferenceController(context)); controllers.add(new NavigationBarPreferenceController(context)); return controllers; }android/packages/apps/Settings/src/com/android/settings/display/NavigationBarPreferenceController.java 新增package com.android.settings.display; import android.content.Context; import android.provider.Settings; import androidx.preference.SwitchPreference; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.core.AbstractPreferenceController; import android.content.Intent; import android.util.Log; import android.os.SystemProperties; /** * 根据系统设置参数控制导航栏显示隐藏 * */ public class NavigationBarPreferenceController extends AbstractPreferenceController implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener { private static final String TAG NavigationBarPreferenceController; private static final String KEY_NAVIGATION_BAR ctrl_navigationbar; public static final String ACTION_HIDE_NAVIGATION_BAR com.systemui.navigationbar.hide; public static final String ACTION_SHOW_NAVIGATION_BAR com.systemui.navigationbar.show; public NavigationBarPreferenceController(Context context) { super(context); } Override public String getPreferenceKey() { return KEY_NAVIGATION_BAR; } Override public boolean isAvailable() { return true; } Override public void displayPreference(PreferenceScreen screen) { if (!isAvailable()) { setVisible(screen, KEY_NAVIGATION_BAR, true); return; } final SwitchPreference mNavigationBarPreference screen.findPreference(KEY_NAVIGATION_BAR); if (mNavigationBarPreference ! null) { String value SystemProperties.get(persist.sys.navigationbar.enable, true); mNavigationBarPreference.setChecked(value.equals(true)); mNavigationBarPreference.setOnPreferenceChangeListener(this); } } Override public void updateState(Preference preference) { String value SystemProperties.get(persist.sys.navigationbar.enable, true); Log.d(TAG, ---updateState--- value: value); ((SwitchPreference) preference).setChecked(value.equals(true)); } Override public boolean onPreferenceChange(Preference preference, Object newValue) { boolean value (Boolean) newValue; Log.d(TAG, ---onPreferenceChange--- value: value); Intent intent new Intent(); if (value) { intent.setAction(ACTION_SHOW_NAVIGATION_BAR); } else { intent.setAction(ACTION_HIDE_NAVIGATION_BAR); } mContext.sendBroadcast(intent); return true; } }android/packages/apps/Settings/src/com/android/settings/display/StatusBarPreferenceController.java新增package com.android.settings.display; import android.content.Context; import android.provider.Settings; import androidx.preference.SwitchPreference; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.core.AbstractPreferenceController; import android.content.Intent; import android.util.Log; import android.os.SystemProperties; /** * 根据系统设置参数控制状态栏显示隐藏 * */ public class StatusBarPreferenceController extends AbstractPreferenceController implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener { private static final String TAG StatusBarPreferenceController; private static final String KEY_STATUS_BAR ctrl_statusbar; public static final String ACTION_HIDE_STATUS_BAR com.systemui.statusbar.hide; public static final String ACTION_SHOW_STATUS_BAR com.systemui.statusbar.show; public StatusBarPreferenceController(Context context) { super(context); } Override public String getPreferenceKey() { return KEY_STATUS_BAR; } Override public boolean isAvailable() { return true; } Override public void displayPreference(PreferenceScreen screen) { if (!isAvailable()) { setVisible(screen, KEY_STATUS_BAR, true); return; } final SwitchPreference mStatusBarPreference screen.findPreference(KEY_STATUS_BAR); if (mStatusBarPreference ! null) { String value SystemProperties.get(persist.sys.statusbar.enable, true); mStatusBarPreference.setChecked(value.equals(true)); mStatusBarPreference.setOnPreferenceChangeListener(this); } } Override public void updateState(Preference preference) { String value SystemProperties.get(persist.sys.statusbar.enable, true); Log.d(TAG, ---updateState--- value: value); ((SwitchPreference) preference).setChecked(value.equals(true)); } Override public boolean onPreferenceChange(Preference preference, Object newValue) { boolean value (Boolean) newValue; Log.d(TAG, ---onPreferenceChange--- value: value); Intent intent new Intent(); if (value) { intent.setAction(ACTION_SHOW_STATUS_BAR); } else { intent.setAction(ACTION_HIDE_STATUS_BAR); } mContext.sendBroadcast(intent); // 发送广播 return true; } }4、设置--显示菜单里的效果如下图