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();
+ }
}