Snap for 11486370 from 3498227cc32cb35e9cb5a1533ebab1a529923eb0 to 24Q2-release

Change-Id: I09a3b6c0e3c2a4a17d76d5ca01e7b4481776f5b2
diff --git a/service/java/com/android/server/stats/StatsCompanionService.java b/service/java/com/android/server/stats/StatsCompanionService.java
index 360889b..16e66fe 100644
--- a/service/java/com/android/server/stats/StatsCompanionService.java
+++ b/service/java/com/android/server/stats/StatsCompanionService.java
@@ -742,13 +742,15 @@
             filter.addAction(Intent.ACTION_PACKAGE_ADDED);
             filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
             filter.addDataScheme("package");
-            mContext.registerReceiverForAllUsers(appUpdateReceiver, filter, null, null);
+            mContext.registerReceiverForAllUsers(appUpdateReceiver, filter, null,
+                    /* scheduler= */ mHandler);
 
             // Setup receiver for user initialize (which happens once for a new user)
             // and if a user is removed.
             filter = new IntentFilter(Intent.ACTION_USER_INITIALIZE);
             filter.addAction(Intent.ACTION_USER_REMOVED);
-            mContext.registerReceiverForAllUsers(userUpdateReceiver, filter, null, null);
+            mContext.registerReceiverForAllUsers(userUpdateReceiver, filter, null,
+                    /* scheduler= */ mHandler);
 
             // Setup receiver for device reboots or shutdowns.
             filter = new IntentFilter(Intent.ACTION_REBOOT);
diff --git a/tests/apps/statsdapp/src/com/android/server/cts/device/statsd/StatsdStressLogging.java b/tests/apps/statsdapp/src/com/android/server/cts/device/statsd/StatsdStressLogging.java
index 8ec72e1..62dfe78 100644
--- a/tests/apps/statsdapp/src/com/android/server/cts/device/statsd/StatsdStressLogging.java
+++ b/tests/apps/statsdapp/src/com/android/server/cts/device/statsd/StatsdStressLogging.java
@@ -16,6 +16,7 @@
 
 package com.android.server.cts.device.statsd;
 
+import android.os.SystemClock;
 import android.util.StatsLog;
 
 import org.junit.Test;
@@ -27,10 +28,16 @@
     @Test
     public void testLogAtomsBackToBack() throws Exception {
         // logging back to back many atoms to force socket overflow
-        performAtomStorm(EVENT_STORM_ATOMS_COUNT);
+        logAtoms(EVENT_STORM_ATOMS_COUNT);
+
+        // Using sleep to allow bypass libstatsocket dumpAtomsLossStats() cooldown timer
+        SystemClock.sleep(100);
+
+        // Try to log atoms into socket successfully to trigger libstatsocket dumpAtomsLossStats()
+        logAtoms(1);
     }
 
-    private void performAtomStorm(int iterations) {
+    private void logAtoms(int iterations) {
         // single atom logging takes ~2us excluding JNI interactions
         for (int i = 0; i < iterations; i++) {
             StatsLog.logStart(i);
diff --git a/tests/src/android/cts/statsd/metadata/MetadataTests.java b/tests/src/android/cts/statsd/metadata/MetadataTests.java
index f912e81..4b6433e 100644
--- a/tests/src/android/cts/statsd/metadata/MetadataTests.java
+++ b/tests/src/android/cts/statsd/metadata/MetadataTests.java
@@ -137,6 +137,20 @@
             runDeviceTests(
                     DEVICE_SIDE_TEST_PACKAGE, ".StatsdStressLogging", "testLogAtomsBackToBack");
 
+            // Delay to allow statsd socket recover after overflow
+            Thread.sleep(500);
+
+            // There is some un-deterministic component in AtomLossStats propagation:
+            // - the dumpAtomsLossStats() from the libstatssocket happens ONLY after the
+            //   next successful atom write to socket.
+            // - to avoid socket flood there is also cooldown timer incorporated. If no new atoms -
+            //   loss info will not be propagated, which is intention by design.
+            // Log atoms into socket successfully to trigger libstatsocket dumpAtomsLossStats()
+            doAppBreadcrumbReportedStart(6);
+
+            // Delay to allow libstatssocket loss info to be propagated to statsdstats
+            Thread.sleep(1000);
+
             StatsdStatsReport report = getStatsdStatsReport();
             assertThat(report).isNotNull();
             boolean detectedLossEventForAppBreadcrumbAtom = false;
@@ -168,7 +182,6 @@
                     }
                 }
             }
-
             assertThat(detectedLossEventForAppBreadcrumbAtomViaSocketLossStats).isTrue();
         }
     }