diff options
author | Ameer Armaly <aarmaly@google.com> | 2020-10-22 07:11:39 -0700 |
---|---|---|
committer | Ameer Armaly <aarmaly@google.com> | 2020-11-12 19:04:50 +0000 |
commit | a9027a7f9f4d328e268ba1c99ca284d89724d520 (patch) | |
tree | 83d9d89ae62f24f0ed06e7fc3ddbaed00860e890 /services/accessibility | |
parent | b3485671015125eb7f6f88a46395ffd4bd4c37fa (diff) |
[DO NOT MERGE] Transition to clear state after gesture cancelation.
The agreed-upon behavior has always been that after gesture cancelation, touch explorer would exist in essentially a dead state.
It should not be possible to execute a two-finger passthrough gesture for example after doing an invalid gesture.
This is likely why we see GESTURE_PASSTHROUGH in cases where we expect GESTURE_UNKNOWN.
Fix: 171421786
Bug: 162521649
Test: manual
Change-Id: Idce921c5278dea174ec5dad5cecf046f12ab113d
Change-Id: Ic71246adc613ea60d3f25974e4085814c4b3211d
Diffstat (limited to 'services/accessibility')
3 files changed, 16 insertions, 6 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/GestureManifold.java b/services/accessibility/java/com/android/server/accessibility/gestures/GestureManifold.java index 8604fe7a7359..17e3a023ca3c 100644 --- a/services/accessibility/java/com/android/server/accessibility/gestures/GestureManifold.java +++ b/services/accessibility/java/com/android/server/accessibility/gestures/GestureManifold.java @@ -104,9 +104,9 @@ class GestureManifold implements GestureMatcher.StateChangeListener { // Shared state information. private TouchState mState; - GestureManifold(Context context, Listener listener, TouchState state) { + GestureManifold(Context context, Listener listener, TouchState state, Handler handler) { mContext = context; - mHandler = new Handler(context.getMainLooper()); + mHandler = handler; mListener = listener; mState = state; mMultiFingerGesturesEnabled = false; 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 71d2c2c5b8c5..c3d0e1a9d5a7 100644 --- a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java +++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java @@ -175,7 +175,7 @@ public class TouchExplorer extends BaseEventStreamTransformation AccessibilityEvent.TYPE_TOUCH_INTERACTION_END, mDetermineUserIntentTimeout); if (detector == null) { - mGestureDetector = new GestureManifold(context, this, mState); + mGestureDetector = new GestureManifold(context, this, mState, mHandler); } else { mGestureDetector = detector; } @@ -353,7 +353,6 @@ public class TouchExplorer extends BaseEventStreamTransformation public boolean onGestureStarted() { // We have to perform gesture detection, so // clear the current state and try to detect. - mState.startGestureDetecting(); mSendHoverEnterAndMoveDelayed.cancel(); mSendHoverExitDelayed.cancel(); mExitGestureDetectionModeDelayed.post(); @@ -1107,7 +1106,7 @@ public class TouchExplorer extends BaseEventStreamTransformation } private boolean shouldPerformGestureDetection(MotionEvent event) { - if (mState.isDelegating()) { + if (mState.isDelegating() || mState.isDragging()) { return false; } if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { @@ -1200,6 +1199,15 @@ public class TouchExplorer extends BaseEventStreamTransformation } public void run() { + if (mReceivedPointerTracker.getReceivedPointerDownCount() > 1) { + // Multi-finger touch exploration doesn't make sense. + Slog.e( + LOG_TAG, + "Attempted touch exploration with " + + mReceivedPointerTracker.getReceivedPointerDownCount() + + " pointers down."); + return; + } // Send an accessibility event to announce the touch exploration start. mDispatcher.sendAccessibilityEvent( AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START); diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java b/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java index 7a39bc29e8e5..6dabe76c7dc9 100644 --- a/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java +++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java @@ -208,7 +208,9 @@ public class TouchState { startGestureDetecting(); break; case AccessibilityEvent.TYPE_GESTURE_DETECTION_END: - startTouchInteracting(); + // Clear to make sure that we don't accidentally execute passthrough, and that we + // are ready for the next interaction. + clear(); break; default: break; |