diff --git a/res/values/config.xml b/res/values/config.xml index 48d698cc465..0065a651b2f 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -560,4 +560,7 @@ false + + + false diff --git a/src/com/android/settings/users/UserCapabilities.java b/src/com/android/settings/users/UserCapabilities.java index 7af6c645f66..620738f1386 100644 --- a/src/com/android/settings/users/UserCapabilities.java +++ b/src/com/android/settings/users/UserCapabilities.java @@ -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; } diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java index 1d4f2019fb8..dc42515bf90 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java @@ -49,6 +49,7 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager private final Map> mRestrictionSources = new HashMap<>(); private final List mUserProfileInfos = new ArrayList<>(); private final Set mManagedProfiles = new HashSet<>(); + private final Set 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); + } + } } diff --git a/tests/robotests/src/com/android/settings/users/UserCapabilitiesTest.java b/tests/robotests/src/com/android/settings/users/UserCapabilitiesTest.java index 382ac5d364e..628c14e5051 100644 --- a/tests/robotests/src/com/android/settings/users/UserCapabilitiesTest.java +++ b/tests/robotests/src/com/android/settings/users/UserCapabilitiesTest.java @@ -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(); + } }