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 MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

使用Spring Cache时设置缓存键的注意事项详解

《使用SpringCache时设置缓存键的注意事项详解》在现代的Web应用中,缓存是提高系统性能和响应速度的重要手段之一,Spring框架提供了强大的缓存支持,通过​​@Cacheable​​、​​... 目录引言1. 缓存键的基本概念2. 默认缓存键生成器3. 自定义缓存键3.1 使用​​@Cacheab

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

Python实现局域网远程控制电脑

《Python实现局域网远程控制电脑》这篇文章主要为大家详细介绍了如何利用Python编写一个工具,可以实现远程控制局域网电脑关机,重启,注销等功能,感兴趣的小伙伴可以参考一下... 目录1.简介2. 运行效果3. 1.0版本相关源码服务端server.py客户端client.py4. 2.0版本相关源码1

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作