diff --git a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java index 068847f00a5..98ab504432a 100644 --- a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java +++ b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java @@ -21,11 +21,11 @@ import android.accounts.AccountManagerCallback; import android.accounts.AccountManagerFuture; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; -import android.app.admin.DevicePolicyManager; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.Fragment; +import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.DialogInterface; 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.instrumentation.InstrumentedDialogFragment; import com.android.settings.wrapper.DevicePolicyManagerWrapper; +import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.core.AbstractPreferenceController; import java.io.IOException; @@ -92,12 +94,15 @@ public class RemoveAccountPreferenceController extends AbstractPreferenceControl @Override public void onClick(View v) { - final Intent intent = mDpm.createAdminSupportIntent(UserManager.DISALLOW_MODIFY_ACCOUNTS); - if (intent != null) { - // DISALLOW_MODIFY_ACCOUNTS is active, show admin support dialog - mContext.startActivity(intent); - return; + if (mUserHandle != null) { + final EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(mContext, + UserManager.DISALLOW_MODIFY_ACCOUNTS, mUserHandle.getIdentifier()); + if (admin != null) { + RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext, admin); + return; + } } + ConfirmRemoveAccountDialog.show(mParentFragment, mAccount, mUserHandle); } diff --git a/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java index 6020277f932..3df7c9d8b11 100644 --- a/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java @@ -32,8 +32,8 @@ import android.accounts.AuthenticatorDescription; import android.app.Activity; import android.app.FragmentManager; import android.app.FragmentTransaction; +import android.content.ComponentName; import android.content.Context; -import android.content.Intent; import android.os.Bundle; import android.os.Handler; 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.shadow.ShadowAccountManager; 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 java.util.ArrayList; +import java.util.List; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -60,6 +65,11 @@ import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; @RunWith(SettingsRobolectricTestRunner.class) +@Config( + shadows = { + ShadowUserManager.class, + ShadowDevicePolicyManager.class + }) public class RemoveAccountPreferenceControllerTest { private static final String KEY_REMOVE_ACCOUNT = "remove_account"; @@ -125,8 +135,21 @@ public class RemoveAccountPreferenceControllerTest { @Test public void onClick_shouldNotStartConfirmDialogWhenModifyAccountsIsDisallowed() { 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 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); verify(mFragmentTransaction, never()).add( diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowDevicePolicyManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowDevicePolicyManager.java index 77daae00c5a..7e2c3cc7e43 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowDevicePolicyManager.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowDevicePolicyManager.java @@ -5,12 +5,14 @@ import android.annotation.Nullable; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; +import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import java.util.HashMap; import java.util.Map; import java.util.Objects; +import org.robolectric.shadow.api.Shadow; /** * 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 { private Map mSupportMessagesMap = new HashMap<>(); private boolean mIsAdminActiveAsUser = false; + ComponentName mDeviceOwnerComponentName; public void setShortSupportMessageForUser(ComponentName admin, int userHandle, String 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) { 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; + } }