Merge "Delay boot complete broadcast for main user on HSUM." into udc-dev am: 0ad77cb163 am: 72b808c231

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22954348

Change-Id: I3e01828458f094d786ee05698bb7f23d55e3466c
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Oli Lan
2023-05-03 13:24:21 +00:00
committed by Automerger Merge Worker
2 changed files with 33 additions and 8 deletions

View File

@@ -583,7 +583,10 @@ class UserController implements Handler.Callback {
// user transitions to RUNNING_LOCKED. However, in "headless system user mode", the
// system user is explicitly started before the device has finished booting. In
// that case, we need to wait until onBootComplete() to send the broadcast.
if (!(mInjector.isHeadlessSystemUserMode() && uss.mHandle.isSystem())) {
// Similarly, this occurs after a user switch, but in HSUM we switch to the main
// user before boot is complete, so again this should be delayed until
// onBootComplete if boot has not yet completed.
if (mAllowUserUnlocking) {
// ACTION_LOCKED_BOOT_COMPLETED
sendLockedBootCompletedBroadcast(resultTo, userId);
}
@@ -2564,9 +2567,9 @@ class UserController implements Handler.Callback {
// we should *not* transition users out of the BOOTING state using finishUserBoot(), as that
// doesn't handle issuing the needed onUserStarting() call, and it would just race with an
// explicit start anyway. We do, however, need to send the "locked boot complete" broadcast
// for the system user, as that got skipped earlier due to the *device* boot not being
// complete yet. We also need to try to unlock all started users, since until now explicit
// user starts didn't proceed to unlocking, due to it being too early in the device boot.
// as that got skipped earlier due to the *device* boot not being complete yet.
// We also need to try to unlock all started users, since until now explicit user starts
// didn't proceed to unlocking, due to it being too early in the device boot.
//
// USER_SYSTEM must be processed first. It will be first in the array, as its ID is lowest.
Preconditions.checkArgument(startedUsers.keyAt(0) == UserHandle.USER_SYSTEM);
@@ -2576,9 +2579,7 @@ class UserController implements Handler.Callback {
if (!mInjector.isHeadlessSystemUserMode()) {
finishUserBoot(uss, resultTo);
} else {
if (userId == UserHandle.USER_SYSTEM) {
sendLockedBootCompletedBroadcast(resultTo, userId);
}
sendLockedBootCompletedBroadcast(resultTo, userId);
maybeUnlockUser(userId);
}
}

View File

@@ -200,6 +200,7 @@ public class UserControllerTest {
mUserController.setAllowUserUnlocking(true);
setUpUser(TEST_USER_ID, NO_USERINFO_FLAGS);
setUpUser(TEST_PRE_CREATED_USER_ID, NO_USERINFO_FLAGS, /* preCreated= */ true, null);
mInjector.mRelevantUser = null;
});
}
@@ -232,6 +233,25 @@ public class UserControllerTest {
verifyUserAssignedToDisplay(TEST_USER_ID, Display.DEFAULT_DISPLAY);
}
@Test
public void testStartUser_background_duringBootHsum() {
mockIsHeadlessSystemUserMode(true);
mUserController.setAllowUserUnlocking(false);
mInjector.mRelevantUser = TEST_USER_ID;
boolean started = mUserController.startUser(TEST_USER_ID, USER_START_MODE_BACKGROUND);
assertWithMessage("startUser(%s, foreground=false)", TEST_USER_ID).that(started).isTrue();
// ACTION_LOCKED_BOOT_COMPLETED not sent yet
startUserAssertions(newArrayList(Intent.ACTION_USER_STARTED, Intent.ACTION_USER_STARTING),
START_BACKGROUND_USER_MESSAGE_CODES);
mUserController.onBootComplete(null);
startUserAssertions(newArrayList(Intent.ACTION_USER_STARTED, Intent.ACTION_USER_STARTING,
Intent.ACTION_LOCKED_BOOT_COMPLETED),
START_BACKGROUND_USER_MESSAGE_CODES);
}
@Test
public void testStartUser_sendsNoBroadcastsForSystemUserInNonHeadlessMode() {
setUpUser(SYSTEM_USER_ID, UserInfo.FLAG_SYSTEM, /* preCreated= */ false,
@@ -1079,6 +1099,8 @@ public class UserControllerTest {
private final Context mCtx;
private Integer mRelevantUser;
TestInjector(Context ctx) {
super(null);
mCtx = ctx;
@@ -1166,7 +1188,9 @@ public class UserControllerTest {
boolean sticky, int callingPid, int callingUid, int realCallingUid,
int realCallingPid, int userId) {
Log.i(TAG, "broadcastIntentLocked " + intent);
mSentIntents.add(intent);
if (mRelevantUser == null || mRelevantUser == userId || userId == UserHandle.USER_ALL) {
mSentIntents.add(intent);
}
return 0;
}