Merge "Changed how user restrictions are pushed to UM" into rvc-dev am: bb5e6b49a7
Change-Id: I90114859b55e9f073bd62e528b419b7d291fed42
This commit is contained in:
@@ -23,6 +23,8 @@ import android.content.Context;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.graphics.Bitmap;
|
||||
|
||||
import com.android.server.pm.RestrictionsSet;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
@@ -57,21 +59,18 @@ public abstract class UserManagerInternal {
|
||||
* Called by {@link com.android.server.devicepolicy.DevicePolicyManagerService} to set
|
||||
* restrictions enforced by the user.
|
||||
*
|
||||
* @param originatingUserId user id of the user where the restriction originated.
|
||||
* @param restrictions a bundle of user restrictions.
|
||||
* @param restrictionOwnerType determines which admin {@code userId} corresponds to.
|
||||
* The admin can be either
|
||||
* {@link UserManagerInternal#OWNER_TYPE_DEVICE_OWNER},
|
||||
* {@link UserManagerInternal#OWNER_TYPE_PROFILE_OWNER},
|
||||
* {@link UserManagerInternal#OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE}
|
||||
* or {@link UserManagerInternal#OWNER_TYPE_NO_OWNER}.
|
||||
* If the admin is a DEVICE_OWNER or a PROFILE_OWNER_ORG_OWNED_DEVICE then
|
||||
* a restriction may be applied globally depending on which restriction it is,
|
||||
* otherwise it will be applied just on the current user.
|
||||
* @see OwnerType
|
||||
* @param originatingUserId user id of the user where the restrictions originated.
|
||||
* @param global a bundle of global user restrictions. Global restrictions are
|
||||
* restrictions that apply device-wide: to the managed profile,
|
||||
* primary profile and secondary users and any profile created in
|
||||
* any secondary user.
|
||||
* @param local a restriction set of local user restrictions. The key is the user
|
||||
* id of the user whom the restrictions are targeting.
|
||||
* @param isDeviceOwner whether {@code originatingUserId} corresponds to device owner
|
||||
* user id.
|
||||
*/
|
||||
public abstract void setDevicePolicyUserRestrictions(int originatingUserId,
|
||||
@Nullable Bundle restrictions, @OwnerType int restrictionOwnerType);
|
||||
@Nullable Bundle global, @Nullable RestrictionsSet local, boolean isDeviceOwner);
|
||||
|
||||
/**
|
||||
* Returns the "base" user restrictions.
|
||||
|
||||
@@ -1716,27 +1716,6 @@ public class UserManagerService extends IUserManager.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
private void setDevicePolicyUserRestrictionsInner(@UserIdInt int originatingUserId,
|
||||
@Nullable Bundle restrictions,
|
||||
@UserManagerInternal.OwnerType int restrictionOwnerType) {
|
||||
final Bundle global = new Bundle();
|
||||
final Bundle local = new Bundle();
|
||||
|
||||
// Sort restrictions into local and global ensuring they don't overlap.
|
||||
UserRestrictionsUtils.sortToGlobalAndLocal(restrictions, restrictionOwnerType, global,
|
||||
local);
|
||||
boolean isDeviceOwner = restrictionOwnerType == UserManagerInternal.OWNER_TYPE_DEVICE_OWNER;
|
||||
|
||||
RestrictionsSet localRestrictionsSet;
|
||||
if (UserRestrictionsUtils.isEmpty(local)) {
|
||||
localRestrictionsSet = new RestrictionsSet();
|
||||
} else {
|
||||
localRestrictionsSet = new RestrictionsSet(originatingUserId, local);
|
||||
}
|
||||
setDevicePolicyUserRestrictionsInner(originatingUserId, global, localRestrictionsSet,
|
||||
isDeviceOwner);
|
||||
}
|
||||
|
||||
/**
|
||||
* See {@link UserManagerInternal#setDevicePolicyUserRestrictions}
|
||||
*/
|
||||
@@ -4754,10 +4733,10 @@ public class UserManagerService extends IUserManager.Stub {
|
||||
private class LocalService extends UserManagerInternal {
|
||||
@Override
|
||||
public void setDevicePolicyUserRestrictions(@UserIdInt int originatingUserId,
|
||||
@Nullable Bundle restrictions,
|
||||
@OwnerType int restrictionOwnerType) {
|
||||
@NonNull Bundle global, @NonNull RestrictionsSet local,
|
||||
boolean isDeviceOwner) {
|
||||
UserManagerService.this.setDevicePolicyUserRestrictionsInner(originatingUserId,
|
||||
restrictions, restrictionOwnerType);
|
||||
global, local, isDeviceOwner);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -232,6 +232,13 @@ public class UserRestrictionsUtils {
|
||||
UserManager.DISALLOW_UNMUTE_MICROPHONE
|
||||
);
|
||||
|
||||
/**
|
||||
* Special user restrictions that profile owner of an organization-owned managed profile can
|
||||
* set on the parent profile instance to apply them on the personal profile.
|
||||
*/
|
||||
private static final Set<String> PROFILE_OWNER_ORGANIZATION_OWNED_LOCAL_RESTRICTIONS =
|
||||
Sets.newArraySet();
|
||||
|
||||
/**
|
||||
* User restrictions that default to {@code true} for managed profile owners.
|
||||
*
|
||||
@@ -416,7 +423,8 @@ public class UserRestrictionsUtils {
|
||||
* @return true if a restriction is settable by profile owner of an organization owned device.
|
||||
*/
|
||||
public static boolean canProfileOwnerOfOrganizationOwnedDeviceChange(String restriction) {
|
||||
return PROFILE_OWNER_ORGANIZATION_OWNED_GLOBAL_RESTRICTIONS.contains(restriction);
|
||||
return PROFILE_OWNER_ORGANIZATION_OWNED_GLOBAL_RESTRICTIONS.contains(restriction)
|
||||
|| PROFILE_OWNER_ORGANIZATION_OWNED_LOCAL_RESTRICTIONS.contains(restriction);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -426,32 +434,10 @@ public class UserRestrictionsUtils {
|
||||
return DEFAULT_ENABLED_FOR_MANAGED_PROFILES;
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes restrictions that can be set by device owner, and sort them into what should be applied
|
||||
* globally and what should be applied only on the current user.
|
||||
*/
|
||||
public static void sortToGlobalAndLocal(@Nullable Bundle in,
|
||||
@UserManagerInternal.OwnerType int restrictionOwnerType, @NonNull Bundle global,
|
||||
@NonNull Bundle local) {
|
||||
if (in == null || in.size() == 0) {
|
||||
return;
|
||||
}
|
||||
for (String key : in.keySet()) {
|
||||
if (!in.getBoolean(key)) {
|
||||
continue;
|
||||
}
|
||||
if (isGlobal(restrictionOwnerType, key)) {
|
||||
global.putBoolean(key, true);
|
||||
} else {
|
||||
local.putBoolean(key, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether given user restriction should be enforced globally.
|
||||
*/
|
||||
private static boolean isGlobal(@UserManagerInternal.OwnerType int restrictionOwnerType,
|
||||
public static boolean isGlobal(@UserManagerInternal.OwnerType int restrictionOwnerType,
|
||||
String key) {
|
||||
return ((restrictionOwnerType == UserManagerInternal.OWNER_TYPE_DEVICE_OWNER) && (
|
||||
PRIMARY_USER_ONLY_RESTRICTIONS.contains(key) || GLOBAL_RESTRICTIONS.contains(key)))
|
||||
@@ -462,6 +448,14 @@ public class UserRestrictionsUtils {
|
||||
|| DEVICE_OWNER_ONLY_RESTRICTIONS.contains(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether given user restriction should be enforced locally.
|
||||
*/
|
||||
public static boolean isLocal(@UserManagerInternal.OwnerType int restrictionOwnerType,
|
||||
String key) {
|
||||
return !isGlobal(restrictionOwnerType, key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if two Bundles contain the same user restriction.
|
||||
* A null bundle and an empty bundle are considered to be equal.
|
||||
|
||||
@@ -87,6 +87,9 @@ import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
|
||||
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
|
||||
import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES;
|
||||
import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK;
|
||||
import static android.os.UserManagerInternal.OWNER_TYPE_DEVICE_OWNER;
|
||||
import static android.os.UserManagerInternal.OWNER_TYPE_PROFILE_OWNER;
|
||||
import static android.os.UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE;
|
||||
import static android.provider.Settings.Global.PRIVATE_DNS_MODE;
|
||||
import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER;
|
||||
import static android.provider.Telephony.Carriers.DPC_URI;
|
||||
@@ -284,6 +287,7 @@ import com.android.server.SystemService;
|
||||
import com.android.server.devicepolicy.DevicePolicyManagerService.ActiveAdmin.TrustAgentInfo;
|
||||
import com.android.server.inputmethod.InputMethodManagerInternal;
|
||||
import com.android.server.net.NetworkPolicyManagerInternal;
|
||||
import com.android.server.pm.RestrictionsSet;
|
||||
import com.android.server.pm.UserRestrictionsUtils;
|
||||
import com.android.server.pm.parsing.pkg.AndroidPackage;
|
||||
import com.android.server.storage.DeviceStorageMonitorInternal;
|
||||
@@ -322,6 +326,7 @@ import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
* Implementation of the device policy APIs.
|
||||
@@ -1828,6 +1833,50 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
||||
info = deviceAdminInfo;
|
||||
}
|
||||
|
||||
Bundle addSyntheticRestrictions(Bundle restrictions) {
|
||||
if (disableCamera) {
|
||||
restrictions.putBoolean(UserManager.DISALLOW_CAMERA, true);
|
||||
} else {
|
||||
restrictions.remove(UserManager.DISALLOW_CAMERA);
|
||||
}
|
||||
return restrictions;
|
||||
}
|
||||
|
||||
static Bundle removeDeprecatedRestrictions(Bundle restrictions) {
|
||||
for (String deprecatedRestriction: DEPRECATED_USER_RESTRICTIONS) {
|
||||
restrictions.remove(deprecatedRestriction);
|
||||
}
|
||||
return restrictions;
|
||||
}
|
||||
|
||||
static Bundle filterRestrictions(Bundle restrictions, Predicate<String> filter) {
|
||||
Bundle result = new Bundle();
|
||||
for (String key : restrictions.keySet()) {
|
||||
if (!restrictions.getBoolean(key)) {
|
||||
continue;
|
||||
}
|
||||
if (filter.test(key)) {
|
||||
result.putBoolean(key, true);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Bundle getEffectiveRestrictions() {
|
||||
return addSyntheticRestrictions(
|
||||
removeDeprecatedRestrictions(ensureUserRestrictions()));
|
||||
}
|
||||
|
||||
Bundle getLocalUserRestrictions(int adminType) {
|
||||
return filterRestrictions(getEffectiveRestrictions(),
|
||||
key -> UserRestrictionsUtils.isLocal(adminType, key));
|
||||
}
|
||||
|
||||
Bundle getGlobalUserRestrictions(int adminType) {
|
||||
return filterRestrictions(getEffectiveRestrictions(),
|
||||
key -> UserRestrictionsUtils.isGlobal(adminType, key));
|
||||
}
|
||||
|
||||
void dump(IndentingPrintWriter pw) {
|
||||
pw.print("uid="); pw.println(getUid());
|
||||
pw.print("testOnlyAdmin=");
|
||||
@@ -2772,7 +2821,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
||||
Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, 0, userId) != 0) {
|
||||
profileOwner.ensureUserRestrictions().putBoolean(
|
||||
UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, true);
|
||||
saveUserRestrictionsLocked(userId, /* parent = */ false);
|
||||
saveUserRestrictionsLocked(userId);
|
||||
mInjector.settingsSecurePutIntForUser(
|
||||
Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, 0, userId);
|
||||
}
|
||||
@@ -2803,7 +2852,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
||||
}
|
||||
admin.defaultEnabledRestrictionsAlreadySet.addAll(restrictionsToSet);
|
||||
Slog.i(LOG_TAG, "Enabled the following restrictions by default: " + restrictionsToSet);
|
||||
saveUserRestrictionsLocked(userId, /* parent = */ false);
|
||||
saveUserRestrictionsLocked(userId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8222,9 +8271,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
||||
}
|
||||
}
|
||||
// Tell the user manager that the restrictions have changed.
|
||||
final int affectedUserId = parent ? getProfileParentId(userHandle) : userHandle;
|
||||
pushUserRestrictions(affectedUserId);
|
||||
pushUserRestrictions(userHandle);
|
||||
|
||||
final int affectedUserId = parent ? getProfileParentId(userHandle) : userHandle;
|
||||
if (SecurityLog.isLoggingEnabled()) {
|
||||
SecurityLog.writeEvent(SecurityLog.TAG_CAMERA_POLICY_SET,
|
||||
who.getPackageName(), userHandle, affectedUserId, disabled ? 1 : 0);
|
||||
@@ -10806,10 +10855,14 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
||||
"Cannot use the parent instance in Device Owner mode");
|
||||
}
|
||||
} else {
|
||||
if (!(UserRestrictionsUtils.canProfileOwnerChange(key, userHandle) || (
|
||||
isProfileOwnerOfOrganizationOwnedDevice(activeAdmin) && parent
|
||||
&& UserRestrictionsUtils.canProfileOwnerOfOrganizationOwnedDeviceChange(
|
||||
key)))) {
|
||||
boolean profileOwnerCanChangeOnItself = !parent
|
||||
&& UserRestrictionsUtils.canProfileOwnerChange(key, userHandle);
|
||||
boolean orgOwnedProfileOwnerCanChangesGlobally = parent
|
||||
&& isProfileOwnerOfOrganizationOwnedDevice(activeAdmin)
|
||||
&& UserRestrictionsUtils
|
||||
.canProfileOwnerOfOrganizationOwnedDeviceChange(key);
|
||||
|
||||
if (!profileOwnerCanChangeOnItself && !orgOwnedProfileOwnerCanChangesGlobally) {
|
||||
throw new SecurityException("Profile owner cannot set user restriction " + key);
|
||||
}
|
||||
}
|
||||
@@ -10821,7 +10874,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
||||
} else {
|
||||
restrictions.remove(key);
|
||||
}
|
||||
saveUserRestrictionsLocked(userHandle, parent);
|
||||
saveUserRestrictionsLocked(userHandle);
|
||||
}
|
||||
final int eventId = enabledFromThisOwner
|
||||
? DevicePolicyEnums.ADD_USER_RESTRICTION
|
||||
@@ -10839,91 +10892,65 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
||||
}
|
||||
}
|
||||
|
||||
private void saveUserRestrictionsLocked(int userId, boolean parent) {
|
||||
private void saveUserRestrictionsLocked(int userId) {
|
||||
saveSettingsLocked(userId);
|
||||
pushUserRestrictions(parent ? getProfileParentId(userId) : userId);
|
||||
pushUserRestrictions(userId);
|
||||
sendChangedNotification(userId);
|
||||
}
|
||||
|
||||
private void pushUserRestrictions(int userId) {
|
||||
/**
|
||||
* Pushes the user restrictions originating from a specific user.
|
||||
*
|
||||
* If called by the profile owner of an organization-owned device, the global and local
|
||||
* user restrictions will be an accumulation of the global user restrictions from the profile
|
||||
* owner active admin and its parent active admin. The key of the local user restrictions set
|
||||
* will be the target user id.
|
||||
*/
|
||||
private void pushUserRestrictions(int originatingUserId) {
|
||||
final Bundle global;
|
||||
final RestrictionsSet local = new RestrictionsSet();
|
||||
final boolean isDeviceOwner;
|
||||
synchronized (getLockObject()) {
|
||||
final boolean isDeviceOwner = mOwners.isDeviceOwnerUserId(userId);
|
||||
Bundle userRestrictions = null;
|
||||
final int restrictionOwnerType;
|
||||
final int originatingUserId;
|
||||
|
||||
isDeviceOwner = mOwners.isDeviceOwnerUserId(originatingUserId);
|
||||
if (isDeviceOwner) {
|
||||
final ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
|
||||
if (deviceOwner == null) {
|
||||
return; // Shouldn't happen.
|
||||
}
|
||||
userRestrictions = addOrRemoveDisableCameraRestriction(
|
||||
deviceOwner.userRestrictions, deviceOwner);
|
||||
restrictionOwnerType = UserManagerInternal.OWNER_TYPE_DEVICE_OWNER;
|
||||
originatingUserId = deviceOwner.getUserHandle().getIdentifier();
|
||||
global = deviceOwner.getGlobalUserRestrictions(OWNER_TYPE_DEVICE_OWNER);
|
||||
local.updateRestrictions(originatingUserId, deviceOwner.getLocalUserRestrictions(
|
||||
OWNER_TYPE_DEVICE_OWNER));
|
||||
} else {
|
||||
final ActiveAdmin profileOwnerOfOrganizationOwnedDevice =
|
||||
getProfileOwnerOfOrganizationOwnedDeviceLocked(userId);
|
||||
|
||||
// If profile owner of an organization owned device, the restrictions will be
|
||||
// pushed to the parent instance.
|
||||
if (profileOwnerOfOrganizationOwnedDevice != null && !isManagedProfile(userId)) {
|
||||
restrictionOwnerType =
|
||||
UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE;
|
||||
final ActiveAdmin parent = profileOwnerOfOrganizationOwnedDevice
|
||||
.getParentActiveAdmin();
|
||||
userRestrictions = parent.userRestrictions;
|
||||
userRestrictions = addOrRemoveDisableCameraRestriction(userRestrictions,
|
||||
parent);
|
||||
originatingUserId =
|
||||
profileOwnerOfOrganizationOwnedDevice.getUserHandle().getIdentifier();
|
||||
} else {
|
||||
final ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userId);
|
||||
|
||||
if (profileOwner != null) {
|
||||
userRestrictions = profileOwner.userRestrictions;
|
||||
restrictionOwnerType = UserManagerInternal.OWNER_TYPE_PROFILE_OWNER;
|
||||
originatingUserId = profileOwner.getUserHandle().getIdentifier();
|
||||
} else {
|
||||
restrictionOwnerType = UserManagerInternal.OWNER_TYPE_NO_OWNER;
|
||||
originatingUserId = userId;
|
||||
}
|
||||
userRestrictions = addOrRemoveDisableCameraRestriction(
|
||||
userRestrictions, userId);
|
||||
final ActiveAdmin profileOwner = getProfileOwnerAdminLocked(originatingUserId);
|
||||
if (profileOwner == null) {
|
||||
return;
|
||||
}
|
||||
global = profileOwner.getGlobalUserRestrictions(OWNER_TYPE_PROFILE_OWNER);
|
||||
local.updateRestrictions(originatingUserId, profileOwner.getLocalUserRestrictions(
|
||||
OWNER_TYPE_PROFILE_OWNER));
|
||||
// Global (device-wide) and local user restrictions set by the profile owner of an
|
||||
// organization-owned device are stored in the parent ActiveAdmin instance.
|
||||
if (isProfileOwnerOfOrganizationOwnedDevice(
|
||||
profileOwner.getUserHandle().getIdentifier())) {
|
||||
// The global restrictions set on the parent ActiveAdmin instance need to be
|
||||
// merged with the global restrictions set on the profile owner ActiveAdmin
|
||||
// instance, since both are to be applied device-wide.
|
||||
UserRestrictionsUtils.merge(global,
|
||||
profileOwner.getParentActiveAdmin().getGlobalUserRestrictions(
|
||||
OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE));
|
||||
// The local restrictions set on the parent ActiveAdmin instance are only to be
|
||||
// applied to the primary user. They therefore need to be added the local
|
||||
// restriction set with the primary user id as the key, in this case the
|
||||
// primary user id is the target user.
|
||||
local.updateRestrictions(
|
||||
getProfileParentId(profileOwner.getUserHandle().getIdentifier()),
|
||||
profileOwner.getParentActiveAdmin().getLocalUserRestrictions(
|
||||
OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE));
|
||||
}
|
||||
}
|
||||
// Remove deprecated restrictions.
|
||||
for (String deprecatedRestriction: DEPRECATED_USER_RESTRICTIONS) {
|
||||
userRestrictions.remove(deprecatedRestriction);
|
||||
}
|
||||
mUserManagerInternal.setDevicePolicyUserRestrictions(originatingUserId,
|
||||
userRestrictions, restrictionOwnerType);
|
||||
}
|
||||
}
|
||||
|
||||
private Bundle addOrRemoveDisableCameraRestriction(Bundle userRestrictions, ActiveAdmin admin) {
|
||||
if (userRestrictions == null) {
|
||||
userRestrictions = new Bundle();
|
||||
}
|
||||
if (admin.disableCamera) {
|
||||
userRestrictions.putBoolean(UserManager.DISALLOW_CAMERA, true);
|
||||
} else {
|
||||
userRestrictions.remove(UserManager.DISALLOW_CAMERA);
|
||||
}
|
||||
return userRestrictions;
|
||||
}
|
||||
|
||||
private Bundle addOrRemoveDisableCameraRestriction(Bundle userRestrictions, int userId) {
|
||||
if (userRestrictions == null) {
|
||||
userRestrictions = new Bundle();
|
||||
}
|
||||
if (getCameraDisabled(/* who= */ null, userId, /* mergeDeviceOwnerRestriction= */
|
||||
false)) {
|
||||
userRestrictions.putBoolean(UserManager.DISALLOW_CAMERA, true);
|
||||
} else {
|
||||
userRestrictions.remove(UserManager.DISALLOW_CAMERA);
|
||||
}
|
||||
return userRestrictions;
|
||||
mUserManagerInternal.setDevicePolicyUserRestrictions(originatingUserId, global, local,
|
||||
isDeviceOwner);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -83,7 +83,6 @@ import android.os.Bundle;
|
||||
import android.os.Process;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.os.UserManagerInternal;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
import android.provider.Settings;
|
||||
import android.security.KeyChain;
|
||||
@@ -1170,7 +1169,6 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
() -> dpm.clearDeviceOwnerApp(admin1.getPackageName()));
|
||||
|
||||
when(getServices().userManager.isUserUnlocked(anyInt())).thenReturn(true);
|
||||
reset(getServices().userManagerInternal);
|
||||
dpm.clearDeviceOwnerApp(admin1.getPackageName());
|
||||
|
||||
// Now DO shouldn't be set.
|
||||
@@ -1181,9 +1179,8 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
|
||||
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(UserHandle.USER_SYSTEM),
|
||||
MockUtils.checkUserRestrictions(),
|
||||
eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER));
|
||||
eq(UserHandle.USER_SYSTEM), MockUtils.checkUserRestrictions(),
|
||||
MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true));
|
||||
|
||||
verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
|
||||
null, UserHandle.USER_SYSTEM);
|
||||
@@ -1745,15 +1742,16 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(UserHandle.USER_SYSTEM),
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADD_USER),
|
||||
eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER));
|
||||
MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true));
|
||||
reset(getServices().userManagerInternal);
|
||||
|
||||
dpm.addUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS);
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(UserHandle.USER_SYSTEM),
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_OUTGOING_CALLS,
|
||||
UserManager.DISALLOW_ADD_USER),
|
||||
eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER));
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADD_USER),
|
||||
MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM,
|
||||
UserManager.DISALLOW_OUTGOING_CALLS),
|
||||
eq(true));
|
||||
reset(getServices().userManagerInternal);
|
||||
|
||||
DpmTestUtils.assertRestrictions(
|
||||
@@ -1770,8 +1768,10 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
dpm.clearUserRestriction(admin1, UserManager.DISALLOW_ADD_USER);
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(UserHandle.USER_SYSTEM),
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_OUTGOING_CALLS),
|
||||
eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER));
|
||||
MockUtils.checkUserRestrictions(),
|
||||
MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM,
|
||||
UserManager.DISALLOW_OUTGOING_CALLS),
|
||||
eq(true));
|
||||
reset(getServices().userManagerInternal);
|
||||
|
||||
DpmTestUtils.assertRestrictions(
|
||||
@@ -1787,7 +1787,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(UserHandle.USER_SYSTEM),
|
||||
MockUtils.checkUserRestrictions(),
|
||||
eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER));
|
||||
MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true));
|
||||
reset(getServices().userManagerInternal);
|
||||
|
||||
assertNoDeviceOwnerRestrictions();
|
||||
@@ -1801,7 +1801,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
eq(UserHandle.USER_SYSTEM),
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADJUST_VOLUME,
|
||||
UserManager.DISALLOW_UNMUTE_MICROPHONE),
|
||||
eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER));
|
||||
MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true));
|
||||
reset(getServices().userManagerInternal);
|
||||
|
||||
dpm.clearUserRestriction(admin1, UserManager.DISALLOW_ADJUST_VOLUME);
|
||||
@@ -1813,7 +1813,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(UserHandle.USER_SYSTEM),
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADD_USER),
|
||||
eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER));
|
||||
MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true));
|
||||
reset(getServices().userManagerInternal);
|
||||
|
||||
dpm.addUserRestriction(admin1, UserManager.DISALLOW_FUN);
|
||||
@@ -1821,7 +1821,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
eq(UserHandle.USER_SYSTEM),
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_FUN,
|
||||
UserManager.DISALLOW_ADD_USER),
|
||||
eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER));
|
||||
MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true));
|
||||
reset(getServices().userManagerInternal);
|
||||
|
||||
dpm.setCameraDisabled(admin1, true);
|
||||
@@ -1830,7 +1830,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
// DISALLOW_CAMERA will be applied globally.
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_FUN,
|
||||
UserManager.DISALLOW_ADD_USER, UserManager.DISALLOW_CAMERA),
|
||||
eq(UserManagerInternal.OWNER_TYPE_DEVICE_OWNER));
|
||||
MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true));
|
||||
reset(getServices().userManagerInternal);
|
||||
}
|
||||
|
||||
@@ -1887,17 +1887,19 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
dpm.addUserRestriction(admin1, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(DpmMockContext.CALLER_USER_HANDLE),
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES),
|
||||
eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER));
|
||||
reset(getServices().userManagerInternal);
|
||||
MockUtils.checkUserRestrictions(),
|
||||
MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE,
|
||||
UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES),
|
||||
eq(false));
|
||||
|
||||
dpm.addUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS);
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(DpmMockContext.CALLER_USER_HANDLE),
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
|
||||
MockUtils.checkUserRestrictions(),
|
||||
MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE,
|
||||
UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
|
||||
UserManager.DISALLOW_OUTGOING_CALLS),
|
||||
eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER));
|
||||
reset(getServices().userManagerInternal);
|
||||
eq(false));
|
||||
|
||||
DpmTestUtils.assertRestrictions(
|
||||
DpmTestUtils.newRestrictions(
|
||||
@@ -1918,9 +1920,10 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
dpm.clearUserRestriction(admin1, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(DpmMockContext.CALLER_USER_HANDLE),
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_OUTGOING_CALLS),
|
||||
eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER));
|
||||
reset(getServices().userManagerInternal);
|
||||
MockUtils.checkUserRestrictions(),
|
||||
MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE,
|
||||
UserManager.DISALLOW_OUTGOING_CALLS),
|
||||
eq(false));
|
||||
|
||||
DpmTestUtils.assertRestrictions(
|
||||
DpmTestUtils.newRestrictions(
|
||||
@@ -1940,8 +1943,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(DpmMockContext.CALLER_USER_HANDLE),
|
||||
MockUtils.checkUserRestrictions(),
|
||||
eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER));
|
||||
reset(getServices().userManagerInternal);
|
||||
MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE), eq(false));
|
||||
|
||||
DpmTestUtils.assertRestrictions(
|
||||
DpmTestUtils.newRestrictions(),
|
||||
@@ -1956,21 +1958,25 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
// DISALLOW_ADJUST_VOLUME and DISALLOW_UNMUTE_MICROPHONE can be set by PO too, even
|
||||
// though when DO sets them they'll be applied globally.
|
||||
dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADJUST_VOLUME);
|
||||
reset(getServices().userManagerInternal);
|
||||
|
||||
dpm.addUserRestriction(admin1, UserManager.DISALLOW_UNMUTE_MICROPHONE);
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(DpmMockContext.CALLER_USER_HANDLE),
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADJUST_VOLUME,
|
||||
MockUtils.checkUserRestrictions(),
|
||||
MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE,
|
||||
UserManager.DISALLOW_ADJUST_VOLUME,
|
||||
UserManager.DISALLOW_UNMUTE_MICROPHONE),
|
||||
eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER));
|
||||
reset(getServices().userManagerInternal);
|
||||
eq(false));
|
||||
|
||||
dpm.setCameraDisabled(admin1, true);
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(DpmMockContext.CALLER_USER_HANDLE),
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADJUST_VOLUME,
|
||||
UserManager.DISALLOW_UNMUTE_MICROPHONE, UserManager.DISALLOW_CAMERA),
|
||||
eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER));
|
||||
MockUtils.checkUserRestrictions(),
|
||||
MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE,
|
||||
UserManager.DISALLOW_ADJUST_VOLUME,
|
||||
UserManager.DISALLOW_UNMUTE_MICROPHONE,
|
||||
UserManager.DISALLOW_CAMERA),
|
||||
eq(false));
|
||||
reset(getServices().userManagerInternal);
|
||||
|
||||
// TODO Make sure restrictions are written to the file.
|
||||
@@ -2004,15 +2010,14 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
);
|
||||
|
||||
public void testSetUserRestriction_asPoOfOrgOwnedDevice() throws Exception {
|
||||
final int MANAGED_PROFILE_USER_ID = DpmMockContext.CALLER_USER_HANDLE;
|
||||
final int MANAGED_PROFILE_ADMIN_UID =
|
||||
UserHandle.getUid(MANAGED_PROFILE_USER_ID, DpmMockContext.SYSTEM_UID);
|
||||
UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, DpmMockContext.SYSTEM_UID);
|
||||
mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
|
||||
|
||||
addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
|
||||
configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE);
|
||||
|
||||
when(getServices().userManager.getProfileParent(MANAGED_PROFILE_USER_ID))
|
||||
when(getServices().userManager.getProfileParent(DpmMockContext.CALLER_USER_HANDLE))
|
||||
.thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0));
|
||||
|
||||
for (String restriction : PROFILE_OWNER_ORGANIZATION_OWNED_GLOBAL_RESTRICTIONS) {
|
||||
@@ -2021,16 +2026,20 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
|
||||
parentDpm.setCameraDisabled(admin1, true);
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(MANAGED_PROFILE_USER_ID),
|
||||
eq(DpmMockContext.CALLER_USER_HANDLE),
|
||||
MockUtils.checkUserRestrictions(UserManager.DISALLOW_CAMERA),
|
||||
eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE));
|
||||
reset(getServices().userManagerInternal);
|
||||
MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE),
|
||||
eq(false));
|
||||
DpmTestUtils.assertRestrictions(
|
||||
DpmTestUtils.newRestrictions(UserManager.DISALLOW_CAMERA),
|
||||
parentDpm.getUserRestrictions(admin1)
|
||||
);
|
||||
|
||||
parentDpm.setCameraDisabled(admin1, false);
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(MANAGED_PROFILE_USER_ID),
|
||||
MockUtils.checkUserRestrictions(),
|
||||
eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE));
|
||||
DpmTestUtils.assertRestrictions(
|
||||
DpmTestUtils.newRestrictions(),
|
||||
parentDpm.getUserRestrictions(admin1)
|
||||
);
|
||||
reset(getServices().userManagerInternal);
|
||||
}
|
||||
|
||||
@@ -2039,13 +2048,13 @@ public class DevicePolicyManagerTest extends DpmTestBase {
|
||||
verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
|
||||
eq(DpmMockContext.CALLER_USER_HANDLE),
|
||||
MockUtils.checkUserRestrictions(restriction),
|
||||
eq(UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE));
|
||||
MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE),
|
||||
eq(false));
|
||||
parentDpm.clearUserRestriction(admin1, restriction);
|
||||
DpmTestUtils.assertRestrictions(
|
||||
DpmTestUtils.newRestrictions(),
|
||||
parentDpm.getUserRestrictions(admin1)
|
||||
);
|
||||
reset(getServices().userManagerInternal);
|
||||
}
|
||||
|
||||
public void testNoDefaultEnabledUserRestrictions() throws Exception {
|
||||
|
||||
@@ -15,10 +15,6 @@
|
||||
*/
|
||||
package com.android.server.devicepolicy;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
|
||||
import com.android.server.pm.UserRestrictionsUtils;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.os.BaseBundle;
|
||||
@@ -26,6 +22,11 @@ import android.os.Bundle;
|
||||
import android.os.UserHandle;
|
||||
import android.util.ArraySet;
|
||||
|
||||
import com.android.server.pm.RestrictionsSet;
|
||||
import com.android.server.pm.UserRestrictionsUtils;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
|
||||
import org.hamcrest.BaseMatcher;
|
||||
import org.hamcrest.Description;
|
||||
import org.hamcrest.Matcher;
|
||||
@@ -106,11 +107,14 @@ public class MockUtils {
|
||||
}
|
||||
|
||||
public static Bundle checkUserRestrictions(String... keys) {
|
||||
final Bundle expected = DpmTestUtils.newRestrictions(java.util.Objects.requireNonNull(keys));
|
||||
final Bundle expected = DpmTestUtils.newRestrictions(
|
||||
java.util.Objects.requireNonNull(keys));
|
||||
final Matcher<Bundle> m = new BaseMatcher<Bundle>() {
|
||||
@Override
|
||||
public boolean matches(Object item) {
|
||||
if (item == null) return false;
|
||||
if (item == null) {
|
||||
return false;
|
||||
}
|
||||
return UserRestrictionsUtils.areEqual((Bundle) item, expected);
|
||||
}
|
||||
|
||||
@@ -122,6 +126,26 @@ public class MockUtils {
|
||||
return MockitoHamcrest.argThat(m);
|
||||
}
|
||||
|
||||
public static RestrictionsSet checkUserRestrictions(int userId, String... keys) {
|
||||
final RestrictionsSet expected = DpmTestUtils.newRestrictions(userId,
|
||||
java.util.Objects.requireNonNull(keys));
|
||||
final Matcher<RestrictionsSet> m = new BaseMatcher<RestrictionsSet>() {
|
||||
@Override
|
||||
public boolean matches(Object item) {
|
||||
if (item == null) return false;
|
||||
RestrictionsSet actual = (RestrictionsSet) item;
|
||||
return UserRestrictionsUtils.areEqual(expected.getRestrictions(userId),
|
||||
actual.getRestrictions(userId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void describeTo(Description description) {
|
||||
description.appendText("User restrictions=" + getRestrictionsAsString(expected));
|
||||
}
|
||||
};
|
||||
return MockitoHamcrest.argThat(m);
|
||||
}
|
||||
|
||||
public static Set<String> checkApps(String... adminApps) {
|
||||
final Matcher<Set<String>> m = new BaseMatcher<Set<String>>() {
|
||||
@Override
|
||||
@@ -146,6 +170,23 @@ public class MockUtils {
|
||||
return MockitoHamcrest.argThat(m);
|
||||
}
|
||||
|
||||
private static String getRestrictionsAsString(RestrictionsSet r) {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append("{");
|
||||
|
||||
if (r != null) {
|
||||
String sep = "";
|
||||
for (int i = 0; i < r.size(); i++) {
|
||||
sb.append(sep);
|
||||
sep = ",";
|
||||
sb.append(
|
||||
String.format("%s= %s", r.keyAt(i), getRestrictionsAsString(r.valueAt(i))));
|
||||
}
|
||||
}
|
||||
sb.append("}");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static String getRestrictionsAsString(Bundle b) {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append("[");
|
||||
|
||||
@@ -22,7 +22,6 @@ import static com.android.server.devicepolicy.DpmTestUtils.newRestrictions;
|
||||
import android.os.Bundle;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.os.UserManagerInternal;
|
||||
import android.test.AndroidTestCase;
|
||||
import android.test.suitebuilder.annotation.SmallTest;
|
||||
import android.util.SparseArray;
|
||||
@@ -118,135 +117,6 @@ public class UserRestrictionsUtilsTest extends AndroidTestCase {
|
||||
UserManager.DISALLOW_ADJUST_VOLUME, user));
|
||||
}
|
||||
|
||||
public void testSortToGlobalAndLocal() {
|
||||
final Bundle local = new Bundle();
|
||||
final Bundle global = new Bundle();
|
||||
|
||||
UserRestrictionsUtils.sortToGlobalAndLocal(null,
|
||||
UserManagerInternal.OWNER_TYPE_PROFILE_OWNER,
|
||||
global, local);
|
||||
assertEquals(0, global.size());
|
||||
assertEquals(0, local.size());
|
||||
|
||||
UserRestrictionsUtils.sortToGlobalAndLocal(Bundle.EMPTY,
|
||||
UserManagerInternal.OWNER_TYPE_PROFILE_OWNER,
|
||||
global, local);
|
||||
assertEquals(0, global.size());
|
||||
assertEquals(0, local.size());
|
||||
|
||||
// Restrictions set by DO.
|
||||
UserRestrictionsUtils.sortToGlobalAndLocal(newRestrictions(
|
||||
UserManager.DISALLOW_ADJUST_VOLUME,
|
||||
UserManager.DISALLOW_UNMUTE_MICROPHONE,
|
||||
UserManager.DISALLOW_USB_FILE_TRANSFER,
|
||||
UserManager.DISALLOW_CONFIG_TETHERING,
|
||||
UserManager.DISALLOW_OUTGOING_BEAM,
|
||||
UserManager.DISALLOW_APPS_CONTROL,
|
||||
UserManager.ENSURE_VERIFY_APPS,
|
||||
UserManager.DISALLOW_CAMERA
|
||||
), UserManagerInternal.OWNER_TYPE_DEVICE_OWNER,
|
||||
global, local);
|
||||
|
||||
|
||||
assertRestrictions(newRestrictions(
|
||||
// This one is global no matter who sets it.
|
||||
UserManager.ENSURE_VERIFY_APPS,
|
||||
|
||||
// These can be set by PO too, but when DO sets them, they're global.
|
||||
UserManager.DISALLOW_ADJUST_VOLUME,
|
||||
UserManager.DISALLOW_UNMUTE_MICROPHONE,
|
||||
|
||||
// These can only be set by DO.
|
||||
UserManager.DISALLOW_USB_FILE_TRANSFER,
|
||||
UserManager.DISALLOW_CONFIG_TETHERING,
|
||||
|
||||
// This can be set by DO or PO of organisation owned device
|
||||
UserManager.DISALLOW_CAMERA
|
||||
), global);
|
||||
|
||||
assertRestrictions(newRestrictions(
|
||||
// They can be set by both DO/PO.
|
||||
UserManager.DISALLOW_OUTGOING_BEAM,
|
||||
UserManager.DISALLOW_APPS_CONTROL
|
||||
), local);
|
||||
|
||||
local.clear();
|
||||
global.clear();
|
||||
|
||||
// Restrictions set by PO.
|
||||
UserRestrictionsUtils.sortToGlobalAndLocal(newRestrictions(
|
||||
UserManager.DISALLOW_ADJUST_VOLUME,
|
||||
UserManager.DISALLOW_UNMUTE_MICROPHONE,
|
||||
UserManager.DISALLOW_USB_FILE_TRANSFER,
|
||||
UserManager.DISALLOW_CONFIG_TETHERING,
|
||||
UserManager.DISALLOW_OUTGOING_BEAM,
|
||||
UserManager.DISALLOW_APPS_CONTROL,
|
||||
UserManager.ENSURE_VERIFY_APPS,
|
||||
UserManager.DISALLOW_CAMERA
|
||||
), UserManagerInternal.OWNER_TYPE_PROFILE_OWNER,
|
||||
global, local);
|
||||
|
||||
assertRestrictions(newRestrictions(
|
||||
// This one is global no matter who sets it.
|
||||
UserManager.ENSURE_VERIFY_APPS
|
||||
), global);
|
||||
|
||||
assertRestrictions(newRestrictions(
|
||||
// These can be set by PO too, but when PO sets them, they're local.
|
||||
UserManager.DISALLOW_ADJUST_VOLUME,
|
||||
UserManager.DISALLOW_UNMUTE_MICROPHONE,
|
||||
|
||||
// They can be set by both DO/PO.
|
||||
UserManager.DISALLOW_OUTGOING_BEAM,
|
||||
UserManager.DISALLOW_APPS_CONTROL,
|
||||
|
||||
// These can only be set by DO.
|
||||
UserManager.DISALLOW_USB_FILE_TRANSFER,
|
||||
UserManager.DISALLOW_CONFIG_TETHERING,
|
||||
|
||||
// This can be set by DO or PO of organisation owned device
|
||||
UserManager.DISALLOW_CAMERA
|
||||
), local);
|
||||
|
||||
local.clear();
|
||||
global.clear();
|
||||
|
||||
// Restrictions set by PO of organisation owned device
|
||||
UserRestrictionsUtils.sortToGlobalAndLocal(newRestrictions(
|
||||
UserManager.DISALLOW_CONFIG_DATE_TIME
|
||||
), UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE,
|
||||
global, local);
|
||||
|
||||
assertRestrictions(newRestrictions(
|
||||
// This user restriction is global when set by PO of org owned device
|
||||
UserManager.DISALLOW_CONFIG_DATE_TIME
|
||||
), global);
|
||||
assertEquals(0, local.size());
|
||||
}
|
||||
|
||||
public void testSortToLocalAndGlobalWithCameraDisabled() {
|
||||
final Bundle local = new Bundle();
|
||||
final Bundle global = new Bundle();
|
||||
|
||||
UserRestrictionsUtils.sortToGlobalAndLocal(newRestrictions(UserManager.DISALLOW_CAMERA),
|
||||
UserManagerInternal.OWNER_TYPE_DEVICE_OWNER, global, local);
|
||||
assertRestrictions(newRestrictions(UserManager.DISALLOW_CAMERA), global);
|
||||
assertEquals(0, local.size());
|
||||
global.clear();
|
||||
|
||||
UserRestrictionsUtils.sortToGlobalAndLocal(newRestrictions(UserManager.DISALLOW_CAMERA),
|
||||
UserManagerInternal.OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE, global,
|
||||
local);
|
||||
assertRestrictions(newRestrictions(UserManager.DISALLOW_CAMERA), global);
|
||||
assertEquals(0, local.size());
|
||||
global.clear();
|
||||
|
||||
UserRestrictionsUtils.sortToGlobalAndLocal(newRestrictions(UserManager.DISALLOW_CAMERA),
|
||||
UserManagerInternal.OWNER_TYPE_PROFILE_OWNER, global, local);
|
||||
assertEquals(0, global.size());
|
||||
assertRestrictions(newRestrictions(UserManager.DISALLOW_CAMERA), local);
|
||||
}
|
||||
|
||||
public void testMoveRestriction() {
|
||||
SparseArray<RestrictionsSet> localRestrictions = new SparseArray<>();
|
||||
RestrictionsSet globalRestrictions = new RestrictionsSet();
|
||||
|
||||
Reference in New Issue
Block a user