From 8ee51fbd69129f211475592f36b7dcf0c6cb6b0e Mon Sep 17 00:00:00 2001 From: Jing Ji Date: Mon, 23 May 2022 17:22:01 -0700 Subject: [PATCH] Hide the stop button for the device admin app in the task manager Bug: 233656578 Test: Manual - launch the task manager & check the device admin app. Change-Id: I6ec706b986c69164924fd30a5c55849a98cb6b12 --- .../java/android/os/PowerExemptionManager.java | 10 ++++++++++ .../com/android/server/usage/AppStandbyInternal.java | 5 +++++ .../com/android/server/usage/AppStandbyController.java | 3 ++- .../android/os/appbackgroundrestrictioninfo.proto | 1 + .../com/android/systemui/qs/FgsManagerController.kt | 1 + .../android/server/am/AppRestrictionController.java | 4 ++++ 6 files changed, 23 insertions(+), 1 deletion(-) diff --git a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java index ac8b2e2f46dc3..2fcab59cdec76 100644 --- a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java +++ b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java @@ -379,6 +379,11 @@ public class PowerExemptionManager { * @hide */ public static final int REASON_DISALLOW_APPS_CONTROL = 323; + /** + * Active device admin package. + * @hide + */ + public static final int REASON_ACTIVE_DEVICE_ADMIN = 324; /** @hide The app requests out-out. */ public static final int REASON_OPT_OUT_REQUESTED = 1000; @@ -459,6 +464,7 @@ public class PowerExemptionManager { REASON_OPT_OUT_REQUESTED, REASON_DPO_PROTECTED_APP, REASON_DISALLOW_APPS_CONTROL, + REASON_ACTIVE_DEVICE_ADMIN, }) @Retention(RetentionPolicy.SOURCE) public @interface ReasonCode {} @@ -669,6 +675,8 @@ public class PowerExemptionManager { return AppBackgroundRestrictionsInfo.REASON_DPO_PROTECTED_APP; case REASON_DISALLOW_APPS_CONTROL: return AppBackgroundRestrictionsInfo.REASON_DISALLOW_APPS_CONTROL; + case REASON_ACTIVE_DEVICE_ADMIN: + return AppBackgroundRestrictionsInfo.REASON_ACTIVE_DEVICE_ADMIN; default: return AppBackgroundRestrictionsInfo.REASON_DENIED; } @@ -818,6 +826,8 @@ public class PowerExemptionManager { return "DPO_PROTECTED_APP"; case REASON_DISALLOW_APPS_CONTROL: return "DISALLOW_APPS_CONTROL"; + case REASON_ACTIVE_DEVICE_ADMIN: + return "ACTIVE_DEVICE_ADMIN"; case REASON_OPT_OUT_REQUESTED: return "REASON_OPT_OUT_REQUESTED"; default: diff --git a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java index dd0fe95e174e6..88acf65073334 100644 --- a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java +++ b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java @@ -218,6 +218,11 @@ public interface AppStandbyInternal { void setActiveAdminApps(Set adminPkgs, int userId); + /** + * @return {@code true} if the given package is an active device admin app. + */ + boolean isActiveDeviceAdmin(String packageName, int userId); + void onAdminDataAvailable(); void clearCarrierPrivilegedApps(); diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java index c9afdad8e40ed..c1f31e971ec5b 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -1799,7 +1799,8 @@ public class AppStandbyController } @VisibleForTesting - boolean isActiveDeviceAdmin(String packageName, int userId) { + @Override + public boolean isActiveDeviceAdmin(String packageName, int userId) { synchronized (mActiveAdminApps) { final Set adminPkgs = mActiveAdminApps.get(userId); return adminPkgs != null && adminPkgs.contains(packageName); diff --git a/core/proto/android/os/appbackgroundrestrictioninfo.proto b/core/proto/android/os/appbackgroundrestrictioninfo.proto index 5bf8ea79a8ea3..68b5005c031f1 100644 --- a/core/proto/android/os/appbackgroundrestrictioninfo.proto +++ b/core/proto/android/os/appbackgroundrestrictioninfo.proto @@ -176,6 +176,7 @@ message AppBackgroundRestrictionsInfo { REASON_CARRIER_PRIVILEGED_APP = 321; REASON_DPO_PROTECTED_APP = 322; REASON_DISALLOW_APPS_CONTROL = 323; + REASON_ACTIVE_DEVICE_ADMIN = 324; // app requested to be exempt REASON_OPT_OUT_REQUESTED = 1000; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt index e5d7b40032977..8d2b14a60632a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt @@ -462,6 +462,7 @@ class FgsManagerController @Inject constructor( PowerExemptionManager.REASON_DISALLOW_APPS_CONTROL, PowerExemptionManager.REASON_DPO_PROTECTED_APP, PowerExemptionManager.REASON_PROFILE_OWNER, + PowerExemptionManager.REASON_ACTIVE_DEVICE_ADMIN, PowerExemptionManager.REASON_PROC_STATE_PERSISTENT, PowerExemptionManager.REASON_PROC_STATE_PERSISTENT_UI, PowerExemptionManager.REASON_ROLE_DIALER, diff --git a/services/core/java/com/android/server/am/AppRestrictionController.java b/services/core/java/com/android/server/am/AppRestrictionController.java index 6f5d87bab15fe..e37d7b0579861 100644 --- a/services/core/java/com/android/server/am/AppRestrictionController.java +++ b/services/core/java/com/android/server/am/AppRestrictionController.java @@ -55,6 +55,7 @@ import static android.content.Intent.ACTION_SHOW_FOREGROUND_SERVICE_MANAGER; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; import static android.content.pm.PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS; +import static android.os.PowerExemptionManager.REASON_ACTIVE_DEVICE_ADMIN; import static android.os.PowerExemptionManager.REASON_ALLOWLISTED_PACKAGE; import static android.os.PowerExemptionManager.REASON_CARRIER_PRIVILEGED_APP; import static android.os.PowerExemptionManager.REASON_COMPANION_DEVICE_MANAGER; @@ -2777,6 +2778,7 @@ public final class AppRestrictionController { if (packages != null) { final AppOpsManager appOpsManager = mInjector.getAppOpsManager(); final PackageManagerInternal pm = mInjector.getPackageManagerInternal(); + final AppStandbyInternal appStandbyInternal = mInjector.getAppStandbyInternal(); for (String pkg : packages) { if (appOpsManager.checkOpNoThrow(AppOpsManager.OP_ACTIVATE_VPN, uid, pkg) == AppOpsManager.MODE_ALLOWED) { @@ -2794,6 +2796,8 @@ public final class AppRestrictionController { return REASON_SYSTEM_ALLOW_LISTED; } else if (pm.isPackageStateProtected(pkg, userId)) { return REASON_DPO_PROTECTED_APP; + } else if (appStandbyInternal.isActiveDeviceAdmin(pkg, userId)) { + return REASON_ACTIVE_DEVICE_ADMIN; } } }