diff options
| author | 2024-04-10 17:32:14 -0700 | |
|---|---|---|
| committer | 2024-05-03 15:51:54 +0000 | |
| commit | b89c03897e6d14787e56f062ca1ff6bfbd61d714 (patch) | |
| tree | 8709ddbad0749516eda7239c37b867f74ad15322 | |
| parent | fad849bcd7ee9a94e78eaaeb94f97e0013bf78fb (diff) | |
Prepare Overlays for MainUser earlier
Headless System User Mode (HSUM) creates and switches to the MainUser
immediately in the initial bootup. This requires that the MainUser's
overlays be ready before launching SetupWizard (SUW).
We therefore monitor for when the user is created, and once it is, we
immediately start updating its overlays, so that they can be ready
early.
Bug: 283904547
Test: Manually confirmed that SUW had theming on HSUM device
Change-Id: Ia3339e6a39bc5d641644cfa6a2a723dd0c067d6f
| -rw-r--r-- | services/core/java/com/android/server/om/OverlayManagerService.java | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java index 4b8e4852aee7..4f7f69dc5967 100644 --- a/services/core/java/com/android/server/om/OverlayManagerService.java +++ b/services/core/java/com/android/server/om/OverlayManagerService.java @@ -88,6 +88,7 @@ import com.android.server.LocalServices; import com.android.server.SystemConfig; import com.android.server.SystemService; import com.android.server.pm.KnownPackages; +import com.android.server.pm.UserManagerInternal; import com.android.server.pm.UserManagerService; import com.android.server.pm.pkg.PackageState; @@ -287,6 +288,9 @@ public final class OverlayManagerService extends SystemService { getContext().registerReceiverAsUser(new UserReceiver(), UserHandle.ALL, userFilter, null, null); + UserManagerInternal umi = LocalServices.getService(UserManagerInternal.class); + umi.addUserLifecycleListener(new UserLifecycleListener()); + restoreSettings(); // Wipe all shell overlays on boot, to recover from a potentially broken device @@ -337,6 +341,7 @@ public final class OverlayManagerService extends SystemService { if (newUserId == mPrevStartedUserId) { return; } + Slog.i(TAG, "Updating overlays for starting user " + newUserId); try { traceBegin(TRACE_TAG_RRO, "OMS#onStartUser " + newUserId); // ensure overlays in the settings are up-to-date, and propagate @@ -533,14 +538,46 @@ public final class OverlayManagerService extends SystemService { } } + /** + * Indicates that the given user is of great importance so that when it is created, we quickly + * update its overlays by using a Listener mechanism rather than a Broadcast mechanism. This + * is especially important for {@link UserManager#isHeadlessSystemUserMode() HSUM}'s MainUser, + * which is created and switched-to immediately on first boot. + */ + private static boolean isHighPriorityUserCreation(UserInfo user) { + // TODO: Consider extending this to all created users (guarded behind a flag in that case). + return user != null && user.isMain(); + } + + private final class UserLifecycleListener implements UserManagerInternal.UserLifecycleListener { + @Override + public void onUserCreated(UserInfo user, Object token) { + if (isHighPriorityUserCreation(user)) { + final int userId = user.id; + try { + Slog.i(TAG, "Updating overlays for onUserCreated " + userId); + traceBegin(TRACE_TAG_RRO, "OMS#onUserCreated " + userId); + synchronized (mLock) { + updatePackageManagerLocked(mImpl.updateOverlaysForUser(userId)); + } + } finally { + traceEnd(TRACE_TAG_RRO); + } + } + } + } + private final class UserReceiver extends BroadcastReceiver { @Override public void onReceive(@NonNull final Context context, @NonNull final Intent intent) { final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); switch (intent.getAction()) { case ACTION_USER_ADDED: - if (userId != UserHandle.USER_NULL) { + UserManagerInternal umi = LocalServices.getService(UserManagerInternal.class); + UserInfo userInfo = umi.getUserInfo(userId); + if (userId != UserHandle.USER_NULL && !isHighPriorityUserCreation(userInfo)) { try { + Slog.i(TAG, "Updating overlays for added user " + userId); traceBegin(TRACE_TAG_RRO, "OMS ACTION_USER_ADDED"); synchronized (mLock) { updatePackageManagerLocked(mImpl.updateOverlaysForUser(userId)); |