summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/ActivityManagerInternal.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java12
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java68
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java2
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 =