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 nothing
            if (!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;
                }
            }
        }
    }

 

相关推荐

  1. Android14 WMS-Power流程

    2024-06-08 03:12:02       7 阅读
  2. android 13power没有关机菜单

    2024-06-08 03:12:02       18 阅读
  3. Android 10.0 POWER3S关机的实现

    2024-06-08 03:12:02       35 阅读
  4. Android13系统长power关机弹框中添加截屏按钮

    2024-06-08 03:12:02       30 阅读
  5. Android 10.0 展讯平台长power电源开机时间修改

    2024-06-08 03:12:02       33 阅读
  6. RK3588 Android13自定义一个按键实现长

    2024-06-08 03:12:02       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 03:12:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 03:12:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 03:12:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 03:12:02       20 阅读

热门阅读

  1. LeetCode 4 - 寻找两个正序数组的中位数

    2024-06-08 03:12:02       8 阅读
  2. redis7.0.x与mysql8.0.x离线docker镜像制作

    2024-06-08 03:12:02       10 阅读
  3. 汇编指令——ARM Cortex-M指令分析

    2024-06-08 03:12:02       7 阅读
  4. C语言HTTP编程:深入探索与实战应用

    2024-06-08 03:12:02       12 阅读
  5. 【Vue】sync修饰符

    2024-06-08 03:12:02       12 阅读
  6. springboot获取当前数据库连接

    2024-06-08 03:12:02       10 阅读
  7. Lambda表达式与函数式接口

    2024-06-08 03:12:02       9 阅读
  8. Nginx实现缓存

    2024-06-08 03:12:02       7 阅读