From f924ff4f3792c014f2218135cbbb0c19a9539628 Mon Sep 17 00:00:00 2001 From: Ameer Armaly Date: Tue, 18 Apr 2023 20:45:37 +0000 Subject: [PATCH] Fix incorrect logic in touch explorer state transitions. We should be able to transition from dragging to delegating states, but as it was the logic did not allow that. Fix: 243354181 Test: Manual. Start to Perform a two-finger scroll but end up doing something else e.g. pinch. Logs should show a state transition from dragging to delegating. Change-Id: Id47c63a9bc8bcfd87d0535d35e6d48cc7e8c9307 --- .../accessibility/gestures/TouchExplorer.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java index 9a257e54cf41b..777c7c8e0da90 100644 --- a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java +++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java @@ -1417,20 +1417,29 @@ public class TouchExplorer extends BaseEventStreamTransformation mSendTouchExplorationEndDelayed.forceSendAndRemove(); } } - if (!mState.isTouchInteracting()) { + if (!mState.isTouchInteracting() && !mState.isDragging()) { // It makes no sense to delegate. - Slog.e(LOG_TAG, "Error: Trying to delegate from " - + mState.getStateSymbolicName(mState.getState())); + Slog.e( + LOG_TAG, + "Error: Trying to delegate from " + + mState.getStateSymbolicName(mState.getState())); return; } - mState.startDelegating(); - MotionEvent prototype = mState.getLastReceivedEvent(); - if (prototype == null) { + MotionEvent event = mState.getLastReceivedEvent(); + MotionEvent rawEvent = mState.getLastReceivedRawEvent(); + if (event == null || rawEvent == null) { Slog.d(LOG_TAG, "Unable to start delegating: unable to get last received event."); return; } int policyFlags = mState.getLastReceivedPolicyFlags(); - mDispatcher.sendDownForAllNotInjectedPointers(prototype, policyFlags); + if (mState.isDragging()) { + // Send an event to the end of the drag gesture. + mDispatcher.sendMotionEvent( + event, ACTION_UP, rawEvent, ALL_POINTER_ID_BITS, policyFlags); + } + mState.startDelegating(); + // Deliver all pointers to the view hierarchy. + mDispatcher.sendDownForAllNotInjectedPointers(event, policyFlags); } }