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

Commit ebcf5a52 authored by Jeff DeCew's avatar Jeff DeCew
Browse files

Account for the bouncer's scrim in LightBarController

1) The ScrimController's alpha is irrelevant when the bouncer is showing, because the bouncer's scrim is baked into that view, so we always want `forceForScrim` to be true when the bouncer is showing.
2) Moreover, the bouncer covers expanded QS, so tweak the later logic to ignore the QS override when the bouncer is visible.

Fixes: 280434803
Test: atest LightBarControllerTest
Change-Id: Id4236235ce11b473d64d36431c9a4e5f70caf2c9
parent d6a5b130
Loading
Loading
Loading
Loading
+15 −5
Original line number Original line Diff line number Diff line
@@ -103,6 +103,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC


    private boolean mQsCustomizing;
    private boolean mQsCustomizing;
    private boolean mQsExpanded;
    private boolean mQsExpanded;
    private boolean mBouncerVisible;
    private boolean mGlobalActionsVisible;
    private boolean mGlobalActionsVisible;


    private boolean mDirectReplying;
    private boolean mDirectReplying;
@@ -188,9 +189,10 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
                final boolean ignoreScrimForce = mDirectReplying && mNavbarColorManagedByIme;
                final boolean ignoreScrimForce = mDirectReplying && mNavbarColorManagedByIme;
                final boolean darkForScrim = mForceDarkForScrim && !ignoreScrimForce;
                final boolean darkForScrim = mForceDarkForScrim && !ignoreScrimForce;
                final boolean lightForScrim = mForceLightForScrim && !ignoreScrimForce;
                final boolean lightForScrim = mForceLightForScrim && !ignoreScrimForce;
                final boolean darkForQs = mQsCustomizing || mQsExpanded || mGlobalActionsVisible;
                final boolean darkForQs = (mQsCustomizing || mQsExpanded) && !mBouncerVisible;
                final boolean darkForTop = darkForQs || mGlobalActionsVisible;
                mNavigationLight =
                mNavigationLight =
                        ((mHasLightNavigationBar && !darkForScrim) || lightForScrim) && !darkForQs;
                        ((mHasLightNavigationBar && !darkForScrim) || lightForScrim) && !darkForTop;
                mLastNavigationBarAppearanceChangedLog = "onNavigationBarAppearanceChanged()"
                mLastNavigationBarAppearanceChangedLog = "onNavigationBarAppearanceChanged()"
                        + " appearance=" + appearance
                        + " appearance=" + appearance
                        + " nbModeChanged=" + nbModeChanged
                        + " nbModeChanged=" + nbModeChanged
@@ -201,6 +203,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
                        + " darkForScrim=" + darkForScrim
                        + " darkForScrim=" + darkForScrim
                        + " lightForScrim=" + lightForScrim
                        + " lightForScrim=" + lightForScrim
                        + " darkForQs=" + darkForQs
                        + " darkForQs=" + darkForQs
                        + " darkForTop=" + darkForTop
                        + " mNavigationLight=" + mNavigationLight
                        + " mNavigationLight=" + mNavigationLight
                        + " last=" + last
                        + " last=" + last
                        + " timestamp=" + new Date();
                        + " timestamp=" + new Date();
@@ -298,15 +301,20 @@ 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) {
        if (mUseNewLightBarLogic) {
            boolean bouncerVisibleLast = mBouncerVisible;
            boolean forceDarkForScrimLast = mForceDarkForScrim;
            boolean forceDarkForScrimLast = mForceDarkForScrim;
            boolean forceLightForScrimLast = mForceLightForScrim;
            boolean forceLightForScrimLast = mForceLightForScrim;
            final boolean forceForScrim =
            mBouncerVisible =
                    scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD;
                    scrimState == ScrimState.BOUNCER || scrimState == ScrimState.BOUNCER_SCRIMMED;
            final boolean forceForScrim = mBouncerVisible
                    || scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD;
            final boolean scrimColorIsLight = scrimInFrontColor.supportsDarkText();
            final boolean scrimColorIsLight = scrimInFrontColor.supportsDarkText();


            mForceDarkForScrim = forceForScrim && !scrimColorIsLight;
            mForceDarkForScrim = forceForScrim && !scrimColorIsLight;
            mForceLightForScrim = forceForScrim && scrimColorIsLight;
            mForceLightForScrim = forceForScrim && scrimColorIsLight;
            if (mHasLightNavigationBar) {
            if (mBouncerVisible != bouncerVisibleLast) {
                reevaluate();
            } else if (mHasLightNavigationBar) {
                if (mForceDarkForScrim != forceDarkForScrimLast) reevaluate();
                if (mForceDarkForScrim != forceDarkForScrimLast) reevaluate();
            } else {
            } else {
                if (mForceLightForScrim != forceLightForScrimLast) reevaluate();
                if (mForceLightForScrim != forceLightForScrimLast) reevaluate();
@@ -318,6 +326,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
                    + " forceForScrim=" + forceForScrim
                    + " forceForScrim=" + forceForScrim
                    + " scrimColorIsLight=" + scrimColorIsLight
                    + " scrimColorIsLight=" + scrimColorIsLight
                    + " mHasLightNavigationBar=" + mHasLightNavigationBar
                    + " mHasLightNavigationBar=" + mHasLightNavigationBar
                    + " mBouncerVisible=" + mBouncerVisible
                    + " mForceDarkForScrim=" + mForceDarkForScrim
                    + " mForceDarkForScrim=" + mForceDarkForScrim
                    + " mForceLightForScrim=" + mForceLightForScrim
                    + " mForceLightForScrim=" + mForceLightForScrim
                    + " timestamp=" + new Date();
                    + " timestamp=" + new Date();
@@ -428,6 +437,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
        pw.println();
        pw.println();
        pw.print(" mQsCustomizing="); pw.println(mQsCustomizing);
        pw.print(" mQsCustomizing="); pw.println(mQsCustomizing);
        pw.print(" mQsExpanded="); pw.println(mQsExpanded);
        pw.print(" mQsExpanded="); pw.println(mQsExpanded);
        pw.print(" mBouncerVisible="); pw.println(mBouncerVisible);
        pw.print(" mGlobalActionsVisible="); pw.println(mGlobalActionsVisible);
        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);
+89 −7
Original line number Original line Diff line number Diff line
@@ -222,31 +222,103 @@ public class LightBarControllerTest extends SysuiTestCase {


        // Initial state is set when controller is set
        // Initial state is set when controller is set
        mLightBarController.setNavigationBar(mNavBarController);
        mLightBarController.setNavigationBar(mNavBarController);
        verifyNavBarIconsDarkSetTo(false);
        verifyNavBarIconsDark(false, /* didFireEvent= */ true);


        // Changing the color of the transparent scrim has no effect
        // Changing the color of the transparent scrim has no effect
        mLightBarController.setScrimState(ScrimState.UNLOCKED, 0f, COLORS_LIGHT);
        mLightBarController.setScrimState(ScrimState.UNLOCKED, 0f, COLORS_LIGHT);
        verifyNavBarIconsUnchanged(); // still light
        verifyNavBarIconsDark(false, /* didFireEvent= */ false);


        // Showing the notification shade with white scrim requires dark icons
        // Showing the notification shade with white scrim requires dark icons
        mLightBarController.setScrimState(ScrimState.UNLOCKED, 1f, COLORS_LIGHT);
        mLightBarController.setScrimState(ScrimState.UNLOCKED, 1f, COLORS_LIGHT);
        verifyNavBarIconsDarkSetTo(true);
        verifyNavBarIconsDark(true, /* didFireEvent= */ true);


        // Expanded QS always provides a black background, so icons become light again
        // Expanded QS always provides a black background, so icons become light again
        mLightBarController.setQsExpanded(true);
        mLightBarController.setQsExpanded(true);
        verifyNavBarIconsDarkSetTo(false);
        verifyNavBarIconsDark(false, /* didFireEvent= */ true);


        // Tapping the QS tile to change to dark theme has no effect in this state
        // Tapping the QS tile to change to dark theme has no effect in this state
        mLightBarController.setScrimState(ScrimState.UNLOCKED, 1f, COLORS_DARK);
        mLightBarController.setScrimState(ScrimState.UNLOCKED, 1f, COLORS_DARK);
        verifyNavBarIconsUnchanged(); // still light
        verifyNavBarIconsDark(false, /* didFireEvent= */ false);


        // collapsing QS in dark mode doesn't affect button color
        // collapsing QS in dark mode doesn't affect button color
        mLightBarController.setQsExpanded(false);
        mLightBarController.setQsExpanded(false);
        verifyNavBarIconsUnchanged(); // still light
        verifyNavBarIconsDark(false, /* didFireEvent= */ false);


        // Closing the shade has no affect
        // Closing the shade has no affect
        mLightBarController.setScrimState(ScrimState.UNLOCKED, 0f, COLORS_DARK);
        mLightBarController.setScrimState(ScrimState.UNLOCKED, 0f, COLORS_DARK);
        verifyNavBarIconsUnchanged(); // still light
        verifyNavBarIconsDark(false, /* didFireEvent= */ false);
    }

    @Test
    public void navBarHasDarkIconsInLockedShade_lightMode() {
        assumeTrue(testNewLightBarLogic());  // Only run in the new suite

        // On the locked shade QS in light mode buttons are light
        mLightBarController.setScrimState(ScrimState.SHADE_LOCKED, 1f, COLORS_LIGHT);
        mLightBarController.onNavigationBarAppearanceChanged(
                0, /* nbModeChanged = */ true,
                MODE_TRANSPARENT, /* navbarColorManagedByIme = */ false);
        verifyNavBarIconsUnchanged(); // no changes yet; not attached

        // Initial state is set when controller is set
        mLightBarController.setNavigationBar(mNavBarController);
        verifyNavBarIconsDark(true, /* didFireEvent= */ true);
    }

    @Test
    public void navBarHasLightIconsInLockedQs_lightMode() {
        // GIVEN dark icons in locked shade in light mdoe
        navBarHasDarkIconsInLockedShade_lightMode();
        // WHEN expanding QS
        mLightBarController.setQsExpanded(true);
        // THEN icons become light
        verifyNavBarIconsDark(false, /* didFireEvent= */ true);
    }

    @Test
    public void navBarHasDarkIconsInBouncerOverQs_lightMode() {
        // GIVEN that light icons in locked expanded QS
        navBarHasLightIconsInLockedQs_lightMode();
        // WHEN device changes to bouncer
        mLightBarController.setScrimState(ScrimState.BOUNCER, 1f, COLORS_LIGHT);
        // THEN icons change to dark
        verifyNavBarIconsDark(true, /* didFireEvent= */ true);
    }

    @Test
    public void navBarHasLightIconsInLockedShade_darkMode() {
        assumeTrue(testNewLightBarLogic());  // Only run in the new suite

        // On the locked shade QS in light mode buttons are light
        mLightBarController.setScrimState(ScrimState.SHADE_LOCKED, 1f, COLORS_DARK);
        mLightBarController.onNavigationBarAppearanceChanged(
                0, /* nbModeChanged = */ true,
                MODE_TRANSPARENT, /* navbarColorManagedByIme = */ false);
        verifyNavBarIconsUnchanged(); // no changes yet; not attached

        // Initial state is set when controller is set
        mLightBarController.setNavigationBar(mNavBarController);
        verifyNavBarIconsDark(false, /* didFireEvent= */ true);
    }

    @Test
    public void navBarHasLightIconsInLockedQs_darkMode() {
        // GIVEN light icons in the locked shade
        navBarHasLightIconsInLockedShade_darkMode();
        // WHEN QS expands
        mLightBarController.setQsExpanded(true);
        // THEN icons stay light
        verifyNavBarIconsDark(false, /* didFireEvent= */ false);
    }

    @Test
    public void navBarHasLightIconsInBouncerOverQs_darkMode() {
        // GIVEN that light icons in locked expanded QS
        navBarHasLightIconsInLockedQs_darkMode();
        // WHEN device changes to bouncer
        mLightBarController.setScrimState(ScrimState.BOUNCER, 1f, COLORS_DARK);
        // THEN icons stay light
        verifyNavBarIconsDark(false, /* didFireEvent= */ false);
    }
    }


    private void verifyNavBarIconsUnchanged() {
    private void verifyNavBarIconsUnchanged() {
@@ -258,4 +330,14 @@ public class LightBarControllerTest extends SysuiTestCase {
        verify(mNavBarController, never()).setIconsDark(eq(!iconsDark), anyBoolean());
        verify(mNavBarController, never()).setIconsDark(eq(!iconsDark), anyBoolean());
        clearInvocations(mNavBarController);
        clearInvocations(mNavBarController);
    }
    }

    private void verifyNavBarIconsDark(boolean iconsDark, boolean didFireEvent) {
        if (didFireEvent) {
            verifyNavBarIconsDarkSetTo(iconsDark);
        } else {
            verifyNavBarIconsUnchanged();
            mLightBarController.setNavigationBar(mNavBarController);
            verifyNavBarIconsDarkSetTo(iconsDark);
        }
    }
}
}