Merge "Add config flag in Settings to control whether restricted profiles are offered."
This commit is contained in:
@@ -560,4 +560,7 @@
|
|||||||
|
|
||||||
<!-- Whether to aggregate for network selection list-->
|
<!-- Whether to aggregate for network selection list-->
|
||||||
<bool name="config_network_selection_list_aggregation_enabled">false</bool>
|
<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>
|
</resources>
|
||||||
|
@@ -23,6 +23,7 @@ import android.os.UserHandle;
|
|||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settingslib.RestrictedLockUtils;
|
import com.android.settingslib.RestrictedLockUtils;
|
||||||
import com.android.settingslib.RestrictedLockUtilsInternal;
|
import com.android.settingslib.RestrictedLockUtilsInternal;
|
||||||
@@ -30,7 +31,7 @@ import com.android.settingslib.RestrictedLockUtilsInternal;
|
|||||||
public class UserCapabilities {
|
public class UserCapabilities {
|
||||||
boolean mEnabled = true;
|
boolean mEnabled = true;
|
||||||
boolean mCanAddUser = true;
|
boolean mCanAddUser = true;
|
||||||
boolean mCanAddRestrictedProfile = true;
|
boolean mCanAddRestrictedProfile;
|
||||||
boolean mIsAdmin;
|
boolean mIsAdmin;
|
||||||
boolean mIsGuest;
|
boolean mIsGuest;
|
||||||
boolean mUserSwitcherEnabled;
|
boolean mUserSwitcherEnabled;
|
||||||
@@ -57,12 +58,13 @@ public class UserCapabilities {
|
|||||||
caps.mIsAdmin = myUserInfo.isAdmin();
|
caps.mIsAdmin = myUserInfo.isAdmin();
|
||||||
DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
|
DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
|
||||||
Context.DEVICE_POLICY_SERVICE);
|
Context.DEVICE_POLICY_SERVICE);
|
||||||
// No restricted profiles for tablets with a device owner, or phones.
|
|
||||||
if (dpm.isDeviceManaged()
|
boolean offerRestricted =
|
||||||
|| Utils.isVoiceCapable(context)
|
context.getResources().getBoolean(R.bool.config_offer_restricted_profiles);
|
||||||
|| !userManager.isUserTypeEnabled(UserManager.USER_TYPE_FULL_RESTRICTED)) {
|
caps.mCanAddRestrictedProfile =
|
||||||
caps.mCanAddRestrictedProfile = false;
|
offerRestricted && !dpm.isDeviceManaged() && userManager.isUserTypeEnabled(
|
||||||
}
|
UserManager.USER_TYPE_FULL_RESTRICTED);
|
||||||
|
|
||||||
caps.updateAddUserCapabilities(context);
|
caps.updateAddUserCapabilities(context);
|
||||||
return caps;
|
return caps;
|
||||||
}
|
}
|
||||||
|
@@ -49,6 +49,7 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
|
|||||||
private final Map<String, List<EnforcingUser>> mRestrictionSources = new HashMap<>();
|
private final Map<String, List<EnforcingUser>> mRestrictionSources = new HashMap<>();
|
||||||
private final List<UserInfo> mUserProfileInfos = new ArrayList<>();
|
private final List<UserInfo> mUserProfileInfos = new ArrayList<>();
|
||||||
private final Set<Integer> mManagedProfiles = new HashSet<>();
|
private final Set<Integer> mManagedProfiles = new HashSet<>();
|
||||||
|
private final Set<String> mEnabledTypes = new HashSet<>();
|
||||||
private boolean mIsQuietModeEnabled = false;
|
private boolean mIsQuietModeEnabled = false;
|
||||||
private int[] profileIdsForUser = new int[0];
|
private int[] profileIdsForUser = new int[0];
|
||||||
private boolean mUserSwitchEnabled;
|
private boolean mUserSwitchEnabled;
|
||||||
@@ -105,6 +106,11 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
|
|||||||
mGuestRestrictions.add(restriction);
|
mGuestRestrictions.add(restriction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Implementation
|
||||||
|
protected boolean hasUserRestriction(String restrictionKey) {
|
||||||
|
return hasUserRestriction(restrictionKey, UserHandle.of(UserHandle.myUserId()));
|
||||||
|
}
|
||||||
|
|
||||||
public static ShadowUserManager getShadow() {
|
public static ShadowUserManager getShadow() {
|
||||||
return (ShadowUserManager) Shadow.extract(
|
return (ShadowUserManager) Shadow.extract(
|
||||||
RuntimeEnvironment.application.getSystemService(UserManager.class));
|
RuntimeEnvironment.application.getSystemService(UserManager.class));
|
||||||
@@ -199,4 +205,17 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
|
|||||||
public void setSwitchabilityStatus(@UserManager.UserSwitchabilityResult int newStatus) {
|
public void setSwitchabilityStatus(@UserManager.UserSwitchabilityResult int newStatus) {
|
||||||
mSwitchabilityStatus = 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,12 +18,17 @@ package com.android.settings.users;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.os.UserManager;
|
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 com.android.settings.testutils.shadow.ShadowUserManager;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
@@ -32,16 +37,24 @@ import org.robolectric.RuntimeEnvironment;
|
|||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
@Config(shadows = {ShadowUserManager.class})
|
@Config(shadows = {ShadowUserManager.class, ShadowDevicePolicyManager.class,
|
||||||
|
SettingsShadowResources.class})
|
||||||
public class UserCapabilitiesTest {
|
public class UserCapabilitiesTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private ShadowUserManager mUserManager;
|
private ShadowUserManager mUserManager;
|
||||||
|
private ShadowDevicePolicyManager mDpm;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = RuntimeEnvironment.application;
|
||||||
mUserManager = ShadowUserManager.getShadow();
|
mUserManager = ShadowUserManager.getShadow();
|
||||||
|
mDpm = ShadowDevicePolicyManager.getShadow();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() {
|
||||||
|
SettingsShadowResources.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -85,4 +98,40 @@ public class UserCapabilitiesTest {
|
|||||||
|
|
||||||
assertThat(userCapabilities.mUserSwitcherEnabled).isTrue();
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user