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

Commit ca06f854 authored by [B's avatar [B Committed by Ameer Armaly
Browse files

Fix the consistency of the event stream during interrupted and continued touch exploration.

aosp/2677516 fixed the event stream when we initiate a new touch exploration which avoids a crash, but this change along with the accompanying test insures that the event stream is sane in the moment rather than waiting for the next ACTION_DOWN to fix it.
Bug:286037469
Bug: 290719741
Test: atest TouchExplorerTest
Test: atest  TouchInteractionControllerTest
Test: atest TouchInteractionControllerTest#testInterruptedSwipe_generatesConsistentEventStream --rerun-until-failure 100

Change-Id: I909e150ae7652842ada5f329f25222e9093a3e6d
parent 7d4aef3a
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -637,7 +637,7 @@ public class TouchExplorer extends BaseEventStreamTransformation
            MotionEvent event, MotionEvent rawEvent, int policyFlags) {
        switch (event.getActionMasked()) {
            case ACTION_DOWN:
                // We should have already received ACTION_DOWN. Ignore.
                handleActionDownStateTouchExploring(event, rawEvent, policyFlags);
                break;
            case ACTION_POINTER_DOWN:
                handleActionPointerDown(event, rawEvent, policyFlags);
@@ -843,6 +843,15 @@ public class TouchExplorer extends BaseEventStreamTransformation
        }
    }

    private void handleActionDownStateTouchExploring(
            MotionEvent event, MotionEvent rawEvent, int policyFlags) {
        // This is an interrupted and continued touch exploration. Maintain the consistency of the
        // event stream.
        mSendTouchExplorationEndDelayed.cancel();
        mSendTouchInteractionEndDelayed.cancel();
        sendTouchExplorationGestureStartAndHoverEnterIfNeeded(policyFlags);
    }

    /**
     * Handles move events while touch exploring. this is also where we drag or delegate based on
     * the number of fingers moving on the screen.
@@ -1100,12 +1109,15 @@ public class TouchExplorer extends BaseEventStreamTransformation
    }

    /**
     * Sends the enter events if needed. Such events are hover enter and touch explore
     * gesture start.
     * Sends the enter events if needed. Such events are hover enter and touch explore gesture
     * start.
     *
     * @param policyFlags The policy flags associated with the event.
     */
    private void sendTouchExplorationGestureStartAndHoverEnterIfNeeded(int policyFlags) {
        if (!mState.isTouchExploring()) {
            mDispatcher.sendAccessibilityEvent(TYPE_TOUCH_EXPLORATION_GESTURE_START);
        }
        MotionEvent event = mState.getLastInjectedHoverEvent();
        if (event != null && event.getActionMasked() == ACTION_HOVER_EXIT) {
            final int pointerIdBits = event.getPointerIdBits();
@@ -1118,7 +1130,6 @@ public class TouchExplorer extends BaseEventStreamTransformation
        }
    }


    /**
     * Determines whether a two pointer gesture is a dragging one.
     *