Ensure all active Device Admins are listed.

Bug: 9074296
Change-Id: Ifb70c12ccea6628042b98a18186816887cb4477b
This commit is contained in:
Alex Klyubin
2013-05-22 09:06:35 -07:00
parent 0b2781ae53
commit d14258e50e

View File

@@ -43,8 +43,10 @@ import android.widget.TextView;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
public class DeviceAdminSettings extends ListFragment { public class DeviceAdminSettings extends ListFragment {
static final String TAG = "DeviceAdminSettings"; static final String TAG = "DeviceAdminSettings";
@@ -91,8 +93,33 @@ public class DeviceAdminSettings extends ListFragment {
List<ResolveInfo> avail = getActivity().getPackageManager().queryBroadcastReceivers( List<ResolveInfo> avail = getActivity().getPackageManager().queryBroadcastReceivers(
new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED), new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
PackageManager.GET_META_DATA | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS); PackageManager.GET_META_DATA | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS);
int count = avail == null ? 0 : avail.size(); if (avail == null) {
for (int i=0; i<count; i++) { avail = Collections.emptyList();
}
// Some admins listed in mActiveAdmins may not have been found by the above query.
// We thus add them separately.
Set<ComponentName> activeAdminsNotInAvail = new HashSet<ComponentName>(mActiveAdmins);
for (ResolveInfo ri : avail) {
ComponentName riComponentName =
new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name);
activeAdminsNotInAvail.remove(riComponentName);
}
if (!activeAdminsNotInAvail.isEmpty()) {
avail = new ArrayList<ResolveInfo>(avail);
PackageManager packageManager = getActivity().getPackageManager();
for (ComponentName unlistedActiveAdmin : activeAdminsNotInAvail) {
List<ResolveInfo> resolved = packageManager.queryBroadcastReceivers(
new Intent().setComponent(unlistedActiveAdmin),
PackageManager.GET_META_DATA
| PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS);
if (resolved != null) {
avail.addAll(resolved);
}
}
}
for (int i = 0, count = avail.size(); i < count; i++) {
ResolveInfo ri = avail.get(i); ResolveInfo ri = avail.get(i);
try { try {
DeviceAdminInfo dpi = new DeviceAdminInfo(getActivity(), ri); DeviceAdminInfo dpi = new DeviceAdminInfo(getActivity(), ri);