diff options
author | 2020-11-18 19:34:04 +0000 | |
---|---|---|
committer | 2020-11-18 19:34:04 +0000 | |
commit | fd24f5cadbab9e6d9982458e41dd0f15977feae3 (patch) | |
tree | c404bbbdf6f19c9d1f7bb53166e76364bcd3447c | |
parent | a26bcb66cfd7b55ba4636f28d29803e35bb08bbd (diff) | |
parent | a9027a7f9f4d328e268ba1c99ca284d89724d520 (diff) |
[DO NOT MERGE] Transition to clear state after gesture cancelation. am: a9027a7f9f
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13036714
Change-Id: Idfc6d16c3048fdf1f49cbb3dc34ddef5cb6195b3
4 files changed, 19 insertions, 7 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 a860db389d1e..7f07c2878088 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 755c06aa4be8..b6126d741718 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; diff --git a/services/tests/servicestests/src/com/android/server/accessibility/gestures/GestureManifoldTest.java b/services/tests/servicestests/src/com/android/server/accessibility/gestures/GestureManifoldTest.java index 538e2d51e88f..0e787853f617 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/gestures/GestureManifoldTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/gestures/GestureManifoldTest.java @@ -26,6 +26,7 @@ import android.accessibilityservice.AccessibilityService; import android.content.Context; import android.graphics.Point; import android.graphics.PointF; +import android.os.Handler; import android.view.MotionEvent; import androidx.test.InstrumentationRegistry; @@ -56,7 +57,8 @@ public class GestureManifoldTest { // Construct a testable GestureManifold. mResultListener = mock(GestureManifold.Listener.class); mState = new TouchState(); - mManifold = new GestureManifold(context, mResultListener, mState); + Handler handler = new Handler(context.getMainLooper()); + mManifold = new GestureManifold(context, mResultListener, mState, handler); // Play the role of touch explorer in updating the shared state. when(mResultListener.onGestureStarted()).thenReturn(onGestureStarted()); |