Track background sensor usage

Keep an additional counter for background access
of sensors. Increment the count when sensor is
accessed while process is in the background state.

Bug: 33553631
Test: runtest -x frameworks/base/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java
Change-Id: I87d7dbdaf4c34aa9dd9c7e13134d8f5f759f4e2b
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index e5aeb4b..8d73544 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -39,6 +39,7 @@
 import android.util.SparseIntArray;
 import android.util.TimeUtils;
 import android.view.Display;
+
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatteryStatsHelper;
 
@@ -181,6 +182,8 @@
      *
      * New in version 19:
      *   - Wakelock data (wl) gets current and max times.
+     * New in version 20:
+     *   - Sensor gets a background counter.
      */
     static final String CHECKIN_VERSION = "20";
 
@@ -600,10 +603,13 @@
              */
             // Magic sensor number for the GPS.
             public static final int GPS = -10000;
-            
+
             public abstract int getHandle();
-            
+
             public abstract Timer getSensorTime();
+
+            /** Returns a counter for usage count when in the background. */
+            public abstract Counter getSensorBgCount();
         }
 
         public class Pid {
@@ -3318,13 +3324,16 @@
                 final Uid.Sensor se = sensors.valueAt(ise);
                 final int sensorNumber = sensors.keyAt(ise);
                 final Timer timer = se.getSensorTime();
+                final Counter bgCounter = se.getSensorBgCount();
                 if (timer != null) {
                     // Convert from microseconds to milliseconds with rounding
                     final long totalTime = (timer.getTotalTimeLocked(rawRealtime, which) + 500)
                             / 1000;
                     final int count = timer.getCountLocked(which);
+                    final int bgCount = bgCounter != null ? bgCounter.getCountLocked(which) : 0;
                     if (totalTime != 0) {
-                        dumpLine(pw, uid, category, SENSOR_DATA, sensorNumber, totalTime, count);
+                        dumpLine(pw, uid, category, SENSOR_DATA, sensorNumber, totalTime, count,
+                                bgCount);
                     }
                 }
             }
@@ -4493,17 +4502,25 @@
                 sb.append(": ");
 
                 final Timer timer = se.getSensorTime();
+                final Counter bgCounter = se.getSensorBgCount();
                 if (timer != null) {
                     // Convert from microseconds to milliseconds with rounding
                     final long totalTime = (timer.getTotalTimeLocked(
                             rawRealtime, which) + 500) / 1000;
                     final int count = timer.getCountLocked(which);
+                    final int bgCount = bgCounter != null ? bgCounter.getCountLocked(which) : 0;
                     //timer.logState();
                     if (totalTime != 0) {
                         formatTimeMs(sb, totalTime);
                         sb.append("realtime (");
                         sb.append(count);
-                        sb.append(" times)");
+                        sb.append(" times");
+                        if (bgCount > 0) {
+                            sb.append(", ");
+                            sb.append(bgCount);
+                            sb.append(" bg");
+                        }
+                        sb.append(")");
                     } else {
                         sb.append("(not used)");
                     }