Fix individual pointer id up/down reporting.

Fix a minor threading bug in InputManager dump.

Change-Id: Ic2eecf7df5a8dc9f40561fcb03ebe58a2c073778
diff --git a/include/ui/InputReader.h b/include/ui/InputReader.h
index 85a0084..14bea65 100644
--- a/include/ui/InputReader.h
+++ b/include/ui/InputReader.h
@@ -286,7 +286,8 @@
             int32_t keyEventAction, int32_t keyEventFlags);
     void dispatchTouches(nsecs_t when, InputDevice* device, uint32_t policyFlags);
     void dispatchTouch(nsecs_t when, InputDevice* device, uint32_t policyFlags,
-            InputDevice::TouchData* touch, BitSet32 idBits, int32_t motionEventAction);
+            InputDevice::TouchData* touch, BitSet32 idBits, uint32_t changedId,
+            int32_t motionEventAction);
 
     // display
     void resetDisplayProperties();
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) {
diff --git a/services/jni/com_android_server_InputManager.cpp b/services/jni/com_android_server_InputManager.cpp
index f19f1ec..0992b33 100644
--- a/services/jni/com_android_server_InputManager.cpp
+++ b/services/jni/com_android_server_InputManager.cpp
@@ -410,7 +410,11 @@
 String8 NativeInputManager::dump() {
     String8 dump;
     dump.append("Native Input Dispatcher State:\n");
-    dumpDispatchStateLd(dump);
+
+    { // acquire lock
+        AutoMutex _l(mDisplayLock);
+        dumpDispatchStateLd(dump);
+    } // release lock
     return dump;
 }
 
@@ -984,8 +988,8 @@
 
         mTempTouchedWallpaperChannels.clear();
 
-        if (hadFocusedWindow && ! mFocusedWindow
-                || mFocusedWindow && ! mFocusedWindow->visible) {
+        if ((hadFocusedWindow && ! mFocusedWindow)
+                || (mFocusedWindow && ! mFocusedWindow->visible)) {
             preemptInputDispatch();
         }