am fb8116f7: am c891d2b3: Merge "Fix PointerLocationView when pointer ids are not zero-based." into gingerbread

Merge commit 'fb8116f736f2df6d1b2f8044541390a9fd9953cb'

* commit 'fb8116f736f2df6d1b2f8044541390a9fd9953cb':
  Fix PointerLocationView when pointer ids are not zero-based.
diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java
index 939f118..12cf853 100644
--- a/core/java/com/android/internal/widget/PointerLocationView.java
+++ b/core/java/com/android/internal/widget/PointerLocationView.java
@@ -84,6 +84,7 @@
     private boolean mCurDown;
     private int mCurNumPointers;
     private int mMaxNumPointers;
+    private int mActivePointerId;
     private final ArrayList<PointerState> mPointers = new ArrayList<PointerState>();
     
     private final VelocityTracker mVelocity;
@@ -123,6 +124,7 @@
         
         PointerState ps = new PointerState();
         mPointers.add(ps);
+        mActivePointerId = 0;
         
         mVelocity = VelocityTracker.obtain();
         
@@ -183,14 +185,15 @@
             final int NP = mPointers.size();
             
             // Labels
-            if (NP > 0) {
-                final PointerState ps = mPointers.get(0);
+            if (mActivePointerId >= 0) {
+                final PointerState ps = mPointers.get(mActivePointerId);
+                
                 canvas.drawRect(0, 0, itemW-1, bottom,mTextBackgroundPaint);
                 canvas.drawText(mText.clear()
                         .append("P: ").append(mCurNumPointers)
                         .append(" / ").append(mMaxNumPointers)
                         .toString(), 1, base, mTextPaint);
-                
+
                 final int N = ps.mTraceCount;
                 if ((mCurDown && ps.mCurDown) || N == 0) {
                     canvas.drawRect(itemW, 0, (itemW * 2) - 1, bottom, mTextBackgroundPaint);
@@ -355,6 +358,11 @@
                     NP++;
                 }
                 
+                if (mActivePointerId < 0 ||
+                        ! mPointers.get(mActivePointerId).mCurDown) {
+                    mActivePointerId = id;
+                }
+                
                 final PointerState ps = mPointers.get(id);
                 ps.mCurDown = true;
                 if (mPrintCoords) {
@@ -396,6 +404,7 @@
             }
             
             if (action == MotionEvent.ACTION_UP
+                    || action == MotionEvent.ACTION_CANCEL
                     || (action & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_UP) {
                 final int index = (action & MotionEvent.ACTION_POINTER_INDEX_MASK)
                         >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; // will be 0 for UP
@@ -407,10 +416,14 @@
                     Log.i(TAG, mText.clear().append("Pointer ")
                             .append(id + 1).append(": UP").toString());
                 }
-
-                if (action == MotionEvent.ACTION_UP) {
+                
+                if (action == MotionEvent.ACTION_UP
+                        || action == MotionEvent.ACTION_CANCEL) {
                     mCurDown = false;
                 } else {
+                    if (mActivePointerId == id) {
+                        mActivePointerId = event.getPointerId(index == 0 ? 1 : 0);
+                    }
                     ps.addTrace(Float.NaN, Float.NaN);
                 }
             }
@@ -438,9 +451,9 @@
     
     // HACK
     // A quick and dirty string builder implementation optimized for GC.
-    // Using the basic StringBuilder implementation causes the application grind to a halt when
-    // more than a couple of pointers are down due to the number of temporary objects allocated
-    // while formatting strings for drawing or logging.
+    // Using String.format causes the application grind to a halt when
+    // more than a couple of pointers are down due to the number of
+    // temporary objects allocated while formatting strings for drawing or logging.
     private static final class FasterStringBuilder {
         private char[] mChars;
         private int mLength;