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

Commit f72a7197 authored by Siarhei Vishniakou's avatar Siarhei Vishniakou
Browse files

Sync input transactions after ACTION_UP

Changes to windows can happen before or after a touch gesture. For
example, a window can be dismissed after ACTION_UP occurs. For those
scenarios, sync input transactions after the ACTION_UP event has been
injected.

Bug: 134414988
Test: atest MultiDisplayPolicyTests
Test: atest android.app.cts.DialogTest
Test: TaplTestsQuickstep
Test: atest ActivityLifecycleTopResumedStateTests
Merged-In: I810fad449ea405d104009075d2698109a620a91e
Change-Id: I810fad449ea405d104009075d2698109a620a91e
parent e41abff8
Loading
Loading
Loading
Loading
+17 −9
Original line number Diff line number Diff line
@@ -7626,22 +7626,30 @@ public class WindowManagerService extends IWindowManager.Stub

    @Override
    public boolean injectInputAfterTransactionsApplied(InputEvent ev, int mode) {
        boolean shouldWaitForAnimToComplete = false;
        boolean isDown;
        boolean isUp;

        if (ev instanceof KeyEvent) {
            KeyEvent keyEvent = (KeyEvent) ev;
            shouldWaitForAnimToComplete = keyEvent.getSource() == InputDevice.SOURCE_MOUSE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN;
        } else if (ev instanceof MotionEvent) {
            isDown = keyEvent.getAction() == KeyEvent.ACTION_DOWN;
            isUp = keyEvent.getAction() == KeyEvent.ACTION_UP;
        } else {
            MotionEvent motionEvent = (MotionEvent) ev;
            shouldWaitForAnimToComplete = motionEvent.getSource() == InputDevice.SOURCE_MOUSE
                    || motionEvent.getAction() == MotionEvent.ACTION_DOWN;
            isDown = motionEvent.getAction() == MotionEvent.ACTION_DOWN;
            isUp = motionEvent.getAction() == MotionEvent.ACTION_UP;
        }

        if (shouldWaitForAnimToComplete) {
        // For ACTION_DOWN, syncInputTransactions before injecting input.
        // For ACTION_UP, sync after injecting.
        if (isDown) {
            syncInputTransactions();
        }

        return LocalServices.getService(InputManagerInternal.class).injectInputEvent(ev, mode);
        final boolean result =
                LocalServices.getService(InputManagerInternal.class).injectInputEvent(ev, mode);
        if (isUp) {
            syncInputTransactions();
        }
        return result;
    }

    @Override