summaryrefslogtreecommitdiff
path: root/services/accessibility
diff options
context:
space:
mode:
authorAmeer Armaly <aarmaly@google.com>2020-10-22 07:11:39 -0700
committerAmeer Armaly <aarmaly@google.com>2020-11-12 19:04:50 +0000
commita9027a7f9f4d328e268ba1c99ca284d89724d520 (patch)
tree83d9d89ae62f24f0ed06e7fc3ddbaed00860e890 /services/accessibility
parentb3485671015125eb7f6f88a46395ffd4bd4c37fa (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')
-rw-r--r--services/accessibility/java/com/android/server/accessibility/gestures/GestureManifold.java4
-rw-r--r--services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java14
-rw-r--r--services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java4
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;