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

Commit eab25b89 authored by Lyn's avatar Lyn
Browse files

Unfurl notifications on AOD=>lockscreen wakeup

During the (AOD<=>LS) transition where dozeAmount is changing,
apply dozeAmount to stack height instead of expansionFraction.

Later this stack height is proportionally distributed to each
notifcation height.

Bug: 213503823
Test: NotificationStackScrollLayoutTest
Test: press power button to wakeup, notifications unfurl
Test: press power button to sleep, notifications furl up

Change-Id: Ia8bcc5763e22ac1418a515f1c69eeed05d3c2104
parent 9aaf48a2
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -565,6 +565,10 @@ public class AmbientState {
        }
    }

    public float getDozeAmount() {
        return mDozeAmount;
    }

    /**
     * Is the device fully awake, which is different from not tark at all when there are pulsing
     * notifications.
+23 −8
Original line number Diff line number Diff line
@@ -1254,8 +1254,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
     * @param listenerNeedsAnimation does the listener need to animate?
     */
    private void updateStackPosition(boolean listenerNeedsAnimation) {
        // Consider interpolating from an mExpansionStartY for use on lockscreen and AOD
        float endTopPosition = mTopPadding + mExtraTopInsetForFullShadeTransition
        final float endTopPosition = mTopPadding + mExtraTopInsetForFullShadeTransition
                + mAmbientState.getOverExpansion()
                - getCurrentOverScrollAmount(false /* top */);
        final float fraction = mAmbientState.getExpansionFraction();
@@ -1265,13 +1264,29 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
            mOnStackYChanged.accept(listenerNeedsAnimation);
        }
        if (mQsExpansionFraction <= 0) {
            final float stackEndHeight = Math.max(0f,
                    getHeight() - getEmptyBottomMargin() - mTopPadding);
            final float endHeight = updateStackEndHeight(
                    getHeight(), getEmptyBottomMargin(), mTopPadding);
            updateStackHeight(endHeight, fraction);
        }
    }

    public float updateStackEndHeight(float height, float bottomMargin, float topPadding) {
        final float stackEndHeight = Math.max(0f, height - bottomMargin - topPadding);
        mAmbientState.setStackEndHeight(stackEndHeight);
            mAmbientState.setStackHeight(
                    MathUtils.lerp(stackEndHeight * StackScrollAlgorithm.START_FRACTION,
                            stackEndHeight, fraction));
        return stackEndHeight;
    }

    public void updateStackHeight(float endHeight, float fraction) {
        // During the (AOD<=>LS) transition where dozeAmount is changing,
        // apply dozeAmount to stack height instead of expansionFraction
        // to unfurl notifications on AOD=>LS wakeup (and furl up on LS=>AOD sleep)
        final float dozeAmount = mAmbientState.getDozeAmount();
        if (0f < dozeAmount && dozeAmount < 1f) {
            fraction = 1f - dozeAmount;
        }
        mAmbientState.setStackHeight(
                MathUtils.lerp(endHeight * StackScrollAlgorithm.START_FRACTION,
                        endHeight, fraction));
    }

    /**
+43 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import static com.google.common.truth.Truth.assertWithMessage;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;

import static org.junit.Assert.assertFalse;
import static org.mockito.ArgumentMatchers.any;
@@ -44,6 +45,7 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.MathUtils;

import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.SmallTest;
@@ -164,6 +166,47 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
        doNothing().when(mNotificationShelf).setAnimationsEnabled(anyBoolean());
    }

    @Test
    public void testUpdateStackEndHeight_forEndOfStackHeightAnimation() {
        final float nsslHeight = 10f;
        final float bottomMargin = 1f;
        final float topPadding = 1f;

        mStackScroller.updateStackEndHeight(nsslHeight, bottomMargin, topPadding);
        final float stackEndHeight = nsslHeight - bottomMargin - topPadding;
        assertTrue(mAmbientState.getStackEndHeight() == stackEndHeight);
    }

    @Test
    public void testUpdateStackHeight_withDozeAmount_whenDozeChanging() {
        final float dozeAmount = 0.5f;
        mAmbientState.setDozeAmount(dozeAmount);

        final float endHeight = 8f;
        final float expansionFraction = 1f;
        float expected = MathUtils.lerp(
                endHeight * StackScrollAlgorithm.START_FRACTION,
                endHeight, dozeAmount);

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

    @Test
    public void testUpdateStackHeight_withExpansionAmount_whenDozeNotChanging() {
        final float dozeAmount = 1f;
        mAmbientState.setDozeAmount(dozeAmount);

        final float endHeight = 8f;
        final float expansionFraction = 0.5f;
        final float expected = MathUtils.lerp(
                endHeight * StackScrollAlgorithm.START_FRACTION,
                endHeight, expansionFraction);

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

    @Test
    public void testNotDimmedOnKeyguard() {
        when(mBarState.getState()).thenReturn(StatusBarState.SHADE);