Loading packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java +10 −0 Original line number Diff line number Diff line Loading @@ -128,6 +128,7 @@ import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; Loading Loading @@ -240,6 +241,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene private final ScreenshotHelper mScreenshotHelper; private final SysuiColorExtractor mSysuiColorExtractor; private final IStatusBarService mStatusBarService; protected final LightBarController mLightBarController; protected final NotificationShadeWindowController mNotificationShadeWindowController; private final IWindowManager mIWindowManager; private final Executor mBackgroundExecutor; Loading Loading @@ -349,6 +351,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene MetricsLogger metricsLogger, SysuiColorExtractor colorExtractor, IStatusBarService statusBarService, LightBarController lightBarController, NotificationShadeWindowController notificationShadeWindowController, IWindowManager iWindowManager, @Background Executor backgroundExecutor, Loading Loading @@ -381,6 +384,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mUiEventLogger = uiEventLogger; mSysuiColorExtractor = colorExtractor; mStatusBarService = statusBarService; mLightBarController = lightBarController; mNotificationShadeWindowController = notificationShadeWindowController; mIWindowManager = iWindowManager; mBackgroundExecutor = backgroundExecutor; Loading Loading @@ -694,6 +698,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene ActionsDialogLite dialog = new ActionsDialogLite(mContext, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActionsLite, mAdapter, mOverflowAdapter, mSysuiColorExtractor, mStatusBarService, mLightBarController, mNotificationShadeWindowController, this::onRefresh, mKeyguardShowing, mPowerAdapter, mUiEventLogger, mCentralSurfacesOptional, mKeyguardUpdateMonitor, mLockPatternUtils); Loading Loading @@ -2192,6 +2197,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene protected final SysuiColorExtractor mColorExtractor; private boolean mKeyguardShowing; protected float mScrimAlpha; protected final LightBarController mLightBarController; protected final NotificationShadeWindowController mNotificationShadeWindowController; private ListPopupWindow mOverflowPopup; private Dialog mPowerOptionsDialog; Loading Loading @@ -2267,6 +2273,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene ActionsDialogLite(Context context, int themeRes, MyAdapter adapter, MyOverflowAdapter overflowAdapter, SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService, LightBarController lightBarController, NotificationShadeWindowController notificationShadeWindowController, Runnable onRefreshCallback, boolean keyguardShowing, MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger, Loading @@ -2282,6 +2289,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mPowerOptionsAdapter = powerAdapter; mColorExtractor = sysuiColorExtractor; mStatusBarService = statusBarService; mLightBarController = lightBarController; mNotificationShadeWindowController = notificationShadeWindowController; mOnRefreshCallback = onRefreshCallback; mKeyguardShowing = keyguardShowing; Loading Loading @@ -2474,6 +2482,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene @Override protected void start() { mGlobalActionsLayout.updateList(); mLightBarController.setGlobalActionsVisible(true); if (mBackgroundDrawable instanceof ScrimDrawable) { mColorExtractor.addOnColorsChangedListener(this); Loading Loading @@ -2504,6 +2513,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene @Override protected void stop() { mLightBarController.setGlobalActionsVisible(false); mColorExtractor.removeOnColorsChangedListener(this); } Loading packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +7 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardStatusBarView; import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.LockscreenGestureLogger; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; Loading Loading @@ -117,6 +118,7 @@ public class QuickSettingsController { private final PulseExpansionHandler mPulseExpansionHandler; private final ShadeExpansionStateManager mShadeExpansionStateManager; private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private final LightBarController mLightBarController; private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController; private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; private final NotificationShadeDepthController mDepthController; Loading Loading @@ -304,6 +306,7 @@ public class QuickSettingsController { NotificationRemoteInputManager remoteInputManager, ShadeExpansionStateManager shadeExpansionStateManager, StatusBarKeyguardViewManager statusBarKeyguardViewManager, LightBarController lightBarController, NotificationStackScrollLayoutController notificationStackScrollLayoutController, LockscreenShadeTransitionController lockscreenShadeTransitionController, NotificationShadeDepthController notificationShadeDepthController, Loading Loading @@ -346,6 +349,7 @@ public class QuickSettingsController { mRemoteInputManager = remoteInputManager; mShadeExpansionStateManager = shadeExpansionStateManager; mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mLightBarController = lightBarController; mNotificationStackScrollLayoutController = notificationStackScrollLayoutController; mLockscreenShadeTransitionController = lockscreenShadeTransitionController; mDepthController = notificationShadeDepthController; Loading Loading @@ -1018,6 +1022,9 @@ public class QuickSettingsController { mShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction); mShadeHeaderController.setQsExpandedFraction(qsExpansionFraction); mShadeHeaderController.setQsVisible(mVisible); // Update the light bar mLightBarController.setQsExpanded(mFullyExpanded); } float getLockscreenShadeDragProgress() { Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java +141 −22 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARE import android.annotation.ColorInt; import android.content.Context; import android.graphics.Rect; import android.util.Log; import android.view.InsetsFlags; import android.view.ViewDebug; import android.view.WindowInsetsController.Appearance; Loading @@ -35,13 +36,17 @@ import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.settings.DisplayTracker; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.util.Compile; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Date; import javax.inject.Inject; Loading @@ -51,10 +56,14 @@ import javax.inject.Inject; @SysUISingleton public class LightBarController implements BatteryController.BatteryStateChangeCallback, Dumpable { private static final String TAG = "LightBarController"; private static final boolean DEBUG = Compile.IS_DEBUG && Log.isLoggable(TAG, Log.DEBUG); private static final float NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD = 0.1f; private final SysuiDarkIconDispatcher mStatusBarIconController; private final BatteryController mBatteryController; private final boolean mUseNewLightBarLogic; private BiometricUnlockController mBiometricUnlockController; private LightBarTransitionsController mNavigationBarController; Loading @@ -67,13 +76,17 @@ public class LightBarController implements BatteryController.BatteryStateChangeC private final int mLightIconColor; /** * Whether the navigation bar should be light factoring in already how much alpha the scrim has * Whether the navigation bar should be light factoring in already how much alpha the scrim has. * "Light" refers to the background color of the navigation bar, so when this is true, * it's referring to a state where the navigation bar icons are tinted dark. */ private boolean mNavigationLight; /** * Whether the flags indicate that a light status bar is requested. This doesn't factor in the * scrim alpha yet. * Whether the flags indicate that a light navigation bar is requested. * "Light" refers to the background color of the navigation bar, so when this is true, * it's referring to a state where the navigation bar icons would be tinted dark. * This doesn't factor in the scrim alpha yet. */ private boolean mHasLightNavigationBar; Loading @@ -82,22 +95,34 @@ public class LightBarController implements BatteryController.BatteryStateChangeC * {@link #mNavigationLight} {@code false}. */ private boolean mForceDarkForScrim; /** * {@code true} if {@link #mHasLightNavigationBar} should be ignored and forcefully make * {@link #mNavigationLight} {@code true}. */ private boolean mForceLightForScrim; private boolean mQsCustomizing; private boolean mQsExpanded; private boolean mGlobalActionsVisible; private boolean mDirectReplying; private boolean mNavbarColorManagedByIme; private boolean mIsCustomizingForBackNav; private String mLastSetScrimStateLog; private String mLastNavigationBarAppearanceChangedLog; @Inject public LightBarController( Context ctx, DarkIconDispatcher darkIconDispatcher, BatteryController batteryController, NavigationModeController navModeController, FeatureFlags featureFlags, DumpManager dumpManager, DisplayTracker displayTracker) { mUseNewLightBarLogic = featureFlags.isEnabled(Flags.NEW_LIGHT_BAR_LOGIC); mDarkIconColor = ctx.getColor(R.color.dark_mode_icon_color_single_tone); mLightIconColor = ctx.getColor(R.color.light_mode_icon_color_single_tone); mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher; Loading Loading @@ -159,9 +184,42 @@ public class LightBarController implements BatteryController.BatteryStateChangeC final boolean last = mNavigationLight; mHasLightNavigationBar = isLight(appearance, navigationBarMode, APPEARANCE_LIGHT_NAVIGATION_BARS); if (mUseNewLightBarLogic) { final boolean ignoreScrimForce = mDirectReplying && mNavbarColorManagedByIme; final boolean darkForScrim = mForceDarkForScrim && !ignoreScrimForce; final boolean lightForScrim = mForceLightForScrim && !ignoreScrimForce; final boolean darkForQs = mQsCustomizing || mQsExpanded || mGlobalActionsVisible; mNavigationLight = ((mHasLightNavigationBar && !darkForScrim) || lightForScrim) && !darkForQs; mLastNavigationBarAppearanceChangedLog = "onNavigationBarAppearanceChanged()" + " appearance=" + appearance + " nbModeChanged=" + nbModeChanged + " navigationBarMode=" + navigationBarMode + " navbarColorManagedByIme=" + navbarColorManagedByIme + " mHasLightNavigationBar=" + mHasLightNavigationBar + " ignoreScrimForce=" + ignoreScrimForce + " darkForScrim=" + darkForScrim + " lightForScrim=" + lightForScrim + " darkForQs=" + darkForQs + " mNavigationLight=" + mNavigationLight + " last=" + last + " timestamp=" + new Date(); if (DEBUG) Log.d(TAG, mLastNavigationBarAppearanceChangedLog); } else { mNavigationLight = mHasLightNavigationBar && (mDirectReplying && mNavbarColorManagedByIme || !mForceDarkForScrim) && !mQsCustomizing; mLastNavigationBarAppearanceChangedLog = "onNavigationBarAppearanceChanged()" + " appearance=" + appearance + " nbModeChanged=" + nbModeChanged + " navigationBarMode=" + navigationBarMode + " navbarColorManagedByIme=" + navbarColorManagedByIme + " mHasLightNavigationBar=" + mHasLightNavigationBar + " mNavigationLight=" + mNavigationLight + " last=" + last + " timestamp=" + new Date(); if (DEBUG) Log.d(TAG, mLastNavigationBarAppearanceChangedLog); } if (mNavigationLight != last) { updateNavigation(); } Loading @@ -188,6 +246,20 @@ public class LightBarController implements BatteryController.BatteryStateChangeC reevaluate(); } /** Set if Quick Settings is fully expanded, which affects notification scrim visibility */ public void setQsExpanded(boolean expanded) { if (mQsExpanded == expanded) return; mQsExpanded = expanded; reevaluate(); } /** Set if Global Actions dialog is visible, which requires dark mode (light buttons) */ public void setGlobalActionsVisible(boolean visible) { if (mGlobalActionsVisible == visible) return; mGlobalActionsVisible = visible; reevaluate(); } /** * Controls the light status bar temporarily for back navigation. * @param appearance the custmoized appearance. Loading Loading @@ -225,10 +297,37 @@ public class LightBarController implements BatteryController.BatteryStateChangeC public void setScrimState(ScrimState scrimState, float scrimBehindAlpha, GradientColors scrimInFrontColor) { if (mUseNewLightBarLogic) { boolean forceDarkForScrimLast = mForceDarkForScrim; boolean forceLightForScrimLast = mForceLightForScrim; final boolean forceForScrim = scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD; final boolean scrimColorIsLight = scrimInFrontColor.supportsDarkText(); mForceDarkForScrim = forceForScrim && !scrimColorIsLight; mForceLightForScrim = forceForScrim && scrimColorIsLight; if (mHasLightNavigationBar) { if (mForceDarkForScrim != forceDarkForScrimLast) reevaluate(); } else { if (mForceLightForScrim != forceLightForScrimLast) reevaluate(); } mLastSetScrimStateLog = "setScrimState()" + " scrimState=" + scrimState + " scrimBehindAlpha=" + scrimBehindAlpha + " scrimInFrontColor=" + scrimInFrontColor + " forceForScrim=" + forceForScrim + " scrimColorIsLight=" + scrimColorIsLight + " mHasLightNavigationBar=" + mHasLightNavigationBar + " mForceDarkForScrim=" + mForceDarkForScrim + " mForceLightForScrim=" + mForceLightForScrim + " timestamp=" + new Date(); if (DEBUG) Log.d(TAG, mLastSetScrimStateLog); } else { boolean forceDarkForScrimLast = mForceDarkForScrim; // For BOUNCER/BOUNCER_SCRIMMED cases, we assume that alpha is always below threshold. // This enables IMEs to control the navigation bar color. // For other cases, scrim should be able to veto the light navigation bar. // NOTE: this was also wrong for S and has been removed in the new logic. mForceDarkForScrim = scrimState != ScrimState.BOUNCER && scrimState != ScrimState.BOUNCER_SCRIMMED && scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD Loading @@ -236,6 +335,15 @@ public class LightBarController implements BatteryController.BatteryStateChangeC if (mHasLightNavigationBar && (mForceDarkForScrim != forceDarkForScrimLast)) { reevaluate(); } mLastSetScrimStateLog = "setScrimState()" + " scrimState=" + scrimState + " scrimBehindAlpha=" + scrimBehindAlpha + " scrimInFrontColor=" + scrimInFrontColor + " mHasLightNavigationBar=" + mHasLightNavigationBar + " mForceDarkForScrim=" + mForceDarkForScrim + " timestamp=" + new Date(); if (DEBUG) Log.d(TAG, mLastSetScrimStateLog); } } private static boolean isLight(int appearance, int barMode, int flag) { Loading Loading @@ -309,16 +417,24 @@ public class LightBarController implements BatteryController.BatteryStateChangeC pw.print(mAppearanceRegions[i].toString()); pw.print(" isLight="); pw.println(isLight); } pw.print(" mNavigationLight="); pw.print(mNavigationLight); pw.print(" mNavigationLight="); pw.println(mNavigationLight); pw.print(" mHasLightNavigationBar="); pw.println(mHasLightNavigationBar); pw.println(); pw.print(" mStatusBarMode="); pw.print(mStatusBarMode); pw.print(" mNavigationBarMode="); pw.println(mNavigationBarMode); pw.print(" mForceDarkForScrim="); pw.print(mForceDarkForScrim); pw.print(" mQsCustomizing="); pw.print(mQsCustomizing); pw.println(); pw.print(" mForceDarkForScrim="); pw.println(mForceDarkForScrim); pw.print(" mForceLightForScrim="); pw.println(mForceLightForScrim); pw.println(); pw.print(" mQsCustomizing="); pw.println(mQsCustomizing); pw.print(" mQsExpanded="); pw.println(mQsExpanded); pw.print(" mGlobalActionsVisible="); pw.println(mGlobalActionsVisible); pw.print(" mDirectReplying="); pw.println(mDirectReplying); pw.print(" mNavbarColorManagedByIme="); pw.println(mNavbarColorManagedByIme); pw.println(); pw.println(" Recent Calculation Logs:"); pw.print(" "); pw.println(mLastSetScrimStateLog); pw.print(" "); pw.println(mLastNavigationBarAppearanceChangedLog); pw.println(); Loading @@ -344,6 +460,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC private final DarkIconDispatcher mDarkIconDispatcher; private final BatteryController mBatteryController; private final NavigationModeController mNavModeController; private final FeatureFlags mFeatureFlags; private final DumpManager mDumpManager; private final DisplayTracker mDisplayTracker; Loading @@ -352,12 +469,14 @@ public class LightBarController implements BatteryController.BatteryStateChangeC DarkIconDispatcher darkIconDispatcher, BatteryController batteryController, NavigationModeController navModeController, FeatureFlags featureFlags, DumpManager dumpManager, DisplayTracker displayTracker) { mDarkIconDispatcher = darkIconDispatcher; mBatteryController = batteryController; mNavModeController = navModeController; mFeatureFlags = featureFlags; mDumpManager = dumpManager; mDisplayTracker = displayTracker; } Loading @@ -365,7 +484,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC /** Create an {@link LightBarController} */ public LightBarController create(Context context) { return new LightBarController(context, mDarkIconDispatcher, mBatteryController, mNavModeController, mDumpManager, mDisplayTracker); mNavModeController, mFeatureFlags, mDumpManager, mDisplayTracker); } } } packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +19 −3 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor.GradientColors; import com.android.internal.graphics.ColorUtils; import com.android.internal.util.ContrastColorUtil; import com.android.internal.util.function.TriConsumer; import com.android.keyguard.BouncerPanelExpansionCalculator; import com.android.keyguard.KeyguardUpdateMonitor; Loading Loading @@ -249,6 +250,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump private final TriConsumer<ScrimState, Float, GradientColors> mScrimStateListener; private final LargeScreenShadeInterpolator mLargeScreenShadeInterpolator; private final FeatureFlags mFeatureFlags; private final boolean mUseNewLightBarLogic; private Consumer<Integer> mScrimVisibleListener; private boolean mBlankScreen; private boolean mScreenBlankingCallbackCalled; Loading Loading @@ -306,6 +308,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump mScrimStateListener = lightBarController::setScrimState; mLargeScreenShadeInterpolator = largeScreenShadeInterpolator; mFeatureFlags = featureFlags; mUseNewLightBarLogic = featureFlags.isEnabled(Flags.NEW_LIGHT_BAR_LOGIC); mDefaultScrimAlpha = BUSY_SCRIM_ALPHA; mKeyguardStateController = keyguardStateController; Loading Loading @@ -1159,8 +1162,14 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump if (mClipsQsScrim && mQsBottomVisible) { alpha = mNotificationsAlpha; } if (mUseNewLightBarLogic) { mScrimStateListener.accept(mState, alpha, mColors); } else { // NOTE: This wasn't wrong, but it implied that each scrim might have different colors, // when in fact they all share the same GradientColors instance, which we own. mScrimStateListener.accept(mState, alpha, mScrimInFront.getColors()); } } private void dispatchScrimsVisible() { final ScrimView backScrim = mClipsQsScrim ? mNotificationsScrim : mScrimBehind; Loading Loading @@ -1487,8 +1496,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump int accent = Utils.getColorAccent(mScrimBehind.getContext()).getDefaultColor(); mColors.setMainColor(background); mColors.setSecondaryColor(accent); if (mUseNewLightBarLogic) { final boolean isBackgroundLight = !ContrastColorUtil.isColorDark(background); mColors.setSupportsDarkText(isBackgroundLight); } else { // NOTE: This was totally backward, but LightBarController was flipping it back. // There may be other consumers of this which would struggle though mColors.setSupportsDarkText( ColorUtils.calculateContrast(mColors.getMainColor(), Color.WHITE) > 4.5); } mNeedsDrawableColorUpdate = true; } Loading packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java +3 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.telephony.TelephonyListenerManager; Loading Loading @@ -115,6 +116,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { @Mock private MetricsLogger mMetricsLogger; @Mock private SysuiColorExtractor mColorExtractor; @Mock private IStatusBarService mStatusBarService; @Mock private LightBarController mLightBarController; @Mock private NotificationShadeWindowController mNotificationShadeWindowController; @Mock private IWindowManager mWindowManager; @Mock private Executor mBackgroundExecutor; Loading Loading @@ -166,6 +168,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { mMetricsLogger, mColorExtractor, mStatusBarService, mLightBarController, mNotificationShadeWindowController, mWindowManager, mBackgroundExecutor, Loading Loading
packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java +10 −0 Original line number Diff line number Diff line Loading @@ -128,6 +128,7 @@ import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; Loading Loading @@ -240,6 +241,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene private final ScreenshotHelper mScreenshotHelper; private final SysuiColorExtractor mSysuiColorExtractor; private final IStatusBarService mStatusBarService; protected final LightBarController mLightBarController; protected final NotificationShadeWindowController mNotificationShadeWindowController; private final IWindowManager mIWindowManager; private final Executor mBackgroundExecutor; Loading Loading @@ -349,6 +351,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene MetricsLogger metricsLogger, SysuiColorExtractor colorExtractor, IStatusBarService statusBarService, LightBarController lightBarController, NotificationShadeWindowController notificationShadeWindowController, IWindowManager iWindowManager, @Background Executor backgroundExecutor, Loading Loading @@ -381,6 +384,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mUiEventLogger = uiEventLogger; mSysuiColorExtractor = colorExtractor; mStatusBarService = statusBarService; mLightBarController = lightBarController; mNotificationShadeWindowController = notificationShadeWindowController; mIWindowManager = iWindowManager; mBackgroundExecutor = backgroundExecutor; Loading Loading @@ -694,6 +698,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene ActionsDialogLite dialog = new ActionsDialogLite(mContext, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActionsLite, mAdapter, mOverflowAdapter, mSysuiColorExtractor, mStatusBarService, mLightBarController, mNotificationShadeWindowController, this::onRefresh, mKeyguardShowing, mPowerAdapter, mUiEventLogger, mCentralSurfacesOptional, mKeyguardUpdateMonitor, mLockPatternUtils); Loading Loading @@ -2192,6 +2197,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene protected final SysuiColorExtractor mColorExtractor; private boolean mKeyguardShowing; protected float mScrimAlpha; protected final LightBarController mLightBarController; protected final NotificationShadeWindowController mNotificationShadeWindowController; private ListPopupWindow mOverflowPopup; private Dialog mPowerOptionsDialog; Loading Loading @@ -2267,6 +2273,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene ActionsDialogLite(Context context, int themeRes, MyAdapter adapter, MyOverflowAdapter overflowAdapter, SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService, LightBarController lightBarController, NotificationShadeWindowController notificationShadeWindowController, Runnable onRefreshCallback, boolean keyguardShowing, MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger, Loading @@ -2282,6 +2289,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mPowerOptionsAdapter = powerAdapter; mColorExtractor = sysuiColorExtractor; mStatusBarService = statusBarService; mLightBarController = lightBarController; mNotificationShadeWindowController = notificationShadeWindowController; mOnRefreshCallback = onRefreshCallback; mKeyguardShowing = keyguardShowing; Loading Loading @@ -2474,6 +2482,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene @Override protected void start() { mGlobalActionsLayout.updateList(); mLightBarController.setGlobalActionsVisible(true); if (mBackgroundDrawable instanceof ScrimDrawable) { mColorExtractor.addOnColorsChangedListener(this); Loading Loading @@ -2504,6 +2513,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene @Override protected void stop() { mLightBarController.setGlobalActionsVisible(false); mColorExtractor.removeOnColorsChangedListener(this); } Loading
packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +7 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardStatusBarView; import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.LockscreenGestureLogger; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; Loading Loading @@ -117,6 +118,7 @@ public class QuickSettingsController { private final PulseExpansionHandler mPulseExpansionHandler; private final ShadeExpansionStateManager mShadeExpansionStateManager; private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private final LightBarController mLightBarController; private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController; private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; private final NotificationShadeDepthController mDepthController; Loading Loading @@ -304,6 +306,7 @@ public class QuickSettingsController { NotificationRemoteInputManager remoteInputManager, ShadeExpansionStateManager shadeExpansionStateManager, StatusBarKeyguardViewManager statusBarKeyguardViewManager, LightBarController lightBarController, NotificationStackScrollLayoutController notificationStackScrollLayoutController, LockscreenShadeTransitionController lockscreenShadeTransitionController, NotificationShadeDepthController notificationShadeDepthController, Loading Loading @@ -346,6 +349,7 @@ public class QuickSettingsController { mRemoteInputManager = remoteInputManager; mShadeExpansionStateManager = shadeExpansionStateManager; mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mLightBarController = lightBarController; mNotificationStackScrollLayoutController = notificationStackScrollLayoutController; mLockscreenShadeTransitionController = lockscreenShadeTransitionController; mDepthController = notificationShadeDepthController; Loading Loading @@ -1018,6 +1022,9 @@ public class QuickSettingsController { mShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction); mShadeHeaderController.setQsExpandedFraction(qsExpansionFraction); mShadeHeaderController.setQsVisible(mVisible); // Update the light bar mLightBarController.setQsExpanded(mFullyExpanded); } float getLockscreenShadeDragProgress() { Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java +141 −22 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARE import android.annotation.ColorInt; import android.content.Context; import android.graphics.Rect; import android.util.Log; import android.view.InsetsFlags; import android.view.ViewDebug; import android.view.WindowInsetsController.Appearance; Loading @@ -35,13 +36,17 @@ import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.settings.DisplayTracker; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.util.Compile; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Date; import javax.inject.Inject; Loading @@ -51,10 +56,14 @@ import javax.inject.Inject; @SysUISingleton public class LightBarController implements BatteryController.BatteryStateChangeCallback, Dumpable { private static final String TAG = "LightBarController"; private static final boolean DEBUG = Compile.IS_DEBUG && Log.isLoggable(TAG, Log.DEBUG); private static final float NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD = 0.1f; private final SysuiDarkIconDispatcher mStatusBarIconController; private final BatteryController mBatteryController; private final boolean mUseNewLightBarLogic; private BiometricUnlockController mBiometricUnlockController; private LightBarTransitionsController mNavigationBarController; Loading @@ -67,13 +76,17 @@ public class LightBarController implements BatteryController.BatteryStateChangeC private final int mLightIconColor; /** * Whether the navigation bar should be light factoring in already how much alpha the scrim has * Whether the navigation bar should be light factoring in already how much alpha the scrim has. * "Light" refers to the background color of the navigation bar, so when this is true, * it's referring to a state where the navigation bar icons are tinted dark. */ private boolean mNavigationLight; /** * Whether the flags indicate that a light status bar is requested. This doesn't factor in the * scrim alpha yet. * Whether the flags indicate that a light navigation bar is requested. * "Light" refers to the background color of the navigation bar, so when this is true, * it's referring to a state where the navigation bar icons would be tinted dark. * This doesn't factor in the scrim alpha yet. */ private boolean mHasLightNavigationBar; Loading @@ -82,22 +95,34 @@ public class LightBarController implements BatteryController.BatteryStateChangeC * {@link #mNavigationLight} {@code false}. */ private boolean mForceDarkForScrim; /** * {@code true} if {@link #mHasLightNavigationBar} should be ignored and forcefully make * {@link #mNavigationLight} {@code true}. */ private boolean mForceLightForScrim; private boolean mQsCustomizing; private boolean mQsExpanded; private boolean mGlobalActionsVisible; private boolean mDirectReplying; private boolean mNavbarColorManagedByIme; private boolean mIsCustomizingForBackNav; private String mLastSetScrimStateLog; private String mLastNavigationBarAppearanceChangedLog; @Inject public LightBarController( Context ctx, DarkIconDispatcher darkIconDispatcher, BatteryController batteryController, NavigationModeController navModeController, FeatureFlags featureFlags, DumpManager dumpManager, DisplayTracker displayTracker) { mUseNewLightBarLogic = featureFlags.isEnabled(Flags.NEW_LIGHT_BAR_LOGIC); mDarkIconColor = ctx.getColor(R.color.dark_mode_icon_color_single_tone); mLightIconColor = ctx.getColor(R.color.light_mode_icon_color_single_tone); mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher; Loading Loading @@ -159,9 +184,42 @@ public class LightBarController implements BatteryController.BatteryStateChangeC final boolean last = mNavigationLight; mHasLightNavigationBar = isLight(appearance, navigationBarMode, APPEARANCE_LIGHT_NAVIGATION_BARS); if (mUseNewLightBarLogic) { final boolean ignoreScrimForce = mDirectReplying && mNavbarColorManagedByIme; final boolean darkForScrim = mForceDarkForScrim && !ignoreScrimForce; final boolean lightForScrim = mForceLightForScrim && !ignoreScrimForce; final boolean darkForQs = mQsCustomizing || mQsExpanded || mGlobalActionsVisible; mNavigationLight = ((mHasLightNavigationBar && !darkForScrim) || lightForScrim) && !darkForQs; mLastNavigationBarAppearanceChangedLog = "onNavigationBarAppearanceChanged()" + " appearance=" + appearance + " nbModeChanged=" + nbModeChanged + " navigationBarMode=" + navigationBarMode + " navbarColorManagedByIme=" + navbarColorManagedByIme + " mHasLightNavigationBar=" + mHasLightNavigationBar + " ignoreScrimForce=" + ignoreScrimForce + " darkForScrim=" + darkForScrim + " lightForScrim=" + lightForScrim + " darkForQs=" + darkForQs + " mNavigationLight=" + mNavigationLight + " last=" + last + " timestamp=" + new Date(); if (DEBUG) Log.d(TAG, mLastNavigationBarAppearanceChangedLog); } else { mNavigationLight = mHasLightNavigationBar && (mDirectReplying && mNavbarColorManagedByIme || !mForceDarkForScrim) && !mQsCustomizing; mLastNavigationBarAppearanceChangedLog = "onNavigationBarAppearanceChanged()" + " appearance=" + appearance + " nbModeChanged=" + nbModeChanged + " navigationBarMode=" + navigationBarMode + " navbarColorManagedByIme=" + navbarColorManagedByIme + " mHasLightNavigationBar=" + mHasLightNavigationBar + " mNavigationLight=" + mNavigationLight + " last=" + last + " timestamp=" + new Date(); if (DEBUG) Log.d(TAG, mLastNavigationBarAppearanceChangedLog); } if (mNavigationLight != last) { updateNavigation(); } Loading @@ -188,6 +246,20 @@ public class LightBarController implements BatteryController.BatteryStateChangeC reevaluate(); } /** Set if Quick Settings is fully expanded, which affects notification scrim visibility */ public void setQsExpanded(boolean expanded) { if (mQsExpanded == expanded) return; mQsExpanded = expanded; reevaluate(); } /** Set if Global Actions dialog is visible, which requires dark mode (light buttons) */ public void setGlobalActionsVisible(boolean visible) { if (mGlobalActionsVisible == visible) return; mGlobalActionsVisible = visible; reevaluate(); } /** * Controls the light status bar temporarily for back navigation. * @param appearance the custmoized appearance. Loading Loading @@ -225,10 +297,37 @@ public class LightBarController implements BatteryController.BatteryStateChangeC public void setScrimState(ScrimState scrimState, float scrimBehindAlpha, GradientColors scrimInFrontColor) { if (mUseNewLightBarLogic) { boolean forceDarkForScrimLast = mForceDarkForScrim; boolean forceLightForScrimLast = mForceLightForScrim; final boolean forceForScrim = scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD; final boolean scrimColorIsLight = scrimInFrontColor.supportsDarkText(); mForceDarkForScrim = forceForScrim && !scrimColorIsLight; mForceLightForScrim = forceForScrim && scrimColorIsLight; if (mHasLightNavigationBar) { if (mForceDarkForScrim != forceDarkForScrimLast) reevaluate(); } else { if (mForceLightForScrim != forceLightForScrimLast) reevaluate(); } mLastSetScrimStateLog = "setScrimState()" + " scrimState=" + scrimState + " scrimBehindAlpha=" + scrimBehindAlpha + " scrimInFrontColor=" + scrimInFrontColor + " forceForScrim=" + forceForScrim + " scrimColorIsLight=" + scrimColorIsLight + " mHasLightNavigationBar=" + mHasLightNavigationBar + " mForceDarkForScrim=" + mForceDarkForScrim + " mForceLightForScrim=" + mForceLightForScrim + " timestamp=" + new Date(); if (DEBUG) Log.d(TAG, mLastSetScrimStateLog); } else { boolean forceDarkForScrimLast = mForceDarkForScrim; // For BOUNCER/BOUNCER_SCRIMMED cases, we assume that alpha is always below threshold. // This enables IMEs to control the navigation bar color. // For other cases, scrim should be able to veto the light navigation bar. // NOTE: this was also wrong for S and has been removed in the new logic. mForceDarkForScrim = scrimState != ScrimState.BOUNCER && scrimState != ScrimState.BOUNCER_SCRIMMED && scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD Loading @@ -236,6 +335,15 @@ public class LightBarController implements BatteryController.BatteryStateChangeC if (mHasLightNavigationBar && (mForceDarkForScrim != forceDarkForScrimLast)) { reevaluate(); } mLastSetScrimStateLog = "setScrimState()" + " scrimState=" + scrimState + " scrimBehindAlpha=" + scrimBehindAlpha + " scrimInFrontColor=" + scrimInFrontColor + " mHasLightNavigationBar=" + mHasLightNavigationBar + " mForceDarkForScrim=" + mForceDarkForScrim + " timestamp=" + new Date(); if (DEBUG) Log.d(TAG, mLastSetScrimStateLog); } } private static boolean isLight(int appearance, int barMode, int flag) { Loading Loading @@ -309,16 +417,24 @@ public class LightBarController implements BatteryController.BatteryStateChangeC pw.print(mAppearanceRegions[i].toString()); pw.print(" isLight="); pw.println(isLight); } pw.print(" mNavigationLight="); pw.print(mNavigationLight); pw.print(" mNavigationLight="); pw.println(mNavigationLight); pw.print(" mHasLightNavigationBar="); pw.println(mHasLightNavigationBar); pw.println(); pw.print(" mStatusBarMode="); pw.print(mStatusBarMode); pw.print(" mNavigationBarMode="); pw.println(mNavigationBarMode); pw.print(" mForceDarkForScrim="); pw.print(mForceDarkForScrim); pw.print(" mQsCustomizing="); pw.print(mQsCustomizing); pw.println(); pw.print(" mForceDarkForScrim="); pw.println(mForceDarkForScrim); pw.print(" mForceLightForScrim="); pw.println(mForceLightForScrim); pw.println(); pw.print(" mQsCustomizing="); pw.println(mQsCustomizing); pw.print(" mQsExpanded="); pw.println(mQsExpanded); pw.print(" mGlobalActionsVisible="); pw.println(mGlobalActionsVisible); pw.print(" mDirectReplying="); pw.println(mDirectReplying); pw.print(" mNavbarColorManagedByIme="); pw.println(mNavbarColorManagedByIme); pw.println(); pw.println(" Recent Calculation Logs:"); pw.print(" "); pw.println(mLastSetScrimStateLog); pw.print(" "); pw.println(mLastNavigationBarAppearanceChangedLog); pw.println(); Loading @@ -344,6 +460,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC private final DarkIconDispatcher mDarkIconDispatcher; private final BatteryController mBatteryController; private final NavigationModeController mNavModeController; private final FeatureFlags mFeatureFlags; private final DumpManager mDumpManager; private final DisplayTracker mDisplayTracker; Loading @@ -352,12 +469,14 @@ public class LightBarController implements BatteryController.BatteryStateChangeC DarkIconDispatcher darkIconDispatcher, BatteryController batteryController, NavigationModeController navModeController, FeatureFlags featureFlags, DumpManager dumpManager, DisplayTracker displayTracker) { mDarkIconDispatcher = darkIconDispatcher; mBatteryController = batteryController; mNavModeController = navModeController; mFeatureFlags = featureFlags; mDumpManager = dumpManager; mDisplayTracker = displayTracker; } Loading @@ -365,7 +484,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC /** Create an {@link LightBarController} */ public LightBarController create(Context context) { return new LightBarController(context, mDarkIconDispatcher, mBatteryController, mNavModeController, mDumpManager, mDisplayTracker); mNavModeController, mFeatureFlags, mDumpManager, mDisplayTracker); } } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +19 −3 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor.GradientColors; import com.android.internal.graphics.ColorUtils; import com.android.internal.util.ContrastColorUtil; import com.android.internal.util.function.TriConsumer; import com.android.keyguard.BouncerPanelExpansionCalculator; import com.android.keyguard.KeyguardUpdateMonitor; Loading Loading @@ -249,6 +250,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump private final TriConsumer<ScrimState, Float, GradientColors> mScrimStateListener; private final LargeScreenShadeInterpolator mLargeScreenShadeInterpolator; private final FeatureFlags mFeatureFlags; private final boolean mUseNewLightBarLogic; private Consumer<Integer> mScrimVisibleListener; private boolean mBlankScreen; private boolean mScreenBlankingCallbackCalled; Loading Loading @@ -306,6 +308,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump mScrimStateListener = lightBarController::setScrimState; mLargeScreenShadeInterpolator = largeScreenShadeInterpolator; mFeatureFlags = featureFlags; mUseNewLightBarLogic = featureFlags.isEnabled(Flags.NEW_LIGHT_BAR_LOGIC); mDefaultScrimAlpha = BUSY_SCRIM_ALPHA; mKeyguardStateController = keyguardStateController; Loading Loading @@ -1159,8 +1162,14 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump if (mClipsQsScrim && mQsBottomVisible) { alpha = mNotificationsAlpha; } if (mUseNewLightBarLogic) { mScrimStateListener.accept(mState, alpha, mColors); } else { // NOTE: This wasn't wrong, but it implied that each scrim might have different colors, // when in fact they all share the same GradientColors instance, which we own. mScrimStateListener.accept(mState, alpha, mScrimInFront.getColors()); } } private void dispatchScrimsVisible() { final ScrimView backScrim = mClipsQsScrim ? mNotificationsScrim : mScrimBehind; Loading Loading @@ -1487,8 +1496,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump int accent = Utils.getColorAccent(mScrimBehind.getContext()).getDefaultColor(); mColors.setMainColor(background); mColors.setSecondaryColor(accent); if (mUseNewLightBarLogic) { final boolean isBackgroundLight = !ContrastColorUtil.isColorDark(background); mColors.setSupportsDarkText(isBackgroundLight); } else { // NOTE: This was totally backward, but LightBarController was flipping it back. // There may be other consumers of this which would struggle though mColors.setSupportsDarkText( ColorUtils.calculateContrast(mColors.getMainColor(), Color.WHITE) > 4.5); } mNeedsDrawableColorUpdate = true; } Loading
packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java +3 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.telephony.TelephonyListenerManager; Loading Loading @@ -115,6 +116,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { @Mock private MetricsLogger mMetricsLogger; @Mock private SysuiColorExtractor mColorExtractor; @Mock private IStatusBarService mStatusBarService; @Mock private LightBarController mLightBarController; @Mock private NotificationShadeWindowController mNotificationShadeWindowController; @Mock private IWindowManager mWindowManager; @Mock private Executor mBackgroundExecutor; Loading Loading @@ -166,6 +168,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { mMetricsLogger, mColorExtractor, mStatusBarService, mLightBarController, mNotificationShadeWindowController, mWindowManager, mBackgroundExecutor, Loading