summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/input/IInputManager.aidl4
-rw-r--r--core/java/android/hardware/input/InputGestureData.java31
-rw-r--r--core/java/android/hardware/input/InputManager.java16
-rw-r--r--services/core/java/com/android/server/input/InputGestureManager.java34
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java9
-rw-r--r--services/core/java/com/android/server/input/KeyGestureController.java11
-rw-r--r--tests/Input/src/com/android/server/input/InputGestureManagerTests.kt68
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