diff options
| author | 2024-10-17 23:04:11 +0000 | |
|---|---|---|
| committer | 2024-10-28 21:32:06 +0000 | |
| commit | 2d89f6e75e8595ef07f65c8f47acbf36de629ff2 (patch) | |
| tree | 7e85c1c1c6e05d8020a75bdfb9c1c38d3bcbd2fc | |
| parent | c19a22662cb3811bba4577815ccb6f179a6fae23 (diff) | |
Implement shortcut controls for a11y keyboard features
Bug: 331682470
Test: atest com.android.server.policy.KeyGestureEventTests
Flag: com.android.hardware.input.keyboard_a11y_shortcut_control
Change-Id: I9a71bb01b2e768f3d162cc51bfc069a084da3fe4
6 files changed, 352 insertions, 0 deletions
diff --git a/core/java/android/hardware/input/InputSettings.java b/core/java/android/hardware/input/InputSettings.java index 897ce4a7b022..4a9efe0a675b 100644 --- a/core/java/android/hardware/input/InputSettings.java +++ b/core/java/android/hardware/input/InputSettings.java @@ -72,6 +72,20 @@ public class InputSettings { public static final int DEFAULT_POINTER_SPEED = 0; /** + * Bounce Keys Threshold: The default value of the threshold (500 ms). + * + * @hide + */ + public static final int DEFAULT_BOUNCE_KEYS_THRESHOLD_MILLIS = 500; + + /** + * Slow Keys Threshold: The default value of the threshold (500 ms). + * + * @hide + */ + public static final int DEFAULT_SLOW_KEYS_THRESHOLD_MILLIS = 500; + + /** * The maximum allowed obscuring opacity by UID to propagate touches (0 <= x <= 1). * @hide */ diff --git a/core/java/android/hardware/input/KeyGestureEvent.java b/core/java/android/hardware/input/KeyGestureEvent.java index ee1a6aba2ab5..0f290d90770f 100644 --- a/core/java/android/hardware/input/KeyGestureEvent.java +++ b/core/java/android/hardware/input/KeyGestureEvent.java @@ -109,6 +109,10 @@ public final class KeyGestureEvent { public static final int KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS = 61; public static final int KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY = 62; public static final int KEY_GESTURE_TYPE_TOGGLE_TALKBACK = 63; + public static final int KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS = 64; + public static final int KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS = 65; + public static final int KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS = 66; + public static final int KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS = 67; public static final int FLAG_CANCELLED = 1; @@ -187,6 +191,10 @@ public final class KeyGestureEvent { KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS, KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY, KEY_GESTURE_TYPE_TOGGLE_TALKBACK, + KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS, + KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS, + KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS, + KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS }) @Retention(RetentionPolicy.SOURCE) public @interface KeyGestureType { @@ -733,6 +741,14 @@ public final class KeyGestureEvent { return "KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS"; case KEY_GESTURE_TYPE_TOGGLE_TALKBACK: return "KEY_GESTURE_TYPE_TOGGLE_TALKBACK"; + case KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS: + return "KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS"; + case KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS: + return "KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS"; + case KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS: + return "KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS"; + case KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS: + return "KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS"; default: return Integer.toHexString(value); } diff --git a/services/core/java/com/android/server/input/KeyGestureController.java b/services/core/java/com/android/server/input/KeyGestureController.java index 4d93e6570a79..7ee811656dc1 100644 --- a/services/core/java/com/android/server/input/KeyGestureController.java +++ b/services/core/java/com/android/server/input/KeyGestureController.java @@ -39,6 +39,7 @@ import android.hardware.input.AidlKeyGestureEvent; import android.hardware.input.IKeyGestureEventListener; import android.hardware.input.IKeyGestureHandler; import android.hardware.input.InputManager; +import android.hardware.input.InputSettings; import android.hardware.input.KeyGestureEvent; import android.os.Handler; import android.os.IBinder; @@ -589,6 +590,54 @@ final class KeyGestureController { } } break; + case KeyEvent.KEYCODE_3: + if (InputSettings.isAccessibilityBounceKeysFeatureEnabled() + && keyboardA11yShortcutControl()) { + if (firstDown && event.isMetaPressed() && event.isAltPressed()) { + return handleKeyGesture(deviceId, new int[]{keyCode}, + KeyEvent.META_META_ON | KeyEvent.META_ALT_ON, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS, + KeyGestureEvent.ACTION_GESTURE_COMPLETE, displayId, + focusedToken, /* flags = */0); + } + } + break; + case KeyEvent.KEYCODE_4: + if (InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled() + && keyboardA11yShortcutControl()) { + if (firstDown && event.isMetaPressed() && event.isAltPressed()) { + return handleKeyGesture(deviceId, new int[]{keyCode}, + KeyEvent.META_META_ON | KeyEvent.META_ALT_ON, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS, + KeyGestureEvent.ACTION_GESTURE_COMPLETE, displayId, + focusedToken, /* flags = */0); + } + } + break; + case KeyEvent.KEYCODE_5: + if (InputSettings.isAccessibilityStickyKeysFeatureEnabled() + && keyboardA11yShortcutControl()) { + if (firstDown && event.isMetaPressed() && event.isAltPressed()) { + return handleKeyGesture(deviceId, new int[]{keyCode}, + KeyEvent.META_META_ON | KeyEvent.META_ALT_ON, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS, + KeyGestureEvent.ACTION_GESTURE_COMPLETE, displayId, + focusedToken, /* flags = */0); + } + } + break; + case KeyEvent.KEYCODE_6: + if (InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled() + && keyboardA11yShortcutControl()) { + if (firstDown && event.isMetaPressed() && event.isAltPressed()) { + return handleKeyGesture(deviceId, new int[]{keyCode}, + KeyEvent.META_META_ON | KeyEvent.META_ALT_ON, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS, + KeyGestureEvent.ACTION_GESTURE_COMPLETE, displayId, + focusedToken, /* flags = */0); + } + } + break; case KeyEvent.KEYCODE_DEL: if (newBugreportKeyboardShortcut()) { if (firstDown && mEnableBugReportKeyboardShortcut && event.isMetaPressed() diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 3ab1009b22e1..2893430572d8 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -151,6 +151,7 @@ import android.hardware.hdmi.HdmiPlaybackClient; import android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback; import android.hardware.input.AppLaunchData; import android.hardware.input.InputManager; +import android.hardware.input.InputSettings; import android.hardware.input.KeyGestureEvent; import android.media.AudioManager; import android.media.AudioManagerInternal; @@ -3617,6 +3618,68 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } break; + case KeyEvent.KEYCODE_3: + if (InputSettings.isAccessibilityBounceKeysFeatureEnabled() + && keyboardA11yShortcutControl()) { + if (firstDown && event.isMetaPressed() + && event.isAltPressed()) { + final boolean bounceKeysEnabled = + InputSettings.isAccessibilityBounceKeysEnabled( + mContext); + InputSettings.setAccessibilityBounceKeysThreshold(mContext, + bounceKeysEnabled ? 0 + : InputSettings.DEFAULT_BOUNCE_KEYS_THRESHOLD_MILLIS); + notifyKeyGestureCompleted(event, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS); + return true; + } + } + break; + case KeyEvent.KEYCODE_4: + if (InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled() + && keyboardA11yShortcutControl()) { + if (firstDown && event.isMetaPressed() && event.isAltPressed()) { + final boolean mouseKeysEnabled = + InputSettings.isAccessibilityMouseKeysEnabled( + mContext); + InputSettings.setAccessibilityMouseKeysEnabled(mContext, + !mouseKeysEnabled); + notifyKeyGestureCompleted(event, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS); + return true; + } + } + break; + case KeyEvent.KEYCODE_5: + if (InputSettings.isAccessibilityStickyKeysFeatureEnabled() + && keyboardA11yShortcutControl()) { + if (firstDown && event.isMetaPressed() && event.isAltPressed()) { + final boolean stickyKeysEnabled = + InputSettings.isAccessibilityStickyKeysEnabled( + mContext); + InputSettings.setAccessibilityStickyKeysEnabled(mContext, + !stickyKeysEnabled); + notifyKeyGestureCompleted(event, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS); + return true; + } + } + break; + case KeyEvent.KEYCODE_6: + if (InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled() + && keyboardA11yShortcutControl()) { + if (firstDown && event.isMetaPressed() && event.isAltPressed()) { + final boolean slowKeysEnabled = + InputSettings.isAccessibilitySlowKeysEnabled(mContext); + InputSettings.setAccessibilitySlowKeysThreshold(mContext, + slowKeysEnabled ? 0 + : InputSettings.DEFAULT_SLOW_KEYS_THRESHOLD_MILLIS); + notifyKeyGestureCompleted(event, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS); + return true; + } + } + break; case KeyEvent.KEYCODE_DEL: if (newBugreportKeyboardShortcut()) { if (mEnableBugReportKeyboardShortcut && firstDown @@ -4053,6 +4116,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { .isAccessibilityShortcutAvailable(false); case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK: return keyboardA11yShortcutControl(); + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS: + return InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled() + && keyboardA11yShortcutControl(); + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS: + return InputSettings.isAccessibilityBounceKeysFeatureEnabled() + && keyboardA11yShortcutControl(); + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS: + return InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled() + && keyboardA11yShortcutControl(); + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS: + return InputSettings.isAccessibilityStickyKeysFeatureEnabled() + && keyboardA11yShortcutControl(); default: return false; } @@ -4286,6 +4361,57 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (complete && isUserSetupComplete() && !keyguardOn && data != null && mModifierShortcutManager.launchApplication(data)) { dismissKeyboardShortcutsMenu(); + } + return true; + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS: + if (InputSettings.isAccessibilityBounceKeysFeatureEnabled() + && keyboardA11yShortcutControl()) { + if (complete) { + final boolean bounceKeysEnabled = + InputSettings.isAccessibilityBounceKeysEnabled( + mContext); + InputSettings.setAccessibilityBounceKeysThreshold(mContext, + bounceKeysEnabled ? 0 + : InputSettings.DEFAULT_BOUNCE_KEYS_THRESHOLD_MILLIS); + } + return true; + } + break; + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS: + if (InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled() + && keyboardA11yShortcutControl()) { + if (complete) { + final boolean mouseKeysEnabled = + InputSettings.isAccessibilityMouseKeysEnabled( + mContext); + InputSettings.setAccessibilityMouseKeysEnabled(mContext, + !mouseKeysEnabled); + } + return true; + } + break; + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS: + if (InputSettings.isAccessibilityStickyKeysFeatureEnabled() + && keyboardA11yShortcutControl()) { + if (complete) { + final boolean stickyKeysEnabled = + InputSettings.isAccessibilityStickyKeysEnabled(mContext); + InputSettings.setAccessibilityStickyKeysEnabled(mContext, + !stickyKeysEnabled); + } + return true; + } + break; + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS: + if (InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled() + && keyboardA11yShortcutControl()) { + if (complete) { + final boolean slowKeysEnabled = + InputSettings.isAccessibilitySlowKeysEnabled(mContext); + InputSettings.setAccessibilitySlowKeysThreshold(mContext, + slowKeysEnabled ? 0 + : InputSettings.DEFAULT_SLOW_KEYS_THRESHOLD_MILLIS); + } return true; } break; diff --git a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java index d83ffd15ff71..ad11c2681779 100644 --- a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java +++ b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java @@ -26,6 +26,7 @@ import static com.android.server.policy.PhoneWindowManager.POWER_VOLUME_UP_BEHAV import static com.android.server.policy.PhoneWindowManager.POWER_VOLUME_UP_BEHAVIOR_MUTE; import static com.android.server.policy.PhoneWindowManager.SETTINGS_KEY_BEHAVIOR_NOTIFICATION_PANEL; +import android.hardware.input.InputSettings; import android.hardware.input.KeyGestureEvent; import android.os.RemoteException; import android.platform.test.annotations.DisableFlags; @@ -405,6 +406,36 @@ public class KeyGestureEventTests extends ShortcutKeyTestBase { META_ON | ALT_ON); } + @Test + @EnableFlags({com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL, + com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG, + com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG, + com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG, + com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_MOUSE_KEYS}) + @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER) + public void testKeyboardAccessibilityToggleShortcutPress() { + testShortcutInternal("Meta + Alt + 3 -> Toggle Bounce Keys", + new int[]{META_KEY, ALT_KEY, KeyEvent.KEYCODE_3}, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS, + KeyEvent.KEYCODE_3, + META_ON | ALT_ON); + testShortcutInternal("Meta + Alt + 4 -> Toggle Mouse Keys", + new int[]{META_KEY, ALT_KEY, KeyEvent.KEYCODE_4}, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS, + KeyEvent.KEYCODE_4, + META_ON | ALT_ON); + testShortcutInternal("Meta + Alt + 5 -> Toggle Sticky Keys", + new int[]{META_KEY, ALT_KEY, KeyEvent.KEYCODE_5}, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS, + KeyEvent.KEYCODE_5, + META_ON | ALT_ON); + testShortcutInternal("Meta + Alt + 6 -> Toggle Slow Keys", + new int[]{META_KEY, ALT_KEY, KeyEvent.KEYCODE_6}, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS, + KeyEvent.KEYCODE_6, + META_ON | ALT_ON); + } + private void testShortcutInternal(String testName, int[] testKeys, @KeyGestureEvent.KeyGestureType int expectedKeyGestureType, int expectedKey, int expectedModifierState) { @@ -723,4 +754,56 @@ public class KeyGestureEventTests extends ShortcutKeyTestBase { sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK)); mPhoneWindowManager.assertTalkBack(false); } + + @Test + @EnableFlags({com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL, + com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG}) + public void testKeyGestureToggleStickyKeys() { + Assert.assertTrue( + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS)); + Assert.assertTrue(InputSettings.isAccessibilityStickyKeysEnabled(mContext)); + + Assert.assertTrue( + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS)); + Assert.assertFalse(InputSettings.isAccessibilityStickyKeysEnabled(mContext)); + } + + @Test + @EnableFlags({com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL, + com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG}) + public void testKeyGestureToggleSlowKeys() { + Assert.assertTrue( + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS)); + Assert.assertTrue(InputSettings.isAccessibilitySlowKeysEnabled(mContext)); + + Assert.assertTrue( + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS)); + Assert.assertFalse(InputSettings.isAccessibilitySlowKeysEnabled(mContext)); + } + + @Test + @EnableFlags({com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL, + com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_MOUSE_KEYS}) + public void testKeyGestureToggleMouseKeys() { + Assert.assertTrue( + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS)); + Assert.assertTrue(InputSettings.isAccessibilityMouseKeysEnabled(mContext)); + + Assert.assertTrue( + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS)); + Assert.assertFalse(InputSettings.isAccessibilityMouseKeysEnabled(mContext)); + } + + @Test + @EnableFlags({com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL, + com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG}) + public void testKeyGestureToggleBounceKeys() { + Assert.assertTrue( + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS)); + Assert.assertTrue(InputSettings.isAccessibilityBounceKeysEnabled(mContext)); + + Assert.assertTrue( + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS)); + Assert.assertFalse(InputSettings.isAccessibilityBounceKeysEnabled(mContext)); + } } diff --git a/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt b/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt index 787ae06cd856..19dea0c5e74a 100644 --- a/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt +++ b/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt @@ -799,6 +799,70 @@ class KeyGestureControllerTests { } @Test + @EnableFlags( + com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL, + com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG, + com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG, + com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG, + com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_MOUSE_KEYS + ) + fun testKeyboardAccessibilityToggleShortcutPress() { + val keyGestureController = KeyGestureController(context, testLooper.looper) + testKeyGestureInternal( + keyGestureController, + TestData( + "Meta + Alt + 3 -> Toggle Bounce Keys", + intArrayOf( + KeyEvent.KEYCODE_META_LEFT, + KeyEvent.KEYCODE_ALT_LEFT, + KeyEvent.KEYCODE_3 + ), + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS, + intArrayOf(KeyEvent.KEYCODE_3), + KeyEvent.META_META_ON or KeyEvent.META_ALT_ON, + intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE))) + testKeyGestureInternal( + keyGestureController, + TestData( + "Meta + Alt + 4 -> Toggle Mouse Keys", + intArrayOf( + KeyEvent.KEYCODE_META_LEFT, + KeyEvent.KEYCODE_ALT_LEFT, + KeyEvent.KEYCODE_4 + ), + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS, + intArrayOf(KeyEvent.KEYCODE_4), + KeyEvent.META_META_ON or KeyEvent.META_ALT_ON, + intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE))) + testKeyGestureInternal( + keyGestureController, + TestData( + "Meta + Alt + 5 -> Toggle Sticky Keys", + intArrayOf( + KeyEvent.KEYCODE_META_LEFT, + KeyEvent.KEYCODE_ALT_LEFT, + KeyEvent.KEYCODE_5 + ), + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS, + intArrayOf(KeyEvent.KEYCODE_5), + KeyEvent.META_META_ON or KeyEvent.META_ALT_ON, + intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE))) + testKeyGestureInternal( + keyGestureController, + TestData( + "Meta + Alt + 6 -> Toggle Slow Keys", + intArrayOf( + KeyEvent.KEYCODE_META_LEFT, + KeyEvent.KEYCODE_ALT_LEFT, + KeyEvent.KEYCODE_6 + ), + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS, + intArrayOf(KeyEvent.KEYCODE_6), + KeyEvent.META_META_ON or KeyEvent.META_ALT_ON, + intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE))) + } + + @Test @EnableFlags(com.android.window.flags.Flags.FLAG_ENABLE_MOVE_TO_NEXT_DISPLAY_SHORTCUT) fun testMoveToNextDisplay() { val keyGestureController = KeyGestureController(context, testLooper.looper) |