Merge "Fixes an issue that occured unexpected exception "pointerIndex out of range"."

This commit is contained in:
Jean-Baptiste Queru
2012-05-01 06:42:11 -07:00
committed by android code review

View File

@@ -220,8 +220,10 @@ public class ScaleGestureDetector {
mActiveId1 = event.getPointerId(index1);
if (index0 < 0 || index0 == index1) {
// Probably someone sending us a broken event stream.
index0 = findNewActiveIndex(event, index0 == index1 ? -1 : mActiveId1, index0);
mActiveId0 = event.getPointerId(index0);
boolean valid = handleBrokenEventStream(event);
if (!valid) {
return false;
}
}
mActive0MostRecent = false;
@@ -377,13 +379,10 @@ public class ScaleGestureDetector {
int index0 = event.findPointerIndex(mActiveId0);
if (index0 < 0 || mActiveId0 == mActiveId1) {
// Probably someone sending us a broken event stream.
Log.e(TAG, "Got " + MotionEvent.actionToString(action) +
" with bad state while a gesture was in progress. " +
"Did you forget to pass an event to " +
"ScaleGestureDetector#onTouchEvent?");
index0 = findNewActiveIndex(event,
mActiveId0 == mActiveId1 ? -1 : mActiveId1, index0);
mActiveId0 = event.getPointerId(index0);
boolean valid = handleBrokenEventStream(event);
if (!valid) {
return false;
}
}
setContext(event);
@@ -483,6 +482,27 @@ public class ScaleGestureDetector {
return handled;
}
private boolean handleBrokenEventStream(MotionEvent event) {
Log.e(TAG, "Got " + MotionEvent.actionToString(event.getActionMasked()) +
" with bad state while a gesture was in progress. " +
"Did you forget to pass an event to " +
"ScaleGestureDetector#onTouchEvent?");
int index0 = findNewActiveIndex(event,
mActiveId0 == mActiveId1 ? -1 : mActiveId1,
event.findPointerIndex(mActiveId0));
if (index0 >= 0) {
mActiveId0 = event.getPointerId(index0);
return true;
} else {
mInvalidGesture = true;
Log.e(TAG, "Invalid MotionEvent stream detected.", new Throwable());
if (mGestureInProgress) {
mListener.onScaleEnd(this);
}
return false;
}
}
private int findNewActiveIndex(MotionEvent ev, int otherActiveId, int oldIndex) {
final int pointerCount = ev.getPointerCount();