Honor app visibility for resources changed broadcast

Bug: 227270414
Test: manually using the PoC in the buganizer to ensure the symptom
      no longer exists.
Change-Id: I2d55d78a6c245adada282c7dfcd05eb6fa21b4b3
diff --git a/services/core/java/com/android/server/pm/BroadcastHelper.java b/services/core/java/com/android/server/pm/BroadcastHelper.java
index c1b25d7..b404410 100644
--- a/services/core/java/com/android/server/pm/BroadcastHelper.java
+++ b/services/core/java/com/android/server/pm/BroadcastHelper.java
@@ -152,30 +152,40 @@
         }
     }
 
-    public void sendResourcesChangedBroadcast(boolean mediaStatus, boolean replacing,
-            ArrayList<String> pkgList, int[] uidArr, IIntentReceiver finishedReceiver) {
-        sendResourcesChangedBroadcast(mediaStatus, replacing,
-                pkgList.toArray(new String[pkgList.size()]), uidArr, finishedReceiver);
-    }
+    public void sendResourcesChangedBroadcast(@NonNull Computer snapshot, boolean mediaStatus,
+            boolean replacing, @NonNull String[] pkgNames, @NonNull int[] uids) {
+        if (ArrayUtils.isEmpty(pkgNames) || ArrayUtils.isEmpty(uids)) {
+            return;
+        }
 
-    public void sendResourcesChangedBroadcast(boolean mediaStatus, boolean replacing,
-            String[] pkgList, int[] uidArr, IIntentReceiver finishedReceiver) {
-        int size = pkgList.length;
-        if (size > 0) {
-            // Send broadcasts here
-            Bundle extras = new Bundle();
-            extras.putStringArray(Intent.EXTRA_CHANGED_PACKAGE_LIST, pkgList);
-            if (uidArr != null) {
-                extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, uidArr);
+        try {
+            final IActivityManager am = ActivityManager.getService();
+            if (am == null) {
+                return;
             }
-            if (replacing) {
-                extras.putBoolean(Intent.EXTRA_REPLACING, replacing);
+
+            final int[] resolvedUserIds = am.getRunningUserIds();
+            for (int userId : resolvedUserIds) {
+                final var lists = getBroadcastParams(snapshot, pkgNames, uids, userId);
+                for (int i = 0; i < lists.size(); i++) {
+                    // Send broadcasts here
+                    final Bundle extras = new Bundle(3);
+                    final BroadcastParams list = lists.get(i);
+                    extras.putStringArray(Intent.EXTRA_CHANGED_PACKAGE_LIST,
+                            list.getPackageNames());
+                    extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, list.getUids());
+                    extras.putBoolean(Intent.EXTRA_REPLACING, replacing);
+                    final SparseArray<int[]> allowList = list.getAllowList().size() == 0
+                            ? null : list.getAllowList();
+                    final String action =
+                            mediaStatus ? Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
+                                    : Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
+                    sendPackageBroadcast(action, null /* pkg */, extras, 0 /* flags */,
+                            null /* targetPkg */, null /* finishedReceiver */, new int[]{userId},
+                            null /* instantUserIds */, allowList, null /* bOptions */);
+                }
             }
-            String action = mediaStatus ? Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
-                    : Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
-            // TODO: not sure how to handle this one.
-            sendPackageBroadcast(action, null, extras, 0, null, finishedReceiver,
-                    null, null, null, null);
+        } catch (RemoteException ex) {
         }
     }
 
diff --git a/services/core/java/com/android/server/pm/BroadcastParams.java b/services/core/java/com/android/server/pm/BroadcastParams.java
index 7883f48..279aab0 100644
--- a/services/core/java/com/android/server/pm/BroadcastParams.java
+++ b/services/core/java/com/android/server/pm/BroadcastParams.java
@@ -22,8 +22,6 @@
 import android.util.IntArray;
 import android.util.SparseArray;
 
-import com.android.internal.util.DataClass;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -32,7 +30,6 @@
  * A helper class that contains information about package names and uids that share the same allow
  * list for sending broadcasts. Used by various package helpers.
  */
-@DataClass(genConstructor = false, genConstDefs = false)
 final class BroadcastParams {
     private final @NonNull List<String> mPackageNames;
     private final @NonNull IntArray mUids;
@@ -51,46 +48,15 @@
         mUids.add(uid);
     }
 
-
-
-    // Code below generated by codegen v1.0.23.
-    //
-    // DO NOT MODIFY!
-    // CHECKSTYLE:OFF Generated code
-    //
-    // To regenerate run:
-    // $ codegen $ANDROID_BUILD_TOP/frameworks/base/services/core/java/com/android/server/pm/BroadcastParams.java
-    //
-    // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
-    //   Settings > Editor > Code Style > Formatter Control
-    //@formatter:off
-
-
-    @DataClass.Generated.Member
-    public @NonNull List<String> getPackageNames() {
-        return mPackageNames;
+    public @NonNull String[] getPackageNames() {
+        return mPackageNames.toArray(new String[0]);
     }
 
-    @DataClass.Generated.Member
-    public @NonNull IntArray getUids() {
-        return mUids;
+    public @NonNull int[] getUids() {
+        return mUids.toArray();
     }
 
-    @DataClass.Generated.Member
     public @NonNull SparseArray<int[]> getAllowList() {
         return mAllowList;
     }
-
-    @DataClass.Generated(
-            time = 1651554793681L,
-            codegenVersion = "1.0.23",
-            sourceFile = "frameworks/base/services/core/java/com/android/server/pm/BroadcastParams.java",
-            inputSignatures = "private final @android.annotation.NonNull java.util.List<java.lang.String> mPackageNames\nprivate final @android.annotation.NonNull android.util.IntArray mUids\nprivate final @android.annotation.NonNull android.util.SparseArray<int[]> mAllowList\npublic  void addPackage(java.lang.String,int)\nclass BroadcastParams extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)")
-    @Deprecated
-    private void __metadata() {}
-
-
-    //@formatter:on
-    // End of generated code
-
 }
diff --git a/services/core/java/com/android/server/pm/DistractingPackageHelper.java b/services/core/java/com/android/server/pm/DistractingPackageHelper.java
index 90dff16..b9fb3bd 100644
--- a/services/core/java/com/android/server/pm/DistractingPackageHelper.java
+++ b/services/core/java/com/android/server/pm/DistractingPackageHelper.java
@@ -190,9 +190,8 @@
         for (int i = 0; i < lists.size(); i++) {
             final Bundle extras = new Bundle(3);
             final BroadcastParams list = lists.get(i);
-            extras.putStringArray(Intent.EXTRA_CHANGED_PACKAGE_LIST,
-                    list.getPackageNames().toArray(new String[0]));
-            extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, list.getUids().toArray());
+            extras.putStringArray(Intent.EXTRA_CHANGED_PACKAGE_LIST, list.getPackageNames());
+            extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, list.getUids());
             extras.putInt(Intent.EXTRA_DISTRACTION_RESTRICTIONS, distractionFlags);
             final SparseArray<int[]> allowList = list.getAllowList().size() == 0
                     ? null : list.getAllowList();
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index e52fae4..615a3bc8 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -2632,11 +2632,10 @@
                         Slog.i(TAG, "upgrading pkg " + res.mRemovedInfo.mRemovedPackage
                                 + " is ASEC-hosted -> UNAVAILABLE");
                     }
-                    final int[] uidArray = new int[]{res.mRemovedInfo.mUid};
-                    final ArrayList<String> pkgList = new ArrayList<>(1);
-                    pkgList.add(res.mRemovedInfo.mRemovedPackage);
-                    mBroadcastHelper.sendResourcesChangedBroadcast(
-                            false, true, pkgList, uidArray, null);
+                    final String[] pkgNames = new String[]{res.mRemovedInfo.mRemovedPackage};
+                    final int[] uids = new int[]{res.mRemovedInfo.mUid};
+                    mBroadcastHelper.sendResourcesChangedBroadcast(mPm.snapshotComputer(),
+                            false /* mediaStatus */, true /* replacing */, pkgNames, uids);
                 }
                 res.mRemovedInfo.sendPackageRemovedBroadcasts(killApp, false /*removedBySystem*/);
             }
@@ -2808,11 +2807,10 @@
                     if (DEBUG_INSTALL) {
                         Slog.i(TAG, "upgrading pkg " + res.mPkg + " is external");
                     }
-                    final int[] uidArray = new int[]{res.mPkg.getUid()};
-                    ArrayList<String> pkgList = new ArrayList<>(1);
-                    pkgList.add(packageName);
-                    mBroadcastHelper.sendResourcesChangedBroadcast(
-                            true, true, pkgList, uidArray, null);
+                    final String[] pkgNames = new String[]{packageName};
+                    final int[] uids = new int[]{res.mPkg.getUid()};
+                    mBroadcastHelper.sendResourcesChangedBroadcast(mPm.snapshotComputer(),
+                            true /* mediaStatus */, true /* replacing */, pkgNames, uids);
                 }
             } else if (!ArrayUtils.isEmpty(res.mLibraryConsumers)) { // if static shared lib
                 // No need to kill consumers if it's installation of new version static shared lib.
diff --git a/services/core/java/com/android/server/pm/StorageEventHelper.java b/services/core/java/com/android/server/pm/StorageEventHelper.java
index 666776b..fe1c83b 100644
--- a/services/core/java/com/android/server/pm/StorageEventHelper.java
+++ b/services/core/java/com/android/server/pm/StorageEventHelper.java
@@ -28,7 +28,6 @@
 
 import android.annotation.NonNull;
 import android.app.ResourcesManager;
-import android.content.IIntentReceiver;
 import android.content.pm.PackageManager;
 import android.content.pm.PackagePartitions;
 import android.content.pm.UserInfo;
@@ -223,7 +222,7 @@
         }
 
         if (DEBUG_INSTALL) Slog.d(TAG, "Loaded packages " + loaded);
-        sendResourcesChangedBroadcast(true, false, loaded, null);
+        sendResourcesChangedBroadcast(true /* mediaStatus */, false /* replacing */, loaded);
         synchronized (mLoadedVolumes) {
             mLoadedVolumes.add(vol.getId());
         }
@@ -274,7 +273,7 @@
         }
 
         if (DEBUG_INSTALL) Slog.d(TAG, "Unloaded packages " + unloaded);
-        sendResourcesChangedBroadcast(false, false, unloaded, null);
+        sendResourcesChangedBroadcast(false /* mediaStatus */, false /* replacing */, unloaded);
         synchronized (mLoadedVolumes) {
             mLoadedVolumes.remove(vol.getId());
         }
@@ -290,7 +289,7 @@
     }
 
     private void sendResourcesChangedBroadcast(boolean mediaStatus, boolean replacing,
-            ArrayList<AndroidPackage> packages, IIntentReceiver finishedReceiver) {
+            ArrayList<AndroidPackage> packages) {
         final int size = packages.size();
         final String[] packageNames = new String[size];
         final int[] packageUids = new int[size];
@@ -299,8 +298,8 @@
             packageNames[i] = pkg.getPackageName();
             packageUids[i] = pkg.getUid();
         }
-        mBroadcastHelper.sendResourcesChangedBroadcast(mediaStatus, replacing, packageNames,
-                packageUids, finishedReceiver);
+        mBroadcastHelper.sendResourcesChangedBroadcast(mPm.snapshotComputer(), mediaStatus,
+                replacing, packageNames, packageUids);
     }
 
     /**
diff --git a/services/core/java/com/android/server/pm/SuspendPackageHelper.java b/services/core/java/com/android/server/pm/SuspendPackageHelper.java
index b475840..5f44c63 100644
--- a/services/core/java/com/android/server/pm/SuspendPackageHelper.java
+++ b/services/core/java/com/android/server/pm/SuspendPackageHelper.java
@@ -593,9 +593,8 @@
         for (int i = 0; i < lists.size(); i++) {
             final Bundle extras = new Bundle(3);
             final BroadcastParams list = lists.get(i);
-            extras.putStringArray(Intent.EXTRA_CHANGED_PACKAGE_LIST,
-                    list.getPackageNames().toArray(new String[0]));
-            extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, list.getUids().toArray());
+            extras.putStringArray(Intent.EXTRA_CHANGED_PACKAGE_LIST, list.getPackageNames());
+            extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, list.getUids());
             final SparseArray<int[]> allowList = list.getAllowList().size() == 0
                     ? null : list.getAllowList();
             handler.post(() -> mBroadcastHelper.sendPackageBroadcast(intent, null /* pkg */,
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/BroadcastHelperTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/BroadcastHelperTest.kt
index e13da97..d25649e 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/BroadcastHelperTest.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/BroadcastHelperTest.kt
@@ -67,9 +67,9 @@
                 snapshot, packagesToChange, uidsToChange, TEST_USER_ID)
 
         assertThat(broadcastParams).hasSize(1)
-        assertThat(broadcastParams[0].packageNames).containsExactlyElementsIn(
+        assertThat(broadcastParams[0].packageNames).asList().containsExactlyElementsIn(
                 packagesToChange.toCollection(ArrayList()))
-        assertThat(broadcastParams[0].uids.toArray()).asList().containsExactlyElementsIn(
+        assertThat(broadcastParams[0].uids).asList().containsExactlyElementsIn(
                 uidsToChange.toCollection(ArrayList()))
     }