From 8b4354e6d2639c64696dd612030b07bde6386439 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Sun, 5 Jun 2022 14:05:58 -0700 Subject: [PATCH] [pm] fix missing PACKAGE_CHANGED broadcasts A regression was introduced during refactoring where we used numUsers as the size of the pending broadcasts. This caused some pending broadcasts to be neglected. Test: manually verified that SetUpWizard broadcasts were sent as expected. BUG: 233363816 Change-Id: I8f194f15971597593a9b022f2d5937cd519a30cb --- .../server/pm/InstallPackageHelper.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index e62f35d591fa9..e90a5db39d71f 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -2548,28 +2548,31 @@ final class InstallPackageHelper { public void sendPendingBroadcasts() { String[] packages; ArrayList[] components; - int size = 0; + int numBroadcasts = 0, numUsers; int[] uids; synchronized (mPm.mLock) { final SparseArray>> userIdToPackagesToComponents = mPm.mPendingBroadcasts.copiedMap(); - size = userIdToPackagesToComponents.size(); - if (size <= 0) { + numUsers = userIdToPackagesToComponents.size(); + for (int n = 0; n < numUsers; n++) { + numBroadcasts += userIdToPackagesToComponents.valueAt(n).size(); + } + if (numBroadcasts == 0) { // Nothing to be done. Just return return; } - packages = new String[size]; - components = new ArrayList[size]; - uids = new int[size]; + packages = new String[numBroadcasts]; + components = new ArrayList[numBroadcasts]; + uids = new int[numBroadcasts]; int i = 0; // filling out the above arrays - for (int n = 0; n < size; n++) { + for (int n = 0; n < numUsers; n++) { final int packageUserId = userIdToPackagesToComponents.keyAt(n); final ArrayMap> componentsToBroadcast = userIdToPackagesToComponents.valueAt(n); final int numComponents = CollectionUtils.size(componentsToBroadcast); - for (int index = 0; i < size && index < numComponents; index++) { + for (int index = 0; index < numComponents; index++) { packages[i] = componentsToBroadcast.keyAt(index); components[i] = componentsToBroadcast.valueAt(index); final PackageSetting ps = mPm.mSettings.getPackageLPr(packages[i]); @@ -2579,12 +2582,12 @@ final class InstallPackageHelper { i++; } } - size = i; + numBroadcasts = i; mPm.mPendingBroadcasts.clear(); } final Computer snapshot = mPm.snapshotComputer(); // Send broadcasts - for (int i = 0; i < size; i++) { + for (int i = 0; i < numBroadcasts; i++) { mPm.sendPackageChangedBroadcast(snapshot, packages[i], true /* dontKillApp */, components[i], uids[i], null /* reason */); }