Bug fix for wakeup sensors.

SensorService should hold a wakelock till the app reads events from a wakeup sensor. Currently drivers hold a wakelock with a
timeout while delivering events from a wake up sensor like Significant Motion. This hack can be removed now.
Bug: 9774884

Change-Id: I6cab0147c63f57a494a61f4dfe2a64a27dfe1b4e
diff --git a/core/jni/android_hardware_SensorManager.cpp b/core/jni/android_hardware_SensorManager.cpp
index 7a4728d..fcf8f83e 100644
--- a/core/jni/android_hardware_SensorManager.cpp
+++ b/core/jni/android_hardware_SensorManager.cpp
@@ -160,7 +160,6 @@
         ASensorEvent buffer[16];
         while ((n = q->read(buffer, 16)) > 0) {
             for (int i=0 ; i<n ; i++) {
-
                 if (buffer[i].type == SENSOR_TYPE_STEP_COUNTER) {
                     // step-counter returns a uint64, but the java API only deals with floats
                     float value = float(buffer[i].u64.step_counter);
@@ -183,17 +182,17 @@
                                         buffer[i].vector.status,
                                         buffer[i].timestamp);
                 }
-
                 if (env->ExceptionCheck()) {
+                    mSensorQueue->sendAck(buffer, n);
                     ALOGE("Exception dispatching input event.");
                     return 1;
                 }
             }
+            mSensorQueue->sendAck(buffer, n);
         }
         if (n<0 && n != -EAGAIN) {
             // FIXME: error receiving events, what to do in this case?
         }
-
         return 1;
     }
 };
diff --git a/native/android/sensor.cpp b/native/android/sensor.cpp
index fb4de9e..acfcd83 100644
--- a/native/android/sensor.cpp
+++ b/native/android/sensor.cpp
@@ -123,10 +123,13 @@
 ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue,
                 ASensorEvent* events, size_t count)
 {
-    return static_cast<SensorEventQueue*>(queue)->read(events, count);
+    ssize_t actual = static_cast<SensorEventQueue*>(queue)->read(events, count);
+    if (actual > 0) {
+        static_cast<SensorEventQueue*>(queue)->sendAck(events, actual);
+    }
+    return actual;
 }
 
-
 /*****************************************************************************/
 
 const char* ASensor_getName(ASensor const* sensor)