Loading core/java/android/hardware/input/IInputManager.aidl +5 −0 Original line number Diff line number Diff line Loading @@ -263,6 +263,11 @@ interface IInputManager { + "android.Manifest.permission.MANAGE_KEY_GESTURES)") void unregisterKeyGestureHandler(IKeyGestureHandler handler); @PermissionManuallyEnforced @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + "android.Manifest.permission.MANAGE_KEY_GESTURES)") AidlInputGestureData getInputGesture(int userId, in AidlInputGestureData.Trigger trigger); @PermissionManuallyEnforced @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + "android.Manifest.permission.MANAGE_KEY_GESTURES)") Loading core/java/android/hardware/input/InputManager.java +24 −0 Original line number Diff line number Diff line Loading @@ -1480,6 +1480,30 @@ public final class InputManager { mGlobal.unregisterKeyGestureEventHandler(handler); } /** * Find an input gesture mapped to a particular trigger. * * @param trigger to find the input gesture for * @return input gesture mapped to the provided trigger, {@code null} if none found * * @hide */ @RequiresPermission(Manifest.permission.MANAGE_KEY_GESTURES) @UserHandleAware @Nullable public InputGestureData getInputGesture(@NonNull InputGestureData.Trigger trigger) { try { AidlInputGestureData result = mIm.getInputGesture(mContext.getUserId(), trigger.getAidlTrigger()); if (result == null) { return null; } return new InputGestureData(result); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** Adds a new custom input gesture * * @param inputGestureData gesture data to add as custom gesture Loading core/java/android/hardware/input/KeyGestureEvent.java +6 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,9 @@ public final class KeyGestureEvent { private static final int LOG_EVENT_UNSPECIFIED = FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__UNSPECIFIED; // Used as a placeholder to identify if a gesture is reserved for system public static final int KEY_GESTURE_TYPE_SYSTEM_RESERVED = -1; // These values should not change and values should not be re-used as this data is persisted to // long term storage and must be kept backwards compatible. public static final int KEY_GESTURE_TYPE_UNSPECIFIED = 0; Loading Loading @@ -144,6 +147,7 @@ public final class KeyGestureEvent { public static final int ACTION_GESTURE_COMPLETE = 2; @IntDef(prefix = "KEY_GESTURE_TYPE_", value = { KEY_GESTURE_TYPE_SYSTEM_RESERVED, KEY_GESTURE_TYPE_UNSPECIFIED, KEY_GESTURE_TYPE_HOME, KEY_GESTURE_TYPE_RECENT_APPS, Loading Loading @@ -665,6 +669,8 @@ public final class KeyGestureEvent { private static String keyGestureTypeToString(@KeyGestureType int value) { switch (value) { case KEY_GESTURE_TYPE_SYSTEM_RESERVED: return "KEY_GESTURE_TYPE_SYSTEM_RESERVED"; case KEY_GESTURE_TYPE_UNSPECIFIED: return "KEY_GESTURE_TYPE_UNSPECIFIED"; case KEY_GESTURE_TYPE_HOME: Loading services/core/java/com/android/server/input/InputGestureManager.java +25 −0 Original line number Diff line number Diff line Loading @@ -316,6 +316,31 @@ final class InputGestureManager { } } @Nullable public InputGestureData getInputGesture(int userId, InputGestureData.Trigger trigger) { synchronized (mGestureLock) { if (mBlockListedTriggers.contains(trigger)) { return new InputGestureData.Builder().setTrigger(trigger).setKeyGestureType( KeyGestureEvent.KEY_GESTURE_TYPE_SYSTEM_RESERVED).build(); } if (trigger instanceof InputGestureData.KeyTrigger keyTrigger) { if (KeyEvent.isModifierKey(keyTrigger.getKeycode()) || KeyEvent.isSystemKey(keyTrigger.getKeycode())) { return new InputGestureData.Builder().setTrigger(trigger).setKeyGestureType( KeyGestureEvent.KEY_GESTURE_TYPE_SYSTEM_RESERVED).build(); } } InputGestureData gestureData = mSystemShortcuts.get(trigger); if (gestureData != null) { return gestureData; } if (!mCustomInputGestures.contains(userId)) { return null; } return mCustomInputGestures.get(userId).get(trigger); } } @InputManager.CustomInputGestureResult public int addCustomInputGesture(int userId, InputGestureData newGesture) { synchronized (mGestureLock) { Loading services/core/java/com/android/server/input/InputManagerService.java +10 −0 Original line number Diff line number Diff line Loading @@ -3059,6 +3059,16 @@ public class InputManagerService extends IInputManager.Stub mKeyGestureController.unregisterKeyGestureHandler(handler, Binder.getCallingPid()); } @Override @PermissionManuallyEnforced public AidlInputGestureData getInputGesture(@UserIdInt int userId, @NonNull AidlInputGestureData.Trigger trigger) { enforceManageKeyGesturePermission(); Objects.requireNonNull(trigger); return mKeyGestureController.getInputGesture(userId, trigger); } @Override @PermissionManuallyEnforced public int addCustomInputGesture(@UserIdInt int userId, Loading Loading
core/java/android/hardware/input/IInputManager.aidl +5 −0 Original line number Diff line number Diff line Loading @@ -263,6 +263,11 @@ interface IInputManager { + "android.Manifest.permission.MANAGE_KEY_GESTURES)") void unregisterKeyGestureHandler(IKeyGestureHandler handler); @PermissionManuallyEnforced @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + "android.Manifest.permission.MANAGE_KEY_GESTURES)") AidlInputGestureData getInputGesture(int userId, in AidlInputGestureData.Trigger trigger); @PermissionManuallyEnforced @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + "android.Manifest.permission.MANAGE_KEY_GESTURES)") Loading
core/java/android/hardware/input/InputManager.java +24 −0 Original line number Diff line number Diff line Loading @@ -1480,6 +1480,30 @@ public final class InputManager { mGlobal.unregisterKeyGestureEventHandler(handler); } /** * Find an input gesture mapped to a particular trigger. * * @param trigger to find the input gesture for * @return input gesture mapped to the provided trigger, {@code null} if none found * * @hide */ @RequiresPermission(Manifest.permission.MANAGE_KEY_GESTURES) @UserHandleAware @Nullable public InputGestureData getInputGesture(@NonNull InputGestureData.Trigger trigger) { try { AidlInputGestureData result = mIm.getInputGesture(mContext.getUserId(), trigger.getAidlTrigger()); if (result == null) { return null; } return new InputGestureData(result); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** Adds a new custom input gesture * * @param inputGestureData gesture data to add as custom gesture Loading
core/java/android/hardware/input/KeyGestureEvent.java +6 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,9 @@ public final class KeyGestureEvent { private static final int LOG_EVENT_UNSPECIFIED = FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__UNSPECIFIED; // Used as a placeholder to identify if a gesture is reserved for system public static final int KEY_GESTURE_TYPE_SYSTEM_RESERVED = -1; // These values should not change and values should not be re-used as this data is persisted to // long term storage and must be kept backwards compatible. public static final int KEY_GESTURE_TYPE_UNSPECIFIED = 0; Loading Loading @@ -144,6 +147,7 @@ public final class KeyGestureEvent { public static final int ACTION_GESTURE_COMPLETE = 2; @IntDef(prefix = "KEY_GESTURE_TYPE_", value = { KEY_GESTURE_TYPE_SYSTEM_RESERVED, KEY_GESTURE_TYPE_UNSPECIFIED, KEY_GESTURE_TYPE_HOME, KEY_GESTURE_TYPE_RECENT_APPS, Loading Loading @@ -665,6 +669,8 @@ public final class KeyGestureEvent { private static String keyGestureTypeToString(@KeyGestureType int value) { switch (value) { case KEY_GESTURE_TYPE_SYSTEM_RESERVED: return "KEY_GESTURE_TYPE_SYSTEM_RESERVED"; case KEY_GESTURE_TYPE_UNSPECIFIED: return "KEY_GESTURE_TYPE_UNSPECIFIED"; case KEY_GESTURE_TYPE_HOME: Loading
services/core/java/com/android/server/input/InputGestureManager.java +25 −0 Original line number Diff line number Diff line Loading @@ -316,6 +316,31 @@ final class InputGestureManager { } } @Nullable public InputGestureData getInputGesture(int userId, InputGestureData.Trigger trigger) { synchronized (mGestureLock) { if (mBlockListedTriggers.contains(trigger)) { return new InputGestureData.Builder().setTrigger(trigger).setKeyGestureType( KeyGestureEvent.KEY_GESTURE_TYPE_SYSTEM_RESERVED).build(); } if (trigger instanceof InputGestureData.KeyTrigger keyTrigger) { if (KeyEvent.isModifierKey(keyTrigger.getKeycode()) || KeyEvent.isSystemKey(keyTrigger.getKeycode())) { return new InputGestureData.Builder().setTrigger(trigger).setKeyGestureType( KeyGestureEvent.KEY_GESTURE_TYPE_SYSTEM_RESERVED).build(); } } InputGestureData gestureData = mSystemShortcuts.get(trigger); if (gestureData != null) { return gestureData; } if (!mCustomInputGestures.contains(userId)) { return null; } return mCustomInputGestures.get(userId).get(trigger); } } @InputManager.CustomInputGestureResult public int addCustomInputGesture(int userId, InputGestureData newGesture) { synchronized (mGestureLock) { Loading
services/core/java/com/android/server/input/InputManagerService.java +10 −0 Original line number Diff line number Diff line Loading @@ -3059,6 +3059,16 @@ public class InputManagerService extends IInputManager.Stub mKeyGestureController.unregisterKeyGestureHandler(handler, Binder.getCallingPid()); } @Override @PermissionManuallyEnforced public AidlInputGestureData getInputGesture(@UserIdInt int userId, @NonNull AidlInputGestureData.Trigger trigger) { enforceManageKeyGesturePermission(); Objects.requireNonNull(trigger); return mKeyGestureController.getInputGesture(userId, trigger); } @Override @PermissionManuallyEnforced public int addCustomInputGesture(@UserIdInt int userId, Loading