Fix individual pointer id up/down reporting.

Fix a minor threading bug in InputManager dump.

Change-Id: Ic2eecf7df5a8dc9f40561fcb03ebe58a2c073778
diff --git a/libs/ui/InputReader.cpp b/libs/ui/InputReader.cpp
index cd4654a..403afe7 100644
--- a/libs/ui/InputReader.cpp
+++ b/libs/ui/InputReader.cpp
@@ -766,7 +766,7 @@
         // The dispatcher takes care of batching moves so we don't have to deal with that here.
         int32_t motionEventAction = AMOTION_EVENT_ACTION_MOVE;
         dispatchTouch(when, device, policyFlags, & device->touchScreen.currentTouch,
-                currentIdBits, motionEventAction);
+                currentIdBits, -1, motionEventAction);
     } else {
         // There may be pointers going up and pointers going down at the same time when pointer
         // ids are reported by the device driver.
@@ -784,12 +784,11 @@
             if (activeIdBits.isEmpty()) {
                 motionEventAction = AMOTION_EVENT_ACTION_UP;
             } else {
-                motionEventAction = AMOTION_EVENT_ACTION_POINTER_UP
-                        | (upId << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT);
+                motionEventAction = AMOTION_EVENT_ACTION_POINTER_UP;
             }
 
             dispatchTouch(when, device, policyFlags, & device->touchScreen.lastTouch,
-                    oldActiveIdBits, motionEventAction);
+                    oldActiveIdBits, upId, motionEventAction);
         }
 
         while (! downIdBits.isEmpty()) {
@@ -803,18 +802,17 @@
                 motionEventAction = AMOTION_EVENT_ACTION_DOWN;
                 device->touchScreen.downTime = when;
             } else {
-                motionEventAction = AMOTION_EVENT_ACTION_POINTER_DOWN
-                        | (downId << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT);
+                motionEventAction = AMOTION_EVENT_ACTION_POINTER_DOWN;
             }
 
             dispatchTouch(when, device, policyFlags, & device->touchScreen.currentTouch,
-                    activeIdBits, motionEventAction);
+                    activeIdBits, downId, motionEventAction);
         }
     }
 }
 
 void InputReader::dispatchTouch(nsecs_t when, InputDevice* device, uint32_t policyFlags,
-        InputDevice::TouchData* touch, BitSet32 idBits,
+        InputDevice::TouchData* touch, BitSet32 idBits, uint32_t changedId,
         int32_t motionEventAction) {
     int32_t orientedWidth, orientedHeight;
     switch (mDisplayOrientation) {
@@ -904,12 +902,15 @@
         pointerCoords[pointerCount].toolMinor = toolMinor;
         pointerCoords[pointerCount].orientation = orientation;
 
+        if (id == changedId) {
+            motionEventAction |= pointerCount << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+        }
+
         pointerCount += 1;
     }
 
     // Check edge flags by looking only at the first pointer since the flags are
     // global to the event.
-    // XXX Maybe we should revise the edge flags API to work on a per-pointer basis.
     int32_t motionEventEdgeFlags = 0;
     if (motionEventAction == AMOTION_EVENT_ACTION_DOWN) {
         if (pointerCoords[0].x <= 0) {