Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3bf69d45 authored by Marcelo Arteiro's avatar Marcelo Arteiro Committed by Android (Google) Code Review
Browse files

Merge "[DO NOT MERGE] Fixes boot issues on Headless (HSUM) related to ag/25382994" into udc-qpr-dev

parents 84f14933 f9571f82
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -1236,9 +1236,12 @@ public abstract class ActivityManagerInternal {
            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);
}
+2 −1
Original line number Diff line number Diff line
@@ -769,7 +769,8 @@ public class ThemeOverlayController implements CoreStartable, Dumpable {
        }

        final Runnable onCompleteCallback = () -> {
            Log.d(TAG, "ThemeHomeDelay: ThemeOverlayController ready");
            Log.d(TAG, "ThemeHomeDelay: ThemeOverlayController ready with user "
                    + currentUser);
            mActivityManager.setThemeOverlayReady(currentUser);
        };

+47 −19
Original line number Diff line number Diff line
@@ -5251,18 +5251,24 @@ public class ActivityManagerService extends IActivityManager.Stub
     * Starts Home if there is no completion signal from ThemeOverlayController
     */
    private void scheduleHomeTimeout() {
        if (mHasHomeDelay.compareAndSet(false, true)) {
            int userId = mUserController.getCurrentUserId();
        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");
                                + "Home after " + HOME_LAUNCH_TIMEOUT_MS + "ms"
                                + " with user " + userId);
                setThemeOverlayReady(userId);
            }
        }, HOME_LAUNCH_TIMEOUT_MS);
        }
    }
    /**
@@ -5270,22 +5276,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) {
          Slog.d(TAG, "ThemeHomeDelay: updating user " + userId);
            mAtmInternal.startHomeOnAllDisplays(userId, "setThemeOverlayReady");
        }
    }
@@ -5302,6 +5314,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();
    }
    final void ensureBootCompleted() {
        boolean booting;
        boolean enableScreen;
@@ -17680,10 +17702,12 @@ public class ActivityManagerService extends IActivityManager.Stub
            // Clean up various services by removing the user
            mBatteryStatsService.onUserRemoved(userId);
            if (isHomeLaunchDelayable()) {
                synchronized (mThemeOverlayReadyUsers) {
                    mThemeOverlayReadyUsers.remove(userId);
                }
            }
        }
        @Override
        public void killForegroundAppsForUser(@UserIdInt int userId) {
@@ -19039,8 +19063,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);
            }
        }
    }
+2 −2
Original line number Diff line number Diff line
@@ -1452,8 +1452,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
            return false;
        }

        if (!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;
        }

+1 −1
Original line number Diff line number Diff line
@@ -311,7 +311,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 =