Remove account should show policy transparency dialog when DISALLOW_MODIFY_ACCOUNTS

is set.

createAdminIntentSupport always checks user restrictions on user 0(
if called from system uid) so can't be used here when account could
be work profile account.

Bug: 70674230
Test: m -j RunSettingsRobotests
Change-Id: Ibd2df8891d9fa7b4c85c42a305c5db2acd4c829b
This commit is contained in:
yuemingw
2018-03-12 16:38:50 +00:00
parent f88dcfadbb
commit 5f0f6b9831
3 changed files with 53 additions and 9 deletions

View File

@@ -21,11 +21,11 @@ import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture; import android.accounts.AccountManagerFuture;
import android.accounts.AuthenticatorException; import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException; import android.accounts.OperationCanceledException;
import android.app.admin.DevicePolicyManager;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.app.Fragment; import android.app.Fragment;
import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
@@ -44,6 +44,8 @@ import com.android.settings.applications.LayoutPreference;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.wrapper.DevicePolicyManagerWrapper; import com.android.settings.wrapper.DevicePolicyManagerWrapper;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import java.io.IOException; import java.io.IOException;
@@ -92,12 +94,15 @@ public class RemoveAccountPreferenceController extends AbstractPreferenceControl
@Override @Override
public void onClick(View v) { public void onClick(View v) {
final Intent intent = mDpm.createAdminSupportIntent(UserManager.DISALLOW_MODIFY_ACCOUNTS); if (mUserHandle != null) {
if (intent != null) { final EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(mContext,
// DISALLOW_MODIFY_ACCOUNTS is active, show admin support dialog UserManager.DISALLOW_MODIFY_ACCOUNTS, mUserHandle.getIdentifier());
mContext.startActivity(intent); if (admin != null) {
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext, admin);
return; return;
} }
}
ConfirmRemoveAccountDialog.show(mParentFragment, mAccount, mUserHandle); ConfirmRemoveAccountDialog.show(mParentFragment, mAccount, mUserHandle);
} }

View File

@@ -32,8 +32,8 @@ import android.accounts.AuthenticatorDescription;
import android.app.Activity; import android.app.Activity;
import android.app.FragmentManager; import android.app.FragmentManager;
import android.app.FragmentTransaction; import android.app.FragmentTransaction;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.UserHandle; import android.os.UserHandle;
@@ -48,8 +48,13 @@ import com.android.settings.applications.LayoutPreference;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowAccountManager; import com.android.settings.testutils.shadow.ShadowAccountManager;
import com.android.settings.testutils.shadow.ShadowContentResolver; import com.android.settings.testutils.shadow.ShadowContentResolver;
import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.wrapper.DevicePolicyManagerWrapper; import com.android.settings.wrapper.DevicePolicyManagerWrapper;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -60,6 +65,11 @@ import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication; import org.robolectric.shadows.ShadowApplication;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(
shadows = {
ShadowUserManager.class,
ShadowDevicePolicyManager.class
})
public class RemoveAccountPreferenceControllerTest { public class RemoveAccountPreferenceControllerTest {
private static final String KEY_REMOVE_ACCOUNT = "remove_account"; private static final String KEY_REMOVE_ACCOUNT = "remove_account";
@@ -125,8 +135,21 @@ public class RemoveAccountPreferenceControllerTest {
@Test @Test
public void onClick_shouldNotStartConfirmDialogWhenModifyAccountsIsDisallowed() { public void onClick_shouldNotStartConfirmDialogWhenModifyAccountsIsDisallowed() {
when(mFragment.isAdded()).thenReturn(true); when(mFragment.isAdded()).thenReturn(true);
when(mDevicePolicyManager.createAdminSupportIntent(UserManager.DISALLOW_MODIFY_ACCOUNTS))
.thenReturn(new Intent()); final int userId = UserHandle.myUserId();
mController.init(new Account("test", "test"), UserHandle.of(userId));
List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>();
enforcingUsers.add(new UserManager.EnforcingUser(userId,
UserManager.RESTRICTION_SOURCE_DEVICE_OWNER));
ComponentName componentName = new ComponentName("test", "test");
// Ensure that RestrictedLockUtils.checkIfRestrictionEnforced doesn't return null.
ShadowUserManager.getShadow().setUserRestrictionSources(
UserManager.DISALLOW_MODIFY_ACCOUNTS,
UserHandle.of(userId),
enforcingUsers);
ShadowDevicePolicyManager.getShadow().setDeviceOwnerComponentOnAnyUser(componentName);
mController.onClick(null); mController.onClick(null);
verify(mFragmentTransaction, never()).add( verify(mFragmentTransaction, never()).add(

View File

@@ -5,12 +5,14 @@ import android.annotation.Nullable;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.ComponentName; import android.content.ComponentName;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements; import org.robolectric.annotation.Implements;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import org.robolectric.shadow.api.Shadow;
/** /**
* This shadow if using {@link ShadowDevicePolicyManagerWrapper} is not possible. * This shadow if using {@link ShadowDevicePolicyManagerWrapper} is not possible.
@@ -19,6 +21,7 @@ import java.util.Objects;
public class ShadowDevicePolicyManager extends org.robolectric.shadows.ShadowDevicePolicyManager { public class ShadowDevicePolicyManager extends org.robolectric.shadows.ShadowDevicePolicyManager {
private Map<Integer, CharSequence> mSupportMessagesMap = new HashMap<>(); private Map<Integer, CharSequence> mSupportMessagesMap = new HashMap<>();
private boolean mIsAdminActiveAsUser = false; private boolean mIsAdminActiveAsUser = false;
ComponentName mDeviceOwnerComponentName;
public void setShortSupportMessageForUser(ComponentName admin, int userHandle, String message) { public void setShortSupportMessageForUser(ComponentName admin, int userHandle, String message) {
mSupportMessagesMap.put(Objects.hash(admin, userHandle), message); mSupportMessagesMap.put(Objects.hash(admin, userHandle), message);
@@ -38,4 +41,17 @@ public class ShadowDevicePolicyManager extends org.robolectric.shadows.ShadowDev
public void setIsAdminActiveAsUser(boolean active) { public void setIsAdminActiveAsUser(boolean active) {
mIsAdminActiveAsUser = active; mIsAdminActiveAsUser = active;
} }
public static ShadowDevicePolicyManager getShadow() {
return (ShadowDevicePolicyManager) Shadow.extract(
RuntimeEnvironment.application.getSystemService(DevicePolicyManager.class));
}
public ComponentName getDeviceOwnerComponentOnAnyUser() {
return mDeviceOwnerComponentName;
}
public void setDeviceOwnerComponentOnAnyUser(ComponentName admin) {
mDeviceOwnerComponentName = admin;
}
} }