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()))
}