Loading core/java/android/hardware/input/IInputManager.aidl +2 −2 Original line number Diff line number Diff line Loading @@ -276,9 +276,9 @@ interface IInputManager { @PermissionManuallyEnforced @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + "android.Manifest.permission.MANAGE_KEY_GESTURES)") void removeAllCustomInputGestures(int userId); void removeAllCustomInputGestures(int userId, int tag); AidlInputGestureData[] getCustomInputGestures(int userId); AidlInputGestureData[] getCustomInputGestures(int userId, int tag); AidlInputGestureData[] getAppLaunchBookmarks(); } core/java/android/hardware/input/InputGestureData.java +31 −0 Original line number Diff line number Diff line Loading @@ -296,4 +296,35 @@ public final class InputGestureData { public record Action(@KeyGestureEvent.KeyGestureType int keyGestureType, @Nullable AppLaunchData appLaunchData) { } /** Filter definition for InputGestureData */ public enum Filter { KEY(AidlInputGestureData.Trigger.Tag.key), TOUCHPAD(AidlInputGestureData.Trigger.Tag.touchpadGesture); @AidlInputGestureData.Trigger.Tag private final int mTag; Filter(@AidlInputGestureData.Trigger.Tag int tag) { mTag = tag; } @Nullable public static Filter of(@AidlInputGestureData.Trigger.Tag int tag) { return switch (tag) { case AidlInputGestureData.Trigger.Tag.key -> KEY; case AidlInputGestureData.Trigger.Tag.touchpadGesture -> TOUCHPAD; default -> null; }; } @AidlInputGestureData.Trigger.Tag public int getTag() { return mTag; } public boolean matches(@NonNull InputGestureData inputGestureData) { return mTag == inputGestureData.mInputGestureData.trigger.getTag(); } } } core/java/android/hardware/input/InputManager.java +12 −4 Original line number Diff line number Diff line Loading @@ -1525,34 +1525,42 @@ public final class InputManager { } /** Removes all custom input gestures * * @param filter for removing all gestures of a category. If {@code null}, all custom input * gestures will be removed * * @hide */ @RequiresPermission(Manifest.permission.MANAGE_KEY_GESTURES) @UserHandleAware public void removeAllCustomInputGestures() { public void removeAllCustomInputGestures(@Nullable InputGestureData.Filter filter) { if (!enableCustomizableInputGestures()) { return; } try { mIm.removeAllCustomInputGestures(mContext.getUserId()); mIm.removeAllCustomInputGestures(mContext.getUserId(), filter == null ? -1 : filter.getTag()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** Get all custom input gestures * * @param filter for fetching all gestures of a category. If {@code null}, then will return * all custom input gestures * * @hide */ @UserHandleAware public List<InputGestureData> getCustomInputGestures() { public List<InputGestureData> getCustomInputGestures(@Nullable InputGestureData.Filter filter) { List<InputGestureData> result = new ArrayList<>(); if (!enableCustomizableInputGestures()) { return result; } try { for (AidlInputGestureData data : mIm.getCustomInputGestures(mContext.getUserId())) { for (AidlInputGestureData data : mIm.getCustomInputGestures(mContext.getUserId(), filter == null ? -1 : filter.getTag())) { result.add(new InputGestureData(data)); } } catch (RemoteException e) { Loading services/core/java/com/android/server/input/InputGestureManager.java +29 −5 Original line number Diff line number Diff line Loading @@ -323,26 +323,50 @@ final class InputGestureManager { return InputManager.CUSTOM_INPUT_GESTURE_RESULT_ERROR_DOES_NOT_EXIST; } customGestures.remove(data.getTrigger()); if (customGestures.size() == 0) { if (customGestures.isEmpty()) { mCustomInputGestures.remove(userId); } return InputManager.CUSTOM_INPUT_GESTURE_RESULT_SUCCESS; } } public void removeAllCustomInputGestures(int userId) { public void removeAllCustomInputGestures(int userId, @Nullable InputGestureData.Filter filter) { synchronized (mGestureLock) { Map<InputGestureData.Trigger, InputGestureData> customGestures = mCustomInputGestures.get(userId); if (customGestures == null) { return; } if (filter == null) { mCustomInputGestures.remove(userId); return; } customGestures.entrySet().removeIf(entry -> filter.matches(entry.getValue())); if (customGestures.isEmpty()) { mCustomInputGestures.remove(userId); } } } @NonNull public List<InputGestureData> getCustomInputGestures(int userId) { public List<InputGestureData> getCustomInputGestures(int userId, @Nullable InputGestureData.Filter filter) { synchronized (mGestureLock) { if (!mCustomInputGestures.contains(userId)) { return List.of(); } return new ArrayList<>(mCustomInputGestures.get(userId).values()); Map<InputGestureData.Trigger, InputGestureData> customGestures = mCustomInputGestures.get(userId); if (filter == null) { return new ArrayList<>(customGestures.values()); } List<InputGestureData> result = new ArrayList<>(); for (InputGestureData customGesture : customGestures.values()) { if (filter.matches(customGesture)) { result.add(customGesture); } } return result; } } Loading services/core/java/com/android/server/input/InputManagerService.java +5 −4 Original line number Diff line number Diff line Loading @@ -3017,15 +3017,16 @@ public class InputManagerService extends IInputManager.Stub @Override @PermissionManuallyEnforced public void removeAllCustomInputGestures(@UserIdInt int userId) { public void removeAllCustomInputGestures(@UserIdInt int userId, int tag) { enforceManageKeyGesturePermission(); mKeyGestureController.removeAllCustomInputGestures(userId); mKeyGestureController.removeAllCustomInputGestures(userId, InputGestureData.Filter.of(tag)); } @Override public AidlInputGestureData[] getCustomInputGestures(@UserIdInt int userId) { return mKeyGestureController.getCustomInputGestures(userId); public AidlInputGestureData[] getCustomInputGestures(@UserIdInt int userId, int tag) { return mKeyGestureController.getCustomInputGestures(userId, InputGestureData.Filter.of(tag)); } @Override Loading Loading
core/java/android/hardware/input/IInputManager.aidl +2 −2 Original line number Diff line number Diff line Loading @@ -276,9 +276,9 @@ interface IInputManager { @PermissionManuallyEnforced @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + "android.Manifest.permission.MANAGE_KEY_GESTURES)") void removeAllCustomInputGestures(int userId); void removeAllCustomInputGestures(int userId, int tag); AidlInputGestureData[] getCustomInputGestures(int userId); AidlInputGestureData[] getCustomInputGestures(int userId, int tag); AidlInputGestureData[] getAppLaunchBookmarks(); }
core/java/android/hardware/input/InputGestureData.java +31 −0 Original line number Diff line number Diff line Loading @@ -296,4 +296,35 @@ public final class InputGestureData { public record Action(@KeyGestureEvent.KeyGestureType int keyGestureType, @Nullable AppLaunchData appLaunchData) { } /** Filter definition for InputGestureData */ public enum Filter { KEY(AidlInputGestureData.Trigger.Tag.key), TOUCHPAD(AidlInputGestureData.Trigger.Tag.touchpadGesture); @AidlInputGestureData.Trigger.Tag private final int mTag; Filter(@AidlInputGestureData.Trigger.Tag int tag) { mTag = tag; } @Nullable public static Filter of(@AidlInputGestureData.Trigger.Tag int tag) { return switch (tag) { case AidlInputGestureData.Trigger.Tag.key -> KEY; case AidlInputGestureData.Trigger.Tag.touchpadGesture -> TOUCHPAD; default -> null; }; } @AidlInputGestureData.Trigger.Tag public int getTag() { return mTag; } public boolean matches(@NonNull InputGestureData inputGestureData) { return mTag == inputGestureData.mInputGestureData.trigger.getTag(); } } }
core/java/android/hardware/input/InputManager.java +12 −4 Original line number Diff line number Diff line Loading @@ -1525,34 +1525,42 @@ public final class InputManager { } /** Removes all custom input gestures * * @param filter for removing all gestures of a category. If {@code null}, all custom input * gestures will be removed * * @hide */ @RequiresPermission(Manifest.permission.MANAGE_KEY_GESTURES) @UserHandleAware public void removeAllCustomInputGestures() { public void removeAllCustomInputGestures(@Nullable InputGestureData.Filter filter) { if (!enableCustomizableInputGestures()) { return; } try { mIm.removeAllCustomInputGestures(mContext.getUserId()); mIm.removeAllCustomInputGestures(mContext.getUserId(), filter == null ? -1 : filter.getTag()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** Get all custom input gestures * * @param filter for fetching all gestures of a category. If {@code null}, then will return * all custom input gestures * * @hide */ @UserHandleAware public List<InputGestureData> getCustomInputGestures() { public List<InputGestureData> getCustomInputGestures(@Nullable InputGestureData.Filter filter) { List<InputGestureData> result = new ArrayList<>(); if (!enableCustomizableInputGestures()) { return result; } try { for (AidlInputGestureData data : mIm.getCustomInputGestures(mContext.getUserId())) { for (AidlInputGestureData data : mIm.getCustomInputGestures(mContext.getUserId(), filter == null ? -1 : filter.getTag())) { result.add(new InputGestureData(data)); } } catch (RemoteException e) { Loading
services/core/java/com/android/server/input/InputGestureManager.java +29 −5 Original line number Diff line number Diff line Loading @@ -323,26 +323,50 @@ final class InputGestureManager { return InputManager.CUSTOM_INPUT_GESTURE_RESULT_ERROR_DOES_NOT_EXIST; } customGestures.remove(data.getTrigger()); if (customGestures.size() == 0) { if (customGestures.isEmpty()) { mCustomInputGestures.remove(userId); } return InputManager.CUSTOM_INPUT_GESTURE_RESULT_SUCCESS; } } public void removeAllCustomInputGestures(int userId) { public void removeAllCustomInputGestures(int userId, @Nullable InputGestureData.Filter filter) { synchronized (mGestureLock) { Map<InputGestureData.Trigger, InputGestureData> customGestures = mCustomInputGestures.get(userId); if (customGestures == null) { return; } if (filter == null) { mCustomInputGestures.remove(userId); return; } customGestures.entrySet().removeIf(entry -> filter.matches(entry.getValue())); if (customGestures.isEmpty()) { mCustomInputGestures.remove(userId); } } } @NonNull public List<InputGestureData> getCustomInputGestures(int userId) { public List<InputGestureData> getCustomInputGestures(int userId, @Nullable InputGestureData.Filter filter) { synchronized (mGestureLock) { if (!mCustomInputGestures.contains(userId)) { return List.of(); } return new ArrayList<>(mCustomInputGestures.get(userId).values()); Map<InputGestureData.Trigger, InputGestureData> customGestures = mCustomInputGestures.get(userId); if (filter == null) { return new ArrayList<>(customGestures.values()); } List<InputGestureData> result = new ArrayList<>(); for (InputGestureData customGesture : customGestures.values()) { if (filter.matches(customGesture)) { result.add(customGesture); } } return result; } } Loading
services/core/java/com/android/server/input/InputManagerService.java +5 −4 Original line number Diff line number Diff line Loading @@ -3017,15 +3017,16 @@ public class InputManagerService extends IInputManager.Stub @Override @PermissionManuallyEnforced public void removeAllCustomInputGestures(@UserIdInt int userId) { public void removeAllCustomInputGestures(@UserIdInt int userId, int tag) { enforceManageKeyGesturePermission(); mKeyGestureController.removeAllCustomInputGestures(userId); mKeyGestureController.removeAllCustomInputGestures(userId, InputGestureData.Filter.of(tag)); } @Override public AidlInputGestureData[] getCustomInputGestures(@UserIdInt int userId) { return mKeyGestureController.getCustomInputGestures(userId); public AidlInputGestureData[] getCustomInputGestures(@UserIdInt int userId, int tag) { return mKeyGestureController.getCustomInputGestures(userId, InputGestureData.Filter.of(tag)); } @Override Loading