Send system user broadcasts in headless system user mode.

In headless system user mode, USER_STARTING, USER_STARTED, and
USER_SWITCHED broadcasts were not sent for the system user.
It had caused issues for other parts of the system which are expecting
such broadcast messages. For example, VpnManagerService expects
USER_STARTED event for system user but was not receiving it.

This change will only affect headless system user mode. No behavior
changes for phones.

Bug: 263439429
Bug: 242195409

Test: atest com.android.cts.devicepolicy.MixedDeviceOwnerTest

Change-Id: I4a101418c10a2c959c2bfae01b95863aebd521e8
(cherry picked from commit ba0f9f3ad2)
Merged-In: I4a101418c10a2c959c2bfae01b95863aebd521e8
This commit is contained in:
bkchoi
2023-01-12 15:52:45 -08:00
committed by Android Build Coastguard Worker
parent 34696dcb97
commit 746d2338b3

View File

@@ -8196,15 +8196,13 @@ public class ActivityManagerService extends IActivityManager.Stub
t.traceEnd();
}
boolean isBootingSystemUser = currentUserId == UserHandle.USER_SYSTEM;
// Some systems - like automotive - will explicitly unlock system user then switch
// to a secondary user. Hence, we don't want to send duplicate broadcasts for
// the system user here.
// to a secondary user.
// TODO(b/242195409): this workaround shouldn't be necessary once we move
// the headless-user start logic to UserManager-land.
final boolean isBootingSystemUser = (currentUserId == UserHandle.USER_SYSTEM)
&& !UserManager.isHeadlessSystemUserMode();
if (isBootingSystemUser) {
if (isBootingSystemUser && !UserManager.isHeadlessSystemUserMode()) {
t.traceBegin("startHomeOnAllDisplays");
mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
t.traceEnd();
@@ -8216,6 +8214,10 @@ public class ActivityManagerService extends IActivityManager.Stub
if (isBootingSystemUser) {
// Need to send the broadcasts for the system user here because
// UserController#startUserInternal will not send them for the system user starting,
// It checks if the user state already exists, which is always the case for the
// system user.
t.traceBegin("sendUserStartBroadcast");
final int callingUid = Binder.getCallingUid();
final int callingPid = Binder.getCallingPid();