Merge changes Ie07816b7,I1b5aeeee,Id9d50703 into main
* changes: Show disabled add actions in COPE mode Add handling of admin enforced restrictions in Users Settings Refactor multiuser toggle to control user switch feature
This commit is contained in:
committed by
Android (Google) Code Review
commit
ca90cf1fbe
@@ -12661,7 +12661,7 @@
|
||||
<string name="default_print_service_main_switch_title">Use print service</string>
|
||||
|
||||
<!-- Title for multiple users main switch. [CHAR LIMIT=50] -->
|
||||
<string name="multiple_users_main_switch_title">Allow multiple users</string>
|
||||
<string name="multiple_users_main_switch_title">Allow user switch</string>
|
||||
<!-- Search keywords for the "Allow Multiple Users" section in Multiple Users Screen. [CHAR LIMIT=NONE] -->
|
||||
<string name="multiple_users_main_switch_keywords">allow, multiple, user, permit, many</string>
|
||||
<!-- Search keywords for the Users Screen. [CHAR LIMIT=NONE] -->
|
||||
|
@@ -41,17 +41,28 @@ public class AddUserWhenLockedPreferenceController extends TogglePreferenceContr
|
||||
(RestrictedSwitchPreference) preference;
|
||||
if (!isAvailable()) {
|
||||
restrictedSwitchPreference.setVisible(false);
|
||||
} else {
|
||||
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
|
||||
restrictedSwitchPreference.setVisible(true);
|
||||
if (mUserCaps.mDisallowAddUserSetByAdmin) {
|
||||
restrictedSwitchPreference.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
|
||||
} else if (mUserCaps.mDisallowAddUser) {
|
||||
restrictedSwitchPreference.setVisible(false);
|
||||
}
|
||||
} else {
|
||||
restrictedSwitchPreference.setDisabledByAdmin(
|
||||
mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
|
||||
restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
if (!mUserCaps.isAdmin()) {
|
||||
return DISABLED_FOR_USER;
|
||||
} else if (android.multiuser.Flags.newMultiuserSettingsUx()) {
|
||||
return AVAILABLE;
|
||||
} else if (mUserCaps.disallowAddUser() || mUserCaps.disallowAddUserSetByAdmin()) {
|
||||
return DISABLED_FOR_USER;
|
||||
} else {
|
||||
|
@@ -19,12 +19,16 @@ package com.android.settings.users;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Bundle;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.TogglePreferenceController;
|
||||
import com.android.settingslib.RestrictedLockUtils;
|
||||
import com.android.settingslib.RestrictedLockUtilsInternal;
|
||||
import com.android.settingslib.RestrictedSwitchPreference;
|
||||
|
||||
/**
|
||||
* Controls the preference on the user settings screen which determines whether the guest user
|
||||
@@ -43,12 +47,23 @@ public class GuestTelephonyPreferenceController extends TogglePreferenceControll
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
|
||||
|| UserManager.isHeadlessSystemUserMode()) {
|
||||
return DISABLED_FOR_USER;
|
||||
}
|
||||
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
|
||||
if (!mUserCaps.isAdmin()) {
|
||||
return DISABLED_FOR_USER;
|
||||
}
|
||||
return AVAILABLE;
|
||||
} else {
|
||||
if (!mUserCaps.isAdmin() || !mUserCaps.mCanAddGuest) {
|
||||
return DISABLED_FOR_USER;
|
||||
} else {
|
||||
return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
@@ -74,8 +89,31 @@ public class GuestTelephonyPreferenceController extends TogglePreferenceControll
|
||||
public void updateState(Preference preference) {
|
||||
super.updateState(preference);
|
||||
mUserCaps.updateAddUserCapabilities(mContext);
|
||||
preference.setVisible(isAvailable() && mUserCaps.mUserSwitcherEnabled
|
||||
&& mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
|
||||
&& !UserManager.isHeadlessSystemUserMode());
|
||||
final RestrictedSwitchPreference restrictedSwitchPreference =
|
||||
(RestrictedSwitchPreference) preference;
|
||||
restrictedSwitchPreference.setChecked(isChecked());
|
||||
if (!isAvailable()) {
|
||||
restrictedSwitchPreference.setVisible(false);
|
||||
} else {
|
||||
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
|
||||
restrictedSwitchPreference.setVisible(true);
|
||||
final RestrictedLockUtils.EnforcedAdmin disallowRemoveUserAdmin =
|
||||
RestrictedLockUtilsInternal.checkIfRestrictionEnforced(mContext,
|
||||
UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId());
|
||||
if (disallowRemoveUserAdmin != null) {
|
||||
restrictedSwitchPreference.setDisabledByAdmin(disallowRemoveUserAdmin);
|
||||
} else if (mUserCaps.mDisallowAddUserSetByAdmin) {
|
||||
restrictedSwitchPreference.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
|
||||
} else if (mUserCaps.mDisallowAddUser) {
|
||||
// Adding user is restricted by system
|
||||
restrictedSwitchPreference.setVisible(false);
|
||||
}
|
||||
} else {
|
||||
restrictedSwitchPreference.setDisabledByAdmin(
|
||||
mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
|
||||
restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled
|
||||
&& isAvailable());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -57,11 +57,6 @@ public class MultiUserSwitchBarController implements SwitchWidgetController.OnSw
|
||||
mSwitchBar.setDisabledByAdmin(RestrictedLockUtilsInternal
|
||||
.checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_USER_SWITCH,
|
||||
UserHandle.myUserId()));
|
||||
|
||||
} else if (mUserCapabilities.mDisallowAddUser) {
|
||||
mSwitchBar.setDisabledByAdmin(RestrictedLockUtilsInternal
|
||||
.checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_ADD_USER,
|
||||
UserHandle.myUserId()));
|
||||
} else {
|
||||
mSwitchBar.setEnabled(mUserCapabilities.mIsMain);
|
||||
}
|
||||
|
@@ -22,6 +22,7 @@ import android.content.DialogInterface;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.provider.Settings;
|
||||
import android.util.Log;
|
||||
@@ -33,6 +34,8 @@ import androidx.preference.Preference;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||
import com.android.settingslib.RestrictedLockUtils;
|
||||
import com.android.settingslib.RestrictedLockUtilsInternal;
|
||||
import com.android.settingslib.RestrictedSwitchPreference;
|
||||
|
||||
/**
|
||||
@@ -69,12 +72,27 @@ public class RemoveGuestOnExitPreferenceController extends BasePreferenceControl
|
||||
restrictedSwitchPreference.setChecked(isChecked());
|
||||
if (!isAvailable()) {
|
||||
restrictedSwitchPreference.setVisible(false);
|
||||
} else {
|
||||
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
|
||||
restrictedSwitchPreference.setVisible(true);
|
||||
final RestrictedLockUtils.EnforcedAdmin disallowRemoveUserAdmin =
|
||||
RestrictedLockUtilsInternal.checkIfRestrictionEnforced(mContext,
|
||||
UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId());
|
||||
if (disallowRemoveUserAdmin != null) {
|
||||
restrictedSwitchPreference.setDisabledByAdmin(disallowRemoveUserAdmin);
|
||||
} else if (mUserCaps.mDisallowAddUserSetByAdmin) {
|
||||
restrictedSwitchPreference.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
|
||||
} else if (mUserCaps.mDisallowAddUser) {
|
||||
// Adding user is restricted by system
|
||||
restrictedSwitchPreference.setVisible(false);
|
||||
}
|
||||
} else {
|
||||
restrictedSwitchPreference.setDisabledByAdmin(
|
||||
mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
|
||||
restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
@@ -82,6 +100,15 @@ public class RemoveGuestOnExitPreferenceController extends BasePreferenceControl
|
||||
// then disable this controller
|
||||
// also disable this controller for non-admin users
|
||||
// also disable when config_guestUserAllowEphemeralStateChange is false
|
||||
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
|
||||
if (mUserManager.isGuestUserAlwaysEphemeral()
|
||||
|| !UserManager.isGuestUserAllowEphemeralStateChange()
|
||||
|| !mUserCaps.isAdmin()) {
|
||||
return DISABLED_FOR_USER;
|
||||
} else {
|
||||
return AVAILABLE;
|
||||
}
|
||||
} else {
|
||||
if (mUserManager.isGuestUserAlwaysEphemeral()
|
||||
|| !UserManager.isGuestUserAllowEphemeralStateChange()
|
||||
|| !mUserCaps.isAdmin()
|
||||
@@ -92,6 +119,7 @@ public class RemoveGuestOnExitPreferenceController extends BasePreferenceControl
|
||||
return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isChecked() {
|
||||
return Settings.Global.getInt(mContext.getContentResolver(),
|
||||
|
@@ -126,7 +126,11 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
|
||||
mSwitchUserPref.setEnabled(canSwitchUserNow() && mUserCaps.mUserSwitcherEnabled);
|
||||
} else {
|
||||
mSwitchUserPref.setEnabled(canSwitchUserNow());
|
||||
}
|
||||
if (mUserInfo.isGuest() && mGuestUserAutoCreated) {
|
||||
mRemoveUserPref.setEnabled((mUserInfo.flags & UserInfo.FLAG_INITIALIZED) != 0);
|
||||
}
|
||||
@@ -358,7 +362,12 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
|
||||
mSwitchUserPref.setDisabledByAdmin(RestrictedLockUtilsInternal.getDeviceOwner(context));
|
||||
} else {
|
||||
mSwitchUserPref.setDisabledByAdmin(null);
|
||||
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
|
||||
mSwitchUserPref.setEnabled(mUserCaps.mUserSwitcherEnabled);
|
||||
mSwitchUserPref.setSelectable(mUserCaps.mUserSwitcherEnabled);
|
||||
} else {
|
||||
mSwitchUserPref.setSelectable(true);
|
||||
}
|
||||
mSwitchUserPref.setOnPreferenceClickListener(this);
|
||||
}
|
||||
if (mUserInfo.isMain() || mUserInfo.isGuest() || !UserManager.isMultipleAdminEnabled()
|
||||
|
@@ -463,7 +463,8 @@ public class UserSettings extends SettingsPreferenceFragment
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
int pos = 0;
|
||||
if (!isCurrentUserAdmin() && canSwitchUserNow() && !isCurrentUserGuest()) {
|
||||
if (!isCurrentUserAdmin() && (canSwitchUserNow() || Flags.newMultiuserSettingsUx())
|
||||
&& !isCurrentUserGuest()) {
|
||||
String nickname = mUserManager.getUserName();
|
||||
MenuItem removeThisUser = menu.add(0, MENU_REMOVE_USER, pos++,
|
||||
getResources().getString(R.string.user_remove_user_menu, nickname));
|
||||
@@ -1198,6 +1199,13 @@ public class UserSettings extends SettingsPreferenceFragment
|
||||
}
|
||||
|
||||
List<UserInfo> users;
|
||||
if (Flags.newMultiuserSettingsUx()) {
|
||||
// Only users that can be switched to should show up here.
|
||||
// e.g. Managed profiles appear under Accounts Settings instead
|
||||
users = mUserManager.getAliveUsers().stream()
|
||||
.filter(UserInfo::supportsSwitchToByUser)
|
||||
.collect(Collectors.toList());
|
||||
} else {
|
||||
if (mUserCaps.mUserSwitcherEnabled) {
|
||||
// Only users that can be switched to should show up here.
|
||||
// e.g. Managed profiles appear under Accounts Settings instead
|
||||
@@ -1208,6 +1216,7 @@ public class UserSettings extends SettingsPreferenceFragment
|
||||
// Only current user will be displayed in case of multi-user switch is disabled
|
||||
users = List.of(mUserManager.getUserInfo(context.getUserId()));
|
||||
}
|
||||
}
|
||||
|
||||
final ArrayList<Integer> missingIcons = new ArrayList<>();
|
||||
final ArrayList<UserPreference> userPreferences = new ArrayList<>();
|
||||
@@ -1257,7 +1266,10 @@ public class UserSettings extends SettingsPreferenceFragment
|
||||
pref.setSummary(R.string.user_summary_not_set_up);
|
||||
// Disallow setting up user which results in user switching when the
|
||||
// restriction is set.
|
||||
pref.setEnabled(!mUserCaps.mDisallowSwitchUser && canSwitchUserNow());
|
||||
// If newMultiuserSettingsUx flag is enabled, allow opening user details page
|
||||
// since switch to user will be disabled
|
||||
pref.setEnabled((!mUserCaps.mDisallowSwitchUser && canSwitchUserNow())
|
||||
|| Flags.newMultiuserSettingsUx());
|
||||
}
|
||||
} else if (user.isRestricted()) {
|
||||
pref.setSummary(R.string.user_summary_restricted_profile);
|
||||
@@ -1417,17 +1429,23 @@ public class UserSettings extends SettingsPreferenceFragment
|
||||
getContext().getResources(), icon)));
|
||||
pref.setKey(KEY_USER_GUEST);
|
||||
pref.setOrder(Preference.DEFAULT_ORDER);
|
||||
if (mUserCaps.mDisallowSwitchUser) {
|
||||
if (mUserCaps.mDisallowSwitchUser && !Flags.newMultiuserSettingsUx()) {
|
||||
pref.setDisabledByAdmin(
|
||||
RestrictedLockUtilsInternal.getDeviceOwner(context));
|
||||
} else {
|
||||
pref.setDisabledByAdmin(null);
|
||||
}
|
||||
if (Flags.newMultiuserSettingsUx()) {
|
||||
mGuestUserCategory.addPreference(pref);
|
||||
// guest user preference is shown hence also make guest category visible
|
||||
mGuestUserCategory.setVisible(true);
|
||||
} else {
|
||||
if (mUserCaps.mUserSwitcherEnabled) {
|
||||
mGuestUserCategory.addPreference(pref);
|
||||
// guest user preference is shown hence also make guest category visible
|
||||
mGuestUserCategory.setVisible(true);
|
||||
}
|
||||
}
|
||||
isGuestAlreadyCreated = true;
|
||||
}
|
||||
boolean isVisible = updateAddGuestPreference(context, isGuestAlreadyCreated);
|
||||
@@ -1450,10 +1468,11 @@ public class UserSettings extends SettingsPreferenceFragment
|
||||
|
||||
private boolean updateAddGuestPreference(Context context, boolean isGuestAlreadyCreated) {
|
||||
boolean isVisible = false;
|
||||
if (!isGuestAlreadyCreated && mUserCaps.mCanAddGuest
|
||||
if (!isGuestAlreadyCreated && (mUserCaps.mCanAddGuest
|
||||
|| (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUser))
|
||||
&& mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_GUEST)
|
||||
&& WizardManagerHelper.isDeviceProvisioned(context)
|
||||
&& mUserCaps.mUserSwitcherEnabled) {
|
||||
&& (mUserCaps.mUserSwitcherEnabled || Flags.newMultiuserSettingsUx())) {
|
||||
Drawable icon = context.getDrawable(
|
||||
com.android.settingslib.R.drawable.ic_account_circle);
|
||||
mAddGuest.setIcon(centerAndTint(icon));
|
||||
@@ -1466,7 +1485,25 @@ public class UserSettings extends SettingsPreferenceFragment
|
||||
mAddGuest.setEnabled(false);
|
||||
} else {
|
||||
mAddGuest.setTitle(com.android.settingslib.R.string.guest_new_guest);
|
||||
mAddGuest.setEnabled(canSwitchUserNow());
|
||||
if (Flags.newMultiuserSettingsUx()
|
||||
&& mUserCaps.mDisallowAddUserSetByAdmin) {
|
||||
mAddGuest.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
|
||||
} else if (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUser) {
|
||||
final List<UserManager.EnforcingUser> enforcingUsers =
|
||||
mUserManager.getUserRestrictionSources(UserManager.DISALLOW_ADD_USER,
|
||||
UserHandle.of(UserHandle.myUserId()));
|
||||
if (!enforcingUsers.isEmpty()) {
|
||||
final UserManager.EnforcingUser enforcingUser = enforcingUsers.get(0);
|
||||
final int restrictionSource = enforcingUser.getUserRestrictionSource();
|
||||
if (restrictionSource == UserManager.RESTRICTION_SOURCE_SYSTEM) {
|
||||
mAddGuest.setEnabled(false);
|
||||
} else {
|
||||
mAddGuest.setVisible(false);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
mAddGuest.setEnabled(canSwitchUserNow() || Flags.newMultiuserSettingsUx());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
mAddGuest.setVisible(false);
|
||||
@@ -1494,16 +1531,18 @@ public class UserSettings extends SettingsPreferenceFragment
|
||||
|
||||
private void updateAddUserCommon(Context context, RestrictedPreference addUser,
|
||||
boolean canAddRestrictedProfile) {
|
||||
if ((mUserCaps.mCanAddUser && !mUserCaps.mDisallowAddUserSetByAdmin)
|
||||
if ((mUserCaps.mCanAddUser
|
||||
&& !(mUserCaps.mDisallowAddUserSetByAdmin && Flags.newMultiuserSettingsUx()))
|
||||
&& WizardManagerHelper.isDeviceProvisioned(context)
|
||||
&& mUserCaps.mUserSwitcherEnabled) {
|
||||
&& (mUserCaps.mUserSwitcherEnabled || Flags.newMultiuserSettingsUx())) {
|
||||
addUser.setVisible(true);
|
||||
addUser.setSelectable(true);
|
||||
final boolean canAddMoreUsers =
|
||||
mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_SECONDARY)
|
||||
|| (canAddRestrictedProfile
|
||||
&& mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_RESTRICTED));
|
||||
addUser.setEnabled(canAddMoreUsers && !mAddingUser && canSwitchUserNow());
|
||||
addUser.setEnabled(canAddMoreUsers && !mAddingUser
|
||||
&& (canSwitchUserNow() || Flags.newMultiuserSettingsUx()));
|
||||
|
||||
if (!canAddMoreUsers) {
|
||||
addUser.setSummary(getString(R.string.user_add_max_count));
|
||||
@@ -1514,6 +1553,23 @@ public class UserSettings extends SettingsPreferenceFragment
|
||||
addUser.setDisabledByAdmin(
|
||||
mUserCaps.mDisallowAddUser ? mUserCaps.mEnforcedAdmin : null);
|
||||
}
|
||||
} else if (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUserSetByAdmin) {
|
||||
addUser.setVisible(true);
|
||||
addUser.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
|
||||
} else if (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUser) {
|
||||
final List<UserManager.EnforcingUser> enforcingUsers =
|
||||
mUserManager.getUserRestrictionSources(UserManager.DISALLOW_ADD_USER,
|
||||
UserHandle.of(UserHandle.myUserId()));
|
||||
if (!enforcingUsers.isEmpty()) {
|
||||
final UserManager.EnforcingUser enforcingUser = enforcingUsers.get(0);
|
||||
final int restrictionSource = enforcingUser.getUserRestrictionSource();
|
||||
if (restrictionSource == UserManager.RESTRICTION_SOURCE_SYSTEM) {
|
||||
addUser.setVisible(true);
|
||||
addUser.setEnabled(false);
|
||||
} else {
|
||||
addUser.setVisible(false);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
addUser.setVisible(false);
|
||||
}
|
||||
|
@@ -42,9 +42,13 @@ import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.multiuser.Flags;
|
||||
import android.os.Bundle;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.platform.test.annotations.RequiresFlagsEnabled;
|
||||
import android.platform.test.flag.junit.CheckFlagsRule;
|
||||
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
|
||||
import android.telephony.TelephonyManager;
|
||||
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
@@ -63,6 +67,7 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
@@ -123,6 +128,8 @@ public class UserDetailsSettingsTest {
|
||||
private Bundle mArguments;
|
||||
private UserInfo mUserInfo;
|
||||
|
||||
@Rule
|
||||
public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
@@ -244,6 +251,19 @@ public class UserDetailsSettingsTest {
|
||||
verify(mSwitchUserPref).setEnabled(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
@RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
|
||||
public void onResume_UserSwitcherDisabled_shouldDisableSwitchPref() {
|
||||
setupSelectedUser();
|
||||
mUserCapabilities.mUserSwitcherEnabled = false;
|
||||
mFragment.mSwitchUserPref = mSwitchUserPref;
|
||||
mFragment.onAttach(mContext);
|
||||
|
||||
mFragment.onResume();
|
||||
|
||||
verify(mSwitchUserPref).setEnabled(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onResume_switchDisallowed_shouldDisableSwitchPref() {
|
||||
setupSelectedUser();
|
||||
|
@@ -34,6 +34,7 @@ import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.robolectric.Shadows.shadowOf;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
@@ -46,10 +47,15 @@ import android.content.pm.ResolveInfo;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.multiuser.Flags;
|
||||
import android.os.Bundle;
|
||||
import android.os.Looper;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.platform.test.annotations.RequiresFlagsDisabled;
|
||||
import android.platform.test.annotations.RequiresFlagsEnabled;
|
||||
import android.platform.test.flag.junit.CheckFlagsRule;
|
||||
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
|
||||
import android.provider.Settings;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.view.Menu;
|
||||
@@ -75,6 +81,7 @@ import com.android.settingslib.search.SearchIndexableRaw;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.AdditionalMatchers;
|
||||
@@ -142,6 +149,9 @@ public class UserSettingsTest {
|
||||
private UserSettings mFragment;
|
||||
private UserCapabilities mUserCapabilities;
|
||||
|
||||
@Rule
|
||||
public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
@@ -359,6 +369,7 @@ public class UserSettingsTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
|
||||
public void updateUserList_cannotSwitchUser_shouldDisableAddUser() {
|
||||
mUserCapabilities.mCanAddUser = true;
|
||||
doReturn(true).when(mUserManager).canAddMoreUsers(anyString());
|
||||
@@ -374,6 +385,20 @@ public class UserSettingsTest {
|
||||
verify(mAddUserPreference).setSelectable(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
|
||||
public void updateUserList_disallowAddUser_shouldDisableAddUserAndAddGuest() {
|
||||
mUserCapabilities.mDisallowAddUserSetByAdmin = true;
|
||||
doReturn(true).when(mUserManager).canAddMoreUsers(anyString());
|
||||
doReturn(SWITCHABILITY_STATUS_OK)
|
||||
.when(mUserManager).getUserSwitchability();
|
||||
|
||||
mFragment.updateUserList();
|
||||
|
||||
verify(mAddUserPreference).setVisible(true);
|
||||
verify(mAddUserPreference).setDisabledByAdmin(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateUserList_canNotAddMoreUsers_shouldDisableAddUserWithSummary() {
|
||||
mUserCapabilities.mCanAddUser = true;
|
||||
@@ -392,6 +417,7 @@ public class UserSettingsTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
|
||||
public void updateUserList_cannotSwitchUser_shouldDisableAddGuest() {
|
||||
mUserCapabilities.mCanAddGuest = true;
|
||||
doReturn(true)
|
||||
@@ -406,6 +432,54 @@ public class UserSettingsTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
|
||||
public void updateUserList_cannotSwitchUser_shouldKeepPreferencesVisibleAndEnabled() {
|
||||
givenUsers(getAdminUser(true));
|
||||
mUserCapabilities.mCanAddGuest = true;
|
||||
mUserCapabilities.mCanAddUser = true;
|
||||
mUserCapabilities.mDisallowSwitchUser = true;
|
||||
doReturn(true)
|
||||
.when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST));
|
||||
doReturn(true)
|
||||
.when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_SECONDARY));
|
||||
|
||||
mFragment.updateUserList();
|
||||
|
||||
verify(mAddGuestPreference).setVisible(true);
|
||||
verify(mAddGuestPreference).setEnabled(true);
|
||||
verify(mAddUserPreference).setVisible(true);
|
||||
verify(mAddUserPreference).setEnabled(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
|
||||
public void updateUserList_disallowAddUser_shouldShowButDisableAddActions() {
|
||||
givenUsers(getAdminUser(true));
|
||||
mUserCapabilities.mCanAddGuest = true;
|
||||
mUserCapabilities.mCanAddUser = false;
|
||||
mUserCapabilities.mDisallowAddUser = true;
|
||||
mUserCapabilities.mDisallowAddUserSetByAdmin = false;
|
||||
List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>();
|
||||
enforcingUsers.add(new UserManager.EnforcingUser(UserHandle.myUserId(),
|
||||
UserManager.RESTRICTION_SOURCE_SYSTEM));
|
||||
when(mUserManager.getUserRestrictionSources(UserManager.DISALLOW_ADD_USER,
|
||||
UserHandle.of(UserHandle.myUserId()))).thenReturn(enforcingUsers);
|
||||
|
||||
doReturn(true)
|
||||
.when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST));
|
||||
doReturn(true)
|
||||
.when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_SECONDARY));
|
||||
|
||||
mFragment.updateUserList();
|
||||
|
||||
verify(mAddGuestPreference).setVisible(true);
|
||||
verify(mAddGuestPreference).setEnabled(false);
|
||||
verify(mAddUserPreference).setVisible(true);
|
||||
verify(mAddUserPreference).setEnabled(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
@RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
|
||||
public void updateUserList_addUserDisallowedByAdmin_shouldNotShowAddUser() {
|
||||
RestrictedLockUtils.EnforcedAdmin enforcedAdmin = mock(
|
||||
RestrictedLockUtils.EnforcedAdmin.class);
|
||||
@@ -420,6 +494,22 @@ public class UserSettingsTest {
|
||||
verify(mAddUserPreference).setVisible(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
@RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
|
||||
public void updateUserList_addUserDisallowedByAdmin_shouldShowPrefDisabledByAdmin() {
|
||||
RestrictedLockUtils.EnforcedAdmin enforcedAdmin = mock(
|
||||
RestrictedLockUtils.EnforcedAdmin.class);
|
||||
|
||||
mUserCapabilities.mEnforcedAdmin = enforcedAdmin;
|
||||
mUserCapabilities.mCanAddUser = false;
|
||||
mUserCapabilities.mDisallowAddUser = true;
|
||||
mUserCapabilities.mDisallowAddUserSetByAdmin = true;
|
||||
doReturn(true).when(mAddUserPreference).isEnabled();
|
||||
|
||||
mFragment.updateUserList();
|
||||
|
||||
verify(mAddUserPreference).setDisabledByAdmin(enforcedAdmin);
|
||||
}
|
||||
@Test
|
||||
public void updateUserList_cannotAddUserButCanSwitchUser_shouldNotShowAddUser() {
|
||||
mUserCapabilities.mCanAddUser = false;
|
||||
@@ -461,18 +551,31 @@ public class UserSettingsTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateUserList_userSwitcherDisabled_shouldNotShowAddUser() {
|
||||
public void updateUserList_userSwitcherDisabled_shouldShowAddUser() {
|
||||
givenUsers(getAdminUser(true));
|
||||
mUserCapabilities.mCanAddUser = true;
|
||||
mUserCapabilities.mUserSwitcherEnabled = false;
|
||||
|
||||
mFragment.updateUserList();
|
||||
|
||||
verify(mAddUserPreference).setVisible(false);
|
||||
verify(mAddUserPreference).setVisible(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateUserList_userSwitcherDisabled_shouldNotShowAddGuest() {
|
||||
public void updateUserList_userSwitcherDisabled_shouldShowAddGuest() {
|
||||
givenUsers(getAdminUser(true));
|
||||
mUserCapabilities.mCanAddGuest = true;
|
||||
mUserCapabilities.mUserSwitcherEnabled = false;
|
||||
doReturn(true)
|
||||
.when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST));
|
||||
|
||||
mFragment.updateUserList();
|
||||
|
||||
verify(mAddGuestPreference).setVisible(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateUserList_userSwitcherDisabledCannotAddMoreGuests_shouldNotShowAddGuest() {
|
||||
givenUsers(getAdminUser(true));
|
||||
mUserCapabilities.mCanAddGuest = true;
|
||||
mUserCapabilities.mUserSwitcherEnabled = false;
|
||||
@@ -533,18 +636,18 @@ public class UserSettingsTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateUserList_existingSecondaryUser_shouldAddOnlyCurrUser_MultiUserIsDisabled() {
|
||||
public void updateUserList_existingSecondaryUser_shouldAddAllUsers_MultiUserIsDisabled() {
|
||||
givenUsers(getAdminUser(true), getSecondaryUser(false));
|
||||
mUserCapabilities.mUserSwitcherEnabled = false;
|
||||
|
||||
mFragment.updateUserList();
|
||||
|
||||
ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
|
||||
verify(mFragment.mUserListCategory, times(1))
|
||||
verify(mFragment.mUserListCategory, times(2))
|
||||
.addPreference(captor.capture());
|
||||
|
||||
List<UserPreference> userPrefs = captor.getAllValues();
|
||||
assertThat(userPrefs.size()).isEqualTo(1);
|
||||
assertThat(userPrefs.size()).isEqualTo(2);
|
||||
assertThat(userPrefs.get(0)).isSameInstanceAs(mMePreference);
|
||||
}
|
||||
|
||||
@@ -631,6 +734,7 @@ public class UserSettingsTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
|
||||
public void updateUserList_uninitializedUserAndCanNotSwitchUser_shouldDisablePref() {
|
||||
UserInfo uninitializedUser = getSecondaryUser(false);
|
||||
removeFlag(uninitializedUser, UserInfo.FLAG_INITIALIZED);
|
||||
|
Reference in New Issue
Block a user