Skip to content

Commit d8a3663

Browse files
committed
Fixes an issue that occured unexpected exception "pointerIndex out of range".
The findNewActiveIndex method may return -1. So, the code should check case of -1 before event.getPointerId and if index0 is -1, gesture should be ended immediately. Change-Id: I4aae5c84e3db61d10b0bfcfa7bfa6b9115231a52
1 parent 67cf093 commit d8a3663

File tree

1 file changed

+29
-9
lines changed

1 file changed

+29
-9
lines changed

core/java/android/view/ScaleGestureDetector.java

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,10 @@ public boolean onTouchEvent(MotionEvent event) {
220220
mActiveId1 = event.getPointerId(index1);
221221
if (index0 < 0 || index0 == index1) {
222222
// Probably someone sending us a broken event stream.
223-
index0 = findNewActiveIndex(event, index0 == index1 ? -1 : mActiveId1, index0);
224-
mActiveId0 = event.getPointerId(index0);
223+
boolean valid = handleBrokenEventStream(event);
224+
if (!valid) {
225+
return false;
226+
}
225227
}
226228
mActive0MostRecent = false;
227229

@@ -377,13 +379,10 @@ public boolean onTouchEvent(MotionEvent event) {
377379
int index0 = event.findPointerIndex(mActiveId0);
378380
if (index0 < 0 || mActiveId0 == mActiveId1) {
379381
// Probably someone sending us a broken event stream.
380-
Log.e(TAG, "Got " + MotionEvent.actionToString(action) +
381-
" with bad state while a gesture was in progress. " +
382-
"Did you forget to pass an event to " +
383-
"ScaleGestureDetector#onTouchEvent?");
384-
index0 = findNewActiveIndex(event,
385-
mActiveId0 == mActiveId1 ? -1 : mActiveId1, index0);
386-
mActiveId0 = event.getPointerId(index0);
382+
boolean valid = handleBrokenEventStream(event);
383+
if (!valid) {
384+
return false;
385+
}
387386
}
388387

389388
setContext(event);
@@ -483,6 +482,27 @@ public boolean onTouchEvent(MotionEvent event) {
483482
return handled;
484483
}
485484

485+
private boolean handleBrokenEventStream(MotionEvent event) {
486+
Log.e(TAG, "Got " + MotionEvent.actionToString(event.getActionMasked()) +
487+
" with bad state while a gesture was in progress. " +
488+
"Did you forget to pass an event to " +
489+
"ScaleGestureDetector#onTouchEvent?");
490+
int index0 = findNewActiveIndex(event,
491+
mActiveId0 == mActiveId1 ? -1 : mActiveId1,
492+
event.findPointerIndex(mActiveId0));
493+
if (index0 >= 0) {
494+
mActiveId0 = event.getPointerId(index0);
495+
return true;
496+
} else {
497+
mInvalidGesture = true;
498+
Log.e(TAG, "Invalid MotionEvent stream detected.", new Throwable());
499+
if (mGestureInProgress) {
500+
mListener.onScaleEnd(this);
501+
}
502+
return false;
503+
}
504+
}
505+
486506
private int findNewActiveIndex(MotionEvent ev, int otherActiveId, int oldIndex) {
487507
final int pointerCount = ev.getPointerCount();
488508

0 commit comments

Comments
 (0)