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

Commit 927b5744 authored by Ameer Armaly's avatar Ameer Armaly Committed by Android (Google) Code Review
Browse files

Merge "Add TouchInteractionController API to allow gesture detection from the service."

parents 8d53f84f a558ed68
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