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

Commit 99a414d9 authored by William Xiao's avatar William Xiao
Browse files

Fix notification scrim missing when opening shade over glanceable hub

Before this change, the scrims were entirely missing when the
notification shade was opened over the hub. The previous change
3f2316cc neglected the fact that the
scrims behave differently when dreaming vs on the lockscreen.

This change adds a new ScrimState for when the hub is open over the
dream and uses the same logic as when opening the shade/bouncer over
the dream to set the scrim alphas and tints.

Bug: 323036128
Fixed: 323036128
Test: atest ScrimControllerTest CentralSurfacesImplTest
      also manually verified on device
Flag: ACONFIG com.android.systemui.communal_hub TEAMFOOD
Change-Id: Iec1443357eba9c4c2bd8a2e386120ffb12fed8b2
parent b4f9d4b9
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -2790,6 +2790,9 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
                        || mKeyguardStateController.isKeyguardGoingAway()
                        || mKeyguardViewMediator.requestedShowSurfaceBehindKeyguard()
                        || mKeyguardViewMediator.isAnimatingBetweenKeyguardAndSurfaceBehind());
        boolean dreaming =
                mKeyguardStateController.isShowing() && mKeyguardUpdateMonitor.isDreaming()
                        && !unlocking;

        mScrimController.setExpansionAffectsAlpha(!unlocking);

@@ -2834,13 +2837,16 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
            // this as otherwise it can remain pending and leave keyguard in a weird state.
            mUnlockScrimCallback.onCancelled();
        } else if (mIsIdleOnCommunal) {
            if (dreaming) {
                mScrimController.transitionTo(ScrimState.GLANCEABLE_HUB_OVER_DREAM);
            } else {
                mScrimController.transitionTo(ScrimState.GLANCEABLE_HUB);
            }
        } else if (mKeyguardStateController.isShowing()
                && !mKeyguardStateController.isOccluded()
                && !unlocking) {
            mScrimController.transitionTo(ScrimState.KEYGUARD);
        } else if (mKeyguardStateController.isShowing() && mKeyguardUpdateMonitor.isDreaming()
                && !unlocking) {
        } else if (dreaming) {
            mScrimController.transitionTo(ScrimState.DREAMING);
        } else {
            mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback);
+17 −3
Original line number Diff line number Diff line
@@ -536,6 +536,16 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
        mAnimateChange = state.getAnimateChange();
        mAnimationDuration = state.getAnimationDuration();

        if (mState == ScrimState.GLANCEABLE_HUB_OVER_DREAM) {
            // When the device is docked while on GLANCEABLE_HUB, the dream starts underneath the
            // hub and the ScrimState transitions to GLANCEABLE_HUB_OVER_DREAM. To prevent the
            // scrims from flickering in during this transition, we set the panel expansion
            // fraction, which is 1 when idle on GLANCEABLE_HUB, to 0. This only occurs when the hub
            // is open because the hub lives in the same window as the shade, which is not visible
            // when transitioning from KEYGUARD to DREAMING.
            mPanelExpansionFraction = 0f;
        }

        applyState();

        mScrimInFront.setBlendWithMainColor(state.shouldBlendWithMainColor());
@@ -738,6 +748,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
            boolean relevantState = (mState == ScrimState.UNLOCKED
                    || mState == ScrimState.KEYGUARD
                    || mState == ScrimState.DREAMING
                    || mState == ScrimState.GLANCEABLE_HUB_OVER_DREAM
                    || mState == ScrimState.SHADE_LOCKED
                    || mState == ScrimState.PULSING);
            if (!(relevantState && mExpansionAffectsAlpha) || mAnimatingPanelExpansionOnUnlock) {
@@ -844,7 +855,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
            return;
        }
        mBouncerHiddenFraction = bouncerHiddenAmount;
        if (mState == ScrimState.DREAMING || mState == ScrimState.GLANCEABLE_HUB) {
        if (mState == ScrimState.DREAMING || mState == ScrimState.GLANCEABLE_HUB
                || mState == ScrimState.GLANCEABLE_HUB_OVER_DREAM) {
            // The dreaming and glanceable hub states requires this for the scrim calculation, so we
            // should only trigger an update in those states.
            applyAndDispatchState();
@@ -926,7 +938,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
            return;
        }

        if (mState == ScrimState.UNLOCKED || mState == ScrimState.DREAMING) {
        if (mState == ScrimState.UNLOCKED || mState == ScrimState.DREAMING
                || mState == ScrimState.GLANCEABLE_HUB_OVER_DREAM) {
            final boolean occluding =
                    mOccludeAnimationPlaying || mState.mLaunchingAffordanceWithPreview;
            // Darken scrim as it's pulled down while unlocked. If we're unlocked but playing the
@@ -954,8 +967,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
                mInFrontAlpha = 0;
            }

            if (mState == ScrimState.DREAMING
            if ((mState == ScrimState.DREAMING || mState == ScrimState.GLANCEABLE_HUB_OVER_DREAM)
                    && mBouncerHiddenFraction != KeyguardBouncerConstants.EXPANSION_HIDDEN) {
                // Bouncer is opening over dream or glanceable hub over dream.
                final float interpolatedFraction =
                        BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(
                                mBouncerHiddenFraction);
+22 −3
Original line number Diff line number Diff line
@@ -299,9 +299,9 @@ public enum ScrimState {
    },

    /**
     * Device is locked or on dream and user has swiped from the right edge to enter the glanceable
     * hub UI. From this state, the user can swipe from the left edge to go back to the lock screen
     * or dream, as well as swipe down for the notifications and up for the bouncer.
     * Device is on the lockscreen and user has swiped from the right edge to enter the glanceable
     * hub UI. From this state, the user can swipe from the left edge to go back to the lock screen,
     * as well as swipe down for the notifications and up for the bouncer.
     */
    GLANCEABLE_HUB {
        @Override
@@ -310,6 +310,25 @@ public enum ScrimState {
            mBehindAlpha = 0;
            mNotifAlpha = 0;
            mFrontAlpha = 0;

            mFrontTint = Color.TRANSPARENT;
            mBehindTint = mBackgroundColor;
            mNotifTint = mClipQsScrim ? mBackgroundColor : Color.TRANSPARENT;
        }
    },

    /**
     * Device is dreaming and user has swiped from the right edge to enter the glanceable hub UI.
     * From this state, the user can swipe from the left edge to go back to the  dream, as well as
     * swipe down for the notifications and up for the bouncer.
     *
     * This is a separate state from {@link #GLANCEABLE_HUB} because the scrims behave differently
     * when the dream is running.
     */
    GLANCEABLE_HUB_OVER_DREAM {
        @Override
        public void prepare(ScrimState previousState) {
            GLANCEABLE_HUB.prepare(previousState);
        }
    };

+23 −0
Original line number Diff line number Diff line
@@ -858,6 +858,29 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
        verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
    }

    @Test
    public void testEnteringGlanceableHub_whenDreaming_updatesScrim() {
        when(mKeyguardStateController.isShowing()).thenReturn(true);
        when(mKeyguardStateController.isOccluded()).thenReturn(true);
        when(mKeyguardUpdateMonitor.isDreaming()).thenReturn(true);

        // Transition to the glanceable hub.
        mCommunalRepository.setTransitionState(flowOf(new ObservableTransitionState.Idle(
                CommunalScenes.Communal)));
        mTestScope.getTestScheduler().runCurrent();

        // ScrimState also transitions.
        verify(mScrimController).transitionTo(ScrimState.GLANCEABLE_HUB_OVER_DREAM);

        // Transition away from the glanceable hub.
        mCommunalRepository.setTransitionState(flowOf(new ObservableTransitionState.Idle(
                CommunalScenes.Blank)));
        mTestScope.getTestScheduler().runCurrent();

        // ScrimState goes back to UNLOCKED.
        verify(mScrimController).transitionTo(eq(ScrimState.DREAMING));
    }

    @Test
    public void testShowKeyguardImplementation_setsState() {
        when(mLockscreenUserManager.getCurrentProfiles()).thenReturn(new SparseArray<>());
+69 −1
Original line number Diff line number Diff line
@@ -793,6 +793,73 @@ public class ScrimControllerTest extends SysuiTestCase {
                mScrimBehind, TRANSPARENT));
    }

    @Test
    public void transitionToHubOverDream() {
        mScrimController.setRawPanelExpansionFraction(0f);
        mScrimController.setBouncerHiddenFraction(KeyguardBouncerConstants.EXPANSION_HIDDEN);
        mScrimController.transitionTo(ScrimState.GLANCEABLE_HUB_OVER_DREAM);
        finishAnimationsImmediately();

        // All scrims transparent on the hub.
        assertScrimAlpha(Map.of(
                mScrimInFront, TRANSPARENT,
                mNotificationsScrim, TRANSPARENT,
                mScrimBehind, TRANSPARENT));
    }

    @Test
    public void openBouncerOnHubOverDream() {
        mScrimController.transitionTo(ScrimState.GLANCEABLE_HUB_OVER_DREAM);

        // Open the bouncer.
        mScrimController.setRawPanelExpansionFraction(0f);
        mScrimController.setBouncerHiddenFraction(KeyguardBouncerConstants.EXPANSION_VISIBLE);
        finishAnimationsImmediately();

        // Only behind widget is visible.
        assertScrimAlpha(Map.of(
                mScrimInFront, TRANSPARENT,
                mNotificationsScrim, TRANSPARENT,
                mScrimBehind, OPAQUE));

        // Bouncer is closed.
        mScrimController.setBouncerHiddenFraction(KeyguardBouncerConstants.EXPANSION_HIDDEN);
        mScrimController.transitionTo(ScrimState.GLANCEABLE_HUB_OVER_DREAM);
        finishAnimationsImmediately();

        // All scrims are transparent.
        assertScrimAlpha(Map.of(
                mScrimInFront, TRANSPARENT,
                mNotificationsScrim, TRANSPARENT,
                mScrimBehind, TRANSPARENT));
    }

    @Test
    public void openShadeOnHubOverDream() {
        mScrimController.transitionTo(ScrimState.GLANCEABLE_HUB_OVER_DREAM);

        // Open the shade.
        mScrimController.transitionTo(SHADE_LOCKED);
        mScrimController.setQsPosition(1f, 0);
        mScrimController.setRawPanelExpansionFraction(1f);
        finishAnimationsImmediately();

        // Shade scrims are visible.
        assertScrimAlpha(Map.of(
                mNotificationsScrim, OPAQUE,
                mScrimInFront, TRANSPARENT,
                mScrimBehind, OPAQUE));

        mScrimController.transitionTo(ScrimState.GLANCEABLE_HUB_OVER_DREAM);
        finishAnimationsImmediately();

        // All scrims are transparent.
        assertScrimAlpha(Map.of(
                mScrimInFront, TRANSPARENT,
                mNotificationsScrim, TRANSPARENT,
                mScrimBehind, TRANSPARENT));
    }

    @Test
    public void onThemeChange_bouncerBehindTint_isUpdatedToSurfaceColor() {
        assertEquals(BOUNCER.getBehindTint(), 0x112233);
@@ -1432,7 +1499,8 @@ public class ScrimControllerTest extends SysuiTestCase {
                ScrimState.UNINITIALIZED, ScrimState.KEYGUARD, BOUNCER,
                ScrimState.DREAMING, ScrimState.BOUNCER_SCRIMMED, ScrimState.BRIGHTNESS_MIRROR,
                ScrimState.UNLOCKED, SHADE_LOCKED, ScrimState.AUTH_SCRIMMED,
                ScrimState.AUTH_SCRIMMED_SHADE, ScrimState.GLANCEABLE_HUB));
                ScrimState.AUTH_SCRIMMED_SHADE, ScrimState.GLANCEABLE_HUB,
                ScrimState.GLANCEABLE_HUB_OVER_DREAM));

        for (ScrimState state : ScrimState.values()) {
            if (!lowPowerModeStates.contains(state) && !regularStates.contains(state)) {