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

Commit 2867c571 authored by Aurélien Pomini's avatar Aurélien Pomini
Browse files

Update contrast listener in systemui on user switch

In case of user switch, make sure to unregister the listener for the
previous user and register a new one. Do this via the existing
UserTracker.Callback.

Flag: android.app.fix_contrast_and_force_invert_state_for_multi_user
Test: manual
Bug: 362682063
Change-Id: I07c5e9445131f1300904f1430dc747079bb3f13c
parent fedf9129
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ import com.android.systemui.monet.Style;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
import com.android.systemui.user.utils.UserScopedService;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.settings.SecureSettings;

@@ -137,6 +138,8 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
    @Mock
    private WakefulnessLifecycle mWakefulnessLifecycle;
    @Mock
    private UserScopedService<UiModeManager> mUiModeManagerProvider;
    @Mock
    private UiModeManager mUiModeManager;
    @Mock
    private ActivityManager mActivityManager;
@@ -162,6 +165,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {

        when(mFeatureFlags.isEnabled(Flags.MONET)).thenReturn(true);
        when(mWakefulnessLifecycle.getWakefulness()).thenReturn(WAKEFULNESS_AWAKE);
        when(mUiModeManagerProvider.forUser(any(UserHandle.class))).thenReturn(mUiModeManager);
        when(mUiModeManager.getContrast()).thenReturn(0.5f);

        when(mResources.getColor(eq(android.R.color.system_accent1_500), any()))
@@ -187,8 +191,8 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
                mBroadcastDispatcher, mBgHandler, mMainExecutor, mBgExecutor, mThemeOverlayApplier,
                mSecureSettings, mWallpaperManager, mUserManager, mDeviceProvisionedController,
                mUserTracker, mDumpManager, mFeatureFlags, mResources, mWakefulnessLifecycle,
                mJavaAdapter, mKeyguardTransitionInteractor, mUiModeManager, mActivityManager,
                mSystemProperties) {
                mJavaAdapter, mKeyguardTransitionInteractor, mUiModeManager, mUiModeManagerProvider,
                mActivityManager, mSystemProperties) {
            @VisibleForTesting
            protected boolean isNightMode() {
                return false;
@@ -925,8 +929,8 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
                mBroadcastDispatcher, mBgHandler, executor, executor, mThemeOverlayApplier,
                mSecureSettings, mWallpaperManager, mUserManager, mDeviceProvisionedController,
                mUserTracker, mDumpManager, mFeatureFlags, mResources, mWakefulnessLifecycle,
                mJavaAdapter, mKeyguardTransitionInteractor, mUiModeManager, mActivityManager,
                mSystemProperties) {
                mJavaAdapter, mKeyguardTransitionInteractor, mUiModeManager, mUiModeManagerProvider,
                mActivityManager, mSystemProperties) {
            @VisibleForTesting
            protected boolean isNightMode() {
                return false;
@@ -966,8 +970,8 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
                mBroadcastDispatcher, mBgHandler, executor, executor, mThemeOverlayApplier,
                mSecureSettings, mWallpaperManager, mUserManager, mDeviceProvisionedController,
                mUserTracker, mDumpManager, mFeatureFlags, mResources, mWakefulnessLifecycle,
                mJavaAdapter, mKeyguardTransitionInteractor, mUiModeManager, mActivityManager,
                mSystemProperties) {
                mJavaAdapter, mKeyguardTransitionInteractor, mUiModeManager, mUiModeManagerProvider,
                mActivityManager, mSystemProperties) {
            @VisibleForTesting
            protected boolean isNightMode() {
                return false;
+6 −0
Original line number Diff line number Diff line
@@ -571,6 +571,12 @@ public class FrameworkServicesModule {
        return context.getSystemService(UiModeManager.class);
    }

    @Provides
    @Singleton
    static UserScopedService<UiModeManager> provideUserScopedUiModeManager(Context context) {
        return new UserScopedServiceImpl<>(context, UiModeManager.class);
    }

    /** */
    @Provides
    @Singleton
+35 −11
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@
 */

package com.android.systemui.theme;

import static android.app.Flags.fixContrastAndForceInvertStateForMultiUser;
import static android.util.TypedValue.TYPE_INT_COLOR_ARGB8;

import static com.android.systemui.Flags.hardwareColorStyles;
@@ -85,6 +85,7 @@ import com.android.systemui.monet.Style;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
import com.android.systemui.user.utils.UserScopedService;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.settings.SecureSettings;

@@ -173,6 +174,7 @@ public class ThemeOverlayController implements CoreStartable, Dumpable {
    private final KeyguardTransitionInteractor mKeyguardTransitionInteractor;
    private final StateFlow<Boolean> mIsKeyguardOnAsleepState;
    private final UiModeManager mUiModeManager;
    private final UserScopedService<UiModeManager> mUiModeManagerProvider;
    private ColorScheme mDarkColorScheme;
    private ColorScheme mLightColorScheme;

@@ -237,17 +239,32 @@ public class ThemeOverlayController implements CoreStartable, Dumpable {
    private final UserTracker.Callback mUserTrackerCallback = new UserTracker.Callback() {
        @Override
        public void onUserChanged(int newUser, @NonNull Context userContext) {
            if (fixContrastAndForceInvertStateForMultiUser()) {
                UiModeManager uiModeManager = mUiModeManagerProvider.forUser(
                        UserHandle.of(newUser));
                uiModeManager.removeContrastChangeListener(mContrastChangeListener);
                uiModeManager.addContrastChangeListener(mMainExecutor, mContrastChangeListener);
                mContrast = uiModeManager.getContrast();
            }

            boolean isManagedProfile = mUserManager.isManagedProfile(newUser);
            if (!mDeviceProvisionedController.isCurrentUserSetup() && isManagedProfile) {
                Log.i(TAG, "User setup not finished when new user event was received. "
                        + "Deferring... Managed profile? " + isManagedProfile);
                return;
            }

            if (DEBUG) Log.d(TAG, "Updating overlays for user switch / profile added.");
            reevaluateSystemTheme(true /* forceReload */);
        }
    };

    private final UiModeManager.ContrastChangeListener mContrastChangeListener = contrast -> {
        mContrast = contrast;
        // Force reload so that we update even when the main color has not changed
        reevaluateSystemTheme(true /* forceReload */);
    };

    private int getDefaultWallpaperColorsSource(int userId) {
        if (com.android.systemui.shared.Flags.newCustomizationPickerUi()) {
            // The wallpaper colors source is always the home wallpaper.
@@ -427,7 +444,8 @@ public class ThemeOverlayController implements CoreStartable, Dumpable {
            WakefulnessLifecycle wakefulnessLifecycle,
            JavaAdapter javaAdapter,
            KeyguardTransitionInteractor keyguardTransitionInteractor,
            UiModeManager uiModeManager,
            UiModeManager uiModeManager, // TODO(b/362682063) legacy argument, remove
            UserScopedService<UiModeManager> uiModeManagerProvider,
            ActivityManager activityManager,
            SystemPropertiesHelper systemPropertiesHelper
    ) {
@@ -448,6 +466,7 @@ public class ThemeOverlayController implements CoreStartable, Dumpable {
        mJavaAdapter = javaAdapter;
        mKeyguardTransitionInteractor = keyguardTransitionInteractor;
        mUiModeManager = uiModeManager;
        mUiModeManagerProvider = uiModeManagerProvider;
        mActivityManager = activityManager;
        mSystemPropertiesHelper = systemPropertiesHelper;
        dumpManager.registerDumpable(TAG, this);
@@ -490,12 +509,19 @@ public class ThemeOverlayController implements CoreStartable, Dumpable {
                    }
                },
                UserHandle.USER_ALL);
        int userId = mUserTracker.getUserId();
        if (fixContrastAndForceInvertStateForMultiUser()) {
            UiModeManager uiModeManager = mUiModeManagerProvider.forUser(UserHandle.of(userId));
            uiModeManager.addContrastChangeListener(mMainExecutor, mContrastChangeListener);
            mContrast = uiModeManager.getContrast();
        } else {
            mContrast = mUiModeManager.getContrast();
            mUiModeManager.addContrastChangeListener(mMainExecutor, contrast -> {
                mContrast = contrast;
                // Force reload so that we update even when the main color has not changed
                reevaluateSystemTheme(true /* forceReload */);
            });
        }

        // All wallpaper color and keyguard logic only applies when Monet is enabled.
        if (!mIsMonetEnabled) {
@@ -522,11 +548,10 @@ public class ThemeOverlayController implements CoreStartable, Dumpable {
            );

            /* We update the json in THEME_CUSTOMIZATION_OVERLAY_PACKAGES to reflect the preset. */
            final int currentUser = mUserTracker.getUserId();
            final String overlayPackageJson = Objects.requireNonNullElse(
                    mSecureSettings.getStringForUser(
                            Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES,
                            currentUser),
                            userId),
                    "{}"
            );

@@ -578,7 +603,6 @@ public class ThemeOverlayController implements CoreStartable, Dumpable {
                UserHandle.USER_ALL);

        Runnable whenAsleepHandler = () -> {
            final int userId = mUserTracker.getUserId();
            final WallpaperColors colors = mDeferredWallpaperColors.get(userId);
            if (colors != null) {
                int flags = mDeferredWallpaperColorsFlags.get(userId);