基于RK3568 Android11 移除长按电源按键弹窗的对话框中的 [关机] 和 [紧急呼救] 选项(详细分析)

  一般来说,与Android按键窗口事件相关的基本是与frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 这个文件有关。
  因此先打开与输入相关的日志,如下:
在这里插入图片描述
  然后重新编译烧录后查看打印的日志可以看到如下信息:

WindowManager: interceptKeyTq keycode=26 interactive=true keyguardActive=false policyFlags=22000000

  而 “keycode=26” 这个键值可以通过frameworks/native/include/android/keycodes.h这个文件中的122行中找到,如下: AKEYCODE_POWER = 26,



frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags)

在这里插入图片描述

private void interceptPowerKeyDown(KeyEvent event, boolean interactive)

在这里插入图片描述
  通过上面的分析可以清楚知道电源按键按下后需要达到设定的超时时间后才会发送电源按键长按标志的消息,那么这个消息又会通过对应的Handler对该消息进行处理。
通过查找可以找到,还是在该文件下。

private class PolicyHandler extends Handler

在这里插入图片描述

private void powerLongPress()

在这里插入图片描述

void showGlobalActionsInternal()

在这里插入图片描述
  这里我要说一下,在调用 “showGlobalActionsInternal“ 此方法之前还调用了一个显示对话框方法 “onGlobalActionsAvailableChanged” ,这个就是小的对话框,如下。
在这里插入图片描述

frameworks/base/services/core/java/com/android/server/policy/GlobalActions.java
public void showDialog(boolean keyguardShowing, boolean deviceProvisioned)

在这里插入图片描述

frameworks/base/services/core/java/com/android/server/policy/GlobalActionsProvider.java

在这里插入图片描述

frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
  GlobalActionsProvider接口的实现如下:

在这里插入图片描述

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
public void showGlobalActionsMenu()

在这里插入图片描述

  那么创建并显示对话框这动作应该也是通过Handler去获取对应的 MSG_SHOW_CLOBAL_ACTIONS 标识的消息去执行的。



获取执行创建并显示对话框的源码位置

  根据前面的分析,需要通过 “MSG_SHOW_CLOBAL_ACTIONS” 这个关键词去查找,可以找到如下图:
在这里插入图片描述
在这里插入图片描述


  下面是对该执行创建并显示对话框的源码进行分析:
在这里插入图片描述
堆栈日志:
在这里插入图片描述

frameworks/base/core/java/android/os/Handler.java
public void dispatchMessage(@NonNull Message msg)
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
public void handleMessage(Message msg)

在这里插入图片描述

frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java
public void handleShowGlobalActionsMenu()
frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
public void showGlobalActions(GlobalActionsManager manager)
frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
public void showOrHideDialog(boolean keyguardShowing, boolean isDeviceProvisioned, GlobalActionsPanelPlugin walletPlugin)
private void handleShow()
private ActionsDialog createDialog()
protected void createActionItems()


补丁:
commit d545ddbd31eb876971725e6a2818b44a8fd15a53
Author: dengjiawen <141147155@qq.com>
Date:   Sat Aug 10 14:03:48 2024 +0800移除长按POWER健弹出的对话框中的[关机][紧急呼救]选项diff --git a/frameworks/base/core/res/res/values/config.xml b/frameworks/base/core/res/res/values/config.xml
index c1e3026ee45..f7c5764e0b3 100644
--- a/frameworks/base/core/res/res/values/config.xml
+++ b/frameworks/base/core/res/res/values/config.xml
@@ -2251,7 +2251,7 @@<dimen name="config_viewMaxFlingVelocity">8000dp</dimen><!-- Amount of time in ms the user needs to press the relevant key to bring up the
-         global actions dialog -->
+         global actions dialog 长按按键时长--><integer name="config_globalActionsKeyTimeout">500</integer><!-- Amount of time in ms the user needs to press the relevant keys to trigger the
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index ff25439a5f9..17f085b21be 100644
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -614,12 +614,15 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,for (int i = 0; i < defaultActions.length; i++) {String actionKey = defaultActions[i];
+            Log.e(TAG, "global action key " + actionKey);if (addedKeys.contains(actionKey)) {// If we already have added this, don't add it again.continue;}if (GLOBAL_ACTION_KEY_POWER.equals(actionKey)) {
-                addIfShouldShowAction(tempActions, shutdownAction);
+                // addIfShouldShowAction(tempActions, shutdownAction);
+                Exception e = new Exception("djw :createActionItems stack log");
+                e.printStackTrace(); } else if (GLOBAL_ACTION_KEY_AIRPLANE.equals(actionKey)) {addIfShouldShowAction(tempActions, mAirplaneModeOn);} else if (GLOBAL_ACTION_KEY_BUGREPORT.equals(actionKey)) {
@@ -655,7 +658,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,addIfShouldShowAction(tempActions, new LogoutAction());}} else if (GLOBAL_ACTION_KEY_EMERGENCY.equals(actionKey)) {
-                addIfShouldShowAction(tempActions, new EmergencyDialerAction());
+                // addIfShouldShowAction(tempActions, new EmergencyDialerAction());} else {Log.e(TAG, "Invalid global action key " + actionKey);}
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 96d6ecbcc07..dd1ff736ff6 100644
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -57,6 +57,8 @@ import com.android.systemui.tracing.ProtoTracer;import java.util.ArrayList;+import android.util.Slog;
+/*** This class takes the functions from IStatusBar that come in on* binder pool threads and posts messages to get them onto the main
@@ -66,6 +68,9 @@ import java.util.ArrayList;*/public class CommandQueue extends IStatusBar.Stub implements CallbackController<Callbacks>,DisplayManager.DisplayListener {
+
+    private static final String TAG = "CommandQueue";
+private static final int INDEX_MASK = 0xffff;private static final int MSG_SHIFT  = 16;private static final int MSG_MASK   = 0xffff << MSG_SHIFT;
@@ -742,6 +747,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<@Overridepublic void showGlobalActionsMenu() {synchronized (mLock) {
+            Slog.w(TAG, "djw 9: showGlobalActionsMenu removeMessages obtainMessage");mHandler.removeMessages(MSG_SHOW_GLOBAL_ACTIONS);mHandler.obtainMessage(MSG_SHOW_GLOBAL_ACTIONS).sendToTarget();}
diff --git a/frameworks/base/services/core/java/com/android/server/policy/GlobalActions.java b/frameworks/base/services/core/java/com/android/server/policy/GlobalActions.java
index ecd1eabc857..3e2e146fc9b 100755
--- a/frameworks/base/services/core/java/com/android/server/policy/GlobalActions.java
+++ b/frameworks/base/services/core/java/com/android/server/policy/GlobalActions.java
@@ -26,7 +26,7 @@ import android.os.SystemProperties;class GlobalActions implements GlobalActionsProvider.GlobalActionsListener {private static final String TAG = "GlobalActions";
-    private static final boolean DEBUG = false;
+    private static final boolean DEBUG = true;private final Context mContext;private final GlobalActionsProvider mGlobalActionsProvider;
@@ -66,6 +66,7 @@ class GlobalActions implements GlobalActionsProvider.GlobalActionsListener {mDeviceProvisioned = deviceProvisioned;mShowing = true;if (mGlobalActionsAvailable && !"box".equals(SystemProperties.get("ro.target.product","unkonw"))) {
+            Slog.d(TAG, "djw 7: showDialog mGlobalActionsProvider.showGlobalActions");mHandler.postDelayed(mShowTimeout, 5000);mGlobalActionsProvider.showGlobalActions();} else {
diff --git a/frameworks/base/services/core/java/com/android/server/policy/GlobalActionsProvider.java b/frameworks/base/services/core/java/com/android/server/policy/GlobalActionsProvider.java
index d414314db2b..a7b0f04ba92 100644
--- a/frameworks/base/services/core/java/com/android/server/policy/GlobalActionsProvider.java
+++ b/frameworks/base/services/core/java/com/android/server/policy/GlobalActionsProvider.java
@@ -21,7 +21,7 @@ public interface GlobalActionsProvider {boolean isGlobalActionsDisabled();/** Set the listener that will handle various global actions evetns. */void setGlobalActionsListener(GlobalActionsListener listener);
-    /** Show the global actions UI to the user. */
+    /** Show the global actions UI to the user. by djw -> mGlobalActionsProvider.showGlobalActions();*/void showGlobalActions();/** Listener to pass global actions events back to system. */
diff --git a/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java b/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
index d966f36becb..82c4015630b 100755
--- a/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -240,7 +240,7 @@ import java.util.List;public class PhoneWindowManager implements WindowManagerPolicy {static final String TAG = "WindowManager";static final boolean localLOGV = false;
-    static final boolean DEBUG_INPUT = false;
+    static final boolean DEBUG_INPUT = true;    //首先打开关于输入的日志static final boolean DEBUG_KEYGUARD = false;static final boolean DEBUG_SPLASH_SCREEN = false;static final boolean DEBUG_WAKEUP = false;
@@ -682,6 +682,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {}};+    /* 被注册成监听和观察 */private class PolicyHandler extends Handler {@Overridepublic void handleMessage(Message msg) {
@@ -729,6 +730,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {finishPowerKeyPress();break;case MSG_POWER_LONG_PRESS:
+                    Log.d(TAG, "djw 4: PolicyHandler powerLongPress");powerLongPress();break;case MSG_POWER_VERY_LONG_PRESS:
@@ -1016,8 +1018,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {if ((event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0) {powerLongPress();} else {
+                        Log.d(TAG, "djw 3: mHandler.sendMessageDelayed(msg,ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout())");Message msg = mHandler.obtainMessage(MSG_POWER_LONG_PRESS);
+                        /* mHandler.obtainMessage(MSG_POWER_LONG_PRESS)->PolicyHandler这是一个处理者 */msg.setAsynchronous(true);
+                        /* getDeviceGlobalActionKeyTimeout->mGlobalActionsKeyTimeout->com.android.internal.R.integer.config_globalActionsKeyTimeout->config.xml */mHandler.sendMessageDelayed(msg,ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout());@@ -1308,6 +1313,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {case LONG_PRESS_POWER_NOTHING:break;case LONG_PRESS_POWER_GLOBAL_ACTIONS:
+                Log.d(TAG, "djw 5: LONG_PRESS_POWER_GLOBAL_ACTIONS");mPowerKeyHandled = true;performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,"Power - Long Press - Global Actions");
@@ -1530,6 +1536,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {if (mGlobalActions == null) {mGlobalActions = new GlobalActions(mContext, mWindowManagerFuncs);}
+        Log.d(TAG, "djw 6: LONG_PRESS_POWER_GLOBAL_ACTIONS");final boolean keyguardShowing = isKeyguardShowingAndNotOccluded();mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned());// since it took two seconds of long press to bring this up,
@@ -3737,7 +3744,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {mKeyguardDelegate.isShowing()));if (DEBUG_INPUT) {
-            Log.d(TAG, "interceptKeyTq keycode=" + keyCode
+            Log.d(TAG, "djw 1: interceptKeyTq keycode=" + keyCode+ " interactive=" + interactive + " keyguardActive=" + keyguardActive+ " policyFlags=" + Integer.toHexString(policyFlags));}
@@ -3978,6 +3985,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {result &= ~ACTION_PASS_TO_USER;isWakeKey = false; // wake-up will be handled separatelyif (down) {
+                    Log.d(TAG, "djw 2: KEYCODE_POWER DOWN (down)");interceptPowerKeyDown(event, interactive);} else {interceptPowerKeyUp(event, interactive, canceled);
diff --git a/frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 39e839dfc7e..3ed8845199c 100644
--- a/frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -542,6 +542,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements Dpublic void showGlobalActions() {if (mBar != null) {try {
+                    Slog.w(TAG, "djw 8: showGlobalActionsMenu");mBar.showGlobalActionsMenu();} catch (RemoteException ex) {}}

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

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

相关文章

基于Python、Django开发Web计算器

1、创建项目 创建Django项目参照https://blog.csdn.net/qq_42148307/article/details/140798249&#xff0c;其中项目名为compute&#xff0c;并在该项目下创建一个名为app的应用&#xff0c;并且进行基本的配置。 2、导入Bootstrap前端框架 Bootstrap的使用参照https://blo…

uvm(7)factory

重载 针对任务或者函数&#xff0c;定义virtual;然后就可以重载 第二个是 约束的重载 然后 m_trans.crc_err_cons.constraint_mode(0); 这个是关闭此约束 m_trans.constraint_mode(0); 这是关闭所有约束 还可以集成原来的transation直接重写约束起到重载的作用 用factory重…

【数据结构】二叉树(一)

目录 1. 树型结构 概念 树的表示形式 ​编辑 2. 二叉树&#xff08;重点&#xff09; 2.1 概念 2.2 二叉树的性质 2.3 二叉树的存储 2.4 二叉树的遍历 前中后序遍历 层序遍历&#xff1a; 2.5二叉树的基本操作 本篇主要理解树和二叉树相关概念&#xff0c;二叉树遍…

0813,引用,函数重载,内存布局叭叭叭

是我4句话5个ERROR&#xff0c;阿巴阿巴 001_arrpointer.cc #include <iostream> using std::cout; using std::endl;void test(){int a[5]{1,2,3,4,5};int (*p)[5]&a;cout<<p<<endl;cout<<p1<<endl;int *pp(int*)(&a1);//第二个数组的…

vue 获取当前页面路由

vue2 &#xff1a; import { getCurrentInstance } from ‘vue’; //获取当前页路由 data() { return { currentRouter: ‘’,//默认路由 } } const { proxy } getCurrentInstance(); this.currentRouter proxy.$router.currentRoute.meta.title vue3 &#xff1a; import …

机器学习之随机森林

文章目录 1. 随机森林概述1.1 定义与起源1.2 与其他算法的比较 2. 随机森林的工作原理2.1 决策树基础2.2 Bagging机制2.3 随机性的引入 3. 随机森林的构建过程3.1 数据准备3.2 特征选择3.3 多棵树的集成 4. 随机森林的优缺点分析4.1 优势4.2 局限性 5. 随机森林的应用场景5.1 分…

Go调度器

线程数过多,意味着操作系统会不断地切换线程,频繁的上下文切换就成了性能瓶颈.Go提供一种机制 可以在线程中自己实现调度,上下文切换更轻量,从而达到线程数少,而并发数并不少的效果,而线程中调度的就是Goroutine 调度器主要概念: 1.G:即Go协程,每个go关键字都会创建一个协程…

Vulnhub JIS-CTF靶机详解

项目地址 https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/ 修改靶机的网卡 开机时长按shift&#xff0c;进入此页面 选择root模式进入 将只读模式改为读写模式 mount -o remount,rw / 查看本机的网卡名称 …

C语言进阶(9)

程序的执行时有两种环境&#xff0c;一种是翻译环境&#xff0c;另一种是执行环境。程序先经过编译成为obj的后缀的文件&#xff0c;然后将文件和链接库链接起来&#xff0c;然后将形成可执行程序&#xff0c;前者时翻译环境&#xff0c;后者时执行环境。(链接库就是库函数的所…

C语言——构造类型

构造类型 数据类型分类 结构体 结构体的定义 定义&#xff1a;自定义数据类型的一种&#xff0c;关键字 struct &#xff0c;结构体类型的变量可以存储多个不同数据类型的数据。 定义格式&#xff1a; struct 结构体名 { 数据类型1 成员名称1; 数据类型2 成员名称2; … } 注…

element-plus的表单输入框有清除按钮的,文字输入前后宽度不一致怎么解决

输入内容之后多了一个可清除的图标&#xff0c;输入框的宽度也被撑开了 根据输入前后的dom对比发现&#xff0c;多了一个图标的span标签 :deep(.el-input__wrapper) {position: relative;.el-input__inner {padding-right: 18px;}.el-input__suffix {position: absolute;right:…

【qmake: No such file or directory 的问题解决最全】

尝试1 qmake: could not exec ‘/usr/lib/x86_64-linux-gnu/qt4/bin/qmake’: No such file or directory 执行 qmake -v出现错误&#xff1a;qmake: could not exec ‘/usr/lib/x86_64-linux-gnu/qt4/bin/qmake’: No such file or directory 分析&#xff1a; qtchooser默…

【简历】北京某985大学:JAVA秋招简历指导,面试通过率较高

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 我们今天要看一位来自25届985同学的JAVA简历。 既然要参加校招的话&#xff0c;我们校招法典的第一准则&#xff1a;定你的学校层次。 …

Java面试八股之什么是消息队列

什么是消息队列 消息队列&#xff08;Message Queue&#xff09;是一种应用程序间通信&#xff08;IPC&#xff09;的形式&#xff0c;它允许进程将消息发送到另一个消息队列&#xff0c;接收端则可以在任何时刻从队列中取出这些消息进行处理。消息队列提供了一种异步处理、解…

java后端正式的企业级项目规范——苍穹外卖篇一

我在极速一个月学完黑马的《java web》课程之后跟着他写了一个java后端项目&#xff0c;但是后面我才发现那只是为了巩固基础的一个简单课程项目&#xff0c;跟实际开发的项目根本不一样。然后后面我暑假去了超星的移动图书馆开发部实习&#xff08;我主要做前端的&#xff09;…

深度优化Nginx负载均衡策略,携手Keepalived打造高可用服务架构新纪元

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

【JavaEE初阶】文件操作和IO

目录 &#x1f334;认识文件 &#x1f6a9;树型结构组织和目录 &#x1f6a9;文件路径&#xff08;Path&#xff09; &#x1f6a9; 文件分类 &#x1f38d;Java 中操作文件 &#x1f6a9; File 概述&#xff1a; &#x1f4cc;属性 &#x1f4cc;构造方法 &#x1f4c…

企业大模型业务架构技术选型分析

AI赋能企业&#xff1a;选择适合你的大模型业务架构 现代企业中&#xff0c;大模型业务日益普及&#xff0c;主要涵盖AI Embedded、AI Copilot和AI Agent三大架构。本文深入剖析其特性与适用场景&#xff0c;为企业选择合适的大模型业务架构提供指导&#xff0c;助力企业高效应…

Spring容器启动的过程(main)

大体流程如下 1、初始化 首先&#xff0c;Spring会通过用户提供的配置信息&#xff08;例如XML文件或者注解&#xff09;来初始化一个BeanFactory&#xff0c;这个BeanFactory是Spring容器的核心&#xff0c;它负责创建和管理所有的Bean。 2、读取配置生成并注册BeanDefini…