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

Commit 5f0f6b98 authored by yuemingw's avatar yuemingw
Browse files

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
parent f88dcfad
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -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);
        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);
    }

+26 −3
Original line number Diff line number Diff line
@@ -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<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);

        verify(mFragmentTransaction, never()).add(
+16 −0
Original line number Diff line number Diff line
@@ -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<Integer, CharSequence> 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;
    }
}