Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 15df102f authored by Vaibhav Devmurari's avatar Vaibhav Devmurari
Browse files

Shift ACCESSIBILITY_SHORTCUT handling to KeyGestureController

The multi-key A11y shortcut is already handled in KGC and we can
shift the Ctrl+Alt+Z shortcut to KGC and cleanup PWM

Test: atest WmTests
Flag: EXEMPT cleanup
Bug: 358569822
Change-Id: I9ed8b899670377f22eb3a711610fbf399f781bfe
parent 25ebc356
Loading
Loading
Loading
Loading
+35 −18
Original line number Diff line number Diff line
@@ -458,23 +458,9 @@ final class KeyGestureController {
    private void initKeyGestures() {
        InputManager im = Objects.requireNonNull(mContext.getSystemService(InputManager.class));
        im.registerKeyGestureEventHandler(
                List.of(KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD),
                (event, focusedToken) -> {
                    if (event.getKeyGestureType()
                            == KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD) {
                        if (event.getAction() == KeyGestureEvent.ACTION_GESTURE_START) {
                            mHandler.removeMessages(MSG_ACCESSIBILITY_SHORTCUT);
                            mHandler.sendMessageDelayed(
                                    mHandler.obtainMessage(MSG_ACCESSIBILITY_SHORTCUT),
                                    getAccessibilityShortcutTimeout());
                        } else {
                            mHandler.removeMessages(MSG_ACCESSIBILITY_SHORTCUT);
                        }
                    } else {
                        Log.w(TAG, "Received a key gesture " + event
                                + " that was not registered by this handler");
                    }
                });
                List.of(KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD,
                        KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT),
                new LocalKeyGestureEventHandler());
    }

    public boolean interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
@@ -917,7 +903,9 @@ final class KeyGestureController {
                break;
            case KeyEvent.KEYCODE_Z:
                if (down && KeyEvent.metaStateHasModifiers(metaState,
                        KeyEvent.META_CTRL_ON | KeyEvent.META_ALT_ON)) {
                        KeyEvent.META_CTRL_ON | KeyEvent.META_ALT_ON)
                        && mAccessibilityShortcutController.isAccessibilityShortcutAvailable(
                        mWindowManagerCallbacks.isKeyguardLocked(DEFAULT_DISPLAY))) {
                    // Intercept the Accessibility keychord (CTRL + ALT + Z) for keyboard users.
                    handleKeyGesture(deviceId, new int[]{keyCode},
                            KeyEvent.META_CTRL_ON | KeyEvent.META_ALT_ON,
@@ -1531,4 +1519,33 @@ final class KeyGestureController {
            return new AccessibilityShortcutController(context, handler, UserHandle.USER_SYSTEM);
        }
    }

    private class LocalKeyGestureEventHandler implements InputManager.KeyGestureEventHandler {

        @Override
        public void handleKeyGestureEvent(@NonNull KeyGestureEvent event,
                @Nullable IBinder focusedToken) {
            final boolean complete = event.getAction() == KeyGestureEvent.ACTION_GESTURE_COMPLETE
                    && !event.isCancelled();
            final boolean start = event.getAction() == KeyGestureEvent.ACTION_GESTURE_START;
            switch (event.getKeyGestureType()) {
                case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD:
                    mHandler.removeMessages(MSG_ACCESSIBILITY_SHORTCUT);
                    if (start) {
                        mHandler.sendMessageDelayed(
                                mHandler.obtainMessage(MSG_ACCESSIBILITY_SHORTCUT),
                                getAccessibilityShortcutTimeout());
                    }
                    break;
                case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT:
                    if (complete) {
                        mHandler.sendMessage(mHandler.obtainMessage(MSG_ACCESSIBILITY_SHORTCUT));
                    }
                    break;
                default:
                    Log.w(TAG, "Received a key gesture " + event
                            + " that was not registered by this handler");
            }
        }
    }
}
+0 −7
Original line number Diff line number Diff line
@@ -3630,7 +3630,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS,
                KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SEARCH,
                KeyGestureEvent.KEY_GESTURE_TYPE_LANGUAGE_SWITCH,
                KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT,
                KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS,
                KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_APPLICATION,
                KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB,
@@ -3830,12 +3829,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                    cancelBugreportGestureTv();
                }
                break;
            case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT:
                if (complete && mAccessibilityShortcutController.isAccessibilityShortcutAvailable(
                        isKeyguardLocked())) {
                    mHandler.sendMessage(mHandler.obtainMessage(MSG_ACCESSIBILITY_SHORTCUT));
                }
                break;
            case KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS:
                if (complete) {
                    mContext.closeSystemDialogs();
+0 −6
Original line number Diff line number Diff line
@@ -409,12 +409,6 @@ public class KeyGestureEventTests extends ShortcutKeyTestBase {
        mPhoneWindowManager.assertBugReportNotTakenForTv();
    }

    @Test
    public void testKeyGestureAccessibilityShortcut() {
        sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT);
        mPhoneWindowManager.assertAccessibilityKeychordCalled();
    }

    @Test
    public void testKeyGestureCloseAllDialogs() {
        sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS);
+14 −12
Original line number Diff line number Diff line
@@ -502,18 +502,6 @@ class KeyGestureControllerTests {
                KeyEvent.META_CTRL_ON or KeyEvent.META_SHIFT_ON,
                intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE),
            ),
            TestData(
                "CTRL + ALT + Z -> Accessibility Shortcut",
                intArrayOf(
                    KeyEvent.KEYCODE_CTRL_LEFT,
                    KeyEvent.KEYCODE_ALT_LEFT,
                    KeyEvent.KEYCODE_Z,
                ),
                KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT,
                intArrayOf(KeyEvent.KEYCODE_Z),
                KeyEvent.META_CTRL_ON or KeyEvent.META_ALT_ON,
                intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE),
            ),
            TestData(
                "META + B -> Launch Default Browser",
                intArrayOf(KeyEvent.KEYCODE_META_LEFT, KeyEvent.KEYCODE_B),
@@ -1610,6 +1598,20 @@ class KeyGestureControllerTests {
        )
    }

    @Test
    fun testAccessibilityShortcutPressed() {
        setupKeyGestureController()

        sendKeys(
            intArrayOf(
                KeyEvent.KEYCODE_CTRL_LEFT,
                KeyEvent.KEYCODE_ALT_LEFT,
                KeyEvent.KEYCODE_Z
            )
        )
        Mockito.verify(accessibilityShortcutController, times(1)).performAccessibilityShortcut()
    }

    @Test
    fun testAccessibilityShortcutChordPressed() {
        setupKeyGestureController()