method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String);
method public void clearUserRestriction(android.content.ComponentName, java.lang.String);
method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
+ method public android.os.UserHandle createAndManageUser(android.content.ComponentName, java.lang.String, android.content.ComponentName, android.os.PersistableBundle, int);
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public void enableSystemApp(android.content.ComponentName, java.lang.String);
method public int enableSystemApp(android.content.ComponentName, android.content.Intent);
field public static final int PERMISSION_POLICY_PROMPT = 0; // 0x0
field public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 2; // 0x2
field public static final int RESET_PASSWORD_REQUIRE_ENTRY = 1; // 0x1
+ field public static final int SKIP_SETUP_WIZARD = 1; // 0x1
field public static final int WIPE_EXTERNAL_STORAGE = 1; // 0x1
field public static final int WIPE_RESET_PROTECTION_DATA = 2; // 0x2
}
method public void clearProfileOwner(android.content.ComponentName);
method public void clearUserRestriction(android.content.ComponentName, java.lang.String);
method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
+ method public android.os.UserHandle createAndManageUser(android.content.ComponentName, java.lang.String, android.content.ComponentName, android.os.PersistableBundle, int);
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public void enableSystemApp(android.content.ComponentName, java.lang.String);
method public int enableSystemApp(android.content.ComponentName, android.content.Intent);
field public static final int PERMISSION_POLICY_PROMPT = 0; // 0x0
field public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 2; // 0x2
field public static final int RESET_PASSWORD_REQUIRE_ENTRY = 1; // 0x1
+ field public static final int SKIP_SETUP_WIZARD = 1; // 0x1
field public static final int WIPE_EXTERNAL_STORAGE = 1; // 0x1
field public static final int WIPE_RESET_PROTECTION_DATA = 2; // 0x2
}
method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String);
method public void clearUserRestriction(android.content.ComponentName, java.lang.String);
method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
+ method public android.os.UserHandle createAndManageUser(android.content.ComponentName, java.lang.String, android.content.ComponentName, android.os.PersistableBundle, int);
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public void enableSystemApp(android.content.ComponentName, java.lang.String);
method public int enableSystemApp(android.content.ComponentName, android.content.Intent);
field public static final int PERMISSION_POLICY_PROMPT = 0; // 0x0
field public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 2; // 0x2
field public static final int RESET_PASSWORD_REQUIRE_ENTRY = 1; // 0x1
+ field public static final int SKIP_SETUP_WIZARD = 1; // 0x1
field public static final int WIPE_EXTERNAL_STORAGE = 1; // 0x1
field public static final int WIPE_RESET_PROTECTION_DATA = 2; // 0x2
}
}
/**
- * Flag used by {@link createAndManageUser} to skip setup wizard after creating a new user.
- * @hide
+ * Flag used by {@link #createAndManageUser} to skip setup wizard after creating a new user.
*/
public static final int SKIP_SETUP_WIZARD = 0x0001;
/**
- * Called by a device owner to create a user with the specified name and the caller as profile
- * owner. The UserHandle returned by this method should not be persisted as user handles are
- * recycled as users are removed and created. If you need to persist an identifier for this
- * user, use {@link UserManager#getSerialNumberForUser}. The new user will not be started in the
- * background.
+ * Called by a device owner to create a user with the specified name and a given component of
+ * the calling package as profile owner. The UserHandle returned by this method should not be
+ * persisted as user handles are recycled as users are removed and created. If you need to
+ * persist an identifier for this user, use {@link UserManager#getSerialNumberForUser}. The new
+ * user will not be started in the background.
*
- * <p> admin is the {@link DeviceAdminReceiver} which is the device owner, and will become the
- * profile owner and will be registered as an active admin on the new user. The profile owner
- * package will be installed on the new user.
+ * <p>admin is the {@link DeviceAdminReceiver} which is the device owner. profileOwner is also
+ * a DeviceAdminReceiver in the same package as admin, and will become the profile owner and
+ * will be registered as an active admin on the new user. The profile owner package will be
+ * installed on the new user.
*
* <p>If the adminExtras are not null, they will be stored on the device until the user is
* started for the first time. Then the extras will be passed to the admin when
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param name The user's name.
+ * @param profileOwner Which {@link DeviceAdminReceiver} will be profile owner. Has to be in the
+ * same package as admin, otherwise no user is created and an IllegalArgumentException is
+ * thrown.
* @param adminExtras Extras that will be passed to onEnable of the admin receiver on the new
* user.
- * @param flags {@link SKIP_SETUP_WIZARD} is supported.
+ * @param flags {@link #SKIP_SETUP_WIZARD} is supported.
* @see UserHandle
* @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the
* user could not be created.
- * @hide
*/
public UserHandle createAndManageUser(@NonNull ComponentName admin, @NonNull String name,
- @Nullable PersistableBundle adminExtras, int flags) {
+ @NonNull ComponentName profileOwner, @Nullable PersistableBundle adminExtras,
+ int flags) {
try {
- return mService.createAndManageUser(admin, name, adminExtras, flags);
+ return mService.createAndManageUser(admin, name, profileOwner, adminExtras, flags);
} catch (RemoteException re) {
Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re);
}
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);
- UserHandle createAndManageUser(in ComponentName who, in String name, in PersistableBundle adminExtras, in int flags);
+ UserHandle createAndManageUser(in ComponentName who, in String name, in ComponentName profileOwner, in PersistableBundle adminExtras, in int flags);
boolean removeUser(in ComponentName who, in UserHandle userHandle);
boolean switchUser(in ComponentName who, in UserHandle userHandle);
@Override
public UserHandle createAndManageUser(ComponentName admin, String name,
- PersistableBundle adminExtras, int flags) {
+ ComponentName profileOwner, PersistableBundle adminExtras, int flags) {
+ Preconditions.checkNotNull(admin, "admin is null");
+ Preconditions.checkNotNull(profileOwner, "profileOwner is null");
+ if (!admin.getPackageName().equals(profileOwner.getPackageName())) {
+ throw new IllegalArgumentException("profileOwner " + profileOwner + " and admin "
+ + admin + " are not in the same package");
+ }
// Create user.
- Preconditions.checkNotNull(admin, "ComponentName is null");
UserHandle user = null;
synchronized (this) {
getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
return null;
}
- setActiveAdmin(admin, true, userHandle);
+ setActiveAdmin(profileOwner, true, userHandle);
// User is not started yet, the broadcast by setActiveAdmin will not be received.
// So we store adminExtras for broadcasting when the user starts for first time.
synchronized(this) {
saveSettingsLocked(userHandle);
}
final String ownerName = getProfileOwnerName(Process.myUserHandle().getIdentifier());
- setProfileOwner(admin, ownerName, userHandle);
+ setProfileOwner(profileOwner, ownerName, userHandle);
if ((flags & DevicePolicyManager.SKIP_SETUP_WIZARD) != 0) {
Settings.Secure.putIntForUser(mContext.getContentResolver(),