OSDN Git Service

Permit deactivation of malformed Device Admins.
authorAlex Klyubin <klyubin@google.com>
Thu, 6 Jun 2013 21:56:24 +0000 (14:56 -0700)
committerAlex Klyubin <klyubin@google.com>
Thu, 6 Jun 2013 21:56:24 +0000 (14:56 -0700)
Bug: 9074296
Change-Id: I4a3b2f972cb297b9f985a762219c8d67d8e3a425

src/com/android/settings/DeviceAdminAdd.java

index c0d615c..f668a63 100644 (file)
@@ -116,34 +116,38 @@ public class DeviceAdminAdd extends Activity {
             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),
-                0);
-        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);
+        // When activating, make sure the given component name is actually a valid device admin.
+        // No need to check this when deactivating, because it is safe to deactivate an active
+        // invalid device admin.
+        if (!mDPM.isAdminActive(cn)) {
+            List<ResolveInfo> avail = getPackageManager().queryBroadcastReceivers(
+                    new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
+                    0);
+            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;
                 }
-                break;
             }
-        }
-        if (!found) {
-            Log.w(TAG, "Request to add invalid device admin: " + cn);
-            finish();
-            return;
+            if (!found) {
+                Log.w(TAG, "Request to add invalid device admin: " + cn);
+                finish();
+                return;
+            }
         }
 
         ResolveInfo ri = new ResolveInfo();