SystemUI导航栏

SystemUI导航栏

  • 1、系统中参数项
    • 1.1 相关开关属性
    • 2.2 属性设置代码
  • 2、设置中设置“三按钮”导航更新流程
    • 2.1 属性资源覆盖叠加
    • 2.2 SystemUI导航栏接收改变广播
    • 2.3 SystemUI导航栏布局更新
    • 2.4 时序图

android13-release


1、系统中参数项

1.1 相关开关属性

设置->系统->手势->系统导航->“三按钮”导航
在这里插入图片描述

  • 设置中:“三按钮”导航
    packages/apps/Settings/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
    packages/apps/Settings/res/values-zh-rCN/strings.xml
    <string name="legacy_navigation_title" msgid="7877402855994423727">"“三按钮”导航"</string>

  • 默认导航栏模式:config_navBarInteractionMode
    frameworks/base/core/res/res/values/config.xml
   <!-- Controls the navigation bar interaction mode:0: 3 button mode (back, home, overview buttons)1: 2 button mode (back, home buttons + swipe up for overview)2: gestures only for back, home and overview --><integer name="config_navBarInteractionMode">0</integer><!-- Whether a software navigation bar should be shown. NOTE: in the future this may beautodetected from the Configuration. --><bool name="config_showNavigationBar">false</bool>
  • Settings数据库中:adb shell settings get Secure navigation_mode
    frameworks/base/core/java/android/provider/Settings.java
/*** Navigation bar mode.*  0 = 3 button*  1 = 2 button*  2 = fully gestural* @hide*/
@Readable
public static final String NAVIGATION_MODE ="navigation_mode";
  • prop属性"qemu.hw.mainkeys":允许系统属性覆盖此设置。由仿真器使用。使用方法hasNavigationBar()
  • 导航栏高度:navigation_bar_height
    frameworks/base/core/res/res/values/dimens.xml
   <!-- Height of the bottom navigation / system bar. --><dimen name="navigation_bar_height">48dp</dimen><!-- Height of the bottom navigation bar in portrait; often the same as @dimen/navigation_bar_height --><dimen name="navigation_bar_height_landscape">48dp</dimen>

2.2 属性设置代码

设置中显示判断:

  • String NAV_BAR_MODE_3BUTTON_OVERLAY = "com.android.internal.systemui.navbar.threebutton";
    /product/overlay/NavigationBarMode3Button/NavigationBarMode3ButtonOverlay.apk
  • String NAV_BAR_MODE_2BUTTON_OVERLAY = "com.android.internal.systemui.navbar.twobutton";
    /product/overlay/NavigationBarMode2Button/NavigationBarMode2ButtonOverlay.apk
  • String NAV_BAR_MODE_GESTURAL_OVERLAY = "com.android.internal.systemui.navbar.gestural";
    /product/overlay/NavigationBarModeGestural/NavigationBarModeGesturalOverlay.apk

packages/apps/Settings/src/com/android/settings/gestures/SystemNavigationPreferenceController.java

static boolean isOverlayPackageAvailable(Context context, String overlayPackage) {try {return context.getPackageManager().getPackageInfo(overlayPackage, 0) != null;} catch (PackageManager.NameNotFoundException e) {// Not found, just return unavailablereturn false;}
}

frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java

private int mNavBarMode = NAV_BAR_MODE_3BUTTON;mNavBarMode = mNavigationModeController.addListener(mModeChangedListener);

frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationModeController.java

private int getCurrentInteractionMode(Context context) {int mode = context.getResources().getInteger(com.android.internal.R.integer.config_navBarInteractionMode);if (DEBUG) {Log.d(TAG, "getCurrentInteractionMode: mode=" + mode+ " contextUser=" + context.getUserId());}return mode;
}public void updateCurrentInteractionMode(boolean notify) {mCurrentUserContext = getCurrentUserContext();int mode = getCurrentInteractionMode(mCurrentUserContext);mUiBgExecutor.execute(() ->Settings.Secure.putString(mCurrentUserContext.getContentResolver(),Secure.NAVIGATION_MODE, String.valueOf(mode)));if (DEBUG) {Log.d(TAG, "updateCurrentInteractionMode: mode=" + mode);dumpAssetPaths(mCurrentUserContext);}if (notify) {for (int i = 0; i < mListeners.size(); i++) {mListeners.get(i).onNavigationModeChanged(mode);}}
}

frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java

if (mDisplayContent.isDefaultDisplay) {mHasStatusBar = true;mHasNavigationBar = mContext.getResources().getBoolean(R.bool.config_showNavigationBar);// Allow a system property to override this. Used by the emulator.// See also hasNavigationBar().String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");if ("1".equals(navBarOverride)) {mHasNavigationBar = false;} else if ("0".equals(navBarOverride)) {mHasNavigationBar = true;}
} else {mHasStatusBar = false;mHasNavigationBar = mDisplayContent.supportsSystemDecorations();
}

2、设置中设置“三按钮”导航更新流程

2.1 属性资源覆盖叠加

OverlayManagerService 运行时资源叠加层 (RRO)
点击设置后,导航栏模式通过 OverlayManagerService 服务对 config_navBarInteractionMode 资源进行叠加,而settings的Secure表中navigation_mode属性只是记录模式。
frameworks/base/services/core/java/com/android/server/om/OverlayManagerService.java

资源叠加主要文件:config.xml
frameworks/base/core/res/res/values/config.xml
/product/overlay/NavigationBarMode3Button/NavigationBarMode3ButtonOverlay.apk
/product/overlay/NavigationBarMode2Button/NavigationBarMode2ButtonOverlay.apk
/product/overlay/NavigationBarModeGestural/NavigationBarModeGesturalOverlay.apk

  • updateActivityManager(affectedPackages, userId):发送受覆盖状态更改影响的所有目标包的配置更改事件。
  • broadcastActionOverlayChanged(targets, userId):发送覆盖包已更改广播ACTION_OVERLAY_CHANGED
private void updateTargetPackagesLocked(@Nullable Set<PackageAndUser> updatedTargets) {if (CollectionUtils.isEmpty(updatedTargets)) {return;}persistSettingsLocked();final SparseArray<ArraySet<String>> userTargets = groupTargetsByUserId(updatedTargets);for (int i = 0, n = userTargets.size(); i < n; i++) {final ArraySet<String> targets = userTargets.valueAt(i);final int userId = userTargets.keyAt(i);final List<String> affectedPackages = updatePackageManagerLocked(targets, userId);if (affectedPackages.isEmpty()) {// The package manager paths are already up-to-date.continue;}FgThread.getHandler().post(() -> {// Send configuration changed events for all target packages that have been affected// by overlay state changes.updateActivityManager(affectedPackages, userId);// Do not send broadcasts for all affected targets. Overlays targeting the framework// or shared libraries may cause too many broadcasts to be sent at once.broadcastActionOverlayChanged(targets, userId);});}
}

2.2 SystemUI导航栏接收改变广播

mReceiver :监听ACTION_OVERLAY_CHANGED广播
Secure.NAVIGATION_MODE:记录导航栏模式改变值
mListeners.get(i).onNavigationModeChanged(mode):通知导航栏模式改变的ModeChangedListener监听

frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationModeController.java

private BroadcastReceiver mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (DEBUG) {Log.d(TAG, "ACTION_OVERLAY_CHANGED");}updateCurrentInteractionMode(true /* notify */);}
};public NavigationModeController(Context context,DeviceProvisionedController deviceProvisionedController,ConfigurationController configurationController,@UiBackground Executor uiBgExecutor,DumpManager dumpManager) {//... ...IntentFilter overlayFilter = new IntentFilter(ACTION_OVERLAY_CHANGED);overlayFilter.addDataScheme("package");overlayFilter.addDataSchemeSpecificPart("android", PatternMatcher.PATTERN_LITERAL);mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, overlayFilter, null, null);//... ...
}public void updateCurrentInteractionMode(boolean notify) {mCurrentUserContext = getCurrentUserContext();int mode = getCurrentInteractionMode(mCurrentUserContext);mUiBgExecutor.execute(() ->Settings.Secure.putString(mCurrentUserContext.getContentResolver(),Secure.NAVIGATION_MODE, String.valueOf(mode)));if (DEBUG) {Log.d(TAG, "updateCurrentInteractionMode: mode=" + mode);dumpAssetPaths(mCurrentUserContext);}if (notify) {for (int i = 0; i < mListeners.size(); i++) {mListeners.get(i).onNavigationModeChanged(mode);}}
}

2.3 SystemUI导航栏布局更新

NavigationModeController通知监听执行onNavigationModeChanged方法更新,最后 navBar.getView().updateStates()执行更新界面NavigationBarView

  • updateSlippery():更新WindowManager.LayoutParams.FLAG_SLIPERY状态,具体取决于是否启用了向上滑动,或者通知是否在未处于动画状态的情况下完全打开。如果启用了slide,触摸事件将离开导航栏窗口并进入全屏应用程序/主页窗口,如果没有,则手势离开导航栏后,导航栏将收到取消的触摸事件。
  • reloadNavIcons():重新导入导航栏相关图片资源
  • updateNavButtonIcons:更新界面导航栏图标、显示状态,及活动触摸区域

frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java

@Override
public void onNavigationModeChanged(int mode) {if (mNavMode == mode) {return;}final int oldMode = mNavMode;mNavMode = mode;updateAccessibilityButtonModeIfNeeded();mHandler.post(() -> {// create/destroy nav bar based on nav mode only in unfolded stateif (oldMode != mNavMode) {updateNavbarForTaskbar();}for (int i = 0; i < mNavigationBars.size(); i++) {NavigationBar navBar = mNavigationBars.valueAt(i);if (navBar == null) {continue;}navBar.getView().updateStates();}});
}

frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java

public void updateStates() {if (mNavigationInflaterView != null) {// Reinflate the navbar if needed, no-op unless the swipe up state changesmNavigationInflaterView.onLikelyDefaultLayoutChange();}updateSlippery();reloadNavIcons();updateNavButtonIcons();WindowManagerWrapper.getInstance().setNavBarVirtualKeyHapticFeedbackEnabled(!mShowSwipeUpUi);getHomeButton().setAccessibilityDelegate(mShowSwipeUpUi ? mQuickStepAccessibilityDelegate : null);
}

2.4 时序图

在这里插入图片描述

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

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

相关文章

VC++创建windows服务程序

目录 1.关于windows标准可执行程序和服务程序 2.服务相关整理 2.1 VC编写服务 2.2 服务注册 2.3 服务卸载 2.4 启动服务 2.5 关闭服务 2.6 sc命令 2.7 查看服务 3.标准程序 3.1 后台方式运行标准程序 3.2 查找进程 3.3 终止进程 以前经常在Linux下编写服务器程序…

web漏洞-PHP反序列化

目录 PHP反序列化序列化反序列化原理涉及技术利用危害CTF靶场 PHP反序列化 序列化 将对象转换成字符串 反序列化 相反&#xff0c;将字符串转换成对象。 数据格式的转换对象的序列化有利于对象的保存和传输&#xff0c;也可以让多个文件共享对象。 原理 未对用户输入的序列化字…

【Stm32-F407】Keil uVision5 的安装

文章内容如下&#xff1a; 1&#xff09;Keil uVision5 安装包的获取2&#xff09;Keil uVision5 的安装3&#xff09;Keil uVision5 中 Stm32-F407 芯片包的获取与安装4&#xff09;注册 Keil uVision5 1&#xff09;Keil uVision5 安装包的获取 Keil uVision5 安装包链接: h…

OpenCV报错:AttributeError: module ‘cv2.cv2‘ has no attribute ‘SIFT_create‘

报错位置&#xff1a; sift cv2.SIFT_create()报错原因&#xff1a;opencv将SIFT等算法整合到xfeatures2d集合里面了。 改为&#xff1a; sift cv2.xfeatures2d.SIFT_create()

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第二周测验

课程1_第2周_测验题 目录&#xff1a;目录 第一题 1.神经元计算什么&#xff1f; A. 【  】神经元计算激活函数后&#xff0c;再计算线性函数&#xff08;zWxb&#xff09; B. 【  】神经元计算一个线性函数&#xff08;zWxb&#xff09;&#xff0c;然后接一个激活函数…

打字速度测试,生成您的打字速度证书?

趁着十一国庆之际&#xff0c;开发完成了打字侠的速度测试功能。我自己的打字速度约为56字/分钟&#xff0c;算是盲打中速度比较快的。下面是我的打字荣誉证书&#xff0c;欢迎大家免费测试自己的打字速度。 你也想来测试一下自己的打字速度吗&#xff1f; 打字侠速度测试地址…

一键智能视频编辑与视频修复算法——ProPainter源码解析与部署

前言 视频编辑和修复确实是随着电子产品的普及变得越来越重要的技能。有许多视频编辑工具可以帮助人们轻松完成这些任务如&#xff1a;Adobe Premiere Pro&#xff0c;Final Cut Pro X&#xff0c;Davinci Resolve&#xff0c;HitFilm Express&#xff0c;它们都提供一些视频修…

OpenCV 13(模版匹配和霍夫变换)

一、模版匹配 所谓的模板匹配&#xff0c;就是在给定的图片中查找和模板最相似的区域&#xff0c;该算法的输入包括模板和图片&#xff0c;整个任务的思路就是按照滑窗的思路不断的移动模板图片&#xff0c;计算其与图像中对应区域的匹配度&#xff0c;最终将匹配度最高的区域…

Qt扩展-QCustomPlot绘图基础概述

QCustomPlot绘图基础概述 一、概述二、改变外观1. Graph 类型2. Axis 坐标轴3. 网格 三、案例1. 简单布局两个图2. 绘图与多个轴和更先进的样式3. 绘制日期和时间数据 四、其他Graph&#xff1a;曲线&#xff0c;条形图&#xff0c;统计框图&#xff0c;… 一、概述 本教程使用…

【C语言】函数的定义、传参与调用(二)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C语言初步学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a; 1. 函数的嵌套调用 1.1 什么是嵌套调用 1.2 基础实现 1.3 调用流程解析 2. 函数的链式访问 2.1 …

《深度不确定条件下的决策:从理论到实践》PDF

制定未来计划时需要预测变化&#xff0c;尤其是制定长期计划或针对罕见事件的计划时。当这些变化存在高度不确定性的时候&#xff0c;这种预期就变得越来越困难。 今天给大家介绍的这本《深度不确定条件下的决策&#xff1a;从理论到实践》正是解决以上问题的良方。完整书籍文…

聊聊分布式架构——Http到Https

目录 HTTP通信协议 请求报文 响应报文 持久连接 状态管理 HTTPS通信协议 安全的HTTPS HTTP到HTTPS的演变 对称加密 非对称加密 混合加密机制 证书机构 SSL到底是什么 HTTPS是身披SSL外壳的HTTP HTTP通信协议 一次HTTP请求的通信流程&#xff1a;客户端浏览器通过…