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

Commit 3019e1cf authored by Vaibhav Devmurari's avatar Vaibhav Devmurari
Browse files

Add option to filter custom shortcuts

Test: atest InputTests
Bug: 365064144
Flag: com.android.hardware.input.enable_customizable_input_gestures
Change-Id: I4629ef4536a2f97d13c6458ba5d05c7c7e139ba8
parent 09c17882
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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();
}
+31 −0
Original line number Diff line number Diff line
@@ -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();
        }
    }
}
+12 −4
Original line number Diff line number Diff line
@@ -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) {
+29 −5
Original line number Diff line number Diff line
@@ -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;
        }
    }

+5 −4
Original line number Diff line number Diff line
@@ -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