am ad542efb: Merge "Fix bug 3506292 - Add guards against bad event streams to ScaleGestureDetector" into honeycomb-mr1

* commit 'ad542efb8aa241d3e576d9567f5b0979355037b3':
  Fix bug 3506292 - Add guards against bad event streams to ScaleGestureDetector
This commit is contained in:
Adam Powell
2011-03-07 18:10:13 -08:00
committed by Android Git Automerger

View File

@@ -19,6 +19,7 @@ package android.view;
import android.content.Context;
import android.util.DisplayMetrics;
import android.util.FloatMath;
import android.util.Log;
/**
* Detects transformation gestures involving more than one pointer ("multitouch")
@@ -36,6 +37,8 @@ import android.util.FloatMath;
* </ul>
*/
public class ScaleGestureDetector {
private static final String TAG = "ScaleGestureDetector";
/**
* The listener for receiving notifications when gestures occur.
* If you want to listen for all the different gestures then implement
@@ -170,6 +173,10 @@ public class ScaleGestureDetector {
final int action = event.getActionMasked();
boolean handled = true;
if (action == MotionEvent.ACTION_DOWN) {
reset(); // Start fresh
}
if (!mGestureInProgress) {
switch (action) {
case MotionEvent.ACTION_DOWN: {
@@ -197,6 +204,11 @@ public class ScaleGestureDetector {
int index1 = event.getActionIndex();
int index0 = event.findPointerIndex(mActiveId0);
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);
}
mActive0MostRecent = false;
setContext(event);
@@ -315,6 +327,7 @@ public class ScaleGestureDetector {
final int index = event.findPointerIndex(actionId == mActiveId0 ?
mActiveId1 : mActiveId0);
mActiveId0 = event.getPointerId(index);
mActive0MostRecent = true;
mActiveId1 = -1;
mFocusX = event.getX(index);
@@ -338,6 +351,18 @@ public class ScaleGestureDetector {
mActiveId1 = event.getPointerId(event.getActionIndex());
mActive0MostRecent = false;
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);
}
setContext(event);
mGestureInProgress = mListener.onScaleBegin(this);