diff --git a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java index dabb4ede6e6..b5133d3b320 100644 --- a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java +++ b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java @@ -21,6 +21,7 @@ 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; @@ -30,16 +31,20 @@ import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.UserHandle; +import android.os.UserManager; import android.support.v7.preference.PreferenceScreen; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.applications.LayoutPreference; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import com.android.settings.enterprise.DevicePolicyManagerWrapper; +import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl; import com.android.settingslib.core.AbstractPreferenceController; import java.io.IOException; @@ -52,10 +57,19 @@ public class RemoveAccountPreferenceController extends AbstractPreferenceControl private Account mAccount; private Fragment mParentFragment; private UserHandle mUserHandle; + private DevicePolicyManagerWrapper mDpm; public RemoveAccountPreferenceController(Context context, Fragment parent) { + this(context, parent, new DevicePolicyManagerWrapperImpl( + (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE))); + } + + @VisibleForTesting + RemoveAccountPreferenceController(Context context, Fragment parent, + DevicePolicyManagerWrapper dpm) { super(context); mParentFragment = parent; + mDpm = dpm; } @Override @@ -79,6 +93,12 @@ 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; + } ConfirmRemoveAccountDialog.show(mParentFragment, mAccount, mUserHandle); } diff --git a/src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java b/src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java index babf90e1955..1005fdf3f58 100644 --- a/src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java +++ b/src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java @@ -18,6 +18,7 @@ package com.android.settings.enterprise; import android.annotation.NonNull; import android.content.ComponentName; +import android.content.Intent; import android.os.UserHandle; import android.support.annotation.Nullable; @@ -143,4 +144,11 @@ public interface DevicePolicyManagerWrapper { * @see android.app.admin.DevicePolicyManager#isUninstallInQueue */ boolean isUninstallInQueue(String packageName); + + /** + * Calls {@code DevicePolicyManager.createAdminSupportIntent()}. + * + * @see android.app.admin.DevicePolicyManager#createAdminSupportIntent + */ + Intent createAdminSupportIntent(String restriction); } diff --git a/src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java b/src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java index 7906310682d..965ee248045 100644 --- a/src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java +++ b/src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java @@ -19,6 +19,7 @@ package com.android.settings.enterprise; import android.annotation.NonNull; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; +import android.content.Intent; import android.os.UserHandle; import android.support.annotation.Nullable; @@ -111,4 +112,9 @@ public class DevicePolicyManagerWrapperImpl implements DevicePolicyManagerWrappe public boolean isUninstallInQueue(String packageName) { return mDpm.isUninstallInQueue(packageName); } + + @Override + public Intent createAdminSupportIntent(@NonNull String restriction) { + return mDpm.createAdminSupportIntent(restriction); + } } diff --git a/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java index 93b525398ff..a1eb2d85488 100644 --- a/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java @@ -21,6 +21,7 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -33,17 +34,20 @@ import android.app.Activity; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.UserHandle; +import android.os.UserManager; import android.support.v14.preference.PreferenceFragment; import android.support.v7.preference.PreferenceScreen; import android.widget.Button; import com.android.settings.R; -import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.applications.LayoutPreference; +import com.android.settings.enterprise.DevicePolicyManagerWrapper; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowAccountManager; import com.android.settings.testutils.shadow.ShadowContentResolver; @@ -64,6 +68,8 @@ public class RemoveAccountPreferenceControllerTest { @Mock(answer = RETURNS_DEEP_STUBS) private AccountManager mAccountManager; + @Mock + private DevicePolicyManagerWrapper mDevicePolicyManager; @Mock(answer = RETURNS_DEEP_STUBS) private PreferenceFragment mFragment; @Mock @@ -92,7 +98,8 @@ public class RemoveAccountPreferenceControllerTest { when(mAccountManager.getAuthenticatorTypesAsUser(anyInt())).thenReturn( new AuthenticatorDescription[0]); when(mAccountManager.getAccountsAsUser(anyInt())).thenReturn(new Account[0]); - mController = new RemoveAccountPreferenceController(mContext, mFragment); + mController = new RemoveAccountPreferenceController(mContext, mFragment, + mDevicePolicyManager); } @Test @@ -116,6 +123,18 @@ public class RemoveAccountPreferenceControllerTest { eq(TAG_REMOVE_ACCOUNT_DIALOG)); } + @Test + public void onClick_shouldNotStartConfirmDialogWhenModifyAccountsIsDisallowed() { + when(mFragment.isAdded()).thenReturn(true); + when(mDevicePolicyManager.createAdminSupportIntent(UserManager.DISALLOW_MODIFY_ACCOUNTS)) + .thenReturn(new Intent()); + mController.onClick(null); + + verify(mFragmentTransaction, never()).add( + any(RemoveAccountPreferenceController.ConfirmRemoveAccountDialog.class), + eq(TAG_REMOVE_ACCOUNT_DIALOG)); + } + @Test @Config(shadows = {ShadowAccountManager.class, ShadowContentResolver.class}) public void confirmRemove_shouldRemoveAccount() { @@ -134,4 +153,4 @@ public class RemoveAccountPreferenceControllerTest { verify(mAccountManager).removeAccountAsUser(eq(account), nullable(Activity.class), nullable(AccountManagerCallback.class), nullable(Handler.class), eq(userHandle)); } -} \ No newline at end of file +}