From ed9fa2ca3c9d0ed5f656a6aca459acf6f170660d Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Wed, 10 Feb 2016 16:35:08 -0800 Subject: [PATCH] If package has no active admins, just uninstall right away Also fix the bug where removeAdminArtifacts() is called for all active admins on the target user. Bug 27107878 Change-Id: I6edbdadffe8c75628539976d304e39d6abed73a4 --- .../DevicePolicyManagerService.java | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 2ed96c606dc9d..30b0a7662c37b 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -8498,26 +8498,32 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mPackagesToRemove.add(packageUserPair); } - final List activeAdminsList = getActiveAdmins(userId); - if (activeAdminsList == null || activeAdminsList.size() == 0) { - startUninstallIntent(packageName, userId); - return; - } + // All active admins on the user. + final List allActiveAdmins = getActiveAdmins(userId); - for (ComponentName activeAdmin : activeAdminsList) { - if (packageName.equals(activeAdmin.getPackageName())) { - removeActiveAdmin(activeAdmin, userId); + // Active admins in the target package. + final List packageActiveAdmins = new ArrayList<>(); + if (allActiveAdmins != null) { + for (ComponentName activeAdmin : allActiveAdmins) { + if (packageName.equals(activeAdmin.getPackageName())) { + packageActiveAdmins.add(activeAdmin); + removeActiveAdmin(activeAdmin, userId); + } } } - mHandler.postDelayed(new Runnable() { - @Override - public void run() { - for (ComponentName activeAdmin : activeAdminsList) { - removeAdminArtifacts(activeAdmin, userId); + if (packageActiveAdmins.size() == 0) { + startUninstallIntent(packageName, userId); + } else { + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + for (ComponentName activeAdmin : packageActiveAdmins) { + removeAdminArtifacts(activeAdmin, userId); + } + startUninstallIntent(packageName, userId); } - startUninstallIntent(packageName, userId); - } - }, DEVICE_ADMIN_DEACTIVATE_TIMEOUT); // Start uninstall after timeout anyway. + }, DEVICE_ADMIN_DEACTIVATE_TIMEOUT); // Start uninstall after timeout anyway. + } } private void removePackageIfRequired(final String packageName, final int userId) {