Merge "Introduce system API to get source of user restriction" into nyc-dev

This commit is contained in:
Zoltan Szatmary-Ban
2016-05-17 15:16:55 +00:00
committed by Android (Google) Code Review
4 changed files with 143 additions and 0 deletions

View File

@@ -31780,6 +31780,7 @@ package android.os {
method public deprecated void setUserRestrictions(android.os.Bundle); method public deprecated void setUserRestrictions(android.os.Bundle);
method public deprecated void setUserRestrictions(android.os.Bundle, android.os.UserHandle); method public deprecated void setUserRestrictions(android.os.Bundle, android.os.UserHandle);
method public static boolean supportsMultipleUsers(); method public static boolean supportsMultipleUsers();
method public int getUserRestrictionSource(java.lang.String, android.os.UserHandle);
field public static final java.lang.String ALLOW_PARENT_PROFILE_APP_LINKING = "allow_parent_profile_app_linking"; field public static final java.lang.String ALLOW_PARENT_PROFILE_APP_LINKING = "allow_parent_profile_app_linking";
field public static final java.lang.String DISALLOW_ADD_USER = "no_add_user"; field public static final java.lang.String DISALLOW_ADD_USER = "no_add_user";
field public static final java.lang.String DISALLOW_ADJUST_VOLUME = "no_adjust_volume"; field public static final java.lang.String DISALLOW_ADJUST_VOLUME = "no_adjust_volume";
@@ -31817,6 +31818,13 @@ package android.os {
field public static final java.lang.String KEY_RESTRICTIONS_PENDING = "restrictions_pending"; field public static final java.lang.String KEY_RESTRICTIONS_PENDING = "restrictions_pending";
field public static final int USER_CREATION_FAILED_NOT_PERMITTED = 1; // 0x1 field public static final int USER_CREATION_FAILED_NOT_PERMITTED = 1; // 0x1
field public static final int USER_CREATION_FAILED_NO_MORE_USERS = 2; // 0x2 field public static final int USER_CREATION_FAILED_NO_MORE_USERS = 2; // 0x2
field public static final int RESTRICTION_NOT_SET = 0; // 0x0
field public static final int RESTRICTION_SOURCE_SYSTEM = 1; // 0x1
field public static final int RESTRICTION_SOURCE_DEVICE_OWNER = 2; // 0x2
field public static final int RESTRICTION_SOURCE_PROFILE_OWNER = 4; // 0x4
}
public static abstract class UserManager.UserRestrictionSource implements java.lang.annotation.Annotation {
} }
public abstract class Vibrator { public abstract class Vibrator {

View File

@@ -58,6 +58,7 @@ interface IUserManager {
boolean canHaveRestrictedProfile(int userHandle); boolean canHaveRestrictedProfile(int userHandle);
int getUserSerialNumber(int userHandle); int getUserSerialNumber(int userHandle);
int getUserHandle(int userSerialNumber); int getUserHandle(int userSerialNumber);
int getUserRestrictionSource(String restrictionKey, int userHandle);
Bundle getUserRestrictions(int userHandle); Bundle getUserRestrictions(int userHandle);
boolean hasBaseUserRestriction(String restrictionKey, int userHandle); boolean hasBaseUserRestriction(String restrictionKey, int userHandle);
boolean hasUserRestriction(in String restrictionKey, int userHandle); boolean hasUserRestriction(in String restrictionKey, int userHandle);

View File

@@ -18,6 +18,7 @@ package android.os;
import android.Manifest; import android.Manifest;
import android.accounts.AccountManager; import android.accounts.AccountManager;
import android.annotation.IntDef;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.RequiresPermission; import android.annotation.RequiresPermission;
import android.annotation.SystemApi; import android.annotation.SystemApi;
@@ -43,6 +44,8 @@ import android.view.WindowManager.LayoutParams;
import com.android.internal.R; import com.android.internal.R;
import java.io.IOException; import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -62,6 +65,41 @@ public class UserManager {
private final IUserManager mService; private final IUserManager mService;
private final Context mContext; private final Context mContext;
/**
* @hide
* No user restriction.
*/
@SystemApi
public static final int RESTRICTION_NOT_SET = 0x0;
/**
* @hide
* User restriction set by system/user.
*/
@SystemApi
public static final int RESTRICTION_SOURCE_SYSTEM = 0x1;
/**
* @hide
* User restriction set by a device owner.
*/
@SystemApi
public static final int RESTRICTION_SOURCE_DEVICE_OWNER = 0x2;
/**
* @hide
* User restriction set by a profile owner.
*/
@SystemApi
public static final int RESTRICTION_SOURCE_PROFILE_OWNER = 0x4;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(flag=true, value={RESTRICTION_NOT_SET, RESTRICTION_SOURCE_SYSTEM,
RESTRICTION_SOURCE_DEVICE_OWNER, RESTRICTION_SOURCE_PROFILE_OWNER})
@SystemApi
public @interface UserRestrictionSource {}
/** /**
* Specifies if a user is disallowed from adding and removing accounts, unless they are * Specifies if a user is disallowed from adding and removing accounts, unless they are
* {@link android.accounts.AccountManager#addAccountExplicitly programmatically} added by * {@link android.accounts.AccountManager#addAccountExplicitly programmatically} added by
@@ -1022,6 +1060,27 @@ public class UserManager {
} }
} }
/**
* @hide
*
* Returns who set a user restriction on a user.
* Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
* @param restrictionKey the string key representing the restriction
* @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
* @return The source of user restriction. Any combination of {@link #RESTRICTION_NOT_SET},
* {@link #RESTRICTION_SOURCE_SYSTEM}, {@link #RESTRICTION_SOURCE_DEVICE_OWNER}
* and {@link #RESTRICTION_SOURCE_PROFILE_OWNER}
*/
@SystemApi
@UserRestrictionSource
public int getUserRestrictionSource(String restrictionKey, UserHandle userHandle) {
try {
return mService.getUserRestrictionSource(restrictionKey, userHandle.getIdentifier());
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
}
/** /**
* Returns the user-wide restrictions imposed on this user. * Returns the user-wide restrictions imposed on this user.
* @return a Bundle containing all the restrictions. * @return a Bundle containing all the restrictions.

View File

@@ -22,6 +22,7 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import android.Manifest; import android.Manifest;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.UserIdInt; import android.annotation.UserIdInt;
import android.app.Activity; import android.app.Activity;
import android.app.ActivityManager; import android.app.ActivityManager;
@@ -30,7 +31,9 @@ import android.app.ActivityManagerNative;
import android.app.IActivityManager; import android.app.IActivityManager;
import android.app.IStopUserCallback; import android.app.IStopUserCallback;
import android.app.KeyguardManager; import android.app.KeyguardManager;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
@@ -142,6 +145,7 @@ public class UserManagerService extends IUserManager.Stub {
private static final String TAG_USER = "user"; private static final String TAG_USER = "user";
private static final String TAG_RESTRICTIONS = "restrictions"; private static final String TAG_RESTRICTIONS = "restrictions";
private static final String TAG_DEVICE_POLICY_RESTRICTIONS = "device_policy_restrictions"; private static final String TAG_DEVICE_POLICY_RESTRICTIONS = "device_policy_restrictions";
private static final String TAG_GLOBAL_RESTRICTION_OWNER_ID = "globalRestrictionOwnerUserId";
private static final String TAG_ENTRY = "entry"; private static final String TAG_ENTRY = "entry";
private static final String TAG_VALUE = "value"; private static final String TAG_VALUE = "value";
private static final String TAG_SEED_ACCOUNT_OPTIONS = "seedAccountOptions"; private static final String TAG_SEED_ACCOUNT_OPTIONS = "seedAccountOptions";
@@ -274,6 +278,12 @@ public class UserManagerService extends IUserManager.Stub {
@GuardedBy("mRestrictionsLock") @GuardedBy("mRestrictionsLock")
private Bundle mDevicePolicyGlobalUserRestrictions; private Bundle mDevicePolicyGlobalUserRestrictions;
/**
* Id of the user that set global restrictions.
*/
@GuardedBy("mRestrictionsLock")
private int mGlobalRestrictionOwnerUserId = UserHandle.USER_NULL;
/** /**
* User restrictions set by {@link com.android.server.devicepolicy.DevicePolicyManagerService} * User restrictions set by {@link com.android.server.devicepolicy.DevicePolicyManagerService}
* for each user. * for each user.
@@ -995,6 +1005,13 @@ public class UserManagerService extends IUserManager.Stub {
if (globalChanged) { if (globalChanged) {
mDevicePolicyGlobalUserRestrictions = global; mDevicePolicyGlobalUserRestrictions = global;
} }
// Remember the global restriction owner userId to be able to make a distinction
// in getUserRestrictionSource on who set local policies.
mGlobalRestrictionOwnerUserId = userId;
} else {
// When profile owner sets restrictions it passes null global bundle and we reset
// global restriction owner userId.
mGlobalRestrictionOwnerUserId = UserHandle.USER_NULL;
} }
{ {
// Update local. // Update local.
@@ -1077,6 +1094,54 @@ public class UserManagerService extends IUserManager.Stub {
return restrictions != null && restrictions.getBoolean(restrictionKey); return restrictions != null && restrictions.getBoolean(restrictionKey);
} }
/**
* @hide
*
* Returns who set a user restriction on a user.
* Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
* @param restrictionKey the string key representing the restriction
* @param userId the id of the user for whom to retrieve the restrictions.
* @return The source of user restriction. Any combination of
* {@link UserManager#RESTRICTION_NOT_SET},
* {@link UserManager#RESTRICTION_SOURCE_SYSTEM},
* {@link UserManager#RESTRICTION_SOURCE_DEVICE_OWNER}
* and {@link UserManager#RESTRICTION_SOURCE_PROFILE_OWNER}
*/
@Override
public int getUserRestrictionSource(String restrictionKey, int userId) {
checkManageUsersPermission("getUserRestrictionSource");
int result = UserManager.RESTRICTION_NOT_SET;
// Shortcut for the most common case
if (!hasUserRestriction(restrictionKey, userId)) {
return result;
}
if (hasBaseUserRestriction(restrictionKey, userId)) {
result |= UserManager.RESTRICTION_SOURCE_SYSTEM;
}
synchronized(mRestrictionsLock) {
Bundle localRestrictions = mDevicePolicyLocalUserRestrictions.get(userId);
if (!UserRestrictionsUtils.isEmpty(localRestrictions)
&& localRestrictions.getBoolean(restrictionKey)) {
// Local restrictions may have been set by device owner the userId of which is
// stored in mGlobalRestrictionOwnerUserId.
if (mGlobalRestrictionOwnerUserId == userId) {
result |= UserManager.RESTRICTION_SOURCE_DEVICE_OWNER;
} else {
result |= UserManager.RESTRICTION_SOURCE_PROFILE_OWNER;
}
}
if (!UserRestrictionsUtils.isEmpty(mDevicePolicyGlobalUserRestrictions)
&& mDevicePolicyGlobalUserRestrictions.getBoolean(restrictionKey)) {
result |= UserManager.RESTRICTION_SOURCE_DEVICE_OWNER;
}
}
return result;
}
/** /**
* @return UserRestrictions that are in effect currently. This always returns a new * @return UserRestrictions that are in effect currently. This always returns a new
* {@link Bundle}. * {@link Bundle}.
@@ -1474,6 +1539,11 @@ public class UserManagerService extends IUserManager.Stub {
break; break;
} }
} }
} else if (name.equals(TAG_GLOBAL_RESTRICTION_OWNER_ID)) {
String ownerUserId = parser.getAttributeValue(null, ATTR_ID);
if (ownerUserId != null) {
mGlobalRestrictionOwnerUserId = Integer.parseInt(ownerUserId);
}
} }
} }
} }
@@ -1733,6 +1803,9 @@ public class UserManagerService extends IUserManager.Stub {
UserRestrictionsUtils.writeRestrictions(serializer, UserRestrictionsUtils.writeRestrictions(serializer,
mDevicePolicyGlobalUserRestrictions, TAG_DEVICE_POLICY_RESTRICTIONS); mDevicePolicyGlobalUserRestrictions, TAG_DEVICE_POLICY_RESTRICTIONS);
} }
serializer.startTag(null, TAG_GLOBAL_RESTRICTION_OWNER_ID);
serializer.attribute(null, ATTR_ID, Integer.toString(mGlobalRestrictionOwnerUserId));
serializer.endTag(null, TAG_GLOBAL_RESTRICTION_OWNER_ID);
int[] userIdsToWrite; int[] userIdsToWrite;
synchronized (mUsersLock) { synchronized (mUsersLock) {
userIdsToWrite = new int[mUsers.size()]; userIdsToWrite = new int[mUsers.size()];
@@ -2972,6 +3045,8 @@ public class UserManagerService extends IUserManager.Stub {
.dumpRestrictions(pw, " ", mDevicePolicyGlobalUserRestrictions); .dumpRestrictions(pw, " ", mDevicePolicyGlobalUserRestrictions);
} }
pw.println(); pw.println();
pw.println(" Global restrictions owner id:" + mGlobalRestrictionOwnerUserId);
pw.println();
pw.println(" Guest restrictions:"); pw.println(" Guest restrictions:");
synchronized (mGuestRestrictions) { synchronized (mGuestRestrictions) {
UserRestrictionsUtils.dumpRestrictions(pw, " ", mGuestRestrictions); UserRestrictionsUtils.dumpRestrictions(pw, " ", mGuestRestrictions);