package com.android.settings;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
+
import org.xmlpull.v1.XmlPullParserException;
import android.app.Activity;
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";
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
-
+ getWindow().addPrivateFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
mHandler = new Handler(getMainLooper());
mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
finish();
return;
}
-
+
ActivityInfo ai;
try {
ai = getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
finish();
return;
}
-
+
+ // 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),
+ 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 {
}
});
}
-
+
@Override
protected void onResume() {
super.onResume();
+ mActionButton.setEnabled(true);
updateInterface();
}
-
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ mActionButton.setEnabled(false);
+ }
+
@Override
protected Dialog onCreateDialog(int id, Bundle args) {
switch (id) {