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

Commit a558ed68 authored by Ameer Armaly's avatar Ameer Armaly
Browse files

Add TouchInteractionController API to allow gesture detection from the service.

Bug: 159651900
Test: atest TouchExplorationControllerTest
Change-Id: Ie28dccb0ed29e632bcdb057e909093fa5b7065ac
parent 411e8fa8
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -2994,6 +2994,7 @@ package android.accessibilityservice {
  }
  public final class AccessibilityGestureEvent implements android.os.Parcelable {
    ctor public AccessibilityGestureEvent(int, int, @NonNull java.util.List<android.view.MotionEvent>);
    method public int describeContents();
    method @NonNull public static String gestureIdToString(int);
    method public int getDisplayId();
@@ -3016,6 +3017,7 @@ package android.accessibilityservice {
    method public final android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
    method @NonNull public final android.accessibilityservice.AccessibilityService.SoftKeyboardController getSoftKeyboardController();
    method @NonNull public final java.util.List<android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction> getSystemActions();
    method @NonNull public final android.accessibilityservice.TouchInteractionController getTouchInteractionController(int);
    method public java.util.List<android.view.accessibility.AccessibilityWindowInfo> getWindows();
    method @NonNull public final android.util.SparseArray<java.util.List<android.view.accessibility.AccessibilityWindowInfo>> getWindowsOnAllDisplays();
    method public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
@@ -3250,6 +3252,31 @@ package android.accessibilityservice {
    method public boolean willContinue();
  }
  public final class TouchInteractionController {
    method public void addListener(@Nullable java.util.concurrent.Executor, @NonNull android.accessibilityservice.TouchInteractionController.Listener);
    method public int getDisplayId();
    method public int getMaxPointerCount();
    method public int getState();
    method public void performClick();
    method public void performLongClickAndStartDrag();
    method public void removeAllListeners();
    method public boolean removeListener(@NonNull android.accessibilityservice.TouchInteractionController.Listener);
    method public void requestDelegating();
    method public void requestDragging(int);
    method public void requestTouchExploration();
    method @NonNull public static String stateToString(int);
    field public static final int STATE_CLEAR = 0; // 0x0
    field public static final int STATE_DELEGATING = 4; // 0x4
    field public static final int STATE_DRAGGING = 3; // 0x3
    field public static final int STATE_TOUCH_EXPLORING = 2; // 0x2
    field public static final int STATE_TOUCH_INTERACTING = 1; // 0x1
  }
  public static interface TouchInteractionController.Listener {
    method public void onMotionEvent(@NonNull android.view.MotionEvent);
    method public void onStateChanged(int);
  }
}
package android.accounts {
+6 −1
Original line number Diff line number Diff line
@@ -150,7 +150,12 @@ public final class AccessibilityGestureEvent implements Parcelable {
    private final int mDisplayId;
    private List<MotionEvent> mMotionEvents = new ArrayList<>();

    /** @hide */
/**
 * Constructs an AccessibilityGestureEvent to be dispatched to an accessibility service.
 * @param gestureId the id number of the gesture.
 * @param displayId the display on which this gesture was performed.
 * @param motionEvents the motion events that lead to this gesture.
 */
    public AccessibilityGestureEvent(
            int gestureId, int displayId, @NonNull List<MotionEvent> motionEvents) {
        mGestureId = gestureId;
+85 −1
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import android.util.Slog;
import android.util.SparseArray;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.view.WindowManagerImpl;
@@ -65,6 +66,7 @@ import android.view.accessibility.AccessibilityWindowInfo;
import com.android.internal.os.HandlerCaller;
import com.android.internal.os.SomeArgs;
import com.android.internal.util.Preconditions;
import com.android.internal.util.function.pooled.PooledLambda;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -582,6 +584,10 @@ public abstract class AccessibilityService extends Service {
        /** Magnification changed callbacks for different displays */
        void onMagnificationChanged(int displayId, @NonNull Region region,
                float scale, float centerX, float centerY);
        /** Callbacks for receiving motion events. */
        void onMotionEvent(MotionEvent event);
        /** Callback for tuch state changes. */
        void onTouchStateChanged(int displayId, int state);
        void onSoftKeyboardShowModeChanged(int showMode);
        void onPerformGestureResult(int sequence, boolean completedSuccessfully);
        void onFingerprintCapturingGesturesChanged(boolean active);
@@ -720,6 +726,12 @@ public abstract class AccessibilityService extends Service {
    /** List of magnification controllers, mapping from displayId -> MagnificationController. */
    private final SparseArray<MagnificationController> mMagnificationControllers =
            new SparseArray<>(0);
    /**
     * List of touch interaction controllers, mapping from displayId -> TouchInteractionController.
     */
    private final SparseArray<TouchInteractionController> mTouchInteractionControllers =
            new SparseArray<>(0);

    private SoftKeyboardController mSoftKeyboardController;
    private final SparseArray<AccessibilityButtonController> mAccessibilityButtonControllers =
            new SparseArray<>(0);
@@ -1194,6 +1206,10 @@ public abstract class AccessibilityService extends Service {
        getFingerprintGestureController().onGesture(gesture);
    }

    int getConnectionId() {
        return mConnectionId;
    }

    /**
     * Used to control and query the state of display magnification.
     */
@@ -2209,6 +2225,16 @@ public abstract class AccessibilityService extends Service {
                        centerX, centerY);
            }

            @Override
            public void onMotionEvent(MotionEvent event) {
                AccessibilityService.this.onMotionEvent(event);
            }

            @Override
            public void onTouchStateChanged(int displayId, int state) {
                AccessibilityService.this.onTouchStateChanged(displayId, state);
            }

            @Override
            public void onSoftKeyboardShowModeChanged(int showMode) {
                AccessibilityService.this.onSoftKeyboardShowModeChanged(showMode);
@@ -2371,6 +2397,21 @@ public abstract class AccessibilityService extends Service {
            mCaller.sendMessage(mCaller.obtainMessage(DO_ON_SYSTEM_ACTIONS_CHANGED));
        }

        @Override
        public void onMotionEvent(MotionEvent event) {
            final Message message = PooledLambda.obtainMessage(
                            Callbacks::onMotionEvent, mCallback, event);
            mCaller.sendMessage(message);
        }

        @Override
        public void onTouchStateChanged(int displayId, int state) {
            final Message message = PooledLambda.obtainMessage(Callbacks::onTouchStateChanged,
                    mCallback,
                    displayId, state);
            mCaller.sendMessage(message);
        }

        @Override
        public void executeMessage(Message message) {
            switch (message.what) {
@@ -2748,4 +2789,47 @@ public abstract class AccessibilityService extends Service {
            }
        }
    }

    /**
     * Returns the touch interaction controller for the specified logical display, which may be used
     * to detect gestures and otherwise control touch interactions. If
     * {@link AccessibilityServiceInfo#FLAG_REQUEST_TOUCH_EXPLORATION_MODE} is disabled the
     * controller's methods will have no effect.
     *
     * @param displayId The logical display id, use {@link Display#DEFAULT_DISPLAY} for default
     *                      display.
     * @return the TouchExploration controller
     */
    @NonNull
    public final TouchInteractionController getTouchInteractionController(int displayId) {
        synchronized (mLock) {
            TouchInteractionController controller = mTouchInteractionControllers.get(displayId);
            if (controller == null) {
                controller = new TouchInteractionController(this, mLock, displayId);
                mTouchInteractionControllers.put(displayId, controller);
            }
            return controller;
        }
    }

    void onMotionEvent(MotionEvent event) {
        TouchInteractionController controller;
        synchronized (mLock) {
            int displayId = event.getDisplayId();
            controller = mTouchInteractionControllers.get(displayId);
        }
        if (controller != null) {
            controller.onMotionEvent(event);
        }
    }

    void onTouchStateChanged(int displayId, int state) {
        TouchInteractionController controller;
        synchronized (mLock) {
            controller = mTouchInteractionControllers.get(displayId);
        }
        if (controller != null) {
            controller.onStateChanged(state);
        }
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityWindowInfo;
import android.accessibilityservice.AccessibilityGestureEvent;
import android.view.KeyEvent;
import android.view.MotionEvent;

/**
 * Top-level interface to an accessibility service component.
@@ -44,6 +45,10 @@ import android.view.KeyEvent;

    void onMagnificationChanged(int displayId, in Region region, float scale, float centerX, float centerY);

    void onMotionEvent(in MotionEvent event);

    void onTouchStateChanged(int displayId, int state);

    void onSoftKeyboardShowModeChanged(int showMode);

    void onPerformGestureResult(int sequence, boolean completedSuccessfully);
+12 −0
Original line number Diff line number Diff line
@@ -122,4 +122,16 @@ interface IAccessibilityServiceConnection {

    oneway void logTrace(long timestamp, String where, long loggingTypes, String callingParams,
        int processId, long threadId, int callingUid, in Bundle serializedCallingStackInBundle);

    void setServiceDetectsGesturesEnabled(int displayId, boolean mode);

    void requestTouchExploration(int displayId);

    void requestDragging(int displayId, int pointerId);

    void requestDelegating(int displayId);

    void onDoubleTap(int displayId);

    void onDoubleTapAndHold(int displayId);
}
Loading