Loading packages/SystemUI/multivalentTests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java +10 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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())) Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java +6 −0 Original line number Diff line number Diff line Loading @@ -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 Loading packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +35 −11 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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. Loading Loading @@ -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 ) { Loading @@ -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); Loading Loading @@ -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) { Loading @@ -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), "{}" ); Loading Loading @@ -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); Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java +10 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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())) Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading
packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java +6 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +35 −11 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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. Loading Loading @@ -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 ) { Loading @@ -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); Loading Loading @@ -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) { Loading @@ -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), "{}" ); Loading Loading @@ -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); Loading