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

Commit d66cb8ec authored by Vaibhav Devmurari's avatar Vaibhav Devmurari Committed by Android (Google) Code Review
Browse files

Merge changes Ib5d6d871,I78c7f765 into main

* changes:
  Add support for DND key
  Cleanup: Shift input shortcuts out of PWM
parents 63cf5baf 2a33b625
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -124,6 +124,7 @@ public final class KeyGestureEvent {
    public static final int KEY_GESTURE_TYPE_TOGGLE_MAGNIFICATION = 74;
    public static final int KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK = 75;
    public static final int KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW = 76;
    public static final int KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB = 77;


    public static final int FLAG_CANCELLED = 1;
@@ -215,7 +216,8 @@ public final class KeyGestureEvent {
            KEY_GESTURE_TYPE_MAGNIFIER_ZOOM_OUT,
            KEY_GESTURE_TYPE_TOGGLE_MAGNIFICATION,
            KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK,
            KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW
            KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW,
            KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface KeyGestureType {
@@ -788,6 +790,8 @@ public final class KeyGestureEvent {
                return "KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK";
            case KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW:
                return "KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW";
            case KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB:
                return "KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB";
            default:
                return Integer.toHexString(value);
        }
+74 −26
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.PermissionManuallyEnforced;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.UserIdInt;
import android.app.ActivityManagerInternal;
import android.bluetooth.BluetoothAdapter;
@@ -2625,12 +2626,39 @@ public class InputManagerService extends IInputManager.Stub
        return mWindowManagerCallbacks.interceptUnhandledKey(event, focus);
    }

    @SuppressLint("MissingPermission")
    private void initKeyGestures() {
        InputManager im = Objects.requireNonNull(mContext.getSystemService(InputManager.class));
        im.registerKeyGestureEventHandler(new InputManager.KeyGestureEventHandler() {
            @Override
            public boolean handleKeyGestureEvent(@NonNull KeyGestureEvent event,
                    @Nullable IBinder focussedToken) {
                return InputManagerService.this.handleKeyGestureEvent(event);
            }

            @Override
            public boolean isKeyGestureSupported(int gestureType) {
                switch (gestureType) {
                    case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS:
                        return true;
                    default:
                        return false;

                }
            }
        });
    }

    @SuppressLint("MissingPermission")
    @VisibleForTesting
    boolean handleKeyGestureEvent(@NonNull KeyGestureEvent event) {
        int deviceId = event.getDeviceId();
        boolean complete = event.getAction() == KeyGestureEvent.ACTION_GESTURE_COMPLETE
                && !event.isCancelled();
@@ -2653,26 +2681,46 @@ public class InputManagerService extends IInputManager.Stub
                    mNative.toggleCapsLock(deviceId);
                }
                return true;
                    default:
                        return false;

            case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS:
                if (complete && InputSettings.isAccessibilityBounceKeysFeatureEnabled()) {
                    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 (complete && InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled()) {
                    final boolean mouseKeysEnabled = InputSettings.isAccessibilityMouseKeysEnabled(
                            mContext);
                    InputSettings.setAccessibilityMouseKeysEnabled(mContext, !mouseKeysEnabled);
                    return true;
                }

            @Override
            public boolean isKeyGestureSupported(int gestureType) {
                switch (gestureType) {
                    case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK:
                break;
            case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS:
                if (complete && InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
                    final boolean stickyKeysEnabled =
                            InputSettings.isAccessibilityStickyKeysEnabled(mContext);
                    InputSettings.setAccessibilityStickyKeysEnabled(mContext, !stickyKeysEnabled);
                    return true;
                }
                break;
            case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS:
                if (complete && InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) {
                    final boolean slowKeysEnabled =
                            InputSettings.isAccessibilitySlowKeysEnabled(mContext);
                    InputSettings.setAccessibilitySlowKeysThreshold(mContext,
                            slowKeysEnabled ? 0 : InputSettings.DEFAULT_SLOW_KEYS_THRESHOLD_MILLIS);
                    return true;
                }
                break;
            default:
                return false;

        }
            }
        });
        return false;
    }

    // Native callback.
+9 −1
Original line number Diff line number Diff line
@@ -801,7 +801,15 @@ final class KeyGestureController {
                        + " interceptKeyBeforeQueueing");
                return true;
            case KeyEvent.KEYCODE_DO_NOT_DISTURB:
                // TODO(b/365920375): Implement 25Q2 keycode implementation in system
                if (enableNew25q2Keycodes()) {
                    if (firstDown) {
                        handleKeyGesture(deviceId, new int[]{KeyEvent.KEYCODE_DO_NOT_DISTURB},
                                /* modifierState = */0,
                                KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB,
                                KeyGestureEvent.ACTION_GESTURE_COMPLETE, displayId, focusedToken,
                                /* flags = */0, /* appLaunchData = */null);
                    }
                }
                return true;
        }

+9 −63
Original line number Diff line number Diff line
@@ -4106,6 +4106,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                    case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_APPLICATION:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB:
                        return true;
                    case KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD:
                    case KeyGestureEvent.KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD:
@@ -4120,18 +4121,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                                .isAccessibilityShortcutAvailable(false);
                    case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK:
                        return enableTalkbackAndMagnifierKeyGestures();
                    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;
                }
@@ -4368,59 +4357,16 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                    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);
            case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB:
                NotificationManager nm = getNotificationService();
                if (nm != null) {
                    boolean isEnabled = nm.getZenMode() != Settings.Global.ZEN_MODE_OFF;
                    nm.setZenMode(isEnabled ? Settings.Global.ZEN_MODE_OFF
                                    : Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null,
                            "Key gesture DND", true);
                }
                return true;
        }
                break;
        }
        return false;
    }

+10 −47
Original line number Diff line number Diff line
@@ -26,12 +26,12 @@ 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;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
import android.view.KeyEvent;

import androidx.test.filters.MediumTest;
@@ -758,54 +758,17 @@ public class KeyGestureEventTests extends ShortcutKeyTestBase {
    }

    @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));

    public void testKeyGestureToggleDoNotDisturb() {
        mPhoneWindowManager.overrideZenMode(Settings.Global.ZEN_MODE_OFF);
        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));
                sendKeyGestureEventComplete(
                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB));
        mPhoneWindowManager.assertZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);

        mPhoneWindowManager.overrideZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
        Assert.assertTrue(
                sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS));
        Assert.assertFalse(InputSettings.isAccessibilityBounceKeysEnabled(mContext));
                sendKeyGestureEventComplete(
                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB));
        mPhoneWindowManager.assertZenMode(Settings.Global.ZEN_MODE_OFF);
    }
}
Loading