Merge "Collect binder latency data even when device is charging / device state is unknown." into sc-dev
diff --git a/core/java/com/android/internal/os/BinderCallsStats.java b/core/java/com/android/internal/os/BinderCallsStats.java
index 6f911cb..e3baf90 100644
--- a/core/java/com/android/internal/os/BinderCallsStats.java
+++ b/core/java/com/android/internal/os/BinderCallsStats.java
@@ -220,7 +220,8 @@
     public CallSession callStarted(Binder binder, int code, int workSourceUid) {
         noteNativeThreadId();
 
-        if (!canCollect()) {
+        // We always want to collect data for latency if it's enabled, regardless of device state.
+        if (!mCollectLatencyData && !canCollect()) {
             return null;
         }
 
@@ -267,6 +268,11 @@
             mLatencyObserver.callEnded(s);
         }
 
+        // Latency collection has already been processed so check if the rest should be processed.
+        if (!canCollect()) {
+            return;
+        }
+
         UidEntry uidEntry = null;
         final boolean recordCall;
         if (s.recordedCall) {
diff --git a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
index 55943a0..cac40b2 100644
--- a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -969,6 +970,22 @@
     }
 
     @Test
+    public void testLatencyCollectionActiveEvenWithoutDeviceState() {
+        TestBinderCallsStats bcs = new TestBinderCallsStats(null);
+        bcs.setCollectLatencyData(true);
+
+        Binder binder = new Binder();
+        CallSession callSession = bcs.callStarted(binder, 1, WORKSOURCE_UID);
+        assertNotEquals(null, callSession);
+
+        bcs.time += 10;
+        bcs.elapsedTime += 20;
+        bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE, WORKSOURCE_UID);
+
+        assertEquals(1, bcs.getLatencyObserver().getLatencyHistograms().size());
+    }
+
+    @Test
     public void testLatencyCollectionEnabledByDefault() {
         TestBinderCallsStats bcs = new TestBinderCallsStats();
         assertEquals(true, bcs.getCollectLatencyData());