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

Commit 8d41a0fb authored by Jeff DeCew's avatar Jeff DeCew Committed by Automerger Merge Worker
Browse files

Merge "Fix LightBarController's dark/light logic for the Navigation Bar" into...

Merge "Fix LightBarController's dark/light logic for the Navigation Bar" into udc-dev am: 4542c10c

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22853898



Change-Id: I1535e17a8dbf1b2d8bf3a27f2f3d93749e1b11dc
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents f12ee84b 4542c10c
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -128,6 +128,7 @@ import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.phone.CentralSurfaces;
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.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -240,6 +241,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
    private final ScreenshotHelper mScreenshotHelper;
    private final ScreenshotHelper mScreenshotHelper;
    private final SysuiColorExtractor mSysuiColorExtractor;
    private final SysuiColorExtractor mSysuiColorExtractor;
    private final IStatusBarService mStatusBarService;
    private final IStatusBarService mStatusBarService;
    protected final LightBarController mLightBarController;
    protected final NotificationShadeWindowController mNotificationShadeWindowController;
    protected final NotificationShadeWindowController mNotificationShadeWindowController;
    private final IWindowManager mIWindowManager;
    private final IWindowManager mIWindowManager;
    private final Executor mBackgroundExecutor;
    private final Executor mBackgroundExecutor;
@@ -349,6 +351,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
            MetricsLogger metricsLogger,
            MetricsLogger metricsLogger,
            SysuiColorExtractor colorExtractor,
            SysuiColorExtractor colorExtractor,
            IStatusBarService statusBarService,
            IStatusBarService statusBarService,
            LightBarController lightBarController,
            NotificationShadeWindowController notificationShadeWindowController,
            NotificationShadeWindowController notificationShadeWindowController,
            IWindowManager iWindowManager,
            IWindowManager iWindowManager,
            @Background Executor backgroundExecutor,
            @Background Executor backgroundExecutor,
@@ -381,6 +384,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
        mUiEventLogger = uiEventLogger;
        mUiEventLogger = uiEventLogger;
        mSysuiColorExtractor = colorExtractor;
        mSysuiColorExtractor = colorExtractor;
        mStatusBarService = statusBarService;
        mStatusBarService = statusBarService;
        mLightBarController = lightBarController;
        mNotificationShadeWindowController = notificationShadeWindowController;
        mNotificationShadeWindowController = notificationShadeWindowController;
        mIWindowManager = iWindowManager;
        mIWindowManager = iWindowManager;
        mBackgroundExecutor = backgroundExecutor;
        mBackgroundExecutor = backgroundExecutor;
@@ -694,6 +698,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
        ActionsDialogLite dialog = new ActionsDialogLite(mContext,
        ActionsDialogLite dialog = new ActionsDialogLite(mContext,
                com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActionsLite,
                com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActionsLite,
                mAdapter, mOverflowAdapter, mSysuiColorExtractor, mStatusBarService,
                mAdapter, mOverflowAdapter, mSysuiColorExtractor, mStatusBarService,
                mLightBarController,
                mNotificationShadeWindowController, this::onRefresh, mKeyguardShowing,
                mNotificationShadeWindowController, this::onRefresh, mKeyguardShowing,
                mPowerAdapter, mUiEventLogger, mCentralSurfacesOptional, mKeyguardUpdateMonitor,
                mPowerAdapter, mUiEventLogger, mCentralSurfacesOptional, mKeyguardUpdateMonitor,
                mLockPatternUtils);
                mLockPatternUtils);
@@ -2192,6 +2197,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
        protected final SysuiColorExtractor mColorExtractor;
        protected final SysuiColorExtractor mColorExtractor;
        private boolean mKeyguardShowing;
        private boolean mKeyguardShowing;
        protected float mScrimAlpha;
        protected float mScrimAlpha;
        protected final LightBarController mLightBarController;
        protected final NotificationShadeWindowController mNotificationShadeWindowController;
        protected final NotificationShadeWindowController mNotificationShadeWindowController;
        private ListPopupWindow mOverflowPopup;
        private ListPopupWindow mOverflowPopup;
        private Dialog mPowerOptionsDialog;
        private Dialog mPowerOptionsDialog;
@@ -2267,6 +2273,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
        ActionsDialogLite(Context context, int themeRes, MyAdapter adapter,
        ActionsDialogLite(Context context, int themeRes, MyAdapter adapter,
                MyOverflowAdapter overflowAdapter,
                MyOverflowAdapter overflowAdapter,
                SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService,
                SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService,
                LightBarController lightBarController,
                NotificationShadeWindowController notificationShadeWindowController,
                NotificationShadeWindowController notificationShadeWindowController,
                Runnable onRefreshCallback, boolean keyguardShowing,
                Runnable onRefreshCallback, boolean keyguardShowing,
                MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger,
                MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger,
@@ -2282,6 +2289,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
            mPowerOptionsAdapter = powerAdapter;
            mPowerOptionsAdapter = powerAdapter;
            mColorExtractor = sysuiColorExtractor;
            mColorExtractor = sysuiColorExtractor;
            mStatusBarService = statusBarService;
            mStatusBarService = statusBarService;
            mLightBarController = lightBarController;
            mNotificationShadeWindowController = notificationShadeWindowController;
            mNotificationShadeWindowController = notificationShadeWindowController;
            mOnRefreshCallback = onRefreshCallback;
            mOnRefreshCallback = onRefreshCallback;
            mKeyguardShowing = keyguardShowing;
            mKeyguardShowing = keyguardShowing;
@@ -2474,6 +2482,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
        @Override
        @Override
        protected void start() {
        protected void start() {
            mGlobalActionsLayout.updateList();
            mGlobalActionsLayout.updateList();
            mLightBarController.setGlobalActionsVisible(true);


            if (mBackgroundDrawable instanceof ScrimDrawable) {
            if (mBackgroundDrawable instanceof ScrimDrawable) {
                mColorExtractor.addOnColorsChangedListener(this);
                mColorExtractor.addOnColorsChangedListener(this);
@@ -2504,6 +2513,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene


        @Override
        @Override
        protected void stop() {
        protected void stop() {
            mLightBarController.setGlobalActionsVisible(false);
            mColorExtractor.removeOnColorsChangedListener(this);
            mColorExtractor.removeOnColorsChangedListener(this);
        }
        }


+7 −0
Original line number Original line Diff line number Diff line
@@ -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.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.KeyguardStatusBarView;
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.LockscreenGestureLogger;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -117,6 +118,7 @@ public class QuickSettingsController {
    private final PulseExpansionHandler mPulseExpansionHandler;
    private final PulseExpansionHandler mPulseExpansionHandler;
    private final ShadeExpansionStateManager mShadeExpansionStateManager;
    private final ShadeExpansionStateManager mShadeExpansionStateManager;
    private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
    private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
    private final LightBarController mLightBarController;
    private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
    private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
    private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
    private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
    private final NotificationShadeDepthController mDepthController;
    private final NotificationShadeDepthController mDepthController;
@@ -304,6 +306,7 @@ public class QuickSettingsController {
            NotificationRemoteInputManager remoteInputManager,
            NotificationRemoteInputManager remoteInputManager,
            ShadeExpansionStateManager shadeExpansionStateManager,
            ShadeExpansionStateManager shadeExpansionStateManager,
            StatusBarKeyguardViewManager statusBarKeyguardViewManager,
            StatusBarKeyguardViewManager statusBarKeyguardViewManager,
            LightBarController lightBarController,
            NotificationStackScrollLayoutController notificationStackScrollLayoutController,
            NotificationStackScrollLayoutController notificationStackScrollLayoutController,
            LockscreenShadeTransitionController lockscreenShadeTransitionController,
            LockscreenShadeTransitionController lockscreenShadeTransitionController,
            NotificationShadeDepthController notificationShadeDepthController,
            NotificationShadeDepthController notificationShadeDepthController,
@@ -346,6 +349,7 @@ public class QuickSettingsController {
        mRemoteInputManager = remoteInputManager;
        mRemoteInputManager = remoteInputManager;
        mShadeExpansionStateManager = shadeExpansionStateManager;
        mShadeExpansionStateManager = shadeExpansionStateManager;
        mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
        mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
        mLightBarController = lightBarController;
        mNotificationStackScrollLayoutController = notificationStackScrollLayoutController;
        mNotificationStackScrollLayoutController = notificationStackScrollLayoutController;
        mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
        mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
        mDepthController = notificationShadeDepthController;
        mDepthController = notificationShadeDepthController;
@@ -1018,6 +1022,9 @@ public class QuickSettingsController {
        mShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction);
        mShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction);
        mShadeHeaderController.setQsExpandedFraction(qsExpansionFraction);
        mShadeHeaderController.setQsExpandedFraction(qsExpansionFraction);
        mShadeHeaderController.setQsVisible(mVisible);
        mShadeHeaderController.setQsVisible(mVisible);

        // Update the light bar
        mLightBarController.setQsExpanded(mFullyExpanded);
    }
    }


    float getLockscreenShadeDragProgress() {
    float getLockscreenShadeDragProgress() {
+141 −22
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARE
import android.annotation.ColorInt;
import android.annotation.ColorInt;
import android.content.Context;
import android.content.Context;
import android.graphics.Rect;
import android.graphics.Rect;
import android.util.Log;
import android.view.InsetsFlags;
import android.view.InsetsFlags;
import android.view.ViewDebug;
import android.view.ViewDebug;
import android.view.WindowInsetsController.Appearance;
import android.view.WindowInsetsController.Appearance;
@@ -35,13 +36,17 @@ import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
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.navigationbar.NavigationModeController;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.settings.DisplayTracker;
import com.android.systemui.settings.DisplayTracker;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.util.Compile;


import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Date;


import javax.inject.Inject;
import javax.inject.Inject;


@@ -51,10 +56,14 @@ import javax.inject.Inject;
@SysUISingleton
@SysUISingleton
public class LightBarController implements BatteryController.BatteryStateChangeCallback, Dumpable {
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 static final float NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD = 0.1f;


    private final SysuiDarkIconDispatcher mStatusBarIconController;
    private final SysuiDarkIconDispatcher mStatusBarIconController;
    private final BatteryController mBatteryController;
    private final BatteryController mBatteryController;
    private final boolean mUseNewLightBarLogic;
    private BiometricUnlockController mBiometricUnlockController;
    private BiometricUnlockController mBiometricUnlockController;


    private LightBarTransitionsController mNavigationBarController;
    private LightBarTransitionsController mNavigationBarController;
@@ -67,13 +76,17 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
    private final int mLightIconColor;
    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;
    private boolean mNavigationLight;


    /**
    /**
     * Whether the flags indicate that a light status bar is requested. This doesn't factor in the
     * Whether the flags indicate that a light navigation bar is requested.
     * scrim alpha yet.
     * "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;
    private boolean mHasLightNavigationBar;


@@ -82,22 +95,34 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
     * {@link #mNavigationLight} {@code false}.
     * {@link #mNavigationLight} {@code false}.
     */
     */
    private boolean mForceDarkForScrim;
    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 mQsCustomizing;
    private boolean mQsExpanded;
    private boolean mGlobalActionsVisible;


    private boolean mDirectReplying;
    private boolean mDirectReplying;
    private boolean mNavbarColorManagedByIme;
    private boolean mNavbarColorManagedByIme;


    private boolean mIsCustomizingForBackNav;
    private boolean mIsCustomizingForBackNav;


    private String mLastSetScrimStateLog;
    private String mLastNavigationBarAppearanceChangedLog;

    @Inject
    @Inject
    public LightBarController(
    public LightBarController(
            Context ctx,
            Context ctx,
            DarkIconDispatcher darkIconDispatcher,
            DarkIconDispatcher darkIconDispatcher,
            BatteryController batteryController,
            BatteryController batteryController,
            NavigationModeController navModeController,
            NavigationModeController navModeController,
            FeatureFlags featureFlags,
            DumpManager dumpManager,
            DumpManager dumpManager,
            DisplayTracker displayTracker) {
            DisplayTracker displayTracker) {
        mUseNewLightBarLogic = featureFlags.isEnabled(Flags.NEW_LIGHT_BAR_LOGIC);
        mDarkIconColor = ctx.getColor(R.color.dark_mode_icon_color_single_tone);
        mDarkIconColor = ctx.getColor(R.color.dark_mode_icon_color_single_tone);
        mLightIconColor = ctx.getColor(R.color.light_mode_icon_color_single_tone);
        mLightIconColor = ctx.getColor(R.color.light_mode_icon_color_single_tone);
        mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher;
        mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher;
@@ -159,9 +184,42 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
            final boolean last = mNavigationLight;
            final boolean last = mNavigationLight;
            mHasLightNavigationBar = isLight(appearance, navigationBarMode,
            mHasLightNavigationBar = isLight(appearance, navigationBarMode,
                    APPEARANCE_LIGHT_NAVIGATION_BARS);
                    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
                mNavigationLight = mHasLightNavigationBar
                        && (mDirectReplying && mNavbarColorManagedByIme || !mForceDarkForScrim)
                        && (mDirectReplying && mNavbarColorManagedByIme || !mForceDarkForScrim)
                        && !mQsCustomizing;
                        && !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) {
            if (mNavigationLight != last) {
                updateNavigation();
                updateNavigation();
            }
            }
@@ -188,6 +246,20 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
        reevaluate();
        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.
     * Controls the light status bar temporarily for back navigation.
     * @param appearance the custmoized appearance.
     * @param appearance the custmoized appearance.
@@ -225,10 +297,37 @@ public class LightBarController implements BatteryController.BatteryStateChangeC


    public void setScrimState(ScrimState scrimState, float scrimBehindAlpha,
    public void setScrimState(ScrimState scrimState, float scrimBehindAlpha,
            GradientColors scrimInFrontColor) {
            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;
            boolean forceDarkForScrimLast = mForceDarkForScrim;
            // For BOUNCER/BOUNCER_SCRIMMED cases, we assume that alpha is always below threshold.
            // For BOUNCER/BOUNCER_SCRIMMED cases, we assume that alpha is always below threshold.
            // This enables IMEs to control the navigation bar color.
            // This enables IMEs to control the navigation bar color.
            // For other cases, scrim should be able to veto the light navigation bar.
            // 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
            mForceDarkForScrim = scrimState != ScrimState.BOUNCER
                    && scrimState != ScrimState.BOUNCER_SCRIMMED
                    && scrimState != ScrimState.BOUNCER_SCRIMMED
                    && scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD
                    && scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD
@@ -236,6 +335,15 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
            if (mHasLightNavigationBar && (mForceDarkForScrim != forceDarkForScrimLast)) {
            if (mHasLightNavigationBar && (mForceDarkForScrim != forceDarkForScrimLast)) {
                reevaluate();
                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) {
    private static boolean isLight(int appearance, int barMode, int flag) {
@@ -309,16 +417,24 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
            pw.print(mAppearanceRegions[i].toString()); pw.print(" isLight="); pw.println(isLight);
            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.print(" mHasLightNavigationBar="); pw.println(mHasLightNavigationBar);

        pw.println();
        pw.print(" mStatusBarMode="); pw.print(mStatusBarMode);
        pw.print(" mStatusBarMode="); pw.print(mStatusBarMode);
        pw.print(" mNavigationBarMode="); pw.println(mNavigationBarMode);
        pw.print(" mNavigationBarMode="); pw.println(mNavigationBarMode);

        pw.println();
        pw.print(" mForceDarkForScrim="); pw.print(mForceDarkForScrim);
        pw.print(" mForceDarkForScrim="); pw.println(mForceDarkForScrim);
        pw.print(" mQsCustomizing="); pw.print(mQsCustomizing);
        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(" mDirectReplying="); pw.println(mDirectReplying);
        pw.print(" mNavbarColorManagedByIme="); pw.println(mNavbarColorManagedByIme);
        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();
        pw.println();


@@ -344,6 +460,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
        private final DarkIconDispatcher mDarkIconDispatcher;
        private final DarkIconDispatcher mDarkIconDispatcher;
        private final BatteryController mBatteryController;
        private final BatteryController mBatteryController;
        private final NavigationModeController mNavModeController;
        private final NavigationModeController mNavModeController;
        private final FeatureFlags mFeatureFlags;
        private final DumpManager mDumpManager;
        private final DumpManager mDumpManager;
        private final DisplayTracker mDisplayTracker;
        private final DisplayTracker mDisplayTracker;


@@ -352,12 +469,14 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
                DarkIconDispatcher darkIconDispatcher,
                DarkIconDispatcher darkIconDispatcher,
                BatteryController batteryController,
                BatteryController batteryController,
                NavigationModeController navModeController,
                NavigationModeController navModeController,
                FeatureFlags featureFlags,
                DumpManager dumpManager,
                DumpManager dumpManager,
                DisplayTracker displayTracker) {
                DisplayTracker displayTracker) {


            mDarkIconDispatcher = darkIconDispatcher;
            mDarkIconDispatcher = darkIconDispatcher;
            mBatteryController = batteryController;
            mBatteryController = batteryController;
            mNavModeController = navModeController;
            mNavModeController = navModeController;
            mFeatureFlags = featureFlags;
            mDumpManager = dumpManager;
            mDumpManager = dumpManager;
            mDisplayTracker = displayTracker;
            mDisplayTracker = displayTracker;
        }
        }
@@ -365,7 +484,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
        /** Create an {@link LightBarController} */
        /** Create an {@link LightBarController} */
        public LightBarController create(Context context) {
        public LightBarController create(Context context) {
            return new LightBarController(context, mDarkIconDispatcher, mBatteryController,
            return new LightBarController(context, mDarkIconDispatcher, mBatteryController,
                    mNavModeController, mDumpManager, mDisplayTracker);
                    mNavModeController, mFeatureFlags, mDumpManager, mDisplayTracker);
        }
        }
    }
    }
}
}
+19 −3
Original line number Original line Diff line number Diff line
@@ -42,6 +42,7 @@ import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.graphics.ColorUtils;
import com.android.internal.graphics.ColorUtils;
import com.android.internal.util.ContrastColorUtil;
import com.android.internal.util.function.TriConsumer;
import com.android.internal.util.function.TriConsumer;
import com.android.keyguard.BouncerPanelExpansionCalculator;
import com.android.keyguard.BouncerPanelExpansionCalculator;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitor;
@@ -249,6 +250,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
    private final TriConsumer<ScrimState, Float, GradientColors> mScrimStateListener;
    private final TriConsumer<ScrimState, Float, GradientColors> mScrimStateListener;
    private final LargeScreenShadeInterpolator mLargeScreenShadeInterpolator;
    private final LargeScreenShadeInterpolator mLargeScreenShadeInterpolator;
    private final FeatureFlags mFeatureFlags;
    private final FeatureFlags mFeatureFlags;
    private final boolean mUseNewLightBarLogic;
    private Consumer<Integer> mScrimVisibleListener;
    private Consumer<Integer> mScrimVisibleListener;
    private boolean mBlankScreen;
    private boolean mBlankScreen;
    private boolean mScreenBlankingCallbackCalled;
    private boolean mScreenBlankingCallbackCalled;
@@ -306,6 +308,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
        mScrimStateListener = lightBarController::setScrimState;
        mScrimStateListener = lightBarController::setScrimState;
        mLargeScreenShadeInterpolator = largeScreenShadeInterpolator;
        mLargeScreenShadeInterpolator = largeScreenShadeInterpolator;
        mFeatureFlags = featureFlags;
        mFeatureFlags = featureFlags;
        mUseNewLightBarLogic = featureFlags.isEnabled(Flags.NEW_LIGHT_BAR_LOGIC);
        mDefaultScrimAlpha = BUSY_SCRIM_ALPHA;
        mDefaultScrimAlpha = BUSY_SCRIM_ALPHA;


        mKeyguardStateController = keyguardStateController;
        mKeyguardStateController = keyguardStateController;
@@ -1159,8 +1162,14 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
        if (mClipsQsScrim && mQsBottomVisible) {
        if (mClipsQsScrim && mQsBottomVisible) {
            alpha = mNotificationsAlpha;
            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());
            mScrimStateListener.accept(mState, alpha, mScrimInFront.getColors());
        }
        }
    }


    private void dispatchScrimsVisible() {
    private void dispatchScrimsVisible() {
        final ScrimView backScrim = mClipsQsScrim ? mNotificationsScrim : mScrimBehind;
        final ScrimView backScrim = mClipsQsScrim ? mNotificationsScrim : mScrimBehind;
@@ -1487,8 +1496,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
        int accent = Utils.getColorAccent(mScrimBehind.getContext()).getDefaultColor();
        int accent = Utils.getColorAccent(mScrimBehind.getContext()).getDefaultColor();
        mColors.setMainColor(background);
        mColors.setMainColor(background);
        mColors.setSecondaryColor(accent);
        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(
            mColors.setSupportsDarkText(
                    ColorUtils.calculateContrast(mColors.getMainColor(), Color.WHITE) > 4.5);
                    ColorUtils.calculateContrast(mColors.getMainColor(), Color.WHITE) > 4.5);
        }
        mNeedsDrawableColorUpdate = true;
        mNeedsDrawableColorUpdate = true;
    }
    }


+3 −0
Original line number Original line Diff line number Diff line
@@ -70,6 +70,7 @@ import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.phone.CentralSurfaces;
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.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.telephony.TelephonyListenerManager;
import com.android.systemui.telephony.TelephonyListenerManager;
@@ -115,6 +116,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
    @Mock private MetricsLogger mMetricsLogger;
    @Mock private MetricsLogger mMetricsLogger;
    @Mock private SysuiColorExtractor mColorExtractor;
    @Mock private SysuiColorExtractor mColorExtractor;
    @Mock private IStatusBarService mStatusBarService;
    @Mock private IStatusBarService mStatusBarService;
    @Mock private LightBarController mLightBarController;
    @Mock private NotificationShadeWindowController mNotificationShadeWindowController;
    @Mock private NotificationShadeWindowController mNotificationShadeWindowController;
    @Mock private IWindowManager mWindowManager;
    @Mock private IWindowManager mWindowManager;
    @Mock private Executor mBackgroundExecutor;
    @Mock private Executor mBackgroundExecutor;
@@ -166,6 +168,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
                mMetricsLogger,
                mMetricsLogger,
                mColorExtractor,
                mColorExtractor,
                mStatusBarService,
                mStatusBarService,
                mLightBarController,
                mNotificationShadeWindowController,
                mNotificationShadeWindowController,
                mWindowManager,
                mWindowManager,
                mBackgroundExecutor,
                mBackgroundExecutor,
Loading