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

Commit aaf78026 authored by Michal Brzezinski's avatar Michal Brzezinski
Browse files

Fixing notifications background in split shade mode

Notification background was not showing up when going from lockscreen to
shade directly with swipe down. ScrimState is changed then and only in
SHADE_LOCKED notification scrim alpha should depend on interpolated
fraction

Fixes: 186864180
Test: manual
Change-Id: I75468a92a6d0dd27c32b2eb5c5b0f90e48a4ff67
parent b2de16f2
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -163,7 +163,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
    private final float mDefaultScrimAlpha;

    // Assuming the shade is expanded during initialization
    private float mExpansionFraction = 1f;
    private float mPanelExpansion = 1f;
    private float mQsExpansion;
    private boolean mQsBottomVisible;

@@ -487,8 +487,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
        if (isNaN(fraction)) {
            throw new IllegalArgumentException("Fraction should not be NaN");
        }
        if (mExpansionFraction != fraction) {
            mExpansionFraction = fraction;
        if (mPanelExpansion != fraction) {
            mPanelExpansion = fraction;

            boolean relevantState = (mState == ScrimState.UNLOCKED
                    || mState == ScrimState.KEYGUARD
@@ -641,7 +641,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
                mBehindTint = Color.BLACK;
            } else {
                mBehindAlpha = backAlpha;
                if (mState == ScrimState.SHADE_LOCKED) {
                    // going from KEYGUARD to SHADE_LOCKED state
                    mNotificationsAlpha = getInterpolatedFraction();
                } else {
                    mNotificationsAlpha = Math.max(1.0f - getInterpolatedFraction(), mQsExpansion);
                }
                mBehindTint = backTint;
            }
        }
@@ -805,7 +810,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
    }

    private float getInterpolatedFraction() {
        float frac = mExpansionFraction;
        float frac = mPanelExpansion;
        // let's start this 20% of the way down the screen
        frac = frac * 1.2f - 0.2f;
        if (frac <= 0) {
@@ -1165,7 +1170,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
        pw.print("  mDefaultScrimAlpha=");
        pw.println(mDefaultScrimAlpha);
        pw.print("  mExpansionFraction=");
        pw.println(mExpansionFraction);
        pw.println(mPanelExpansion);
    }

    public void setWallpaperSupportsAmbientMode(boolean wallpaperSupportsAmbientMode) {
+56 −21
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static com.android.systemui.statusbar.phone.ScrimController.OPAQUE;
import static com.android.systemui.statusbar.phone.ScrimController.SEMI_TRANSPARENT;
import static com.android.systemui.statusbar.phone.ScrimController.TRANSPARENT;

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -165,7 +166,7 @@ public class ScrimControllerTest extends SysuiTestCase {
        endAnimation(mScrimInFront);
        endAnimation(mScrimForBubble);

        Assert.assertEquals("Animators did not finish",
        assertEquals("Animators did not finish",
                mAnimatorListener.getNumStarts(), mAnimatorListener.getNumEnds());
    }

@@ -422,7 +423,7 @@ public class ScrimControllerTest extends SysuiTestCase {
        mScrimController.transitionTo(ScrimState.AOD);
        finishAnimationsImmediately();
        mScrimController.setAodFrontScrimAlpha(0.3f);
        Assert.assertEquals(ScrimState.AOD.getFrontAlpha(), mScrimInFront.getViewAlpha(), 0.001f);
        assertEquals(ScrimState.AOD.getFrontAlpha(), mScrimInFront.getViewAlpha(), 0.001f);
        Assert.assertNotEquals(0.3f, mScrimInFront.getViewAlpha(), 0.001f);
    }

@@ -601,13 +602,13 @@ public class ScrimControllerTest extends SysuiTestCase {
        ));

        // Front scrim should be transparent
        Assert.assertEquals(ScrimController.TRANSPARENT,
        assertEquals(ScrimController.TRANSPARENT,
                mScrimInFront.getViewAlpha(), 0.0f);
        // Back scrim should be visible
        Assert.assertEquals(ScrimController.BUSY_SCRIM_ALPHA,
        assertEquals(ScrimController.BUSY_SCRIM_ALPHA,
                mScrimBehind.getViewAlpha(), 0.0f);
        // Bubble scrim should be visible
        Assert.assertEquals(ScrimController.BUBBLE_SCRIM_ALPHA,
        assertEquals(ScrimController.BUBBLE_SCRIM_ALPHA,
                mScrimForBubble.getViewAlpha(), 0.0f);
    }

@@ -615,15 +616,15 @@ public class ScrimControllerTest extends SysuiTestCase {
    public void scrimStateCallback() {
        mScrimController.transitionTo(ScrimState.UNLOCKED);
        finishAnimationsImmediately();
        Assert.assertEquals(mScrimState, ScrimState.UNLOCKED);
        assertEquals(mScrimState, ScrimState.UNLOCKED);

        mScrimController.transitionTo(ScrimState.BOUNCER);
        finishAnimationsImmediately();
        Assert.assertEquals(mScrimState, ScrimState.BOUNCER);
        assertEquals(mScrimState, ScrimState.BOUNCER);

        mScrimController.transitionTo(ScrimState.BOUNCER_SCRIMMED);
        finishAnimationsImmediately();
        Assert.assertEquals(mScrimState, ScrimState.BOUNCER_SCRIMMED);
        assertEquals(mScrimState, ScrimState.BOUNCER_SCRIMMED);
    }

    @Test
@@ -638,13 +639,13 @@ public class ScrimControllerTest extends SysuiTestCase {
        mScrimController.setPanelExpansion(1.0f);
        finishAnimationsImmediately();

        Assert.assertEquals("Scrim alpha should change after setPanelExpansion",
        assertEquals("Scrim alpha should change after setPanelExpansion",
                mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);

        mScrimController.setPanelExpansion(0f);
        finishAnimationsImmediately();

        Assert.assertEquals("Scrim alpha should change after setPanelExpansion",
        assertEquals("Scrim alpha should change after setPanelExpansion",
                mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);
    }

@@ -698,7 +699,7 @@ public class ScrimControllerTest extends SysuiTestCase {
        mScrimController.setExpansionAffectsAlpha(false);
        mScrimController.setPanelExpansion(0.8f);
        verifyZeroInteractions(mScrimBehind);
        Assert.assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha "
        assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha "
                + "is false", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f);

        mScrimController.setExpansionAffectsAlpha(true);
@@ -801,9 +802,9 @@ public class ScrimControllerTest extends SysuiTestCase {
            }
        });
        finishAnimationsImmediately();
        Assert.assertEquals("onStart called in wrong order", 1, callOrder[0]);
        Assert.assertEquals("onDisplayBlanked called in wrong order", 2, callOrder[1]);
        Assert.assertEquals("onFinished called in wrong order", 3, callOrder[2]);
        assertEquals("onStart called in wrong order", 1, callOrder[0]);
        assertEquals("onDisplayBlanked called in wrong order", 2, callOrder[1]);
        assertEquals("onFinished called in wrong order", 3, callOrder[2]);
    }

    @Test
@@ -911,7 +912,7 @@ public class ScrimControllerTest extends SysuiTestCase {
        mScrimController.transitionTo(ScrimState.UNLOCKED);
        finishAnimationsImmediately();

        Assert.assertEquals("Scrim expansion opacity wasn't conserved when transitioning back",
        assertEquals("Scrim expansion opacity wasn't conserved when transitioning back",
                expandedAlpha, mScrimBehind.getViewAlpha(), 0.01f);
    }

@@ -981,7 +982,7 @@ public class ScrimControllerTest extends SysuiTestCase {
            }
            mScrimController.transitionTo(state);
            finishAnimationsImmediately();
            Assert.assertEquals("Should be clickable unless AOD or PULSING, was: " + state,
            assertEquals("Should be clickable unless AOD or PULSING, was: " + state,
                    mScrimBehind.getViewAlpha() != 0 && !eatsTouches.contains(state),
                    mScrimBehind.isClickable());
        }
@@ -1035,9 +1036,9 @@ public class ScrimControllerTest extends SysuiTestCase {
        mScrimController.setQsPosition(0, 300);
        finishAnimationsImmediately();

        Assert.assertEquals("Behind scrim should be opaque",
        assertEquals("Behind scrim should be opaque",
                mScrimBehind.getViewAlpha(), 1, 0.0);
        Assert.assertEquals("Notifications scrim should be opaque",
        assertEquals("Notifications scrim should be opaque",
                mNotificationsScrim.getViewAlpha(), 1, 0.0);
    }

@@ -1093,6 +1094,40 @@ public class ScrimControllerTest extends SysuiTestCase {
                mNotificationsScrim, TRANSPARENT));
    }

    @Test
    public void testNotificationScrimVisible_afterOpeningShadeFromLockscreen() {
        mScrimController.setPanelExpansion(1);
        mScrimController.transitionTo(ScrimState.SHADE_LOCKED);
        finishAnimationsImmediately();

        assertScrimAlpha(Map.of(
                mScrimBehind, OPAQUE,
                mNotificationsScrim, OPAQUE));
    }

    @Test
    public void testNotificationTransparency_followsPanelExpansionInShadeLockedState() {
        mScrimController.transitionTo(ScrimState.SHADE_LOCKED);

        assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.8f, /* expansion */ 0.8f);
        assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.2f, /* expansion */ 0.2f);
    }

    @Test
    public void testNotificationTransparency_inKeyguardState() {
        mScrimController.transitionTo(ScrimState.KEYGUARD);

        assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.2f, /* expansion */ 0.8f);
        assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.8f, /* expansion */ 0.2f);
    }

    private void assertAlphaAfterExpansion(ScrimView scrim, float expectedAlpha, float expansion) {
        mScrimController.setPanelExpansion(expansion);
        finishAnimationsImmediately();
        // alpha is not changing linearly thus 0.2 of leeway when asserting
        assertEquals(expectedAlpha, mNotificationsScrim.getViewAlpha(), 0.2);
    }

    private void assertScrimTinted(Map<ScrimView, Boolean> scrimToTint) {
        scrimToTint.forEach((scrim, hasTint) -> assertScrimTint(scrim, hasTint));
    }
@@ -1101,7 +1136,7 @@ public class ScrimControllerTest extends SysuiTestCase {
        String message = "Tint test failed at state " + mScrimController.getState()
                + " with scrim: " + getScrimName(scrim) + " and tint: "
                + Integer.toHexString(scrim.getTint());
        Assert.assertEquals(message, hasTint, scrim.getTint() != Color.TRANSPARENT);
        assertEquals(message, hasTint, scrim.getTint() != Color.TRANSPARENT);
    }

    private String getScrimName(ScrimView scrim) {
@@ -1146,13 +1181,13 @@ public class ScrimControllerTest extends SysuiTestCase {
        } else {
            visibility = TRANSPARENT;
        }
        Assert.assertEquals("Invalid visibility.",
        assertEquals("Invalid visibility.",
                visibility /* expected */,
                mScrimVisibility);
    }

    private void assertScrimAlpha(ScrimView scrim, int expectedAlpha) {
        Assert.assertEquals("Unexpected " + getScrimName(scrim) + " scrim alpha: "
        assertEquals("Unexpected " + getScrimName(scrim) + " scrim alpha: "
                        + scrim.getViewAlpha(),
                expectedAlpha != TRANSPARENT /* expected */,
                scrim.getViewAlpha() > TRANSPARENT /* actual */);