Loading res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -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> src/com/android/settings/users/UserCapabilities.java +9 −7 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; } Loading tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java +19 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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); } } } tests/robotests/src/com/android/settings/users/UserCapabilitiesTest.java +50 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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(); } } Loading
res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -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>
src/com/android/settings/users/UserCapabilities.java +9 −7 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; } Loading
tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java +19 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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); } } }
tests/robotests/src/com/android/settings/users/UserCapabilitiesTest.java +50 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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(); } }