Allow Device Admins to refresh (re-request) activation

* ACTION_ADD_DEVICE_ADMIN now works on already-added admins

Bug: 3253179
Change-Id: I2090339c1fb61295e728bc61ca977ff6028a68dd
This commit is contained in:
Andy Stadler
2010-12-08 15:57:18 -08:00
parent 72aa19d1a5
commit 5cc0e4152b

View File

@@ -81,6 +81,7 @@ public class DeviceAdminAdd extends Activity {
final ArrayList<View> mActivePolicies = new ArrayList<View>();
boolean mAdding;
boolean mRefreshing;
@Override
protected void onCreate(Bundle icicle) {
@@ -91,7 +92,7 @@ public class DeviceAdminAdd extends Activity {
mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
Log.w(TAG, "Can now start ADD_DEVICE_ADMIN as a new task");
Log.w(TAG, "Cannot start ADD_DEVICE_ADMIN as a new task");
finish();
return;
}
@@ -103,20 +104,10 @@ public class DeviceAdminAdd extends Activity {
finish();
return;
}
if (DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN.equals(getIntent().getAction())) {
// If this was an add request, then just exit immediately if the
// given component is already added.
if (mDPM.isAdminActive(cn)) {
setResult(Activity.RESULT_OK);
finish();
return;
}
}
ActivityInfo ai;
try {
ai = getPackageManager().getReceiverInfo(cn,
PackageManager.GET_META_DATA);
ai = getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, "Unable to retrieve device policy " + cn, e);
finish();
@@ -137,8 +128,29 @@ public class DeviceAdminAdd extends Activity {
return;
}
mAddMsgText = getIntent().getCharSequenceExtra(
DevicePolicyManager.EXTRA_ADD_EXPLANATION);
// This admin already exists, an we have two options at this point. If new policy
// bits are set, show the user the new list. If nothing has changed, simply return
// "OK" immediately.
if (DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN.equals(getIntent().getAction())) {
mRefreshing = false;
if (mDPM.isAdminActive(cn)) {
ArrayList<DeviceAdminInfo.PolicyInfo> newPolicies = mDeviceAdmin.getUsedPolicies();
for (int i = 0; i < newPolicies.size(); i++) {
DeviceAdminInfo.PolicyInfo pi = newPolicies.get(i);
if (!mDPM.hasGrantedPolicy(cn, pi.ident)) {
mRefreshing = true;
break;
}
}
if (!mRefreshing) {
// Nothing changed (or policies were removed) - return immediately
setResult(Activity.RESULT_OK);
finish();
return;
}
}
}
mAddMsgText = getIntent().getCharSequenceExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION);
setContentView(R.layout.device_admin_add);
@@ -170,7 +182,7 @@ public class DeviceAdminAdd extends Activity {
public void onClick(View v) {
if (mAdding) {
try {
mDPM.setActiveAdmin(mDeviceAdmin.getComponent());
mDPM.setActiveAdmin(mDeviceAdmin.getComponent(), mRefreshing);
setResult(Activity.RESULT_OK);
} catch (RuntimeException e) {
// Something bad happened... could be that it was
@@ -260,7 +272,7 @@ public class DeviceAdminAdd extends Activity {
} else {
mAddMsg.setVisibility(View.GONE);
}
if (mDPM.isAdminActive(mDeviceAdmin.getComponent())) {
if (!mRefreshing && mDPM.isAdminActive(mDeviceAdmin.getComponent())) {
if (mActivePolicies.size() == 0) {
ArrayList<DeviceAdminInfo.PolicyInfo> policies = mDeviceAdmin.getUsedPolicies();
for (int i=0; i<policies.size(); i++) {