Ensure MotionEvent.split() won't be given an invalid value.
b/27496784
Change-Id: I28bb4ac5bb8a705e7af9b22b2b56cd4061aa06a0
diff --git a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
index 3cc991c..ecba245 100644
--- a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
@@ -648,7 +648,16 @@
* @param policyFlags The policy flags associated with the event.
*/
private void handleMotionEventStateDragging(MotionEvent event, int policyFlags) {
- final int pointerIdBits = (1 << mDraggingPointerId);
+ int pointerIdBits = 0;
+ // Clear the dragging pointer id if it's no longer valid.
+ if (event.findPointerIndex(mDraggingPointerId) == -1) {
+ Slog.e(LOG_TAG, "mDraggingPointerId doesn't match any pointers on current event. " +
+ "mDraggingPointerId: " + Integer.toString(mDraggingPointerId) +
+ ", Event: " + event);
+ mDraggingPointerId = INVALID_POINTER_ID;
+ } else {
+ pointerIdBits = (1 << mDraggingPointerId);
+ }
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
throw new IllegalStateException("Dragging state can be reached only if two "
@@ -664,6 +673,9 @@
sendDownForAllNotInjectedPointers(event, policyFlags);
} break;
case MotionEvent.ACTION_MOVE: {
+ if (mDraggingPointerId == INVALID_POINTER_ID) {
+ break;
+ }
switch (event.getPointerCount()) {
case 1: {
// do nothing