Android12 添加设置控制导航栏显示和状态栏下拉

2024-08-30 07:52

本文主要是介绍Android12 添加设置控制导航栏显示和状态栏下拉,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

添加key值

  • 位置: frameworks/base/core/java/android/provider/Settings.java
 /*** Control navigation bar enabled*/@Readable@SuppressLint("NoSettingsProvider")public static final String NAVIGATIONBAR_ENABLED = "navigationbar_enabled";/*** Supoort panel bar expand*/@Readable@SuppressLint("NoSettingsProvider")public static final String SUPPORT_PANELBAR_EXPAND = "support_panelbar_expand";

Setting中添加相关设置项

  • 位置:packages/apps/Settings/res/xml/display_settings.xml
  <SwitchPreferenceandroid:key="navigationbar_enabled"android:title="@string/navigationbar_enabled_title"settings:controller="com.android.settings.display.NavigationbarPreferenceController"/><SwitchPreferenceandroid:key="support_panelbar_expand"android:title="@string/support_panelbar_expand_title"settings:controller="com.android.settings.display.SupportPanelbarExpandPreferenceController"/>  
  • 位置:packages/apps/Settings/res/values/strings.xml
   <string name="navigationbar_enabled_title">Show navigation bar</string><string name="support_panelbar_expand_title">Allows status bar drop-down</string>
  • 位置:packages/apps/Settings/src/com/android/settings/display/NavigationbarPreferenceController.java
package com.android.settings.display;import android.content.Context;
import android.text.TextUtils;import androidx.preference.Preference;import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;import android.provider.Settings;public class NavigationbarPreferenceController extends TogglePreferenceController implementsPreference.OnPreferenceChangeListener {private static final String KEY_NAVIGATIONBAR = "navigationbar_enabled";private Context mContext;private Preference mPreference;public NavigationbarPreferenceController(Context context) {super(context, KEY_NAVIGATIONBAR);mContext = context;}@Overridepublic String getPreferenceKey() {return KEY_NAVIGATIONBAR;}@Overridepublic void updateState(Preference preference) {mPreference = preference;super.updateState(preference);}@Overridepublic int getAvailabilityStatus() {return AVAILABLE/* : UNSUPPORTED_ON_DEVICE*/;}@Overridepublic boolean isChecked() {int status = Settings.System.getInt(mContext.getContentResolver(), Settings.System.NAVIGATIONBAR_ENABLED, 0);return status==1;}@Overridepublic boolean setChecked(boolean isChecked) {Settings.System.putInt(mContext.getContentResolver(), Settings.System.NAVIGATIONBAR_ENABLED, isChecked ? 1:0);return true;}
}

在屏幕顶部和中间下滑都可以拉出状态栏,所以有两个地方需要修改。你也可以直接在CommandQueue.java的panelsEnabled()方法中做控制

  • 位置:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
	@Overridepublic boolean onTouchEvent(MotionEvent event) {// add startint supportExpand = Settings.System.getInt(mContext.getContentResolver(), Settings.System.SUPPORT_PANELBAR_EXPAND, 0);if (supportExpand == 0){return true;}// endboolean barConsumedEvent = mBar.interceptTouchEvent(event);if (DEBUG_GESTURES) {if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {EventLog.writeEvent(EventLogTags.SYSUI_PANELBAR_TOUCH,event.getActionMasked(), (int) event.getX(), (int) event.getY(),barConsumedEvent ? 1 : 0);}}return barConsumedEvent || super.onTouchEvent(event);}
  • 位置:packages/apps/Launcher3/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java
	private void dispatchTouchEvent(MotionEvent ev) {// add startint supportExpand = Settings.System.getInt(mLauncher.getContentResolver(), Settings.System.SUPPORT_PANELBAR_EXPAND, 0);if (mSystemUiProxy.isActive() && supportExpand==1) {// add endmLastAction = ev.getActionMasked();mSystemUiProxy.onStatusBarMotionEvent(ev);}}

导航栏显示的控制

  • frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
	// add startimport android.content.ContentResolver;import android.database.ContentObserver;import android.provider.Settings;// end...// add startprivate final Object mLock = new Object();private SettingsObserver mSettingsObserver;private boolean mSupportPanelExpand;private boolean mShowNavigationbar;// end...// add startprivate final class SettingsObserver extends ContentObserver {public SettingsObserver(Handler handler) {super(handler);}@Overridepublic void onChange(boolean selfChange, Uri uri) {synchronized (mLock) {updateSettingsLocked();if (mShowNavigationbar){createNavigationBar(null);} else {removeNavigationBar();}}}}private void updateSettingsLocked() {final ContentResolver resolver = mContext.getContentResolver();mShowNavigationbar = (Settings.System.getInt(resolver,Settings.System.NAVIGATIONBAR_ENABLED, 0)) == 1;}   // add end// ================================================================================// Constructing the view// ================================================================================protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) {final Context context = mContext;updateDisplaySize(); // populates mDisplayMetricsupdateResources();updateTheme();...// add start// Register for settings changes.mSettingsObserver = new SettingsObserver(mHandler);final ContentResolver resolver = mContext.getContentResolver();resolver.registerContentObserver(Settings.System.getUriFor(Settings.System.NAVIGATIONBAR_ENABLED),false, mSettingsObserver);updateSettingsLocked();if (mShowNavigationbar){createNavigationBar(result);}// add end}...protected void createNavigationBar(@Nullable RegisterStatusBarResult result) {mNavigationBarController.createNavigationBars(true /* includeDefaultDisplay */, result);}// add startprotected void removeNavigationBar() {mNavigationBarController.removeNavigationBar();}// add end
  • 位置:frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
	// add startpublic void removeNavigationBar() {Display[] displays = mDisplayManager.getDisplays();for (Display display : displays) {removeNavigationBar(display.getDisplayId());}}// add end

配置默认值

  • 位置:frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
	private void loadSystemSettings(SQLiteDatabase db) {SQLiteStatement stmt = null;try {stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"+ " VALUES(?,?);");loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,R.bool.def_dim_screen);loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,R.integer.def_screen_off_timeout);// add startloadBooleanSetting(stmt, Settings.System.NAVIGATIONBAR_ENABLED,R.bool.def_navigationbar_enabled);loadBooleanSetting(stmt, Settings.System.SUPPORT_PANELBAR_EXPAND,R.bool.def_support_panelbar_expand);// end        ...}
  • frameworks/base/packages/SettingsProvider/res/values/defaults.xml
	// add start<bool name="def_navigationbar_enabled">false</bool><bool name="def_support_panelbar_expand">false</bool>// end

这篇关于Android12 添加设置控制导航栏显示和状态栏下拉的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120226

相关文章

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

PyCharm如何设置新建文件默认为LF换行符

《PyCharm如何设置新建文件默认为LF换行符》:本文主要介绍PyCharm如何设置新建文件默认为LF换行符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm设置新建文件默认为LF换行符设置换行符修改换行符总结PyCharm设置新建文件默认为LF

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.