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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/53135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【硬件操作入门】2--GPIO与门电路、二极管三极管、LED电路与操作

【硬件操作入门】2–GPIO与门电路&#xff08;二极管&三极管&#xff09;、LED电路与操作 文章目录 【硬件操作入门】2--GPIO与门电路&#xff08;二极管&三极管&#xff09;、LED电路与操作一、GPIO与门电路1.1、GPIO的应用1.2、GPIO引脚操作1.2.1 设置引脚为GPIO功能…

【计算机组成原理】3.2.4 双端口RAM和多模块存储器

3.2.4 双端口RAM和多模块存储器 本视频涉及两种内存优化技术&#xff0c;分别是“双端口RAM”和“多模块存储器”。其中&#xff0c;“双端口RAM”已从408大纲删除&#xff0c;但由于部分自命题院校依然会考这个概念&#xff0c;视频中仍然保留了这部分内容。 408考生简要了解…

Flutter Riverpod状态管理之AutoDisposeNotifierProvider

Flutter Riverpod状态管理之AutoDisposeNotifierProvider Flutter的Riverpod状态管理&#xff0c;目前来看是官方出的最好用的状态管理库了&#xff0c;今天我们主要看AutoDisposeNotifierProvider的使用&#xff0c;AutoDisposeNotifierProvider具有如下的优势&#xff1a; 1…

day39(8/29)——harbor私有仓库管理

一、harbor私有仓库管理 是python的包管理工具&#xff0c;和yum对redhat的关系是一样的 yum -y install epel-release yum -y install python2-pip pip install --upgrade pip pip list pip 8x pip install --upgrade pip pip install --upgrade pip20.3 -i https://mirror…

RFID光触发标签在文件柜管理中的创新应用

在当今信息化时代&#xff0c;文件管理对于企业和机构的重要性不言而喻。传统的文件柜管理方式存在诸多问题&#xff0c;如查找文件困难、管理效率低下、安全性难以保障等。而 RFID 光触发标签技术的出现&#xff0c;为文件柜管理带来了全新的解决方案。 一、传统文件柜管理的…

高效学习的方式

一、如何确定一个知识点是否值得投入学习&#xff1f; 1、目标对齐&#xff1a;考虑这个知识点是否与你的个人目标、职业发展或兴趣爱好相符。 2、需求分析&#xff1a;分析当前市场或学术界对这个知识点的需求&#xff0c;是否具有普遍性和紧迫性。 3、资源可用性&#xff…

Spring扩展点系列-@PostConstruct

简介 spring的Bean在创建的时候会进行初始化&#xff0c;而初始化过程会解析出PostConstruct注解的方法&#xff0c;并反射调用该方法。 PostConstruct 的使用和特点 只有一个非静态方法能使用此注解&#xff1b;被注解的方法不得有任何参数&#xff1b;被注解的方法返回值必…

行为型设计模式-中介者(mediator)模式-python实现

设计模式汇总&#xff1a;查看 通俗示例 想象一下你正在参与一个团队项目&#xff0c;团队成员包括设计师、前端开发者、后端开发者、测试工程师等。每个团队成员都需要与其他成员沟通协作&#xff0c;比如设计师完成设计后需要通知前端开发者开始开发&#xff0c;前端开发者完…

实际开发中git在IDEA中的使用

相信搜索这个的同学代码都已经拉取到本地了&#xff0c;并且已经在idea中打开了。 1.一般我们从远程colone下来的代码默认是在主分支下的&#xff0c;也就是说我们从远程的主分支拉取的代码并且在本地创建了一个主分支。 2.一般主分支是不允许修改的&#xff0c;所以我们可以基…

Logistic分类算法原理及Python实践

一、Logistic分类算法原理 Logistic分类算法&#xff0c;也称为逻辑回归&#xff08;Logistic Regression&#xff09;&#xff0c;是机器学习中的一种经典分类算法&#xff0c;主要用于解决二分类问题。其原理基于线性回归和逻辑函数&#xff08;Sigmoid函数&#xff09;的组…

SpringBoot2:配置绑定与自动配置功能源码解读

一、配置绑定 1、作用说明 我们在开发springboot项目时&#xff0c;会有个配置文件&#xff0c;application.properties文件。 我们知道&#xff0c;像什么访问端口、上传功能的相关配置&#xff0c;都会在这里进行配置。 而这些&#xff0c;都是springboot自带的或者第三方j…

Linux | 匿名管道和命名管道:进程间通信数据流的桥梁

目录 1、进程间通信目的 2、管道——匿名管道和命名管道 匿名管道 匿名管道的示例代码&#xff1a;将数据写入管道、子进程从管道读取数据并将其输出到bash中 父子进程通过匿名管道建立通信 重点&#xff1a;管道的五个特点 命名管道&#xff08;也称为FIFO&#xff09;…

每日一题,零基础入门FPGA——工程师在线精讲,直播预告

题目传送门&#xff1a;F学社 zzfpga.com/StudentPlatform/Sheet/QuestionBankhttp://zzfpga.com/StudentPlatform/Sheet/QuestionBank 【第Ⅰ期题目 * 5】 请使用D触发器和必要的逻辑门实现此同步时序电路&#xff0c;用Verilog语言描述。 【第Ⅰ期题目 * 4】 请设计一个0…

观测云核心技术揭秘:基于时间的半结构化数据模型

前言 众所周知&#xff0c;真正意义上的统一监控观测平台本质上是一个超大的数据湖&#xff0c;其存储了大量的来自监控指标&#xff0c;各种各样的日志&#xff0c;各种各样的链路追踪以及包括用户访问行为等海量的可观测性数据。 这些海量数据有什么特点呢&#xff1f; 首先…

【网络安全】逻辑漏洞:绕过应用程序重要功能

未经许可,不得转载。 文章目录 正文漏洞影响正文 目标:xxx.com 一个流行的汽车平台,允许用户为经销商留下评论。该平台有一个功能,用户可以点赞评论,并且它限制每个用户对每个评论只能点赞一次。 然而,我找到了绕过的方法(并不是并发)。 在点击“点赞”按钮时拦截请…

新手指南 | 研发人员奖金激励方案步骤实操

研发团队是一个非常独特的存在。在研发人员的薪酬、激励方案设计上也是很多HR的痛点。 毕竟工作变化大&#xff0c;职责变化快、个体能力差异大、投入了不一定会有产出、多线程并行&#xff0c;贡献难判定、知识密度高&#xff0c;价值难衡量等等... 基于以上难点&#xff0c…

【系统架构设计】嵌入式系统设计(1)

【系统架构设计】嵌入式系统设计&#xff08;1&#xff09; 嵌入式系统概论嵌入式系统的组成硬件嵌入式处理器总线存储器I/O 设备与接口 软件 嵌入式开发平台与调试环境交叉平台开发环境交叉编译环境调试 嵌入式系统概论 嵌入性、专用性、计算机系统是嵌入式系统的三个基本的核…

0基础轻松玩转.NET Web API 8.0【CICD】项目实战

1.背景 最近在学习CI/CD&#xff0c;为了加快熟悉CI/CD&#xff0c;我实操了下基于.Net 8.0的CI/CD项目实战。Ci/CD就是自动化作业&#xff0c;实现项目自动编译、发布、执行等&#xff0c;也有用于拉取推送数据的场景。本文主要介绍了在win 11下搭建CI/CD&#xff0c;实现自动…

UEFI——PCD的简单使用

一、PCD的定义及概念 在UEFI固件接口中&#xff0c;PCD&#xff08;Platform Configuration Database&#xff09;是一个用于存储和访问平台特定配置信息的机制。PCD允许UEFI驱动程序和应用程序在运行时获取和设置平台相关的参数&#xff0c;而无需硬编码这些值。PCD变量可以被…

加速电商物流效率:推荐几款实用的快递批量查询工具

做电商必不可少的快递批量查询平台分享&#xff1a;固乔快递查询助手使用全攻略 在电商行业日益竞争的今天&#xff0c;高效管理物流信息成为了商家们不可或缺的一环。面对每天成百上千的订单和快递单号&#xff0c;如何快速、准确地查询并跟踪物流状态&#xff0c;成为了电商…