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
This commit is contained in:
Ameer Armaly
2023-04-18 20:45:37 +00:00
parent 952b462cf9
commit f924ff4f37

View File

@@ -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);
}
}