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

Commit 06166981 authored by Tetiana Meronyk's avatar Tetiana Meronyk
Browse files

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
parent d21dec33
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -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,6 +55,17 @@ public class MultiUserSwitchBarController implements SwitchWidgetController.OnSw
        mUserCapabilities = UserCapabilities.create(context);
        mSwitchBar.setChecked(mUserCapabilities.mUserSwitcherEnabled);

        if (Flags.fixDisablingOfMuToggleWhenRestrictionApplied()) {
            RestrictedLockUtils.EnforcedAdmin enforcedAdmin = RestrictedLockUtilsInternal
                    .checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_USER_SWITCH,
                            UserHandle.myUserId());
            if (enforcedAdmin != null) {
                mSwitchBar.setDisabledByAdmin(enforcedAdmin);
            } else {
                mSwitchBar.setEnabled(mUserCapabilities.mIsMain
                        && !mUserCapabilities.mDisallowSwitchUser);
            }
        } else {
            if (mUserCapabilities.mDisallowSwitchUser) {
                mSwitchBar.setDisabledByAdmin(RestrictedLockUtilsInternal
                        .checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_USER_SWITCH,
@@ -60,6 +73,7 @@ public class MultiUserSwitchBarController implements SwitchWidgetController.OnSw
            } else {
                mSwitchBar.setEnabled(mUserCapabilities.mIsMain);
            }
        }
        mSwitchBar.setListener(this);
    }

+56 −1
Original line number Diff line number Diff line
@@ -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<UserManager.EnforcingUser> 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()),