improve sensorservice dumpsys

Change-Id: I8b53d5cab884c3aca16d95df5fbf288368d52e8b
diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp
index 38d498c..d82a7e2 100644
--- a/services/sensorservice/SensorDevice.cpp
+++ b/services/sensorservice/SensorDevice.cpp
@@ -138,9 +138,18 @@
 
     Mutex::Autolock _l(mLock);
     for (size_t i=0 ; i<size_t(count) ; i++) {
-        snprintf(buffer, SIZE, "handle=0x%08x, active-count=%d\n",
+        const Info& info = mActivationCount.valueFor(list[i].handle);
+        snprintf(buffer, SIZE, "handle=0x%08x, active-count=%d, rates(ms)={ ",
                 list[i].handle,
-                mActivationCount.valueFor(list[i].handle).rates.size());
+                info.rates.size());
+        result.append(buffer);
+        for (size_t j=0 ; j<info.rates.size() ; j++) {
+            snprintf(buffer, SIZE, "%4.1f%s",
+                    info.rates.valueAt(j) / 1e6f,
+                    j<info.rates.size()-1 ? ", " : "");
+            result.append(buffer);
+        }
+        snprintf(buffer, SIZE, " }, selected=%4.1f ms\n",  info.delay / 1e6f);
         result.append(buffer);
     }
 }
@@ -217,17 +226,9 @@
         }
     }
 
-    if (!actuateHardware || enabled) {
+    { // scope for the lock
         Mutex::Autolock _l(mLock);
-        nsecs_t ns = info.rates.valueAt(0);
-        for (size_t i=1 ; i<info.rates.size() ; i++) {
-            if (info.rates.valueAt(i) < ns) {
-                nsecs_t cur = info.rates.valueAt(i);
-                if (cur < ns) {
-                    ns = cur;
-                }
-            }
-        }
+        nsecs_t ns = info.selectDelay();
         mSensorDevice->setDelay(mSensorDevice, handle, ns);
     }
 
@@ -237,24 +238,39 @@
 status_t SensorDevice::setDelay(void* ident, int handle, int64_t ns)
 {
     if (!mSensorDevice) return NO_INIT;
+    Mutex::Autolock _l(mLock);
     Info& info( mActivationCount.editValueFor(handle) );
-    { // scope for lock
-        Mutex::Autolock _l(mLock);
-        ssize_t index = info.rates.indexOfKey(ident);
-        if (index < 0) return BAD_INDEX;
-        info.rates.editValueAt(index) = ns;
-        ns = info.rates.valueAt(0);
-        for (size_t i=1 ; i<info.rates.size() ; i++) {
-            nsecs_t cur = info.rates.valueAt(i);
-            if (cur < ns) {
-                ns = cur;
-            }
+    status_t err = info.setDelayForIdent(ident, ns);
+    if (err < 0) return err;
+    ns = info.selectDelay();
+    return mSensorDevice->setDelay(mSensorDevice, handle, ns);
+}
+
+// ---------------------------------------------------------------------------
+
+status_t SensorDevice::Info::setDelayForIdent(void* ident, int64_t ns)
+{
+    ssize_t index = rates.indexOfKey(ident);
+    if (index < 0) {
+        LOGE("Info::setDelayForIdent(ident=%p, ns=%lld) failed (%s)",
+                ident, ns, strerror(-index));
+        return BAD_INDEX;
+    }
+    rates.editValueAt(index) = ns;
+    return NO_ERROR;
+}
+
+nsecs_t SensorDevice::Info::selectDelay()
+{
+    nsecs_t ns = rates.valueAt(0);
+    for (size_t i=1 ; i<rates.size() ; i++) {
+        nsecs_t cur = rates.valueAt(i);
+        if (cur < ns) {
+            ns = cur;
         }
     }
-
-    //LOGD("setDelay: ident=%p, handle=%d, ns=%lld", ident, handle, ns);
-
-    return mSensorDevice->setDelay(mSensorDevice, handle, ns);
+    delay = ns;
+    return ns;
 }
 
 // ---------------------------------------------------------------------------