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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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(
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user