diff options
| author | 2024-11-25 15:41:37 +0000 | |
|---|---|---|
| committer | 2024-11-26 16:09:12 +0000 | |
| commit | be4fc95e28cf52f4527adf7a45d0339483881f7d (patch) | |
| tree | 2a2dc36420ccf5fd996bf852c9b9d4c47e0a3f57 | |
| parent | f53f7712fb81a639a9a0aa3d7bc783c0dcde7a46 (diff) | |
Preserve unsuspend behavior
When admin unsuspends packages, pass the whole set to PackageManager,
not just those that the admin previously suspended. This preserves
behavior in case of nonexistent packages.
Bug: 378766314
Flag: android.app.admin.flags.unsuspend_not_suspended
Test: atest CtsDevicePolicyTestCases:android.devicepolicy.cts.PackageSuspensionTest#setPackagesSuspended_unsuspendNonexistentPackage_remainUnuspended[IncludeRunOnProfileOwnerPrimaryUser]
Change-Id: Ibebd47d34f9f56e61cc2d11fd92ebcd3494deab6
| -rw-r--r-- | core/java/android/app/admin/flags/flags.aconfig | 10 | ||||
| -rw-r--r-- | services/devicepolicy/java/com/android/server/devicepolicy/PackageSuspender.java | 19 |
2 files changed, 20 insertions, 9 deletions
diff --git a/core/java/android/app/admin/flags/flags.aconfig b/core/java/android/app/admin/flags/flags.aconfig index 581efa5d2efa..21a29419061d 100644 --- a/core/java/android/app/admin/flags/flags.aconfig +++ b/core/java/android/app/admin/flags/flags.aconfig @@ -286,6 +286,16 @@ flag { } flag { + name: "unsuspend_not_suspended" + namespace: "enterprise" + description: "When admin unsuspends packages, pass previously not suspended packages to PM too" + bug: "378766314" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "backup_connected_apps_settings" namespace: "enterprise" description: "backup and restore connected work and personal apps user settings across devices" diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PackageSuspender.java b/services/devicepolicy/java/com/android/server/devicepolicy/PackageSuspender.java index 40cf0e979375..c8c953d53f9e 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/PackageSuspender.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/PackageSuspender.java @@ -19,6 +19,7 @@ package com.android.server.devicepolicy; import static com.android.server.devicepolicy.DevicePolicyManagerService.LOG_TAG; import android.annotation.Nullable; +import android.app.admin.flags.Flags; import android.content.pm.PackageManagerInternal; import android.util.ArraySet; @@ -64,7 +65,7 @@ public class PackageSuspender { /** * Suspend packages that are requested by a single admin * - * @return a list of packages that the admin has requested to suspend but could not be + * @return an array of packages that the admin has requested to suspend but could not be * suspended, due to DPM and PackageManager exemption list. * */ @@ -87,7 +88,7 @@ public class PackageSuspender { /** * Suspend packages considering the exemption list. * - * @return the list of packages that couldn't be suspended, either due to the exemption list, + * @return the set of packages that couldn't be suspended, either due to the exemption list, * or due to failures from PackageManagerInternal itself. */ private Set<String> suspendWithExemption(Set<String> packages) { @@ -112,15 +113,15 @@ public class PackageSuspender { /** * Unsuspend packages that are requested by a single admin * - * @return a list of packages that the admin has requested to unsuspend but could not be - * unsuspended, due to other amdin's policy or PackageManager restriction. + * @return an array of packages that the admin has requested to unsuspend but could not be + * unsuspended, due to other admin's policy or PackageManager restriction. * */ public String[] unsuspend(Set<String> packages) { - // Unlike suspend(), when unsuspending, call PackageManager with the delta of resolved - // suspended packages list and not what the admin has requested. This is because some - // packages might still be subject to another admin's suspension request. - Set<String> packagesToUnsuspend = new ArraySet<>(mSuspendedPackageBefore); + // Unlike suspend(), when unsuspending, take suspension by other admins into account: only + // packages not suspended by other admins are passed to PackageManager. + Set<String> packagesToUnsuspend = new ArraySet<>( + Flags.unsuspendNotSuspended() ? packages : mSuspendedPackageBefore); packagesToUnsuspend.removeAll(mSuspendedPackageAfter); // To calculate the result (which packages are not unsuspended), start with packages that @@ -139,7 +140,7 @@ public class PackageSuspender { /** * Unsuspend packages considering the exemption list. * - * @return the list of packages that couldn't be unsuspended, either due to the exemption list, + * @return the set of packages that couldn't be unsuspended, either due to the exemption list, * or due to failures from PackageManagerInternal itself. */ private Set<String> unsuspendWithExemption(Set<String> packages) { |