Loading packages/SystemUI/aconfig/systemui.aconfig +9 −0 Original line number Diff line number Diff line Loading @@ -142,9 +142,18 @@ flag { bug: "281655028" } flag { name: "theme_overlay_controller_wakefulness_deprecation" namespace: "systemui" description: "Replacing WakefulnessLifecycle by KeyguardTransitionInteractor in " "ThemOverlayController to mitigate flickering when locking the device" bug: "308676488" } flag { name: "media_in_scene_container" namespace: "systemui" description: "Enable media in the scene container framework" bug: "296122467" } packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt +7 −0 Original line number Diff line number Diff line Loading @@ -302,4 +302,11 @@ constructor( fun isFinishedInState(state: KeyguardState): Flow<Boolean> { return finishedKeyguardState.map { it == state }.distinctUntilChanged() } /** * Whether we've FINISHED a transition to a state that matches the given predicate. Consider * using [isFinishedInStateWhere] whenever possible instead */ fun isFinishedInStateWhereValue(stateMatcher: (KeyguardState) -> Boolean) = stateMatcher(finishedKeyguardState.replayCache.last()) } packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +43 −18 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.theme; import static android.util.TypedValue.TYPE_INT_COLOR_ARGB8; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_ASLEEP; import static com.android.systemui.Flags.themeOverlayControllerWakefulnessDeprecation; 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; Loading Loading @@ -71,12 +72,15 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; import com.android.systemui.keyguard.shared.model.KeyguardState; import com.android.systemui.monet.ColorScheme; import com.android.systemui.monet.Style; import com.android.systemui.monet.TonalPalette; 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.util.kotlin.JavaAdapter; import com.android.systemui.util.settings.SecureSettings; import com.google.ux.material.libmonet.dynamiccolor.MaterialDynamicColors; Loading Loading @@ -127,7 +131,6 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { private final SecureSettings mSecureSettings; private final Executor mMainExecutor; private final Handler mBgHandler; private final boolean mIsMonochromaticEnabled; private final Context mContext; private final boolean mIsMonetEnabled; private final boolean mIsFidelityEnabled; Loading Loading @@ -161,6 +164,8 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { private final SparseArray<WallpaperColors> mDeferredWallpaperColors = new SparseArray<>(); private final SparseIntArray mDeferredWallpaperColorsFlags = new SparseIntArray(); private final WakefulnessLifecycle mWakefulnessLifecycle; private final JavaAdapter mJavaAdapter; private final KeyguardTransitionInteractor mKeyguardTransitionInteractor; private final UiModeManager mUiModeManager; private DynamicScheme mDynamicSchemeDark; private DynamicScheme mDynamicSchemeLight; Loading Loading @@ -200,8 +205,12 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { return; } boolean currentUser = userId == mUserTracker.getUserId(); if (currentUser && !mAcceptColorEvents && mWakefulnessLifecycle.getWakefulness() != WAKEFULNESS_ASLEEP) { boolean isAsleep = themeOverlayControllerWakefulnessDeprecation() ? mKeyguardTransitionInteractor.isFinishedInStateWhereValue( state -> KeyguardState.Companion.deviceIsAsleepInState(state)) : mWakefulnessLifecycle.getWakefulness() != WAKEFULNESS_ASLEEP; if (currentUser && !mAcceptColorEvents && isAsleep) { mDeferredWallpaperColors.put(userId, wallpaperColors); mDeferredWallpaperColorsFlags.put(userId, which); Log.i(TAG, "colors received; processing deferred until screen off: " Loading Loading @@ -395,9 +404,10 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { FeatureFlags featureFlags, @Main Resources resources, WakefulnessLifecycle wakefulnessLifecycle, JavaAdapter javaAdapter, KeyguardTransitionInteractor keyguardTransitionInteractor, UiModeManager uiModeManager) { mContext = context; mIsMonochromaticEnabled = featureFlags.isEnabled(Flags.MONOCHROMATIC_THEME); mIsMonetEnabled = featureFlags.isEnabled(Flags.MONET); mIsFidelityEnabled = featureFlags.isEnabled(Flags.COLOR_FIDELITY); mDeviceProvisionedController = deviceProvisionedController; Loading @@ -412,6 +422,8 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { mUserTracker = userTracker; mResources = resources; mWakefulnessLifecycle = wakefulnessLifecycle; mJavaAdapter = javaAdapter; mKeyguardTransitionInteractor = keyguardTransitionInteractor; mUiModeManager = uiModeManager; dumpManager.registerDumpable(TAG, this); } Loading Loading @@ -494,9 +506,8 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { } mWallpaperManager.addOnColorsChangedListener(mOnColorsChangedListener, null, UserHandle.USER_ALL); mWakefulnessLifecycle.addObserver(new WakefulnessLifecycle.Observer() { @Override public void onFinishedGoingToSleep() { Runnable whenAsleepHandler = () -> { final int userId = mUserTracker.getUserId(); final WallpaperColors colors = mDeferredWallpaperColors.get(userId); if (colors != null) { Loading @@ -507,9 +518,23 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { handleWallpaperColors(colors, flags, userId); } }; if (themeOverlayControllerWakefulnessDeprecation()) { mJavaAdapter.alwaysCollectFlow( mKeyguardTransitionInteractor.isFinishedInState(KeyguardState.DOZING), isFinishedInDozing -> { if (isFinishedInDozing) whenAsleepHandler.run(); }); } else { mWakefulnessLifecycle.addObserver(new WakefulnessLifecycle.Observer() { @Override public void onFinishedGoingToSleep() { whenAsleepHandler.run(); } }); } } private void reevaluateSystemTheme(boolean forceReload) { final WallpaperColors currentColors = mCurrentColors.get(mUserTracker.getUserId()); Loading packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java +10 −4 Original line number Diff line number Diff line Loading @@ -61,10 +61,12 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; 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.util.kotlin.JavaAdapter; import com.android.systemui.util.settings.SecureSettings; import com.google.common.util.concurrent.MoreExecutors; Loading @@ -88,7 +90,10 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { private static final int USER_SYSTEM = UserHandle.USER_SYSTEM; private static final int USER_SECONDARY = 10; @Mock private JavaAdapter mJavaAdapter; @Mock private KeyguardTransitionInteractor mKeyguardTransitionInteractor; private ThemeOverlayController mThemeOverlayController; @Mock private Executor mBgExecutor; Loading Loading @@ -150,11 +155,12 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { .thenReturn(Color.YELLOW); when(mResources.getColor(eq(android.R.color.system_neutral2_500), any())) .thenReturn(Color.BLACK); mThemeOverlayController = new ThemeOverlayController(mContext, mBroadcastDispatcher, mBgHandler, mMainExecutor, mBgExecutor, mThemeOverlayApplier, mSecureSettings, mWallpaperManager, mUserManager, mDeviceProvisionedController, mUserTracker, mDumpManager, mFeatureFlags, mResources, mWakefulnessLifecycle, mUiModeManager) { mJavaAdapter, mKeyguardTransitionInteractor, mUiModeManager) { @VisibleForTesting protected boolean isNightMode() { return false; Loading Loading @@ -736,7 +742,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { mBroadcastDispatcher, mBgHandler, executor, executor, mThemeOverlayApplier, mSecureSettings, mWallpaperManager, mUserManager, mDeviceProvisionedController, mUserTracker, mDumpManager, mFeatureFlags, mResources, mWakefulnessLifecycle, mUiModeManager) { mJavaAdapter, mKeyguardTransitionInteractor, mUiModeManager) { @VisibleForTesting protected boolean isNightMode() { return false; Loading Loading @@ -776,7 +782,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { mBroadcastDispatcher, mBgHandler, executor, executor, mThemeOverlayApplier, mSecureSettings, mWallpaperManager, mUserManager, mDeviceProvisionedController, mUserTracker, mDumpManager, mFeatureFlags, mResources, mWakefulnessLifecycle, mUiModeManager) { mJavaAdapter, mKeyguardTransitionInteractor, mUiModeManager) { @VisibleForTesting protected boolean isNightMode() { return false; Loading Loading
packages/SystemUI/aconfig/systemui.aconfig +9 −0 Original line number Diff line number Diff line Loading @@ -142,9 +142,18 @@ flag { bug: "281655028" } flag { name: "theme_overlay_controller_wakefulness_deprecation" namespace: "systemui" description: "Replacing WakefulnessLifecycle by KeyguardTransitionInteractor in " "ThemOverlayController to mitigate flickering when locking the device" bug: "308676488" } flag { name: "media_in_scene_container" namespace: "systemui" description: "Enable media in the scene container framework" bug: "296122467" }
packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt +7 −0 Original line number Diff line number Diff line Loading @@ -302,4 +302,11 @@ constructor( fun isFinishedInState(state: KeyguardState): Flow<Boolean> { return finishedKeyguardState.map { it == state }.distinctUntilChanged() } /** * Whether we've FINISHED a transition to a state that matches the given predicate. Consider * using [isFinishedInStateWhere] whenever possible instead */ fun isFinishedInStateWhereValue(stateMatcher: (KeyguardState) -> Boolean) = stateMatcher(finishedKeyguardState.replayCache.last()) }
packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +43 −18 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.theme; import static android.util.TypedValue.TYPE_INT_COLOR_ARGB8; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_ASLEEP; import static com.android.systemui.Flags.themeOverlayControllerWakefulnessDeprecation; 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; Loading Loading @@ -71,12 +72,15 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; import com.android.systemui.keyguard.shared.model.KeyguardState; import com.android.systemui.monet.ColorScheme; import com.android.systemui.monet.Style; import com.android.systemui.monet.TonalPalette; 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.util.kotlin.JavaAdapter; import com.android.systemui.util.settings.SecureSettings; import com.google.ux.material.libmonet.dynamiccolor.MaterialDynamicColors; Loading Loading @@ -127,7 +131,6 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { private final SecureSettings mSecureSettings; private final Executor mMainExecutor; private final Handler mBgHandler; private final boolean mIsMonochromaticEnabled; private final Context mContext; private final boolean mIsMonetEnabled; private final boolean mIsFidelityEnabled; Loading Loading @@ -161,6 +164,8 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { private final SparseArray<WallpaperColors> mDeferredWallpaperColors = new SparseArray<>(); private final SparseIntArray mDeferredWallpaperColorsFlags = new SparseIntArray(); private final WakefulnessLifecycle mWakefulnessLifecycle; private final JavaAdapter mJavaAdapter; private final KeyguardTransitionInteractor mKeyguardTransitionInteractor; private final UiModeManager mUiModeManager; private DynamicScheme mDynamicSchemeDark; private DynamicScheme mDynamicSchemeLight; Loading Loading @@ -200,8 +205,12 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { return; } boolean currentUser = userId == mUserTracker.getUserId(); if (currentUser && !mAcceptColorEvents && mWakefulnessLifecycle.getWakefulness() != WAKEFULNESS_ASLEEP) { boolean isAsleep = themeOverlayControllerWakefulnessDeprecation() ? mKeyguardTransitionInteractor.isFinishedInStateWhereValue( state -> KeyguardState.Companion.deviceIsAsleepInState(state)) : mWakefulnessLifecycle.getWakefulness() != WAKEFULNESS_ASLEEP; if (currentUser && !mAcceptColorEvents && isAsleep) { mDeferredWallpaperColors.put(userId, wallpaperColors); mDeferredWallpaperColorsFlags.put(userId, which); Log.i(TAG, "colors received; processing deferred until screen off: " Loading Loading @@ -395,9 +404,10 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { FeatureFlags featureFlags, @Main Resources resources, WakefulnessLifecycle wakefulnessLifecycle, JavaAdapter javaAdapter, KeyguardTransitionInteractor keyguardTransitionInteractor, UiModeManager uiModeManager) { mContext = context; mIsMonochromaticEnabled = featureFlags.isEnabled(Flags.MONOCHROMATIC_THEME); mIsMonetEnabled = featureFlags.isEnabled(Flags.MONET); mIsFidelityEnabled = featureFlags.isEnabled(Flags.COLOR_FIDELITY); mDeviceProvisionedController = deviceProvisionedController; Loading @@ -412,6 +422,8 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { mUserTracker = userTracker; mResources = resources; mWakefulnessLifecycle = wakefulnessLifecycle; mJavaAdapter = javaAdapter; mKeyguardTransitionInteractor = keyguardTransitionInteractor; mUiModeManager = uiModeManager; dumpManager.registerDumpable(TAG, this); } Loading Loading @@ -494,9 +506,8 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { } mWallpaperManager.addOnColorsChangedListener(mOnColorsChangedListener, null, UserHandle.USER_ALL); mWakefulnessLifecycle.addObserver(new WakefulnessLifecycle.Observer() { @Override public void onFinishedGoingToSleep() { Runnable whenAsleepHandler = () -> { final int userId = mUserTracker.getUserId(); final WallpaperColors colors = mDeferredWallpaperColors.get(userId); if (colors != null) { Loading @@ -507,9 +518,23 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { handleWallpaperColors(colors, flags, userId); } }; if (themeOverlayControllerWakefulnessDeprecation()) { mJavaAdapter.alwaysCollectFlow( mKeyguardTransitionInteractor.isFinishedInState(KeyguardState.DOZING), isFinishedInDozing -> { if (isFinishedInDozing) whenAsleepHandler.run(); }); } else { mWakefulnessLifecycle.addObserver(new WakefulnessLifecycle.Observer() { @Override public void onFinishedGoingToSleep() { whenAsleepHandler.run(); } }); } } private void reevaluateSystemTheme(boolean forceReload) { final WallpaperColors currentColors = mCurrentColors.get(mUserTracker.getUserId()); Loading
packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java +10 −4 Original line number Diff line number Diff line Loading @@ -61,10 +61,12 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; 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.util.kotlin.JavaAdapter; import com.android.systemui.util.settings.SecureSettings; import com.google.common.util.concurrent.MoreExecutors; Loading @@ -88,7 +90,10 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { private static final int USER_SYSTEM = UserHandle.USER_SYSTEM; private static final int USER_SECONDARY = 10; @Mock private JavaAdapter mJavaAdapter; @Mock private KeyguardTransitionInteractor mKeyguardTransitionInteractor; private ThemeOverlayController mThemeOverlayController; @Mock private Executor mBgExecutor; Loading Loading @@ -150,11 +155,12 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { .thenReturn(Color.YELLOW); when(mResources.getColor(eq(android.R.color.system_neutral2_500), any())) .thenReturn(Color.BLACK); mThemeOverlayController = new ThemeOverlayController(mContext, mBroadcastDispatcher, mBgHandler, mMainExecutor, mBgExecutor, mThemeOverlayApplier, mSecureSettings, mWallpaperManager, mUserManager, mDeviceProvisionedController, mUserTracker, mDumpManager, mFeatureFlags, mResources, mWakefulnessLifecycle, mUiModeManager) { mJavaAdapter, mKeyguardTransitionInteractor, mUiModeManager) { @VisibleForTesting protected boolean isNightMode() { return false; Loading Loading @@ -736,7 +742,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { mBroadcastDispatcher, mBgHandler, executor, executor, mThemeOverlayApplier, mSecureSettings, mWallpaperManager, mUserManager, mDeviceProvisionedController, mUserTracker, mDumpManager, mFeatureFlags, mResources, mWakefulnessLifecycle, mUiModeManager) { mJavaAdapter, mKeyguardTransitionInteractor, mUiModeManager) { @VisibleForTesting protected boolean isNightMode() { return false; Loading Loading @@ -776,7 +782,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { mBroadcastDispatcher, mBgHandler, executor, executor, mThemeOverlayApplier, mSecureSettings, mWallpaperManager, mUserManager, mDeviceProvisionedController, mUserTracker, mDumpManager, mFeatureFlags, mResources, mWakefulnessLifecycle, mUiModeManager) { mJavaAdapter, mKeyguardTransitionInteractor, mUiModeManager) { @VisibleForTesting protected boolean isNightMode() { return false; Loading