Android14 WMS-Power键短按流程

南飓风  金牌会员 | 2024-6-22 06:03:00 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 518|帖子 518|积分 1554

目录
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
  
  1.     @Override
  2.     <strong>public</strong> <strong>int</strong> interceptKeyBeforeQueueing(KeyEvent event, <strong>int</strong> policyFlags) {               
  3. ...
  4.         <strong>final</strong> <strong>boolean</strong> isDefaultDisplayOn = mDefaultDisplayPolicy.isAwake();
  5.         <strong>final</strong> <strong>boolean</strong> displayOn = Display.isOnState(mDefaultDisplay.getState());
  6.         <strong>final</strong> <strong>boolean</strong> interactiveAndOn = interactive && isDefaultDisplayOn && displayOn;
  7.         <strong>if</strong> ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
  8.             handleKeyGesture(event, interactiveAndOn);
  9.         }
复制代码
2. PhoneWindowManager#handleKeyGesture

  
  1.     <strong>private</strong> <strong>void</strong> handleKeyGesture(KeyEvent event, <strong>boolean</strong> interactive) {
  2.         <strong>if</strong> (mKeyCombinationManager.interceptKey(event, interactive)) {
  3.             // handled by combo keys manager.
  4.             mSingleKeyGestureDetector.reset();
  5.             <strong>return</strong>;
  6.         }
  7.         <strong>if</strong> (event.getKeyCode() == KEYCODE_POWER && event.getAction() == KeyEvent.ACTION_DOWN) {
  8. 如果连续按power键会拉起camera,如果这个power事件被消费了,会直接return,不往下继续走短按power流程了
  9.             mPowerKeyHandled = handleCameraGesture(event, interactive);
  10.             <strong>if</strong> (mPowerKeyHandled) {
  11.                 // handled by camera gesture.
  12.                 mSingleKeyGestureDetector.reset();
  13.                 <strong>return</strong>;
  14.             }
  15.         }
  16.         mSingleKeyGestureDetector.interceptKey(event, interactive);
  17.     }
复制代码
3. PhoneWindowManager#handleCameraGesture

  
  1.     // The camera gesture will be detected by GestureLauncherService.
  2.     <strong>private</strong> <strong>boolean</strong> handleCameraGesture(KeyEvent event, <strong>boolean</strong> interactive) {
  3.         // add by monet, do not handle camera gesture.
  4. 如果是VR设备,这里会直接return false。
  5.         <strong>if</strong> (SystemProperties.getBoolean("persist.xr.vrmode", <strong>true</strong>)) {
  6.             <strong>return</strong> <strong>false</strong>;
  7.         }...
复制代码
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
  
  1.     <strong>void</strong> interceptKey(KeyEvent event, <strong>boolean</strong> interactive) {
  2.         <strong>if</strong> (event.getAction() == KeyEvent.ACTION_DOWN) {
  3.             // Store the non interactive state when first down.
  4.             <strong>if</strong> (mDownKeyCode == KeyEvent.KEYCODE_UNKNOWN || mDownKeyCode != event.getKeyCode()) {
  5.                 mBeganFromNonInteractive = !interactive;
  6.             }
  7.             interceptKeyDown(event);
  8.         } <strong>else</strong> {
  9.             interceptKeyUp(event);
  10.         }
  11.     }
复制代码
5. SingleKeyGestureDetector#interceptKeyUp

  
  1.     <strong>private</strong> <strong>boolean</strong> interceptKeyUp(KeyEvent event) {
复制代码
...
  1.         <strong>if</strong> (event.getKeyCode() == mActiveRule.mKeyCode) {
  2.             // Directly trigger short press when max count is 1.
  3.             <strong>if</strong> (mActiveRule.getMaxMultiPressCount() == 1) {
  4.                 <strong>if</strong> (DEBUG) {
  5.                     Log.i(TAG, "press key " + KeyEvent.keyCodeToString(event.getKeyCode()));
  6.                 }短按
  7.                 Message msg = mHandler.obtainMessage(MSG_KEY_DELAYED_PRESS, mActiveRule.mKeyCode, 1, mActiveRule);
  8.                 msg.setAsynchronous(<strong>true</strong>);
  9.                 mHandler.sendMessage(msg);
  10.                 mActiveRule = null;
  11.                 <strong>return</strong> <strong>true</strong>;
  12.             }
复制代码
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
  
  1.     <strong>private</strong> <strong>class</strong> KeyHandler <strong>extends</strong> Handler {
  2.         KeyHandler() {
  3.             <strong>super</strong>(Looper.myLooper());
  4.         }
  5.         @Override
  6.         <strong>public</strong> <strong>void</strong> handleMessage(Message msg) {
  7.             <strong>final</strong> SingleKeyRule rule = (SingleKeyRule) msg.obj;
  8.             <strong>if</strong> (rule == null) {
  9.                 Log.wtf(TAG, "No active rule.");
  10.                 <strong>return</strong>;
  11.             }
  12.             <strong>final</strong> <strong>int</strong> keyCode = msg.arg1;
  13.             <strong>final</strong> <strong>int</strong> pressCount = msg.arg2;
  14.             <strong>switch</strong>(msg.what) {
  15.                 <strong>case</strong> MSG_KEY_LONG_PRESS:
  16.                     <strong>if</strong> (DEBUG) {
  17.                         Log.i(TAG, "Detect long press " + KeyEvent.keyCodeToString(keyCode));
  18.                     }
  19.                     rule.onLongPress(mLastDownTime);
  20.                     <strong>break</strong>;
  21.                 <strong>case</strong> MSG_KEY_VERY_LONG_PRESS:
  22.                     <strong>if</strong> (DEBUG) {
  23.                         Log.i(TAG, "Detect very long press " + KeyEvent.keyCodeToString(keyCode));
  24.                     }
  25.                     rule.onVeryLongPress(mLastDownTime);
  26.                     <strong>break</strong>;
  27.                 <strong>case</strong> MSG_KEY_DELAYED_PRESS:
  28.                     <strong>if</strong> (DEBUG) {
  29.                         Log.i(TAG, "Detect press " + KeyEvent.keyCodeToString(keyCode) + ", count " + pressCount);
  30.                     }
  31.                     <strong>if</strong> (pressCount == 1) {
  32. 短按一次走这里
  33.                         rule.onPress(mLastDownTime);
  34.                     } <strong>else</strong> {
  35.                         rule.onMultiPress(mLastDownTime, pressCount);
  36.                     }
  37.                     <strong>break</strong>;
  38.             }
复制代码
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
  
  1.     /**
  2.      * Rule for single power key gesture.
  3.      */
  4.     <strong>private</strong> <strong>final</strong> <strong>class</strong> PowerKeyRule <strong>extends</strong> SingleKeyGestureDetector.SingleKeyRule {
  5.         PowerKeyRule() {
  6.             <strong>super</strong>(KEYCODE_POWER);
  7.         }
  8.       @Override 短按一次
  9.         <strong>void</strong> onPress(<strong>long</strong> downTime) {
  10.             powerPress(downTime, 1 /*count*/,
  11.                     mSingleKeyGestureDetector.beganFromNonInteractive());
  12.         }
复制代码
  1.         @Override 长按
  2.         <strong>void</strong> onLongPress(<strong>long</strong> eventTime) {
  3.             <strong>if</strong> (mSingleKeyGestureDetector.beganFromNonInteractive()
  4.                     && !mSupportLongPressPowerWhenNonInteractive) {
  5.                 Slog.v(TAG, "Not support long press power when device is not interactive.");
  6.                 <strong>return</strong>;
  7.             }
  8.             powerLongPress(eventTime);
  9.         }
  10.         @Override
  11.         <strong>void</strong> onVeryLongPress(<strong>long</strong> eventTime) {
  12.             mActivityManagerInternal.prepareForPossibleShutdown();
  13.             powerVeryLongPress();
  14.         }
  15.         @Override  多次按
  16.         <strong>void</strong> onMultiPress(<strong>long</strong> downTime, <strong>int</strong> count) {
  17.             powerPress(downTime, count, mSingleKeyGestureDetector.beganFromNonInteractive());
  18.         }
复制代码
 8. PhoneWindowManager#powerPress

  
  1.     <strong>private</strong> <strong>void</strong> powerPress(<strong>long</strong> eventTime, <strong>int</strong> count, <strong>boolean</strong> beganFromNonInteractive) { count为按power键的次数
  2.         // SideFPS still needs to know about suppressed power buttons, in case it needs to block an auth attempt.
  3.         <strong>if</strong> (count == 1) {
  4.             mSideFpsEventHandler.notifyPowerPressed();
  5.         }
  6.         <strong>if</strong> (mDefaultDisplayPolicy.isScreenOnEarly() && !mDefaultDisplayPolicy.isScreenOnFully()) {
  7.             Slog.i(TAG, "Suppressed redundant power key press while "
  8.                     + "already in the process of turning the screen on.");
  9.             <strong>return</strong>;
  10.         }
  11.         <strong>final</strong> <strong>boolean</strong> interactive = mDefaultDisplayPolicy.isAwake();
  12.         Slog.d(TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive + " count=" + count + " beganFromNonInteractive=" + beganFromNonInteractive + " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior);
  13.         <strong>if</strong> (count == 2) {
  14.             powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior);
  15.         } <strong>else</strong> <strong>if</strong> (count == 3) {
  16.             powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior);
  17.         } <strong>else</strong> <strong>if</strong> (count > 3 && count <= getMaxMultiPressPowerCount()) {
  18.             Slog.d(TAG, "No behavior defined for power press count " + count);
  19.         } <strong>else</strong> <strong>if</strong> (count == 1 && interactive && !beganFromNonInteractive) {
  20.             <strong>if</strong> (mSideFpsEventHandler.shouldConsumeSinglePress(eventTime)) {
  21.                 Slog.i(TAG, "Suppressing power key because the user is interacting with the " + "fingerprint sensor");
  22.                 <strong>return</strong>;
  23.             }
  24.             // Device Integration: If the power button is handled by black screen, then do nothing
  25.             <strong>if</strong> (!DeviceIntegrationUtils.DISABLE_DEVICE_INTEGRATION
  26.                 && BlackScreenWindowManager.getInstance().interceptPowerKey()) {
  27.                 <strong>return</strong>;
  28.             }
  29.             <strong>switch</strong> (mShortPressOnPowerBehavior) {
  30.                 <strong>case</strong> SHORT_PRESS_POWER_NOTHING:
  31.                     <strong>break</strong>;
  32.                 <strong>case</strong> SHORT_PRESS_POWER_GO_TO_SLEEP:
  33.                     sleepDefaultDisplayFromPowerButton(eventTime, 0);
  34.                     <strong>break</strong>;
  35.                 <strong>case</strong> SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP:
  36.                     sleepDefaultDisplayFromPowerButton(eventTime,
  37.                             PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
  38.                     <strong>break</strong>;
  39.                 <strong>case</strong> SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP_AND_GO_HOME:
  40.                     <strong>if</strong> (sleepDefaultDisplayFromPowerButton(eventTime,
  41.                             PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE)) {
  42.                         launchHomeFromHotKey(DEFAULT_DISPLAY);
  43.                     }
  44.                     <strong>break</strong>;
  45.                 <strong>case</strong> SHORT_PRESS_POWER_GO_HOME:
  46.                     shortPressPowerGoHome();
  47.                     <strong>break</strong>;
  48.                 <strong>case</strong> SHORT_PRESS_POWER_CLOSE_IME_OR_GO_HOME: {
  49.                     <strong>if</strong> (mDismissImeOnBackKeyPressed) {
  50.                         InputMethodManagerInternal.get().hideCurrentInputMethod(
  51.                                     SoftInputShowHideReason.HIDE_POWER_BUTTON_GO_HOME);
  52.                     } <strong>else</strong> {
  53.                         shortPressPowerGoHome();
  54.                     }
  55.                     <strong>break</strong>;
  56.                 }
  57.                 <strong>case</strong> SHORT_PRESS_POWER_LOCK_OR_SLEEP: {
  58.                     <strong>if</strong> (mKeyguardDelegate == null || !mKeyguardDelegate.hasKeyguard() || !mKeyguardDelegate.isSecure(mCurrentUserId) || keyguardOn()) {
  59.                         sleepDefaultDisplayFromPowerButton(eventTime, 0);
  60.                     } <strong>else</strong> {
  61.                         lockNow(null /*options*/);
  62.                     }
  63.                     <strong>break</strong>;
  64.                 }
  65.                 <strong>case</strong> SHORT_PRESS_POWER_DREAM_OR_SLEEP: {
  66.                     attemptToDreamFromShortPowerButtonPress(
  67.                             <strong>true</strong>,
  68.                             () -> sleepDefaultDisplayFromPowerButton(eventTime, 0));
  69.                     <strong>break</strong>;
  70.                 }
  71.             }
  72.         }
  73.     }
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表