当前位置: 首页 > news >正文

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

@OverridepublicintinterceptKeyBeforeQueueing(KeyEvent event,intpolicyFlags) { ...finalbooleanisDefaultDisplayOn = mDefaultDisplayPolicy.isAwake();finalbooleandisplayOn = Display.isOnState(mDefaultDisplay.getState());finalbooleaninteractiveAndOn = interactive && isDefaultDisplayOn && displayOn;if((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {handleKeyGesture(event, interactiveAndOn);}

2. PhoneWindowManager#handleKeyGesture

privatevoidhandleKeyGesture(KeyEvent event,booleaninteractive) {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.privatebooleanhandleCameraGesture(KeyEvent event,booleaninteractive) { // add by monet, do not handle camera gesture.如果是VR设备,这里会直接return false。if(SystemProperties.getBoolean("persist.xr.vrmode",true)) {returnfalse; }...

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

voidinterceptKey(KeyEvent event,booleaninteractive) {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

privatebooleaninterceptKeyUp(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())); }短按Messagemsg = mHandler.obtainMessage(MSG_KEY_DELAYED_PRESS, mActiveRule.mKeyCode, 1, mActiveRule);msg.setAsynchronous(true); mHandler.sendMessage(msg); mActiveRule = null;returntrue; }

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

privateclassKeyHandlerextendsHandler { KeyHandler() {super(Looper.myLooper()); } @OverridepublicvoidhandleMessage(Message msg) {finalSingleKeyRule rule = (SingleKeyRule) msg.obj;if(rule == null) { Log.wtf(TAG, "No active rule.");return; }finalintkeyCode = msg.arg1;finalintpressCount = msg.arg2;switch(msg.what) {caseMSG_KEY_LONG_PRESS:if(DEBUG) { Log.i(TAG, "Detect long press " + KeyEvent.keyCodeToString(keyCode)); }rule.onLongPress(mLastDownTime);break;caseMSG_KEY_VERY_LONG_PRESS:if(DEBUG) { Log.i(TAG, "Detect very long press " + KeyEvent.keyCodeToString(keyCode)); }rule.onVeryLongPress(mLastDownTime);break;caseMSG_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. */privatefinalclassPowerKeyRuleextendsSingleKeyGestureDetector.SingleKeyRule { PowerKeyRule() {super(KEYCODE_POWER); } @Override短按一次voidonPress(longdownTime) { powerPress(downTime, 1 /*count*/, mSingleKeyGestureDetector.beganFromNonInteractive()); }
@Override长按voidonLongPress(longeventTime) {if(mSingleKeyGestureDetector.beganFromNonInteractive() && !mSupportLongPressPowerWhenNonInteractive) { Slog.v(TAG, "Not support long press power when device is not interactive.");return; } powerLongPress(eventTime); } @OverridevoidonVeryLongPress(longeventTime) { mActivityManagerInternal.prepareForPossibleShutdown(); powerVeryLongPress(); } @Override多次按voidonMultiPress(longdownTime,intcount) { powerPress(downTime, count, mSingleKeyGestureDetector.beganFromNonInteractive()); }

8. PhoneWindowManager#powerPress

privatevoidpowerPress(longeventTime,intcount,booleanbeganFromNonInteractive) {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; }finalbooleaninteractive = mDefaultDisplayPolicy.isAwake(); Slog.d(TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive + " count=" + count + " beganFromNonInteractive=" + beganFromNonInteractive + " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior);if(count == 2) { powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior); }elseif(count == 3) { powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior); }elseif(count > 3 && count <= getMaxMultiPressPowerCount()) { Slog.d(TAG, "No behavior defined for power press count " + count); }elseif(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) {caseSHORT_PRESS_POWER_NOTHING:break;caseSHORT_PRESS_POWER_GO_TO_SLEEP: sleepDefaultDisplayFromPowerButton(eventTime, 0);break;caseSHORT_PRESS_POWER_REALLY_GO_TO_SLEEP: sleepDefaultDisplayFromPowerButton(eventTime, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);break;caseSHORT_PRESS_POWER_REALLY_GO_TO_SLEEP_AND_GO_HOME:if(sleepDefaultDisplayFromPowerButton(eventTime, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE)) { launchHomeFromHotKey(DEFAULT_DISPLAY); }break;caseSHORT_PRESS_POWER_GO_HOME: shortPressPowerGoHome();break;caseSHORT_PRESS_POWER_CLOSE_IME_OR_GO_HOME: {if(mDismissImeOnBackKeyPressed) { InputMethodManagerInternal.get().hideCurrentInputMethod( SoftInputShowHideReason.HIDE_POWER_BUTTON_GO_HOME); }else{ shortPressPowerGoHome(); }break; }caseSHORT_PRESS_POWER_LOCK_OR_SLEEP: {if(mKeyguardDelegate == null || !mKeyguardDelegate.hasKeyguard() || !mKeyguardDelegate.isSecure(mCurrentUserId) || keyguardOn()) { sleepDefaultDisplayFromPowerButton(eventTime, 0); }else{ lockNow(null /*options*/); }break; }caseSHORT_PRESS_POWER_DREAM_OR_SLEEP: { attemptToDreamFromShortPowerButtonPress(true, () -> sleepDefaultDisplayFromPowerButton(eventTime, 0));break; } } } }
http://www.jsqmd.com/news/1405045/

相关文章:

  • QQ空间备份怎么做最省心?一款把数据存回本地的开源插件
  • 新乡延津哪里有文武学校?一文了解中原文武学校收费与办学情况 - Luckyone王
  • 2026 八月最新唐山下水道疏通地漏反水维修冻管处理异物打捞商家汇总 - 启航优客
  • 2026年广州白云区靠谱的律师事务所推荐:本地产业适配与法律服务选型指南 - 滚动商讯
  • 基于SpringBoot的闲置资产管理系统(毕业设计项目源码+文档)
  • 电子元件-门电路
  • cann 9.0.0 安装同时支持 a2 a3 910 950pr的仿真环境 9.0.0(只支持950pr)
  • 涿州蛋糕谁家好?
  • DFRDisplayKm驱动完整上手指南:让MacBook Pro的Touch Bar在Windows 10下恢复全部功力
  • 在上海茶叶恒温冷藏库怎么做?茶叶仓储环境控制与安装参考 - 上海冰丰库制冷
  • 基于FAQ的智能问答(一): Elasticsearch的调教
  • 基于SpringBoot的问卷调查管理系统(毕业设计项目源码+文档)
  • 2026佛山宝格丽回收,同款价差大?看懂行情再出手 - 闲置奢品线下探店
  • Steam创意工坊下载器终极指南:用WorkshopDL跨平台畅享海量模组
  • 2026年清新微波机构挑选指南:关注这些细节才能找到专业好机构
  • 佛山爱马仕首饰怎么卖更划算?本地真实回收行情一览 - 闲置奢品线下探店
  • 基于FAQ的智能问答(二): 召回篇
  • 河南GEO贴牌适合什么人做?创业者选型指南:核心要点与实用指南
  • 生成模型(二):基于流的生成模型(Flow-based Generative Model)
  • 2026年成都半包装修公司口碑实测梳理与高性价比优选参考 - 天下观知
  • 2026年 节能仿经编割圈绒圆机实力源头厂家:出口认证与高效织造工艺全观察 - 卓企推荐
  • 如何给Unity游戏加模组?BepInEx插件框架从安装到写出第一个插件的完整记录
  • 2026年 节能割圈大圆机生产厂家安全认证与稳定运行实力解析 - 卓企推荐
  • 2026年工控一体机怎么选?看完这篇少花冤枉钱
  • 2026年省内电瓶车托运攻略:短途寄运划算方法与注意事项全解析 - 快递物流资讯
  • 细软塌护发精油太厚重选哪款更清爽?四款热门产品配方结构与功效数据横评 - 资讯报道
  • 秋冬鞋履旺季重磅商标+外观专利双轨TRO突袭!UGG品牌母公司Deckers Outdoor Corporation委托行业头部GBC律所发起大规模批量密封诉讼,26-cv-9356雪地靴、居家拖鞋、
  • 纳米 AI 多场景智能应用落地指南
  • PDF阅读插件怎么选?Obsidian PDF++一键高亮标注的5个实用技巧
  • 万象生鲜配送系统依靠哪些底层技术优化生鲜配送作业效率