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

Commit 9f4b83d2 authored by RyanlwLin's avatar RyanlwLin Committed by Ryan Lin
Browse files

make MotionEventInjector support multi-display

Although we have MotionEventInjector for each display but it always
inject events to default display. We set display id of the motion events
to make it correct.

Test: atest MotionEventInjectorTest
Test: atest AccessibilityGestureDetectorTest
Test: atest AccessibilityServiceConnectionTest
Bug: 138422679
Change-Id: I8cfbe9887109e001ea64ca0c250606684be370e7
parent 74fc2c8d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -361,7 +361,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
                        mSystemSupport.getMotionEventInjectorForDisplayLocked(displayId);
                if (motionEventInjector != null && isTouchableDisplay) {
                    motionEventInjector.injectEvents(
                            gestureSteps.getList(), mServiceInterface, sequence);
                            gestureSteps.getList(), mServiceInterface, sequence, displayId);
                } else {
                    try {
                        mServiceInterface.onPerformGestureResult(sequence, false);
+5 −3
Original line number Diff line number Diff line
@@ -101,11 +101,12 @@ public class MotionEventInjector extends BaseEventStreamTransformation implement
     * either complete or cancelled.
     */
    public void injectEvents(List<GestureStep> gestureSteps,
            IAccessibilityServiceClient serviceInterface, int sequence) {
            IAccessibilityServiceClient serviceInterface, int sequence, int displayId) {
        SomeArgs args = SomeArgs.obtain();
        args.arg1 = gestureSteps;
        args.arg2 = serviceInterface;
        args.argi1 = sequence;
        args.argi2 = displayId;
        mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_INJECT_EVENTS, args));
    }

@@ -146,7 +147,7 @@ public class MotionEventInjector extends BaseEventStreamTransformation implement
        if (message.what == MESSAGE_INJECT_EVENTS) {
            SomeArgs args = (SomeArgs) message.obj;
            injectEventsMainThread((List<GestureStep>) args.arg1,
                    (IAccessibilityServiceClient) args.arg2, args.argi1);
                    (IAccessibilityServiceClient) args.arg2, args.argi1, args.argi2);
            args.recycle();
            return true;
        }
@@ -165,7 +166,7 @@ public class MotionEventInjector extends BaseEventStreamTransformation implement
    }

    private void injectEventsMainThread(List<GestureStep> gestureSteps,
            IAccessibilityServiceClient serviceInterface, int sequence) {
            IAccessibilityServiceClient serviceInterface, int sequence, int displayId) {
        if (mIsDestroyed) {
            try {
                serviceInterface.onPerformGestureResult(sequence, false);
@@ -209,6 +210,7 @@ public class MotionEventInjector extends BaseEventStreamTransformation implement

        for (int i = 0; i < events.size(); i++) {
            MotionEvent event = events.get(i);
            event.setDisplayId(displayId);
            int isEndOfSequence = (i == events.size() - 1) ? 1 : 0;
            Message message = mHandler.obtainMessage(
                    MESSAGE_SEND_MOTION_EVENT, isEndOfSequence, 0, event);
+4 −2
Original line number Diff line number Diff line
@@ -192,7 +192,8 @@ public class AccessibilityServiceConnectionTest {
        when(parceledListSlice.getList()).thenReturn(gestureSteps);
        mConnection.dispatchGesture(0, parceledListSlice, Display.DEFAULT_DISPLAY);

        verify(mMockMotionEventInjector).injectEvents(gestureSteps, mMockServiceClient, 0);
        verify(mMockMotionEventInjector).injectEvents(gestureSteps, mMockServiceClient, 0,
                Display.DEFAULT_DISPLAY);
    }

    @Test
@@ -209,7 +210,8 @@ public class AccessibilityServiceConnectionTest {
        when(parceledListSlice.getList()).thenReturn(gestureSteps);
        mConnection.dispatchGesture(0, parceledListSlice, Display.DEFAULT_DISPLAY);

        verify(mMockMotionEventInjector, never()).injectEvents(gestureSteps, mMockServiceClient, 0);
        verify(mMockMotionEventInjector, never()).injectEvents(gestureSteps, mMockServiceClient, 0,
                Display.DEFAULT_DISPLAY);
        verify(mMockServiceClient).onPerformGestureResult(0, false);
    }

+3 −1
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
import android.view.Display;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
@@ -709,7 +710,8 @@ public class MotionEventInjectorTest {

    private void injectEventsSync(List<GestureStep> gestureSteps,
            IAccessibilityServiceClient serviceInterface, int sequence) {
        mMotionEventInjector.injectEvents(gestureSteps, serviceInterface, sequence);
        mMotionEventInjector.injectEvents(gestureSteps, serviceInterface, sequence,
                Display.DEFAULT_DISPLAY);
        // Dispatch the message sent by the injector. Our simple handler doesn't guarantee stuff
        // happens in order.
        mMessageCapturingHandler.sendLastMessage();