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

Commit 52ebab8f authored by Jeff DeCew's avatar Jeff DeCew Committed by Steve Elliott
Browse files

Fix squished notifications on the lockscreen.

This fixes a stale state caused when stack height is not recalculated after being frozen.  NSSL uses shouldSkipHeightUpdate() to prevent the stack height from being recalculated during various animations and gestures, but we didn't correctly trigger a recalculation after that 'freeze', so this CL adds the necessary recalculation at those transition points to prevent the old stack height from persisting until the next update.

This also fixes a visual jump when unfreezing the stack height if it was frozen while the appear fraction was still changing.  This jump is fixed by allowing the appear fraction to continue to apply and update the stackHeight (from the stackEndHeight) even while the stackEndHeight is frozen.

Fixes: 235366457
Test: drag shade up during aod->ls transition
Change-Id: Ice6de1149b05564294e5c51308e962112cf4eda7
(cherry picked from commit 82596c5c)
parent 9d2f3f9d
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -1323,10 +1323,24 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
        if (mOnStackYChanged != null) {
            mOnStackYChanged.accept(listenerNeedsAnimation);
        }
        updateStackEndHeightAndStackHeight(fraction);
    }

    @VisibleForTesting
    public void updateStackEndHeightAndStackHeight(float fraction) {
        final float oldStackHeight = mAmbientState.getStackHeight();
        if (mQsExpansionFraction <= 0 && !shouldSkipHeightUpdate()) {
            final float endHeight = updateStackEndHeight(
                    getHeight(), getEmptyBottomMargin(), mTopPadding);
            updateStackHeight(endHeight, fraction);
        } else {
            // Always updateStackHeight to prevent jumps in the stack height when this fraction
            // suddenly reapplies after a freeze.
            final float endHeight = mAmbientState.getStackEndHeight();
            updateStackHeight(endHeight, fraction);
        }
        if (oldStackHeight != mAmbientState.getStackHeight()) {
            requestChildrenUpdate();
        }
    }

@@ -1343,6 +1357,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
        return stackEndHeight;
    }

    @VisibleForTesting
    public void updateStackHeight(float endHeight, float fraction) {
        // During the (AOD<=>LS) transition where dozeAmount is changing,
        // apply dozeAmount to stack height instead of expansionFraction
@@ -5041,6 +5056,19 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
    @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
    public void setUnlockHintRunning(boolean running) {
        mAmbientState.setUnlockHintRunning(running);
        if (!running) {
            // re-calculate the stack height which was frozen while running this animation
            updateStackPosition();
        }
    }

    @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
    public void setPanelFlinging(boolean flinging) {
        mAmbientState.setIsFlinging(flinging);
        if (!flinging) {
            // re-calculate the stack height which was frozen while flinging
            updateStackPosition();
        }
    }

    @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
+4 −0
Original line number Diff line number Diff line
@@ -1190,6 +1190,10 @@ public class NotificationStackScrollLayoutController {
        mView.setUnlockHintRunning(running);
    }

    public void setPanelFlinging(boolean flinging) {
        mView.setPanelFlinging(flinging);
    }

    public boolean isFooterViewNotGone() {
        return mView.isFooterViewNotGone();
    }
+2 −2
Original line number Diff line number Diff line
@@ -1782,14 +1782,14 @@ public class NotificationPanelViewController extends PanelViewController {
        mHeadsUpTouchHelper.notifyFling(!expand);
        mKeyguardStateController.notifyPanelFlingStart(!expand /* flingingToDismiss */);
        setClosingWithAlphaFadeout(!expand && !isOnKeyguard() && getFadeoutAlpha() == 1.0f);
        mAmbientState.setIsFlinging(true);
        mNotificationStackScrollLayoutController.setPanelFlinging(true);
        super.flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing);
    }

    @Override
    protected void onFlingEnd(boolean cancelled) {
        super.onFlingEnd(cancelled);
        mAmbientState.setIsFlinging(false);
        mNotificationStackScrollLayoutController.setPanelFlinging(false);
    }

    private boolean onQsIntercept(MotionEvent event) {
+72 −4
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -122,12 +123,12 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
        allowTestableLooperAsMainThread();

        // Interact with real instance of AmbientState.
        mAmbientState = new AmbientState(
        mAmbientState = spy(new AmbientState(
                mContext,
                mDumpManager,
                mNotificationSectionsManager,
                mBypassController,
                mStatusBarKeyguardViewManager);
                mStatusBarKeyguardViewManager));

        // Inject dependencies before initializing the layout
        mDependency.injectTestDependency(SysuiStatusBarStateController.class, mBarState);
@@ -190,7 +191,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
                endHeight, dozeAmount);

        mStackScroller.updateStackHeight(endHeight, expansionFraction);
        assertTrue(mAmbientState.getStackHeight() == expected);
        assertThat(mAmbientState.getStackHeight()).isEqualTo(expected);
    }

    @Test
@@ -205,7 +206,74 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
                endHeight, expansionFraction);

        mStackScroller.updateStackHeight(endHeight, expansionFraction);
        assertTrue(mAmbientState.getStackHeight() == expected);
        assertThat(mAmbientState.getStackHeight()).isEqualTo(expected);
    }

    @Test
    public void updateStackEndHeightAndStackHeight_normallyUpdatesBoth() {
        final float expansionFraction = 0.5f;
        mAmbientState.setStatusBarState(StatusBarState.KEYGUARD);

        // Validate that by default we update everything
        clearInvocations(mAmbientState);
        mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction);
        verify(mAmbientState).setStackEndHeight(anyFloat());
        verify(mAmbientState).setStackHeight(anyFloat());
    }

    @Test
    public void updateStackEndHeightAndStackHeight_onlyUpdatesStackHeightDuringSwipeUp() {
        final float expansionFraction = 0.5f;
        mAmbientState.setStatusBarState(StatusBarState.KEYGUARD);
        mAmbientState.setSwipingUp(true);

        // Validate that when the gesture is in progress, we update only the stackHeight
        clearInvocations(mAmbientState);
        mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction);
        verify(mAmbientState, never()).setStackEndHeight(anyFloat());
        verify(mAmbientState).setStackHeight(anyFloat());
    }

    @Test
    public void setPanelFlinging_updatesStackEndHeightOnlyOnFinish() {
        final float expansionFraction = 0.5f;
        mAmbientState.setStatusBarState(StatusBarState.KEYGUARD);
        mAmbientState.setSwipingUp(true);
        mStackScroller.setPanelFlinging(true);
        mAmbientState.setSwipingUp(false);

        // Validate that when the animation is running, we update only the stackHeight
        clearInvocations(mAmbientState);
        mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction);
        verify(mAmbientState, never()).setStackEndHeight(anyFloat());
        verify(mAmbientState).setStackHeight(anyFloat());

        // Validate that when the animation ends the stackEndHeight is recalculated immediately
        clearInvocations(mAmbientState);
        mStackScroller.setPanelFlinging(false);
        verify(mAmbientState).setIsFlinging(eq(false));
        verify(mAmbientState).setStackEndHeight(anyFloat());
        verify(mAmbientState).setStackHeight(anyFloat());
    }

    @Test
    public void setUnlockHintRunning_updatesStackEndHeightOnlyOnFinish() {
        final float expansionFraction = 0.5f;
        mAmbientState.setStatusBarState(StatusBarState.KEYGUARD);
        mStackScroller.setUnlockHintRunning(true);

        // Validate that when the animation is running, we update only the stackHeight
        clearInvocations(mAmbientState);
        mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction);
        verify(mAmbientState, never()).setStackEndHeight(anyFloat());
        verify(mAmbientState).setStackHeight(anyFloat());

        // Validate that when the animation ends the stackEndHeight is recalculated immediately
        clearInvocations(mAmbientState);
        mStackScroller.setUnlockHintRunning(false);
        verify(mAmbientState).setUnlockHintRunning(eq(false));
        verify(mAmbientState).setStackEndHeight(anyFloat());
        verify(mAmbientState).setStackHeight(anyFloat());
    }

    @Test