diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/settings/DeviceAdminAdd.java | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/src/com/android/settings/DeviceAdminAdd.java b/src/com/android/settings/DeviceAdminAdd.java index b2145b0..27e7a54 100644 --- a/src/com/android/settings/DeviceAdminAdd.java +++ b/src/com/android/settings/DeviceAdminAdd.java @@ -50,6 +50,8 @@ import android.widget.TextView; import java.io.IOException; import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; public class DeviceAdminAdd extends Activity { static final String TAG = "DeviceAdminAdd"; @@ -104,7 +106,7 @@ public class DeviceAdminAdd extends Activity { finish(); return; } - + ActivityInfo ai; try { ai = getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA); @@ -113,7 +115,37 @@ public class DeviceAdminAdd extends Activity { finish(); return; } - + + // Make sure the given component name is actually a valid device admin. + List<ResolveInfo> avail = getPackageManager().queryBroadcastReceivers( + new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED), + PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS); + int count = avail == null ? 0 : avail.size(); + boolean found = false; + for (int i=0; i<count; i++) { + ResolveInfo ri = avail.get(i); + if (ai.packageName.equals(ri.activityInfo.packageName) + && ai.name.equals(ri.activityInfo.name)) { + try { + // We didn't retrieve the meta data for all possible matches, so + // need to use the activity info of this specific one that was retrieved. + ri.activityInfo = ai; + DeviceAdminInfo dpi = new DeviceAdminInfo(this, ri); + found = true; + } catch (XmlPullParserException e) { + Log.w(TAG, "Bad " + ri.activityInfo, e); + } catch (IOException e) { + Log.w(TAG, "Bad " + ri.activityInfo, e); + } + break; + } + } + if (!found) { + Log.w(TAG, "Request to add invalid device admin: " + cn); + finish(); + return; + } + ResolveInfo ri = new ResolveInfo(); ri.activityInfo = ai; try { |