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

Commit 13adae67 authored by Oli Lan's avatar Oli Lan Committed by Android (Google) Code Review
Browse files

Merge "Add config flag in Settings to control whether restricted profiles are offered."

parents 70e96958 8aec687b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -560,4 +560,7 @@
    
    <!-- Whether to aggregate for network selection list-->
    <bool name="config_network_selection_list_aggregation_enabled">false</bool>

    <!-- Whether to give option to add restricted profiles -->
    <bool name="config_offer_restricted_profiles">false</bool>
</resources>
+9 −7
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;

import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
@@ -30,7 +31,7 @@ import com.android.settingslib.RestrictedLockUtilsInternal;
public class UserCapabilities {
    boolean mEnabled = true;
    boolean mCanAddUser = true;
    boolean mCanAddRestrictedProfile = true;
    boolean mCanAddRestrictedProfile;
    boolean mIsAdmin;
    boolean mIsGuest;
    boolean mUserSwitcherEnabled;
@@ -57,12 +58,13 @@ public class UserCapabilities {
        caps.mIsAdmin = myUserInfo.isAdmin();
        DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
                Context.DEVICE_POLICY_SERVICE);
        // No restricted profiles for tablets with a device owner, or phones.
        if (dpm.isDeviceManaged()
                || Utils.isVoiceCapable(context)
                || !userManager.isUserTypeEnabled(UserManager.USER_TYPE_FULL_RESTRICTED)) {
            caps.mCanAddRestrictedProfile = false;
        }

        boolean offerRestricted =
                context.getResources().getBoolean(R.bool.config_offer_restricted_profiles);
        caps.mCanAddRestrictedProfile =
                offerRestricted && !dpm.isDeviceManaged() && userManager.isUserTypeEnabled(
                        UserManager.USER_TYPE_FULL_RESTRICTED);

        caps.updateAddUserCapabilities(context);
        return caps;
    }
+19 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
    private final Map<String, List<EnforcingUser>> mRestrictionSources = new HashMap<>();
    private final List<UserInfo> mUserProfileInfos = new ArrayList<>();
    private final Set<Integer> mManagedProfiles = new HashSet<>();
    private final Set<String> mEnabledTypes = new HashSet<>();
    private boolean mIsQuietModeEnabled = false;
    private int[] profileIdsForUser = new int[0];
    private boolean mUserSwitchEnabled;
@@ -105,6 +106,11 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
        mGuestRestrictions.add(restriction);
    }

    @Implementation
    protected boolean hasUserRestriction(String restrictionKey) {
        return hasUserRestriction(restrictionKey, UserHandle.of(UserHandle.myUserId()));
    }

    public static ShadowUserManager getShadow() {
        return (ShadowUserManager) Shadow.extract(
                RuntimeEnvironment.application.getSystemService(UserManager.class));
@@ -199,4 +205,17 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
    public void setSwitchabilityStatus(@UserManager.UserSwitchabilityResult int newStatus) {
        mSwitchabilityStatus = newStatus;
    }

    @Implementation
    protected boolean isUserTypeEnabled(String userType) {
        return mEnabledTypes.contains(userType);
    }

    public void setUserTypeEnabled(String type, boolean enabled) {
        if (enabled) {
            mEnabledTypes.add(type);
        } else {
            mEnabledTypes.remove(type);
        }
    }
}
+50 −1
Original line number Diff line number Diff line
@@ -18,12 +18,17 @@ package com.android.settings.users;

import static com.google.common.truth.Truth.assertThat;

import android.content.ComponentName;
import android.content.Context;
import android.os.UserHandle;
import android.os.UserManager;

import com.android.settings.R;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
import com.android.settings.testutils.shadow.ShadowUserManager;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -32,16 +37,24 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;

@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowUserManager.class})
@Config(shadows = {ShadowUserManager.class, ShadowDevicePolicyManager.class,
        SettingsShadowResources.class})
public class UserCapabilitiesTest {

    private Context mContext;
    private ShadowUserManager mUserManager;
    private ShadowDevicePolicyManager mDpm;

    @Before
    public void setUp() {
        mContext = RuntimeEnvironment.application;
        mUserManager = ShadowUserManager.getShadow();
        mDpm = ShadowDevicePolicyManager.getShadow();
    }

    @After
    public void tearDown() {
        SettingsShadowResources.reset();
    }

    @Test
@@ -85,4 +98,40 @@ public class UserCapabilitiesTest {

        assertThat(userCapabilities.mUserSwitcherEnabled).isTrue();
    }

    @Test
    public void restrictedProfile_enabled() {
        mUserManager.setUserTypeEnabled(UserManager.USER_TYPE_FULL_RESTRICTED, true);
        mDpm.setDeviceOwner(null);
        SettingsShadowResources.overrideResource(R.bool.config_offer_restricted_profiles, true);
        final UserCapabilities userCapabilities = UserCapabilities.create(mContext);
        assertThat(userCapabilities.mCanAddRestrictedProfile).isTrue();
    }

    @Test
    public void restrictedProfile_configNotSet() {
        mUserManager.setUserTypeEnabled(UserManager.USER_TYPE_FULL_RESTRICTED, true);
        mDpm.setDeviceOwner(null);
        SettingsShadowResources.overrideResource(R.bool.config_offer_restricted_profiles, false);
        final UserCapabilities userCapabilities = UserCapabilities.create(mContext);
        assertThat(userCapabilities.mCanAddRestrictedProfile).isFalse();
    }

    @Test
    public void restrictedProfile_deviceIsManaged() {
        mUserManager.setUserTypeEnabled(UserManager.USER_TYPE_FULL_RESTRICTED, true);
        mDpm.setDeviceOwner(new ComponentName("test", "test"));
        SettingsShadowResources.overrideResource(R.bool.config_offer_restricted_profiles, true);
        final UserCapabilities userCapabilities = UserCapabilities.create(mContext);
        assertThat(userCapabilities.mCanAddRestrictedProfile).isFalse();
    }

    @Test
    public void restrictedProfile_typeNotEnabled() {
        mUserManager.setUserTypeEnabled(UserManager.USER_TYPE_FULL_RESTRICTED, false);
        mDpm.setDeviceOwner(null);
        SettingsShadowResources.overrideResource(R.bool.config_offer_restricted_profiles, true);
        final UserCapabilities userCapabilities = UserCapabilities.create(mContext);
        assertThat(userCapabilities.mCanAddRestrictedProfile).isFalse();
    }
}