diff options
6 files changed, 64 insertions, 36 deletions
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index e28a6ce9b423..5843e51bf0c9 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -1253,10 +1253,14 @@ public abstract class ActivityManagerInternal { public abstract boolean clearApplicationUserData(String packageName, boolean keepState, boolean isRestore, IPackageDataObserver observer, int userId); + /** - * Returns current state of {@link com.android.systemui.theme.ThemeOverlayController} color - * palette readiness. + * Method that checks if system is Headless (don't delay launch) case in which it + * should also check if ThemeOverlayController is ready (don't delay) or not (delay). + * + * @param userId + * @return Boolean indicating if Home launch should wait for ThemeOverlayController signal * @hide */ - public abstract boolean isThemeOverlayReady(int userId); + public abstract boolean shouldDelayHomeLaunch(int userId); } diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java index 147e158bd393..de2fb674f348 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java @@ -15,7 +15,6 @@ */ package com.android.systemui.theme; -import static com.android.systemui.shared.Flags.enableHomeDelay; import android.annotation.AnyThread; import android.content.om.FabricatedOverlay; @@ -251,7 +250,7 @@ public class ThemeOverlayApplier implements Dumpable { try { mOverlayManager.commit(transaction.build()); - if (enableHomeDelay() && onComplete != null) { + if (onComplete != null) { Log.d(TAG, "Executing onComplete runnable"); mMainExecutor.execute(onComplete); } diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java index aac18e365809..5c3bbb7ca253 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java @@ -20,7 +20,6 @@ import static android.util.TypedValue.TYPE_INT_COLOR_ARGB8; import static com.android.systemui.Flags.themeOverlayControllerWakefulnessDeprecation; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_ASLEEP; -import static com.android.systemui.shared.Flags.enableHomeDelay; import static com.android.systemui.theme.ThemeOverlayApplier.COLOR_SOURCE_HOME; import static com.android.systemui.theme.ThemeOverlayApplier.COLOR_SOURCE_LOCK; import static com.android.systemui.theme.ThemeOverlayApplier.COLOR_SOURCE_PRESET; @@ -775,12 +774,11 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { } } - final Runnable onCompleteCallback = !enableHomeDelay() - ? () -> {} - : () -> { - Log.d(TAG, "ThemeHomeDelay: ThemeOverlayController ready"); - mActivityManager.setThemeOverlayReady(currentUser); - }; + final Runnable onCompleteCallback = () -> { + Log.d(TAG, "ThemeHomeDelay: ThemeOverlayController ready with user " + + currentUser); + mActivityManager.setThemeOverlayReady(currentUser); + }; if (colorSchemeIsApplied(managedProfiles)) { Log.d(TAG, "Skipping overlay creation. Theme was already: " + mColorScheme); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f1195f3fe350..03ab5b32586e 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -5283,18 +5283,24 @@ public class ActivityManagerService extends IActivityManager.Stub * Starts Home if there is no completion signal from ThemeOverlayController */ private void scheduleHomeTimeout() { - if (enableHomeDelay() && mHasHomeDelay.compareAndSet(false, true)) { - int userId = mUserController.getCurrentUserId(); - mHandler.postDelayed(() -> { - if (!isThemeOverlayReady(userId)) { - Slog.d(TAG, - "ThemeHomeDelay: ThemeOverlayController not responding, launching " - + "Home after " - + HOME_LAUNCH_TIMEOUT_MS + "ms"); - setThemeOverlayReady(userId); - } - }, HOME_LAUNCH_TIMEOUT_MS); + if (!isHomeLaunchDelayable()) { + Slog.d(TAG, "ThemeHomeDelay: Home launch is not delayable, skipping timeout creation"); + return; } + + if (!mHasHomeDelay.compareAndSet(false, true)) return; + + mHandler.postDelayed(() -> { + int userId = mUserController.getCurrentUserId(); + if (!isThemeOverlayReady(userId)) { + Slog.d(TAG, + "ThemeHomeDelay: ThemeOverlayController not responding, launching " + + "Home after " + HOME_LAUNCH_TIMEOUT_MS + "ms" + + " with user " + userId); + setThemeOverlayReady(userId); + } + }, HOME_LAUNCH_TIMEOUT_MS); + } /** @@ -5302,22 +5308,28 @@ public class ActivityManagerService extends IActivityManager.Stub * palette is ready. * * @param userId The ID of the user where ThemeOverlayController is ready. - * - * @throws RemoteException - * * @hide */ @Override public void setThemeOverlayReady(@UserIdInt int userId) { + if (!isHomeLaunchDelayable()) { + Slog.d(TAG, "ThemeHomeDelay: Home launch is not delayable, " + + "ignoring setThemeOverlayReady() call"); + return; + } + enforceCallingPermission(Manifest.permission.SET_THEME_OVERLAY_CONTROLLER_READY, "setThemeOverlayReady"); - + Slog.d(TAG, "ThemeHomeDelay: userId " + userId + + " notified ThemeOverlayController completeness"); boolean updateUser; synchronized (mThemeOverlayReadyUsers) { updateUser = mThemeOverlayReadyUsers.add(userId); + Slog.d(TAG, "ThemeHomeDelay: updateUser " + userId + " isUpdatable: " + updateUser); } - if (updateUser && enableHomeDelay()) { + if (updateUser) { + Slog.d(TAG, "ThemeHomeDelay: updating user " + userId); mAtmInternal.startHomeOnAllDisplays(userId, "setThemeOverlayReady"); } } @@ -5334,6 +5346,16 @@ public class ActivityManagerService extends IActivityManager.Stub } } + /** + * Checks if feature flag is enabled and if system is Headless (HSUM), case in which + * home delay should be skipped. + * + * @hide + */ + public boolean isHomeLaunchDelayable() { + return !UserManager.isHeadlessSystemUserMode() && enableHomeDelay(); + } + final void ensureBootCompleted() { boolean booting; boolean enableScreen; @@ -18142,8 +18164,10 @@ public class ActivityManagerService extends IActivityManager.Stub // Clean up various services by removing the user mBatteryStatsService.onUserRemoved(userId); - synchronized (mThemeOverlayReadyUsers) { - mThemeOverlayReadyUsers.remove(userId); + if (isHomeLaunchDelayable()) { + synchronized (mThemeOverlayReadyUsers) { + mThemeOverlayReadyUsers.remove(userId); + } } } @@ -19496,8 +19520,12 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override - public boolean isThemeOverlayReady(int userId) { - return ActivityManagerService.this.isThemeOverlayReady(userId); + public boolean shouldDelayHomeLaunch(int userId) { + if (!isHomeLaunchDelayable()) return false; + + synchronized (mThemeOverlayReadyUsers) { + return !ActivityManagerService.this.mThemeOverlayReadyUsers.contains(userId); + } } } diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 445a5c83e1c8..d66005f8fd99 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -83,7 +83,6 @@ import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE import static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_NONE; import static com.android.server.wm.WindowSurfacePlacer.SET_UPDATE_ROTATION; import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_ACTION_PENDING; -import static com.android.systemui.shared.Flags.enableHomeDelay; import static java.lang.Integer.MAX_VALUE; @@ -1452,8 +1451,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> return false; } - if (enableHomeDelay() && !mService.mAmInternal.isThemeOverlayReady(userId)) { - Slog.d(TAG, "ThemeHomeDelay: Home launch was deferred."); + if (mService.mAmInternal.shouldDelayHomeLaunch(userId)) { + Slog.d(TAG, "ThemeHomeDelay: Home launch was deferred with user " + userId); return false; } diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java index a8f6fe86c823..413d003ae7aa 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java +++ b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java @@ -346,7 +346,7 @@ public class SystemServicesTestRule implements TestRule { doReturn(true).when(amInternal).hasStartedUserState(anyInt()); doReturn(false).when(amInternal).shouldConfirmCredentials(anyInt()); doReturn(false).when(amInternal).isActivityStartsLoggingEnabled(); - doReturn(true).when(amInternal).isThemeOverlayReady(anyInt()); + doReturn(false).when(amInternal).shouldDelayHomeLaunch(anyInt()); LocalServices.addService(ActivityManagerInternal.class, amInternal); final ActivityManagerService amService = |