From 3dddd8cbff8c8153363373ebe9911d67f0e50bcd Mon Sep 17 00:00:00 2001 From: Alex Klyubin Date: Wed, 22 May 2013 09:06:35 -0700 Subject: [PATCH] Ensure all active Device Admins are listed. Bug: 9074296 (cherry picked from commit d14258e50efc3677abef3cd204b67e7f26e47b56) Conflicts: src/com/android/settings/DeviceAdminSettings.java Changes made to make the cherry-pick apply: * Dropped PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS in the PackageManager.queryBroadcastReceivers invocation. The above flag was introduced in API Level 18. Change-Id: I65596c49bedad7e39ceb1785859c129db1e3e6d7 --- .../android/settings/DeviceAdminSettings.java | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/DeviceAdminSettings.java b/src/com/android/settings/DeviceAdminSettings.java index 310aae7cd15..da84f433fcf 100644 --- a/src/com/android/settings/DeviceAdminSettings.java +++ b/src/com/android/settings/DeviceAdminSettings.java @@ -43,8 +43,10 @@ import android.widget.TextView; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Set; public class DeviceAdminSettings extends ListFragment { static final String TAG = "DeviceAdminSettings"; @@ -86,8 +88,32 @@ public class DeviceAdminSettings extends ListFragment { List avail = getActivity().getPackageManager().queryBroadcastReceivers( new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED), PackageManager.GET_META_DATA); - int count = avail == null ? 0 : avail.size(); - for (int i=0; i activeAdminsNotInAvail = new HashSet(mActiveAdmins); + for (ResolveInfo ri : avail) { + ComponentName riComponentName = + new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name); + activeAdminsNotInAvail.remove(riComponentName); + } + if (!activeAdminsNotInAvail.isEmpty()) { + avail = new ArrayList(avail); + PackageManager packageManager = getActivity().getPackageManager(); + for (ComponentName unlistedActiveAdmin : activeAdminsNotInAvail) { + List resolved = packageManager.queryBroadcastReceivers( + new Intent().setComponent(unlistedActiveAdmin), + PackageManager.GET_META_DATA); + if (resolved != null) { + avail.addAll(resolved); + } + } + } + + for (int i = 0, count = avail.size(); i < count; i++) { ResolveInfo ri = avail.get(i); try { DeviceAdminInfo dpi = new DeviceAdminInfo(getActivity(), ri);