summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2022-09-23 17:25:28 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-09-23 17:25:28 +0000
commit9958359cedb3b49b365ebc800d84282520534fc5 (patch)
tree9da1cea2bc72ed12c9c2ee0be9b2c0a9320ed8cb
parent09169accb23fcaac2b5032282b244ec0355b6ce3 (diff)
parentef4b48de59cfd432b17bf212eca8db9bbec5054e (diff)
Merge "Only send SUSPENSION_CHANGED for changed packages" into tm-qpr-dev
-rw-r--r--services/core/java/com/android/server/pm/SuspendPackageHelper.java58
1 files changed, 28 insertions, 30 deletions
diff --git a/services/core/java/com/android/server/pm/SuspendPackageHelper.java b/services/core/java/com/android/server/pm/SuspendPackageHelper.java
index 7ad4d226d801..eebde3613fac 100644
--- a/services/core/java/com/android/server/pm/SuspendPackageHelper.java
+++ b/services/core/java/com/android/server/pm/SuspendPackageHelper.java
@@ -110,12 +110,12 @@ public final class SuspendPackageHelper {
final SuspendParams newSuspendParams =
new SuspendParams(dialogInfo, appExtras, launcherExtras);
- final List<String> changedPackagesList = new ArrayList<>(packageNames.length);
- final IntArray changedUids = new IntArray(packageNames.length);
- final IntArray modifiedUids = new IntArray(packageNames.length);
final List<String> unmodifiablePackages = new ArrayList<>(packageNames.length);
- ArraySet<String> modifiedPackages = new ArraySet<>();
+ final List<String> notifyPackagesList = new ArrayList<>(packageNames.length);
+ final IntArray notifyUids = new IntArray(packageNames.length);
+ final ArraySet<String> changedPackagesList = new ArraySet<>(packageNames.length);
+ final IntArray changedUids = new IntArray(packageNames.length);
final boolean[] canSuspend = suspended
? canSuspendPackageForUser(snapshot, packageNames, userId, callingUid) : null;
@@ -143,21 +143,16 @@ public final class SuspendPackageHelper {
final WatchedArrayMap<String, SuspendParams> suspendParamsMap =
packageState.getUserStateOrDefault(userId).getSuspendParams();
- if (suspended) {
- if (suspendParamsMap != null && suspendParamsMap.containsKey(packageName)) {
- final SuspendParams suspendParams = suspendParamsMap.get(packageName);
- // Skip if there's no changes
- if (suspendParams != null
- && Objects.equals(suspendParams.getDialogInfo(), dialogInfo)
- && Objects.equals(suspendParams.getAppExtras(), appExtras)
- && Objects.equals(suspendParams.getLauncherExtras(),
- launcherExtras)) {
- // Carried over API behavior, must notify change even if no change
- changedPackagesList.add(packageName);
- changedUids.add(UserHandle.getUid(userId, packageState.getAppId()));
- continue;
- }
- }
+
+ SuspendParams oldSuspendParams = suspendParamsMap == null
+ ? null : suspendParamsMap.get(packageName);
+ boolean changed = !Objects.equals(oldSuspendParams, newSuspendParams);
+
+ if (suspended && !changed) {
+ // Carried over API behavior, must notify change even if no change
+ notifyPackagesList.add(packageName);
+ notifyUids.add(UserHandle.getUid(userId, packageState.getAppId()));
+ continue;
}
// If only the callingPackage is suspending this package,
@@ -166,18 +161,21 @@ public final class SuspendPackageHelper {
&& CollectionUtils.size(suspendParamsMap) == 1
&& suspendParamsMap.containsKey(callingPackage);
if (suspended || packageUnsuspended) {
+ // Always notify of a suspend call + notify when fully unsuspended
+ notifyPackagesList.add(packageName);
+ notifyUids.add(UserHandle.getUid(userId, packageState.getAppId()));
+ }
+
+ if (changed) {
changedPackagesList.add(packageName);
changedUids.add(UserHandle.getUid(userId, packageState.getAppId()));
}
-
- modifiedPackages.add(packageName);
- modifiedUids.add(UserHandle.getUid(userId, packageState.getAppId()));
}
mPm.commitPackageStateMutation(null, mutator -> {
- final int size = modifiedPackages.size();
+ final int size = changedPackagesList.size();
for (int index = 0; index < size; index++) {
- final String packageName = modifiedPackages.valueAt(index);
+ final String packageName = changedPackagesList.valueAt(index);
final PackageUserStateWrite userState = mutator.forPackage(packageName)
.userState(userId);
if (suspended) {
@@ -190,19 +188,19 @@ public final class SuspendPackageHelper {
final Computer newSnapshot = mPm.snapshotComputer();
- if (!changedPackagesList.isEmpty()) {
- final String[] changedPackages = changedPackagesList.toArray(new String[0]);
+ if (!notifyPackagesList.isEmpty()) {
+ final String[] notifyPackages = notifyPackagesList.toArray(new String[0]);
sendPackagesSuspendedForUser(newSnapshot,
suspended ? Intent.ACTION_PACKAGES_SUSPENDED
: Intent.ACTION_PACKAGES_UNSUSPENDED,
- changedPackages, changedUids.toArray(), userId);
- sendMyPackageSuspendedOrUnsuspended(changedPackages, suspended, userId);
+ notifyPackages, notifyUids.toArray(), userId);
+ sendMyPackageSuspendedOrUnsuspended(notifyPackages, suspended, userId);
mPm.scheduleWritePackageRestrictions(userId);
}
// Send the suspension changed broadcast to ensure suspension state is not stale.
- if (!modifiedPackages.isEmpty()) {
+ if (!changedPackagesList.isEmpty()) {
sendPackagesSuspendedForUser(newSnapshot, Intent.ACTION_PACKAGES_SUSPENSION_CHANGED,
- modifiedPackages.toArray(new String[0]), modifiedUids.toArray(), userId);
+ changedPackagesList.toArray(new String[0]), changedUids.toArray(), userId);
}
return unmodifiablePackages.toArray(new String[0]);
}