Add API for device owner to switch users

Once verified that caller is device owner just calls through to
the activity manager and acts like that call.

Change-Id: I34023313cd6742b73d2105655ec6b631879aa37a
This commit is contained in:
Jason Monk
2014-07-09 19:57:08 -04:00
parent c09a04da29
commit 582d9111d7
4 changed files with 44 additions and 0 deletions

View File

@@ -5330,6 +5330,7 @@ package android.app.admin {
method public void setRestrictionsProvider(android.content.ComponentName, android.content.ComponentName);
method public void setSecureSetting(android.content.ComponentName, java.lang.String, java.lang.String);
method public int setStorageEncryption(android.content.ComponentName, boolean);
method public boolean switchUser(android.content.ComponentName, android.os.UserHandle);
method public void uninstallCaCert(android.content.ComponentName, byte[]);
method public void wipeData(int);
field public static final java.lang.String ACTION_ADD_DEVICE_ADMIN = "android.app.action.ADD_DEVICE_ADMIN";

View File

@@ -2374,6 +2374,24 @@ public class DevicePolicyManager {
}
}
/**
* Called by a device owner to switch the specified user to the foreground.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param userHandle the user to switch to; null will switch to primary.
* @return {@code true} if the switch was successful, {@code false} otherwise.
*
* @see Intent#ACTION_USER_FOREGROUND
*/
public boolean switchUser(ComponentName admin, UserHandle userHandle) {
try {
return mService.switchUser(admin, userHandle);
} catch (RemoteException re) {
Log.w(TAG, "Could not switch user ", re);
return false;
}
}
/**
* Called by a profile or device owner to get the application restrictions for a given target
* application running in the managed profile.

View File

@@ -139,6 +139,7 @@ interface IDevicePolicyManager {
UserHandle createUser(in ComponentName who, in String name);
UserHandle createAndInitializeUser(in ComponentName who, in String name, in String profileOwnerName, in ComponentName profileOwnerComponent, in Bundle adminExtras);
boolean removeUser(in ComponentName who, in UserHandle userHandle);
boolean switchUser(in ComponentName who, in UserHandle userHandle);
void setAccountManagementDisabled(in ComponentName who, in String accountType, in boolean disabled);
String[] getAccountTypesWithManagementDisabled();

View File

@@ -3591,6 +3591,30 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
}
}
@Override
public boolean switchUser(ComponentName who, UserHandle userHandle) {
synchronized (this) {
if (who == null) {
throw new NullPointerException("ComponentName is null");
}
getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
long id = Binder.clearCallingIdentity();
try {
int userId = UserHandle.USER_OWNER;
if (userHandle != null) {
userId = userHandle.getIdentifier();
}
return ActivityManagerNative.getDefault().switchUser(userId);
} catch (RemoteException e) {
Log.e(LOG_TAG, "Couldn't switch user", e);
return false;
} finally {
restoreCallingIdentity(id);
}
}
}
@Override
public Bundle getApplicationRestrictions(ComponentName who, String packageName) {
final UserHandle userHandle = new UserHandle(UserHandle.getCallingUserId());