filter sensor event by connection

we now don't send events down to a connection that has not
registered for this event.

Change-Id: I3fe507974d3e99293749bfec2ef871e8a0ee9600
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index 82cdf3d..b79373d 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -40,7 +40,6 @@
 
 /*
  * TODO:
- * - filter events per connection
  * - make sure to keep the last value of each event type so we can quickly
  *   send something to application when they enable a sensor that is already
  *   active (the issue here is that it can take time before a value is
@@ -162,6 +161,7 @@
     LOGD("nuSensorService thread starting...");
 
     sensors_event_t buffer[16];
+    sensors_event_t scratch[16];
     struct sensors_poll_device_t* device = mSensorDevice;
     ssize_t count;
 
@@ -177,10 +177,11 @@
 
         size_t numConnections = activeConnections.size();
         if (numConnections) {
+            Mutex::Autolock _l(mLock);
             for (size_t i=0 ; i<numConnections ; i++) {
                 sp<SensorEventConnection> connection(activeConnections[i].promote());
                 if (connection != 0) {
-                    connection->sendEvents(buffer, count);
+                    connection->sendEvents(buffer, count, scratch);
                 }
             }
         }
@@ -425,12 +426,23 @@
 }
 
 status_t SensorService::SensorEventConnection::sendEvents(
-        sensors_event_t const* buffer, size_t count)
+        sensors_event_t const* buffer, size_t numEvents,
+        sensors_event_t* scratch)
 {
-    // TODO: we should only send the events for the sensors this connection
-    // is registered for.
+    // filter out events not for this connection
+    size_t count=0, i=0;
+    while (i<numEvents) {
+        const int32_t curr = buffer[i].sensor;
+        if (mSensorInfo.indexOfKey(curr) >= 0) {
+            do {
+                scratch[count++] = buffer[i++];
+            } while ((i<numEvents) && (buffer[i].sensor == curr));
+        } else {
+            i++;
+        }
+    }
 
-    ssize_t size = mChannel->write(buffer, count*sizeof(sensors_event_t));
+    ssize_t size = mChannel->write(scratch, count*sizeof(sensors_event_t));
     if (size == -EAGAIN) {
         // the destination doesn't accept events anymore, it's probably
         // full. For now, we just drop the events on the floor.
diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h
index b8dda84..f77652d 100644
--- a/services/sensorservice/SensorService.h
+++ b/services/sensorservice/SensorService.h
@@ -77,8 +77,6 @@
         sp<SensorChannel> const mChannel;
 
         // protected by SensorService::mLock
-        //SortedVector<int32_t> mSensorList;
-
         struct SensorInfo {
             SensorInfo() : ns(DEFAULT_EVENTS_PERIOD) { }
             nsecs_t ns;
@@ -88,7 +86,8 @@
     public:
         SensorEventConnection(const sp<SensorService>& service);
 
-        status_t sendEvents(sensors_event_t const* buffer, size_t count);
+        status_t sendEvents(sensors_event_t const* buffer, size_t count,
+                sensors_event_t* scratch);
         bool hasSensor(int32_t handle) const;
         bool hasAnySensor() const;
         bool addSensor(int32_t handle);