From 061669815aafec829881f91dcf278f7c093f8d44 Mon Sep 17 00:00:00 2001 From: Tetiana Meronyk Date: Wed, 31 Jul 2024 13:55:10 +0000 Subject: [PATCH] Fix toggle when no_user_switch is applied without EnforcedAdmin If EnforcedAdmin is null, calling setDisabledByEnforcedAdmin does not disable the setting. So if this restriction was applied by a source different than admin, the toggle was still active for users to change (even non-main). After this change, the restriction is correctly processed both when it is applied by admin or by some other source. Bug: 356387759 Test: atest MultiUserSwitchBarControllerTest Flag: android.multiuser.fix_disabling_of_mu_toggle_when_restriction_applied Change-Id: I5d38e250359ccbee67ac747f1d8a0a2143f4c216 --- .../users/MultiUserSwitchBarController.java | 22 +++++-- .../MultiUserSwitchBarControllerTest.java | 57 ++++++++++++++++++- 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/users/MultiUserSwitchBarController.java b/src/com/android/settings/users/MultiUserSwitchBarController.java index 641ae51c9e3..07c03d716c3 100644 --- a/src/com/android/settings/users/MultiUserSwitchBarController.java +++ b/src/com/android/settings/users/MultiUserSwitchBarController.java @@ -17,6 +17,7 @@ package com.android.settings.users; import android.content.Context; +import android.multiuser.Flags; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -25,6 +26,7 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; import com.android.settings.widget.SwitchWidgetController; +import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; @@ -53,12 +55,24 @@ public class MultiUserSwitchBarController implements SwitchWidgetController.OnSw mUserCapabilities = UserCapabilities.create(context); mSwitchBar.setChecked(mUserCapabilities.mUserSwitcherEnabled); - if (mUserCapabilities.mDisallowSwitchUser) { - mSwitchBar.setDisabledByAdmin(RestrictedLockUtilsInternal + if (Flags.fixDisablingOfMuToggleWhenRestrictionApplied()) { + RestrictedLockUtils.EnforcedAdmin enforcedAdmin = RestrictedLockUtilsInternal .checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_USER_SWITCH, - UserHandle.myUserId())); + UserHandle.myUserId()); + if (enforcedAdmin != null) { + mSwitchBar.setDisabledByAdmin(enforcedAdmin); + } else { + mSwitchBar.setEnabled(mUserCapabilities.mIsMain + && !mUserCapabilities.mDisallowSwitchUser); + } } else { - mSwitchBar.setEnabled(mUserCapabilities.mIsMain); + if (mUserCapabilities.mDisallowSwitchUser) { + mSwitchBar.setDisabledByAdmin(RestrictedLockUtilsInternal + .checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_USER_SWITCH, + UserHandle.myUserId())); + } else { + mSwitchBar.setEnabled(mUserCapabilities.mIsMain); + } } mSwitchBar.setListener(this); } diff --git a/tests/robotests/src/com/android/settings/users/MultiUserSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/users/MultiUserSwitchBarControllerTest.java index bfab257e44a..58288a58589 100644 --- a/tests/robotests/src/com/android/settings/users/MultiUserSwitchBarControllerTest.java +++ b/tests/robotests/src/com/android/settings/users/MultiUserSwitchBarControllerTest.java @@ -23,28 +23,40 @@ import static org.mockito.Mockito.verify; import android.content.Context; import android.content.pm.UserInfo; +import android.multiuser.Flags; 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 com.android.settings.testutils.shadow.ShadowDevicePolicyManager; import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settings.widget.SwitchWidgetController; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import java.util.ArrayList; +import java.util.List; + @RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowUserManager.class}) +@Config(shadows = {ShadowUserManager.class, ShadowDevicePolicyManager.class}) public class MultiUserSwitchBarControllerTest { private Context mContext; private ShadowUserManager mUserManager; private SwitchWidgetController mSwitchWidgetController; + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); @Before public void setUp() { @@ -60,6 +72,7 @@ public class MultiUserSwitchBarControllerTest { } @Test + @RequiresFlagsDisabled({Flags.FLAG_FIX_DISABLING_OF_MU_TOGGLE_WHEN_RESTRICTION_APPLIED}) public void onStart_disallowUserSwitch_shouldSetDisabledByAdmin() { mUserManager.setUserRestriction(UserHandle.of(UserHandle.myUserId()), UserManager.DISALLOW_USER_SWITCH, true); @@ -70,6 +83,48 @@ public class MultiUserSwitchBarControllerTest { verify(mSwitchWidgetController).setDisabledByAdmin(any()); } + @Test + @RequiresFlagsEnabled({Flags.FLAG_FIX_DISABLING_OF_MU_TOGGLE_WHEN_RESTRICTION_APPLIED}) + public void onStart_disallowUserSwitchEnforcedByAdmin_shouldSetDisabledByAdminUnchecked() { + int userId = UserHandle.myUserId(); + List enforcingUsers = new ArrayList<>(); + enforcingUsers.add(new UserManager.EnforcingUser(userId, + UserManager.RESTRICTION_SOURCE_DEVICE_OWNER)); + // Ensure that RestrictedLockUtils.checkIfRestrictionEnforced doesn't return null. + ShadowUserManager.getShadow().setUserRestrictionSources( + UserManager.DISALLOW_USER_SWITCH, + UserHandle.of(userId), + enforcingUsers); + + new MultiUserSwitchBarController(mContext, mSwitchWidgetController, null); + verify(mSwitchWidgetController).setChecked(false); + verify(mSwitchWidgetController).setDisabledByAdmin(any()); + } + + @Test + @RequiresFlagsEnabled({Flags.FLAG_FIX_DISABLING_OF_MU_TOGGLE_WHEN_RESTRICTION_APPLIED}) + public void onStart_disallowUserSwitch_userNotMain_shouldSetDisabledUnchecked() { + mUserManager.setUserRestriction(UserHandle.of(UserHandle.myUserId()), + UserManager.DISALLOW_USER_SWITCH, true); + new MultiUserSwitchBarController(mContext, mSwitchWidgetController, null); + + verify(mSwitchWidgetController).setChecked(false); + verify(mSwitchWidgetController).setEnabled(false); + verify(mSwitchWidgetController, never()).setDisabledByAdmin(any()); + } + + @Test + @RequiresFlagsEnabled({Flags.FLAG_FIX_DISABLING_OF_MU_TOGGLE_WHEN_RESTRICTION_APPLIED}) + public void onStart_allowUserSwitch_notMainUser_shouldSetDisabled() { + mUserManager.setUserRestriction(UserHandle.of(UserHandle.myUserId()), + UserManager.DISALLOW_USER_SWITCH, false); + mUserManager.addUser(10, "Test", UserInfo.FLAG_ADMIN); + mUserManager.switchUser(10); + new MultiUserSwitchBarController(mContext, mSwitchWidgetController, null); + + verify(mSwitchWidgetController).setEnabled(false); + } + @Test public void onStart_allowUserSwitch_shouldNotSetDisabledByAdmin() { mUserManager.setUserRestriction(UserHandle.of(UserHandle.myUserId()),