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

Commit b60681ae authored by Vaibhav Devmurari's avatar Vaibhav Devmurari
Browse files

Add KeyGestureEventHandler APIs

Test: atest KeyGestureEventHandlerTest
Bug: 358569822
Flag: EXEMPT hidden APIs added (the usage will be flagged)
Change-Id: I6479583dc756ba47908ffd772ba148e1c2f60fb3
parent 78794fbb
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
/*
 * Copyright 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.hardware.input;

/** @hide */
@JavaDerive(equals=true)
parcelable AidlKeyGestureEvent {
    int deviceId;
    int[] keycodes;
    int modifierState;
    int gestureType;
    int action;
    int displayId;
    int flags;
}
+11 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.hardware.input.IInputDeviceBatteryState;
import android.hardware.input.IKeyboardBacklightListener;
import android.hardware.input.IKeyboardBacklightState;
import android.hardware.input.IKeyGestureEventListener;
import android.hardware.input.IKeyGestureHandler;
import android.hardware.input.IStickyModifierStateListener;
import android.hardware.input.ITabletModeChangedListener;
import android.hardware.input.KeyboardLayoutSelectionResult;
@@ -250,4 +251,14 @@ interface IInputManager {
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = "
            + "android.Manifest.permission.MANAGE_KEY_GESTURES)")
    void unregisterKeyGestureEventListener(IKeyGestureEventListener listener);

    @PermissionManuallyEnforced
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = "
            + "android.Manifest.permission.MANAGE_KEY_GESTURES)")
    void registerKeyGestureHandler(IKeyGestureHandler handler);

    @PermissionManuallyEnforced
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = "
            + "android.Manifest.permission.MANAGE_KEY_GESTURES)")
    void unregisterKeyGestureHandler(IKeyGestureHandler handler);
}
+3 −1
Original line number Diff line number Diff line
@@ -16,11 +16,13 @@

package android.hardware.input;

import android.hardware.input.AidlKeyGestureEvent;

/** @hide */
oneway interface IKeyGestureEventListener {

    /**
     * Called when a key gesture event occurs.
     */
    void onKeyGestureEvent(int deviceId, in int[] keycodes, int modifierState, int shortcut);
    void onKeyGestureEvent(in AidlKeyGestureEvent event);
}
+42 −0
Original line number Diff line number Diff line
/*
 * Copyright 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.hardware.input;

import android.hardware.input.AidlKeyGestureEvent;
import android.os.IBinder;

/** @hide */
interface IKeyGestureHandler {

    /**
     * Called when a key gesture starts, ends, or is cancelled. If a handler returns {@code true},
     * it means they intend to handle the full gesture and should handle all the events pertaining
     * to that gesture.
     */
    boolean handleKeyGesture(in AidlKeyGestureEvent event, in IBinder focusedToken);

    /**
     * Called to know if a particular gesture type is supported by the handler.
     *
     * TODO(b/358569822): Remove this call to reduce the binder calls to single call for
     *  handleKeyGesture. For this we need to remove dependency of multi-key gestures to identify if
     *  a key gesture is supported on first relevant key down.
     *  Also, for now we prioritize handlers in the system server process above external handlers to
     *  reduce IPC binder calls.
     */
    boolean isKeyGestureSupported(int gestureType);
}
+58 −0
Original line number Diff line number Diff line
@@ -1405,6 +1405,33 @@ public final class InputManager {
        mGlobal.unregisterKeyGestureEventListener(listener);
    }

    /**
     * Registers a key gesture event handler for {@link KeyGestureEvent} handling.
     *
     * @param handler the {@link KeyGestureEventHandler}
     * @throws IllegalArgumentException if {@code handler} has already been registered previously.
     * @throws NullPointerException     if {@code handler} or {@code executor} is null.
     * @hide
     * @see #unregisterKeyGestureEventHandler(KeyGestureEventHandler)
     */
    @RequiresPermission(Manifest.permission.MANAGE_KEY_GESTURES)
    public void registerKeyGestureEventHandler(@NonNull KeyGestureEventHandler handler)
            throws IllegalArgumentException {
        mGlobal.registerKeyGestureEventHandler(handler);
    }

    /**
     * Unregisters a previously added key gesture event handler.
     *
     * @param handler the {@link KeyGestureEventHandler}
     * @hide
     * @see #registerKeyGestureEventHandler(KeyGestureEventHandler)
     */
    @RequiresPermission(Manifest.permission.MANAGE_KEY_GESTURES)
    public void unregisterKeyGestureEventHandler(@NonNull KeyGestureEventHandler handler) {
        mGlobal.unregisterKeyGestureEventHandler(handler);
    }

    /**
     * A callback used to be notified about battery state changes for an input device. The
     * {@link #onBatteryStateChanged(int, long, BatteryState)} method will be called once after the
@@ -1522,4 +1549,35 @@ public final class InputManager {
         */
        void onKeyGestureEvent(@NonNull KeyGestureEvent event);
    }

    /**
     * A callback used to notify about key gesture event start, complete and cancel. Unlike
     * {@see KeyGestureEventListener} which is to listen to successfully handled key gestures, this
     * interface allows system components to register handler for handling key gestures.
     *
     * @see #registerKeyGestureEventHandler(KeyGestureEventHandler)
     * @see #unregisterKeyGestureEventHandler(KeyGestureEventHandler)
     *
     * <p> NOTE: All callbacks will occur on system main and input threads, so the caller needs
     * to move time-consuming operations to appropriate handler threads.
     * @hide
     */
    public interface KeyGestureEventHandler {
        /**
         * Called when a key gesture event starts, is completed, or is cancelled. If a handler
         * returns {@code true}, it implies that the handler intends to handle the key gesture and
         * only this handler will receive the future events for this key gesture.
         *
         * @param event the gesture event
         */
        boolean handleKeyGestureEvent(@NonNull KeyGestureEvent event,
                @Nullable IBinder focusedToken);

        /**
         * Called to identify if a particular gesture is of interest to a handler.
         *
         * NOTE: If no active handler supports certain gestures, the gestures will not be captured.
         */
        boolean isKeyGestureSupported(@KeyGestureEvent.KeyGestureType int gestureType);
    }
}
Loading