Include sticky broadcast cache in the processes dump.

Bug: 356148006
Test: manual
Flag: android.app.use_sticky_bcast_cache
Change-Id: Ie19e61c64b969f74638a4b39d0c2b7b2aa88f17d
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 5b556cc..95d3ea5 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -1960,8 +1960,12 @@
 
         @Override
         public void dumpCacheInfo(ParcelFileDescriptor pfd, String[] args) {
-            PropertyInvalidatedCache.dumpCacheInfo(pfd, args);
-            IoUtils.closeQuietly(pfd);
+            try {
+                PropertyInvalidatedCache.dumpCacheInfo(pfd, args);
+                BroadcastStickyCache.dump(pfd);
+            } finally {
+                IoUtils.closeQuietly(pfd);
+            }
         }
 
         private File getDatabasesDir(Context context) {
diff --git a/core/java/android/app/BroadcastStickyCache.java b/core/java/android/app/BroadcastStickyCache.java
index d6f061b..ea81731 100644
--- a/core/java/android/app/BroadcastStickyCache.java
+++ b/core/java/android/app/BroadcastStickyCache.java
@@ -27,16 +27,21 @@
 import android.net.nsd.NsdManager;
 import android.net.wifi.WifiManager;
 import android.net.wifi.p2p.WifiP2pManager;
+import android.os.ParcelFileDescriptor;
 import android.os.SystemProperties;
 import android.os.UpdateLock;
 import android.telephony.TelephonyManager;
 import android.util.ArrayMap;
+import android.util.IndentingPrintWriter;
 import android.view.WindowManagerPolicyConstants;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.FastPrintWriter;
 
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 
 /** @hide */
@@ -214,6 +219,41 @@
         }
     }
 
+    public static void dump(@NonNull ParcelFileDescriptor pfd) {
+        if (!Flags.useStickyBcastCache()) {
+            return;
+        }
+        final PrintWriter pw = new FastPrintWriter(new FileOutputStream(pfd.getFileDescriptor()));
+        synchronized (sCachedStickyBroadcasts) {
+            dumpLocked(pw);
+        }
+        pw.flush();
+    }
+
+    @GuardedBy("sCachedStickyBroadcasts")
+    private static void dumpLocked(@NonNull PrintWriter pw) {
+        final IndentingPrintWriter ipw = new IndentingPrintWriter(
+                pw, "  " /* singleIndent */, "  " /* prefix */);
+        ipw.println("Cached sticky broadcasts:");
+        ipw.increaseIndent();
+        final int count = sCachedStickyBroadcasts.size();
+        if (count == 0) {
+            ipw.println("<empty>");
+        } else {
+            for (int i = 0; i < count; ++i) {
+                final CachedStickyBroadcast cachedStickyBroadcast = sCachedStickyBroadcasts.get(i);
+                ipw.print("Entry #"); ipw.print(i); ipw.println(":");
+                ipw.increaseIndent();
+                ipw.print("filter="); ipw.println(cachedStickyBroadcast.filter.toLongString());
+                ipw.print("intent="); ipw.println(cachedStickyBroadcast.intent);
+                ipw.print("version="); ipw.println(cachedStickyBroadcast.version);
+                ipw.print("handle="); ipw.println(cachedStickyBroadcast.propertyHandle);
+                ipw.decreaseIndent();
+            }
+        }
+        ipw.decreaseIndent();
+    }
+
     private static final class CachedStickyBroadcast {
         @NonNull public final IntentFilter filter;
         @Nullable public Intent intent;