Android14 WMS-Power键短按流程

目录

1. PhoneWindowManager#interceptKeyBeforeQueueing 

2. PhoneWindowManager#handleKeyGesture

3. PhoneWindowManager#handleCameraGesture

4. SingleKeyGestureDetector#interceptKey

5. SingleKeyGestureDetector#interceptKeyUp

6. SingleKeyGestureDetector#KeyHandler#handleMessage

7. PhoneWindowManager#PowerKeyRule#onPress 

 8. PhoneWindowManager#powerPress


WMS中事件分发从

interceptKeyBeforeDispatching->interceptKeyBeforeQueueing

1. PhoneWindowManager#interceptKeyBeforeQueueing 

http://10.12.16.211:8080/source/xref/LA.QSSI.14.0.r1/LINUX/android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java#interceptKeyBeforeQueueing

    @Override
    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {               
...final boolean isDefaultDisplayOn = mDefaultDisplayPolicy.isAwake();final boolean displayOn = Display.isOnState(mDefaultDisplay.getState());final boolean interactiveAndOn = interactive && isDefaultDisplayOn && displayOn;if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { handleKeyGesture(event, interactiveAndOn);}

2. PhoneWindowManager#handleKeyGesture

    private void handleKeyGesture(KeyEvent event, boolean interactive) {if (mKeyCombinationManager.interceptKey(event, interactive)) {// handled by combo keys manager.mSingleKeyGestureDetector.reset();return;}if (event.getKeyCode() == KEYCODE_POWER && event.getAction() == KeyEvent.ACTION_DOWN) {
如果连续按power键会拉起camera,如果这个power事件被消费了,会直接return,不往下继续走短按power流程了mPowerKeyHandled = handleCameraGesture(event, interactive);if (mPowerKeyHandled) {// handled by camera gesture.mSingleKeyGestureDetector.reset();return;}}  mSingleKeyGestureDetector.interceptKey(event, interactive);}

3. PhoneWindowManager#handleCameraGesture

    // The camera gesture will be detected by GestureLauncherService.
    private boolean handleCameraGesture(KeyEvent event, boolean interactive) {// add by monet, do not handle camera gesture.
如果是VR设备,这里会直接return false。if (SystemProperties.getBoolean("persist.xr.vrmode", true)) {return false;}...

4. SingleKeyGestureDetector#interceptKey

http://10.12.16.211:8080/source/xref/LA.QSSI.14.0.r1/LINUX/android/frameworks/base/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java

    void interceptKey(KeyEvent event, boolean interactive) {if (event.getAction() == KeyEvent.ACTION_DOWN) {// Store the non interactive state when first down.if (mDownKeyCode == KeyEvent.KEYCODE_UNKNOWN || mDownKeyCode != event.getKeyCode()) {mBeganFromNonInteractive = !interactive;}interceptKeyDown(event);} else { interceptKeyUp(event);}}

5. SingleKeyGestureDetector#interceptKeyUp

    private boolean interceptKeyUp(KeyEvent event) {

...

        if (event.getKeyCode() == mActiveRule.mKeyCode) {// Directly trigger short press when max count is 1.if (mActiveRule.getMaxMultiPressCount() == 1) {if (DEBUG) {Log.i(TAG, "press key " + KeyEvent.keyCodeToString(event.getKeyCode()));}短按    Message msg = mHandler.obtainMessage(MSG_KEY_DELAYED_PRESS, mActiveRule.mKeyCode, 1, mActiveRule);msg.setAsynchronous(true);mHandler.sendMessage(msg);mActiveRule = null;return true;}

6. SingleKeyGestureDetector#KeyHandler#handleMessage

http://10.12.16.211:8080/source/xref/LA.QSSI.14.0.r1/LINUX/android/frameworks/base/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java#425

    private class KeyHandler extends Handler {
        KeyHandler() {super(Looper.myLooper());}@Override
        public void handleMessage(Message msg) {final SingleKeyRule rule = (SingleKeyRule) msg.obj;if (rule == null) {Log.wtf(TAG, "No active rule.");return;}final int keyCode = msg.arg1;final int pressCount = msg.arg2;switch(msg.what) {case MSG_KEY_LONG_PRESS:if (DEBUG) {Log.i(TAG, "Detect long press " + KeyEvent.keyCodeToString(keyCode));} rule.onLongPress(mLastDownTime);break;case MSG_KEY_VERY_LONG_PRESS:if (DEBUG) {Log.i(TAG, "Detect very long press " + KeyEvent.keyCodeToString(keyCode));} rule.onVeryLongPress(mLastDownTime);break;case MSG_KEY_DELAYED_PRESS:if (DEBUG) {Log.i(TAG, "Detect press " + KeyEvent.keyCodeToString(keyCode) + ", count " + pressCount);}if (pressCount == 1) {
短按一次走这里 rule.onPress(mLastDownTime);} else { rule.onMultiPress(mLastDownTime, pressCount);}break;}

7. PhoneWindowManager#PowerKeyRule#onPress 

http://10.12.16.211:8080/source/xref/LA.QSSI.14.0.r1/LINUX/android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java#2481

    /*** Rule for single power key gesture.*/private final class PowerKeyRule extends SingleKeyGestureDetector.SingleKeyRule {
        PowerKeyRule() {super(KEYCODE_POWER);}@Override 短按一次
        void onPress(long downTime) {powerPress(downTime, 1 /*count*/,mSingleKeyGestureDetector.beganFromNonInteractive());}
        @Override 长按
        void onLongPress(long eventTime) {if (mSingleKeyGestureDetector.beganFromNonInteractive()&& !mSupportLongPressPowerWhenNonInteractive) {Slog.v(TAG, "Not support long press power when device is not interactive.");return;}powerLongPress(eventTime);}@Override
        void onVeryLongPress(long eventTime) {mActivityManagerInternal.prepareForPossibleShutdown();powerVeryLongPress();}@Override  多次按
        void onMultiPress(long downTime, int count) {powerPress(downTime, count, mSingleKeyGestureDetector.beganFromNonInteractive());}

 8. PhoneWindowManager#powerPress

    private void powerPress(long eventTime, int count, boolean beganFromNonInteractive) { count为按power键的次数// SideFPS still needs to know about suppressed power buttons, in case it needs to block an auth attempt.if (count == 1) {mSideFpsEventHandler.notifyPowerPressed();}if (mDefaultDisplayPolicy.isScreenOnEarly() && !mDefaultDisplayPolicy.isScreenOnFully()) {Slog.i(TAG, "Suppressed redundant power key press while "+ "already in the process of turning the screen on.");return;}final boolean interactive = mDefaultDisplayPolicy.isAwake();Slog.d(TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive + " count=" + count + " beganFromNonInteractive=" + beganFromNonInteractive + " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior);if (count == 2) {powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior);} else if (count == 3) {powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior);} else if (count > 3 && count <= getMaxMultiPressPowerCount()) {Slog.d(TAG, "No behavior defined for power press count " + count);} else if (count == 1 && interactive && !beganFromNonInteractive) {if (mSideFpsEventHandler.shouldConsumeSinglePress(eventTime)) {Slog.i(TAG, "Suppressing power key because the user is interacting with the " + "fingerprint sensor");return;}// Device Integration: If the power button is handled by black screen, then do nothingif (!DeviceIntegrationUtils.DISABLE_DEVICE_INTEGRATION&& BlackScreenWindowManager.getInstance().interceptPowerKey()) {return;}switch (mShortPressOnPowerBehavior) {case SHORT_PRESS_POWER_NOTHING:break;case SHORT_PRESS_POWER_GO_TO_SLEEP:sleepDefaultDisplayFromPowerButton(eventTime, 0);break;case SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP:sleepDefaultDisplayFromPowerButton(eventTime,PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);break;case SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP_AND_GO_HOME:if (sleepDefaultDisplayFromPowerButton(eventTime,PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE)) {launchHomeFromHotKey(DEFAULT_DISPLAY);}break;case SHORT_PRESS_POWER_GO_HOME:shortPressPowerGoHome();break;case SHORT_PRESS_POWER_CLOSE_IME_OR_GO_HOME: {if (mDismissImeOnBackKeyPressed) {InputMethodManagerInternal.get().hideCurrentInputMethod(SoftInputShowHideReason.HIDE_POWER_BUTTON_GO_HOME);} else {shortPressPowerGoHome();}break;}case SHORT_PRESS_POWER_LOCK_OR_SLEEP: {if (mKeyguardDelegate == null || !mKeyguardDelegate.hasKeyguard() || !mKeyguardDelegate.isSecure(mCurrentUserId) || keyguardOn()) {sleepDefaultDisplayFromPowerButton(eventTime, 0);} else {lockNow(null /*options*/);}break;}case SHORT_PRESS_POWER_DREAM_OR_SLEEP: {attemptToDreamFromShortPowerButtonPress(true,() -> sleepDefaultDisplayFromPowerButton(eventTime, 0));break;}}}}

 

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

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

相关文章

【数据结构】图论入门

引入 数据的逻辑结构&#xff1a; 集合&#xff1a;数据元素间除“同属于一个集合”外&#xff0c;无其他关系线性结构&#xff1a;一个对多个&#xff0c;例如&#xff1a;线性表、栈、队列树形结构&#xff1a;一个对多个&#xff0c;例如&#xff1a;树图形结构&#xff1…

「前端+鸿蒙」鸿蒙应用开发-搭建开发环境创建项目

快速体验鸿蒙应用开发&#xff0c;首先需要搭建开发环境和创建项目。 搭建开发环境 下载DevEco Studio&#xff1a; 访问华为开发者联盟官方网站下载DevEco Studio。DevEco Studio下载链接 安装DevEco Studio&#xff1a; 运行下载的安装程序&#xff0c;按照安装向导指引完成…

SpringBoot中的WebMvcConfigurationSupport和WebMvcConfigurer

在SpringBoot中可以通过以下两种方式来完成自定义WebMvc的配置&#xff1a; &#xff08;1&#xff09;继承WebMvcConfigurationSupport类 &#xff08;2&#xff09;实现WebMvcConfigurer接口 通过这两种方式完成的WebMvc配置存在差异&#xff0c;本文将对此作简单说明与区…

【Vue】单页应用程序介绍

通常基于Vue去开发一整个网站&#xff0c;开发出来的这整个网站应用&#xff0c;我们都会叫做单页应用程序 概念 单页应用程序&#xff1a;SPA【Single Page Application】是指所有的功能都在一个html页面上实现 我们可以将页面共用的部分封装成组件&#xff0c;底下要切换的也…

【copy_dwg_files.bat】

参考这段代码,实现copy_dwg_files的功能 好的,以下是参考你提供的代码来实现 copy_dwg_files.bat 的功能。这段代码将在当前目录及其所有子目录中查找 施工图 文件夹,并将该文件夹下的所有 .dwg 文件复制到同一目录下的 Calculate 文件夹中。如果 Calculate 文件夹不存在,…

工具-金舟投屏软件: 手机如何投屏到电脑上 / Wi-Fi / USB

金舟安卓/iOS苹果投屏-正版软件下载中心 方法一、金舟投屏软件-wifi 1.1、准备工作 确保苹果手机和Windows电脑都连接到同一个Wi-Fi网络。 在Windows电脑上安装并打开金舟投屏软件。 1.2、操作步骤 在金舟投屏软件上选择“苹果手机投屏”功能。 在苹果手机上下滑屏幕&am…

New Work-flow of Circuit Bootstrapping

参考文献&#xff1a; [CGGI17] Chillotti I, Gama N, Georgieva M, et al. Faster packed homomorphic operations and efficient circuit bootstrapping for TFHE. ASIACRYPT 2017 (1): 377-408.[CDKS21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion be…

dots_image 增强图像中的圆点特征

dots_image 增强图像中的圆点特征 1. dot_image 有什么用途&#xff1f;2. 点状字符的特征增强3. Halcon代码 1. dot_image 有什么用途&#xff1f; Enhance circular dots in an image. 这个算子可以增强图像中的圆点特征&#xff0c;例如下面的例子。 2. 点状字符的特征增强…

忆恒创源国产系列新品 —— PBlaze7 7A40 取得 PCI-SIG 兼容性认证

在此前报道中&#xff0c;我们曾预告了忆恒创源国产系列 PCIe 5.0 SSD 新品 —— PBlaze7 7A40&#xff0c;今天&#xff0c;这款 SSD 已经顺利通过 PCI-SIG 的严格测试并出现在 Integrators List 集成商列表当中&#xff0c;标志着距离 PBlaze7 7A40 的正式发布又近了一步。 正…

记录汇川:红绿灯与HMI-ST

项目要求&#xff1a; 子程序&#xff1a; 子程序&#xff1a; 实际动作如下&#xff1a; 红绿灯与HMI-ST

网工内推 | 华为生态合作伙伴企业,IP以上认证优先,最高20k+

01 金华威&#xff08;华为生态合作伙伴&#xff09; &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;职责描述&#xff1a; 1、负责华为数通产品线用户需求规划、选型、设计、报价及方案制定工作&#xff1b; 2、负责华为数通产品线项目投标文件的编写及应答&a…

STM32项目分享:智能门禁锁系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.c…

基于某评论的TF-IDF下的LDA主题模型分析

完整代码&#xff1a; import numpy as np import re import pandas as pd import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import LatentDirichletAllocationdf1 pd.read_csv(小红书评论.csv) # 读取同目录下csv文件…

【Vue】组件化开发

文章目录 一、介绍二、根组件 App.vue 一、介绍 组件化&#xff1a;一个页面可以拆分成一个个组件&#xff0c;每个组件有着自己独立的结构、样式、行为。 好处&#xff1a;便于维护&#xff0c;利于复用 → 提升开发效率。 组件分类&#xff1a;普通组件、根组件。 根组件…

MySQL 高级 - 第十一章 | 索引优化与查询优化

目录 第十一章 索引优化与查询优化11.1 数据准备11.2 索引失效案例11.2.1 全值匹配10.2.2 最佳左前缀法则10.2.3 主键插入顺序10.2.4 计算、函数、类型转换&#xff08;自动或手动&#xff09;导致索引失效10.2.5 范围条件右边的列索引失效10.2.6 不等于&#xff08;! 或者 <…

删除目录

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 删除目录可以通过使用os模块提供的rmdir()函数实现。通过rmdir()函数删除目录时&#xff0c;只有当要删除的目录为空时才起作用。rmdir()函数的基本语…

Flutter核心原理

Flutter UI框架 UI 框架解决的主要问题就是&#xff1a;如何基于基础的图形API&#xff08;Canvas&#xff09;来封装一套可以高效创建UI的框架。Flutter提供了一套Dart API&#xff0c;然后在底层通过OpenGL这种跨平台的绘制库&#xff08;内部会调用操作系统API&#xff09;…

牛客java基础(一)

A 解析 : java源程序只允许一个public类存在 &#xff0c;且与文件名同名 ; D hashCode方法本质就是一个哈希函数&#xff0c;这是Object类的作者说明的。Object类的作者在注释的最后一段的括号中写道&#xff1a;将对象的地址值映射为integer类型的哈希值。但hashCode()并不…

聚类层次【python,机器学习,算法】

层次聚类算法&#xff08;Hierarchical Clustering Algorithm&#xff09;是一种常用的无监督学习算法&#xff0c;用于将数据集划分成多个不同层次的簇。与K均值聚类不同&#xff0c;层次聚类不需要预先指定聚类数量&#xff0c;而是通过计算样本之间的相似度或距离来构建一个…

Linux性能优化实战

Linux性能优化实战 33 | 关于 Linux 网络&#xff0c;你必须知道这些&#xff08;上&#xff09;如何提高系统并发&#xff1f;&#xff08;8条&#xff09;如何理解分布式&#xff1f;如何理解云计算&#xff1f;如何理解微服务&#xff1f;TCP/IP 网络栈如何分层&#xff1f;…