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

Commit e3861335 authored by Vaibhav Devmurari's avatar Vaibhav Devmurari
Browse files

Shift multi key combinations to IMS from PWM

Test: atest WmTests
Test: atest InputTests
Bug: 358569822
Flag:com.android.hardware.input.use_key_gesture_event_handler_multi_press_gestures

Change-Id: I0aaa4bb1d2afab487fea4d6c38369d77d95ddf68
parent e79e1f46
Loading
Loading
Loading
Loading
+69 −44
Original line number Diff line number Diff line
@@ -48,49 +48,55 @@ public final class KeyGestureEvent {
    public static final int KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL = 8;
    public static final int KEY_GESTURE_TYPE_TOGGLE_TASKBAR = 9;
    public static final int KEY_GESTURE_TYPE_TAKE_SCREENSHOT = 10;
    public static final int KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER = 11;
    public static final int KEY_GESTURE_TYPE_BRIGHTNESS_UP = 12;
    public static final int KEY_GESTURE_TYPE_BRIGHTNESS_DOWN = 13;
    public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP = 14;
    public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN = 15;
    public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE = 16;
    public static final int KEY_GESTURE_TYPE_VOLUME_UP = 17;
    public static final int KEY_GESTURE_TYPE_VOLUME_DOWN = 18;
    public static final int KEY_GESTURE_TYPE_VOLUME_MUTE = 19;
    public static final int KEY_GESTURE_TYPE_ALL_APPS = 20;
    public static final int KEY_GESTURE_TYPE_LAUNCH_SEARCH = 21;
    public static final int KEY_GESTURE_TYPE_LANGUAGE_SWITCH = 22;
    public static final int KEY_GESTURE_TYPE_ACCESSIBILITY_ALL_APPS = 23;
    public static final int KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK = 24;
    public static final int KEY_GESTURE_TYPE_SYSTEM_MUTE = 25;
    public static final int KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT = 26;
    public static final int KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT = 27;
    public static final int KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT = 28;
    public static final int KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT = 29;
    public static final int KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT = 30;
    public static final int KEY_GESTURE_TYPE_LOCK_SCREEN = 31;
    public static final int KEY_GESTURE_TYPE_OPEN_NOTES = 32;
    public static final int KEY_GESTURE_TYPE_TOGGLE_POWER = 33;
    public static final int KEY_GESTURE_TYPE_SYSTEM_NAVIGATION = 34;
    public static final int KEY_GESTURE_TYPE_SLEEP = 35;
    public static final int KEY_GESTURE_TYPE_WAKEUP = 36;
    public static final int KEY_GESTURE_TYPE_MEDIA_KEY = 37;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_BROWSER = 38;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_EMAIL = 39;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CONTACTS = 40;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALENDAR = 41;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALCULATOR = 42;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MUSIC = 43;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MAPS = 44;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MESSAGING = 45;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_GALLERY = 46;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FILES = 47;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_WEATHER = 48;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FITNESS = 49;
    public static final int KEY_GESTURE_TYPE_LAUNCH_APPLICATION_BY_PACKAGE_NAME = 50;
    public static final int KEY_GESTURE_TYPE_DESKTOP_MODE = 51;
    public static final int KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION = 52;
    public static final int KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER = 53;
    public static final int KEY_GESTURE_TYPE_SCREENSHOT_CHORD = 11;
    public static final int KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER = 12;
    public static final int KEY_GESTURE_TYPE_BRIGHTNESS_UP = 13;
    public static final int KEY_GESTURE_TYPE_BRIGHTNESS_DOWN = 14;
    public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_UP = 15;
    public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_DOWN = 16;
    public static final int KEY_GESTURE_TYPE_KEYBOARD_BACKLIGHT_TOGGLE = 17;
    public static final int KEY_GESTURE_TYPE_VOLUME_UP = 18;
    public static final int KEY_GESTURE_TYPE_VOLUME_DOWN = 19;
    public static final int KEY_GESTURE_TYPE_VOLUME_MUTE = 20;
    public static final int KEY_GESTURE_TYPE_ALL_APPS = 21;
    public static final int KEY_GESTURE_TYPE_LAUNCH_SEARCH = 22;
    public static final int KEY_GESTURE_TYPE_LANGUAGE_SWITCH = 23;
    public static final int KEY_GESTURE_TYPE_ACCESSIBILITY_ALL_APPS = 24;
    public static final int KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK = 25;
    public static final int KEY_GESTURE_TYPE_SYSTEM_MUTE = 26;
    public static final int KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT = 27;
    public static final int KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT = 28;
    public static final int KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT = 29;
    public static final int KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT = 30;
    public static final int KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT = 31;
    public static final int KEY_GESTURE_TYPE_LOCK_SCREEN = 32;
    public static final int KEY_GESTURE_TYPE_OPEN_NOTES = 33;
    public static final int KEY_GESTURE_TYPE_TOGGLE_POWER = 34;
    public static final int KEY_GESTURE_TYPE_SYSTEM_NAVIGATION = 35;
    public static final int KEY_GESTURE_TYPE_SLEEP = 36;
    public static final int KEY_GESTURE_TYPE_WAKEUP = 37;
    public static final int KEY_GESTURE_TYPE_MEDIA_KEY = 38;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_BROWSER = 39;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_EMAIL = 40;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CONTACTS = 41;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALENDAR = 42;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_CALCULATOR = 43;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MUSIC = 44;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MAPS = 45;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_MESSAGING = 46;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_GALLERY = 47;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FILES = 48;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_WEATHER = 49;
    public static final int KEY_GESTURE_TYPE_LAUNCH_DEFAULT_FITNESS = 50;
    public static final int KEY_GESTURE_TYPE_LAUNCH_APPLICATION_BY_PACKAGE_NAME = 51;
    public static final int KEY_GESTURE_TYPE_DESKTOP_MODE = 52;
    public static final int KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION = 53;
    public static final int KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER = 54;
    public static final int KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD = 55;
    public static final int KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD = 56;
    public static final int KEY_GESTURE_TYPE_GLOBAL_ACTIONS = 57;
    public static final int KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD = 58;
    public static final int KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT = 59;

    public static final int FLAG_CANCELLED = 1;

@@ -116,6 +122,7 @@ public final class KeyGestureEvent {
            KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL,
            KEY_GESTURE_TYPE_TOGGLE_TASKBAR,
            KEY_GESTURE_TYPE_TAKE_SCREENSHOT,
            KEY_GESTURE_TYPE_SCREENSHOT_CHORD,
            KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER,
            KEY_GESTURE_TYPE_BRIGHTNESS_UP,
            KEY_GESTURE_TYPE_BRIGHTNESS_DOWN,
@@ -158,7 +165,12 @@ public final class KeyGestureEvent {
            KEY_GESTURE_TYPE_LAUNCH_APPLICATION_BY_PACKAGE_NAME,
            KEY_GESTURE_TYPE_DESKTOP_MODE,
            KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION,
            KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER
            KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER,
            KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD,
            KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD,
            KEY_GESTURE_TYPE_GLOBAL_ACTIONS,
            KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD,
            KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface KeyGestureType {
@@ -360,6 +372,7 @@ public final class KeyGestureEvent {
            case KEY_GESTURE_TYPE_TOGGLE_TASKBAR:
                return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__TOGGLE_TASKBAR;
            case KEY_GESTURE_TYPE_TAKE_SCREENSHOT:
            case KEY_GESTURE_TYPE_SCREENSHOT_CHORD:
                return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__TAKE_SCREENSHOT;
            case KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER:
                return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__OPEN_SHORTCUT_HELPER;
@@ -472,6 +485,8 @@ public final class KeyGestureEvent {
                return "KEY_GESTURE_TYPE_TOGGLE_TASKBAR";
            case KEY_GESTURE_TYPE_TAKE_SCREENSHOT:
                return "KEY_GESTURE_TYPE_TAKE_SCREENSHOT";
            case KEY_GESTURE_TYPE_SCREENSHOT_CHORD:
                return "KEY_GESTURE_TYPE_SCREENSHOT_CHORD";
            case KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER:
                return "KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER";
            case KEY_GESTURE_TYPE_BRIGHTNESS_UP:
@@ -558,6 +573,16 @@ public final class KeyGestureEvent {
                return "KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION";
            case KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER:
                return "KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER";
            case KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD:
                return "KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD";
            case KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD:
                return "KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD";
            case KEY_GESTURE_TYPE_GLOBAL_ACTIONS:
                return "KEY_GESTURE_TYPE_GLOBAL_ACTIONS";
            case KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD:
                return "KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD";
            case KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT:
                return "KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT";
            default:
                return Integer.toHexString(value);
        }
+2 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package android.view;

import static android.os.IInputConstants.POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY;
import static android.os.IInputConstants.POLICY_FLAG_KEY_GESTURE_TRIGGERED;

import android.annotation.IntDef;
import android.os.PowerManager;
@@ -35,6 +36,7 @@ public interface WindowManagerPolicyConstants {
    int FLAG_VIRTUAL = 0x00000002;

    int FLAG_INJECTED_FROM_ACCESSIBILITY = POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY;
    int FLAG_KEY_GESTURE_TRIGGERED = POLICY_FLAG_KEY_GESTURE_TRIGGERED;
    int FLAG_INJECTED = 0x01000000;
    int FLAG_TRUSTED = 0x02000000;
    int FLAG_FILTERED = 0x04000000;
+10 −0
Original line number Diff line number Diff line
@@ -117,6 +117,7 @@ import android.view.SurfaceControl;
import android.view.VerifiedInputEvent;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import android.view.WindowManagerPolicyConstants;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;

@@ -611,6 +612,7 @@ public class InputManagerService extends IInputManager.Stub
        mKeyRemapper.systemRunning();
        mPointerIconCache.systemRunning();
        mKeyboardGlyphManager.systemRunning();
        mKeyGestureController.systemRunning();

        initKeyGestures();
    }
@@ -2469,6 +2471,14 @@ public class InputManagerService extends IInputManager.Stub
                mFocusEventDebugView.reportKeyEvent(event);
            }
        }
        if (useKeyGestureEventHandler() && mKeyGestureController.interceptKeyBeforeQueueing(event,
                policyFlags)) {
            // If key gesture gets triggered, we send the event to policy with KEY_GESTURE flag
            // indicating, the event is used in triggering a key gesture. We can't block event
            // like Power or volume keys since policy might still want to handle it to change
            // certain states.
            policyFlags |= WindowManagerPolicyConstants.FLAG_KEY_GESTURE_TRIGGERED;
        }
        return mWindowManagerCallbacks.interceptKeyBeforeQueueing(event, policyFlags);
    }

+328 −3

File changed.

Preview size limit exceeded, changes collapsed.

+15 −15
Original line number Diff line number Diff line
@@ -65,21 +65,21 @@ public class KeyCombinationManager {
     *       };
     *  </pre>
     */
    abstract static class TwoKeysCombinationRule {
    public abstract static class TwoKeysCombinationRule {
        private int mKeyCode1;
        private int mKeyCode2;

        TwoKeysCombinationRule(int keyCode1, int keyCode2) {
        public TwoKeysCombinationRule(int keyCode1, int keyCode2) {
            mKeyCode1 = keyCode1;
            mKeyCode2 = keyCode2;
        }

        boolean preCondition() {
        public boolean preCondition() {
            return true;
        }

        boolean shouldInterceptKey(int keyCode) {
            return preCondition() && (keyCode == mKeyCode1 || keyCode == mKeyCode2);
            return (keyCode == mKeyCode1 || keyCode == mKeyCode2) && preCondition();
        }

        boolean shouldInterceptKeys(SparseLongArray downTimes) {
@@ -94,12 +94,12 @@ public class KeyCombinationManager {
        }

        // The excessive delay before it dispatching to client.
        long getKeyInterceptDelayMs() {
        public long getKeyInterceptDelayMs() {
            return COMBINE_KEY_DELAY_MILLIS;
        }

        abstract void execute();
        abstract void cancel();
        public abstract void execute();
        public abstract void cancel();

        @Override
        public String toString() {
@@ -128,18 +128,18 @@ public class KeyCombinationManager {
        }
    }

    KeyCombinationManager(Handler handler) {
    public KeyCombinationManager(Handler handler) {
        mHandler = handler;
    }

    void addRule(TwoKeysCombinationRule rule) {
    public void addRule(TwoKeysCombinationRule rule) {
        if (mRules.contains(rule)) {
            throw new IllegalArgumentException("Rule : " + rule + " already exists.");
        }
        mRules.add(rule);
    }

    void removeRule(TwoKeysCombinationRule rule) {
    public void removeRule(TwoKeysCombinationRule rule) {
        mRules.remove(rule);
    }

@@ -148,7 +148,7 @@ public class KeyCombinationManager {
     * to a window.
     * Return true if any active rule could be triggered by the key event, otherwise false.
     */
    boolean interceptKey(KeyEvent event, boolean interactive) {
    public boolean interceptKey(KeyEvent event, boolean interactive) {
        synchronized (mLock) {
            return interceptKeyLocked(event, interactive);
        }
@@ -226,7 +226,7 @@ public class KeyCombinationManager {
    /**
     * Return the interceptTimeout to tell InputDispatcher when is ready to deliver to window.
     */
    long getKeyInterceptTimeout(int keyCode) {
    public long getKeyInterceptTimeout(int keyCode) {
        synchronized (mLock) {
            if (mDownTimes.get(keyCode) == 0) {
                return 0;
@@ -246,7 +246,7 @@ public class KeyCombinationManager {
    /**
     * True if the key event had been handled.
     */
    boolean isKeyConsumed(KeyEvent event) {
    public boolean isKeyConsumed(KeyEvent event) {
        synchronized (mLock) {
            if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) != 0) {
                return false;
@@ -258,7 +258,7 @@ public class KeyCombinationManager {
    /**
     * True if power key is the candidate.
     */
    boolean isPowerKeyIntercepted() {
    public boolean isPowerKeyIntercepted() {
        synchronized (mLock) {
            if (forAllActiveRules((rule) -> rule.shouldInterceptKey(KEYCODE_POWER))) {
                // return false if only if power key pressed.
@@ -294,7 +294,7 @@ public class KeyCombinationManager {
        return false;
    }

    void dump(String prefix, PrintWriter pw) {
    public void dump(String prefix, PrintWriter pw) {
        pw.println(prefix + "KeyCombination rules:");
        forAllRules(mRules, (rule)-> {
            pw.println(prefix + "  " + rule);
Loading