Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7072a82a authored by Philipp Weiß's avatar Philipp Weiß Committed by Android (Google) Code Review
Browse files

Merge "When Remove Account is disallowed, show dialog"

parents 3c5a5375 7a34e9c2
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -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);
    }

+8 −0
Original line number Diff line number Diff line
@@ -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);
}
+6 −0
Original line number Diff line number Diff line
@@ -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);
    }
}
+22 −3
Original line number Diff line number Diff line
@@ -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() {