diff options
7 files changed, 147 insertions, 26 deletions
diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl index 1b96224f03da..3284761eb273 100644 --- a/core/java/android/hardware/input/IInputManager.aidl +++ b/core/java/android/hardware/input/IInputManager.aidl @@ -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(); } diff --git a/core/java/android/hardware/input/InputGestureData.java b/core/java/android/hardware/input/InputGestureData.java index ee0a2a9cf88c..f41550f6061e 100644 --- a/core/java/android/hardware/input/InputGestureData.java +++ b/core/java/android/hardware/input/InputGestureData.java @@ -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(); + } + } } diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java index 9050ae235ce7..f8241925dff0 100644 --- a/core/java/android/hardware/input/InputManager.java +++ b/core/java/android/hardware/input/InputManager.java @@ -1526,16 +1526,20 @@ 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(); } @@ -1543,16 +1547,20 @@ public final class InputManager { /** 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) { diff --git a/services/core/java/com/android/server/input/InputGestureManager.java b/services/core/java/com/android/server/input/InputGestureManager.java index 8cb51ce35a89..e545dd507f28 100644 --- a/services/core/java/com/android/server/input/InputGestureManager.java +++ b/services/core/java/com/android/server/input/InputGestureManager.java @@ -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) { - mCustomInputGestures.remove(userId); + 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; } } diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index e0f3a9bd427a..f4dd71706761 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -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 diff --git a/services/core/java/com/android/server/input/KeyGestureController.java b/services/core/java/com/android/server/input/KeyGestureController.java index fc106404049c..155ffe805519 100644 --- a/services/core/java/com/android/server/input/KeyGestureController.java +++ b/services/core/java/com/android/server/input/KeyGestureController.java @@ -1021,13 +1021,16 @@ final class KeyGestureController { } @BinderThread - public void removeAllCustomInputGestures(@UserIdInt int userId) { - mInputGestureManager.removeAllCustomInputGestures(userId); + public void removeAllCustomInputGestures(@UserIdInt int userId, + @Nullable InputGestureData.Filter filter) { + mInputGestureManager.removeAllCustomInputGestures(userId, filter); } @BinderThread - public AidlInputGestureData[] getCustomInputGestures(@UserIdInt int userId) { - List<InputGestureData> customGestures = mInputGestureManager.getCustomInputGestures(userId); + public AidlInputGestureData[] getCustomInputGestures(@UserIdInt int userId, + @Nullable InputGestureData.Filter filter) { + List<InputGestureData> customGestures = mInputGestureManager.getCustomInputGestures(userId, + filter); AidlInputGestureData[] result = new AidlInputGestureData[customGestures.size()]; for (int i = 0; i < customGestures.size(); i++) { result[i] = customGestures.get(i).getAidlData(); diff --git a/tests/Input/src/com/android/server/input/InputGestureManagerTests.kt b/tests/Input/src/com/android/server/input/InputGestureManagerTests.kt index 862886ce69d2..e281a3fb1287 100644 --- a/tests/Input/src/com/android/server/input/InputGestureManagerTests.kt +++ b/tests/Input/src/com/android/server/input/InputGestureManagerTests.kt @@ -61,13 +61,13 @@ class InputGestureManagerTests { assertEquals(InputManager.CUSTOM_INPUT_GESTURE_RESULT_SUCCESS, result) assertEquals( listOf(customGesture), - inputGestureManager.getCustomInputGestures(USER_ID) + inputGestureManager.getCustomInputGestures(USER_ID, /* filter = */null) ) inputGestureManager.removeCustomInputGesture(USER_ID, customGesture) assertEquals( listOf<InputGestureData>(), - inputGestureManager.getCustomInputGestures(USER_ID) + inputGestureManager.getCustomInputGestures(USER_ID, /* filter = */null) ) } @@ -86,7 +86,7 @@ class InputGestureManagerTests { assertEquals(InputManager.CUSTOM_INPUT_GESTURE_RESULT_ERROR_DOES_NOT_EXIST, result) assertEquals( listOf<InputGestureData>(), - inputGestureManager.getCustomInputGestures(USER_ID) + inputGestureManager.getCustomInputGestures(USER_ID, /* filter = */null) ) } @@ -115,7 +115,7 @@ class InputGestureManagerTests { assertEquals(InputManager.CUSTOM_INPUT_GESTURE_RESULT_ERROR_ALREADY_EXISTS, result) assertEquals( listOf(customGesture), - inputGestureManager.getCustomInputGestures(USER_ID) + inputGestureManager.getCustomInputGestures(USER_ID, /* filter = */null) ) } @@ -144,13 +144,67 @@ class InputGestureManagerTests { assertEquals( listOf(customGesture, customGesture2), - inputGestureManager.getCustomInputGestures(USER_ID) + inputGestureManager.getCustomInputGestures(USER_ID, /* filter = */null) ) - inputGestureManager.removeAllCustomInputGestures(USER_ID) + inputGestureManager.removeAllCustomInputGestures(USER_ID, /* filter = */null) assertEquals( listOf<InputGestureData>(), - inputGestureManager.getCustomInputGestures(USER_ID) + inputGestureManager.getCustomInputGestures(USER_ID, /* filter = */null) + ) + } + + @Test + fun filteringBasedOnTouchpadOrKeyGestures() { + val customKeyGesture = InputGestureData.Builder() + .setTrigger( + InputGestureData.createKeyTrigger( + KeyEvent.KEYCODE_H, + KeyEvent.META_META_ON + ) + ) + .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_HOME) + .build() + inputGestureManager.addCustomInputGesture(USER_ID, customKeyGesture) + val customTouchpadGesture = InputGestureData.Builder() + .setTrigger( + InputGestureData.createTouchpadTrigger( + InputGestureData.TOUCHPAD_GESTURE_TYPE_THREE_FINGER_TAP + ) + ) + .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_BACK) + .build() + inputGestureManager.addCustomInputGesture(USER_ID, customTouchpadGesture) + + assertEquals( + listOf(customTouchpadGesture, customKeyGesture), + inputGestureManager.getCustomInputGestures(USER_ID, /* filter = */null) + ) + assertEquals( + listOf(customKeyGesture), + inputGestureManager.getCustomInputGestures(USER_ID, InputGestureData.Filter.KEY) + ) + assertEquals( + listOf(customTouchpadGesture), + inputGestureManager.getCustomInputGestures( + USER_ID, + InputGestureData.Filter.TOUCHPAD + ) + ) + + inputGestureManager.removeAllCustomInputGestures(USER_ID, InputGestureData.Filter.KEY) + assertEquals( + listOf(customTouchpadGesture), + inputGestureManager.getCustomInputGestures(USER_ID, /* filter = */null) + ) + + inputGestureManager.removeAllCustomInputGestures( + USER_ID, + InputGestureData.Filter.TOUCHPAD + ) + assertEquals( + listOf<InputGestureData>(), + inputGestureManager.getCustomInputGestures(USER_ID, /* filter = */null) ) } }
\ No newline at end of file |