目录
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
- <strong>public</strong> <strong>int</strong> interceptKeyBeforeQueueing(KeyEvent event, <strong>int</strong> policyFlags) {
- ...
- <strong>final</strong> <strong>boolean</strong> isDefaultDisplayOn = mDefaultDisplayPolicy.isAwake();
- <strong>final</strong> <strong>boolean</strong> displayOn = Display.isOnState(mDefaultDisplay.getState());
- <strong>final</strong> <strong>boolean</strong> interactiveAndOn = interactive && isDefaultDisplayOn && displayOn;
- <strong>if</strong> ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
- handleKeyGesture(event, interactiveAndOn);
- }
复制代码 2. PhoneWindowManager#handleKeyGesture
- <strong>private</strong> <strong>void</strong> handleKeyGesture(KeyEvent event, <strong>boolean</strong> interactive) {
- <strong>if</strong> (mKeyCombinationManager.interceptKey(event, interactive)) {
- // handled by combo keys manager.
- mSingleKeyGestureDetector.reset();
- <strong>return</strong>;
- }
- <strong>if</strong> (event.getKeyCode() == KEYCODE_POWER && event.getAction() == KeyEvent.ACTION_DOWN) {
- 如果连续按power键会拉起camera,如果这个power事件被消费了,会直接return,不往下继续走短按power流程了
- mPowerKeyHandled = handleCameraGesture(event, interactive);
- <strong>if</strong> (mPowerKeyHandled) {
- // handled by camera gesture.
- mSingleKeyGestureDetector.reset();
- <strong>return</strong>;
- }
- }
- mSingleKeyGestureDetector.interceptKey(event, interactive);
- }
复制代码 3. PhoneWindowManager#handleCameraGesture
- // The camera gesture will be detected by GestureLauncherService.
- <strong>private</strong> <strong>boolean</strong> handleCameraGesture(KeyEvent event, <strong>boolean</strong> interactive) {
- // add by monet, do not handle camera gesture.
- 如果是VR设备,这里会直接return false。
- <strong>if</strong> (SystemProperties.getBoolean("persist.xr.vrmode", <strong>true</strong>)) {
- <strong>return</strong> <strong>false</strong>;
- }...
复制代码 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
- <strong>void</strong> interceptKey(KeyEvent event, <strong>boolean</strong> interactive) {
- <strong>if</strong> (event.getAction() == KeyEvent.ACTION_DOWN) {
- // Store the non interactive state when first down.
- <strong>if</strong> (mDownKeyCode == KeyEvent.KEYCODE_UNKNOWN || mDownKeyCode != event.getKeyCode()) {
- mBeganFromNonInteractive = !interactive;
- }
- interceptKeyDown(event);
- } <strong>else</strong> {
- interceptKeyUp(event);
- }
- }
复制代码 5. SingleKeyGestureDetector#interceptKeyUp
- <strong>private</strong> <strong>boolean</strong> interceptKeyUp(KeyEvent event) {
复制代码 ...
- <strong>if</strong> (event.getKeyCode() == mActiveRule.mKeyCode) {
- // Directly trigger short press when max count is 1.
- <strong>if</strong> (mActiveRule.getMaxMultiPressCount() == 1) {
- <strong>if</strong> (DEBUG) {
- Log.i(TAG, "press key " + KeyEvent.keyCodeToString(event.getKeyCode()));
- }短按
- Message msg = mHandler.obtainMessage(MSG_KEY_DELAYED_PRESS, mActiveRule.mKeyCode, 1, mActiveRule);
- msg.setAsynchronous(<strong>true</strong>);
- mHandler.sendMessage(msg);
- mActiveRule = null;
- <strong>return</strong> <strong>true</strong>;
- }
复制代码 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
- <strong>private</strong> <strong>class</strong> KeyHandler <strong>extends</strong> Handler {
- KeyHandler() {
- <strong>super</strong>(Looper.myLooper());
- }
- @Override
- <strong>public</strong> <strong>void</strong> handleMessage(Message msg) {
- <strong>final</strong> SingleKeyRule rule = (SingleKeyRule) msg.obj;
- <strong>if</strong> (rule == null) {
- Log.wtf(TAG, "No active rule.");
- <strong>return</strong>;
- }
- <strong>final</strong> <strong>int</strong> keyCode = msg.arg1;
- <strong>final</strong> <strong>int</strong> pressCount = msg.arg2;
- <strong>switch</strong>(msg.what) {
- <strong>case</strong> MSG_KEY_LONG_PRESS:
- <strong>if</strong> (DEBUG) {
- Log.i(TAG, "Detect long press " + KeyEvent.keyCodeToString(keyCode));
- }
- rule.onLongPress(mLastDownTime);
- <strong>break</strong>;
- <strong>case</strong> MSG_KEY_VERY_LONG_PRESS:
- <strong>if</strong> (DEBUG) {
- Log.i(TAG, "Detect very long press " + KeyEvent.keyCodeToString(keyCode));
- }
- rule.onVeryLongPress(mLastDownTime);
- <strong>break</strong>;
- <strong>case</strong> MSG_KEY_DELAYED_PRESS:
- <strong>if</strong> (DEBUG) {
- Log.i(TAG, "Detect press " + KeyEvent.keyCodeToString(keyCode) + ", count " + pressCount);
- }
- <strong>if</strong> (pressCount == 1) {
- 短按一次走这里
- rule.onPress(mLastDownTime);
- } <strong>else</strong> {
- rule.onMultiPress(mLastDownTime, pressCount);
- }
- <strong>break</strong>;
- }
复制代码 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.
- */
- <strong>private</strong> <strong>final</strong> <strong>class</strong> PowerKeyRule <strong>extends</strong> SingleKeyGestureDetector.SingleKeyRule {
- PowerKeyRule() {
- <strong>super</strong>(KEYCODE_POWER);
- }
- @Override 短按一次
- <strong>void</strong> onPress(<strong>long</strong> downTime) {
- powerPress(downTime, 1 /*count*/,
- mSingleKeyGestureDetector.beganFromNonInteractive());
- }
复制代码- @Override 长按
- <strong>void</strong> onLongPress(<strong>long</strong> eventTime) {
- <strong>if</strong> (mSingleKeyGestureDetector.beganFromNonInteractive()
- && !mSupportLongPressPowerWhenNonInteractive) {
- Slog.v(TAG, "Not support long press power when device is not interactive.");
- <strong>return</strong>;
- }
- powerLongPress(eventTime);
- }
- @Override
- <strong>void</strong> onVeryLongPress(<strong>long</strong> eventTime) {
- mActivityManagerInternal.prepareForPossibleShutdown();
- powerVeryLongPress();
- }
- @Override 多次按
- <strong>void</strong> onMultiPress(<strong>long</strong> downTime, <strong>int</strong> count) {
- powerPress(downTime, count, mSingleKeyGestureDetector.beganFromNonInteractive());
- }
复制代码 8. PhoneWindowManager#powerPress
- <strong>private</strong> <strong>void</strong> powerPress(<strong>long</strong> eventTime, <strong>int</strong> count, <strong>boolean</strong> beganFromNonInteractive) { count为按power键的次数
- // SideFPS still needs to know about suppressed power buttons, in case it needs to block an auth attempt.
- <strong>if</strong> (count == 1) {
- mSideFpsEventHandler.notifyPowerPressed();
- }
- <strong>if</strong> (mDefaultDisplayPolicy.isScreenOnEarly() && !mDefaultDisplayPolicy.isScreenOnFully()) {
- Slog.i(TAG, "Suppressed redundant power key press while "
- + "already in the process of turning the screen on.");
- <strong>return</strong>;
- }
- <strong>final</strong> <strong>boolean</strong> interactive = mDefaultDisplayPolicy.isAwake();
- Slog.d(TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive + " count=" + count + " beganFromNonInteractive=" + beganFromNonInteractive + " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior);
- <strong>if</strong> (count == 2) {
- powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior);
- } <strong>else</strong> <strong>if</strong> (count == 3) {
- powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior);
- } <strong>else</strong> <strong>if</strong> (count > 3 && count <= getMaxMultiPressPowerCount()) {
- Slog.d(TAG, "No behavior defined for power press count " + count);
- } <strong>else</strong> <strong>if</strong> (count == 1 && interactive && !beganFromNonInteractive) {
- <strong>if</strong> (mSideFpsEventHandler.shouldConsumeSinglePress(eventTime)) {
- Slog.i(TAG, "Suppressing power key because the user is interacting with the " + "fingerprint sensor");
- <strong>return</strong>;
- }
- // Device Integration: If the power button is handled by black screen, then do nothing
- <strong>if</strong> (!DeviceIntegrationUtils.DISABLE_DEVICE_INTEGRATION
- && BlackScreenWindowManager.getInstance().interceptPowerKey()) {
- <strong>return</strong>;
- }
- <strong>switch</strong> (mShortPressOnPowerBehavior) {
- <strong>case</strong> SHORT_PRESS_POWER_NOTHING:
- <strong>break</strong>;
- <strong>case</strong> SHORT_PRESS_POWER_GO_TO_SLEEP:
- sleepDefaultDisplayFromPowerButton(eventTime, 0);
- <strong>break</strong>;
- <strong>case</strong> SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP:
- sleepDefaultDisplayFromPowerButton(eventTime,
- PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
- <strong>break</strong>;
- <strong>case</strong> SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP_AND_GO_HOME:
- <strong>if</strong> (sleepDefaultDisplayFromPowerButton(eventTime,
- PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE)) {
- launchHomeFromHotKey(DEFAULT_DISPLAY);
- }
- <strong>break</strong>;
- <strong>case</strong> SHORT_PRESS_POWER_GO_HOME:
- shortPressPowerGoHome();
- <strong>break</strong>;
- <strong>case</strong> SHORT_PRESS_POWER_CLOSE_IME_OR_GO_HOME: {
- <strong>if</strong> (mDismissImeOnBackKeyPressed) {
- InputMethodManagerInternal.get().hideCurrentInputMethod(
- SoftInputShowHideReason.HIDE_POWER_BUTTON_GO_HOME);
- } <strong>else</strong> {
- shortPressPowerGoHome();
- }
- <strong>break</strong>;
- }
- <strong>case</strong> SHORT_PRESS_POWER_LOCK_OR_SLEEP: {
- <strong>if</strong> (mKeyguardDelegate == null || !mKeyguardDelegate.hasKeyguard() || !mKeyguardDelegate.isSecure(mCurrentUserId) || keyguardOn()) {
- sleepDefaultDisplayFromPowerButton(eventTime, 0);
- } <strong>else</strong> {
- lockNow(null /*options*/);
- }
- <strong>break</strong>;
- }
- <strong>case</strong> SHORT_PRESS_POWER_DREAM_OR_SLEEP: {
- attemptToDreamFromShortPowerButtonPress(
- <strong>true</strong>,
- () -> sleepDefaultDisplayFromPowerButton(eventTime, 0));
- <strong>break</strong>;
- }
- }
- }
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |