From eab25b89671b58715163d33f4b9ff624a9ea8256 Mon Sep 17 00:00:00 2001 From: Lyn Date: Tue, 25 Jan 2022 12:35:34 -0600 Subject: [PATCH] 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 --- .../notification/stack/AmbientState.java | 4 ++ .../stack/NotificationStackScrollLayout.java | 31 +++++++++---- .../NotificationStackScrollLayoutTest.java | 43 +++++++++++++++++++ 3 files changed, 70 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index 7dc2e19492740..ce3e27c55f3e6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -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. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 428334369e21e..ac31a3d8a392d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -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,15 +1264,31 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable mOnStackYChanged.accept(listenerNeedsAnimation); } if (mQsExpansionFraction <= 0) { - final float stackEndHeight = Math.max(0f, - getHeight() - getEmptyBottomMargin() - mTopPadding); - mAmbientState.setStackEndHeight(stackEndHeight); - mAmbientState.setStackHeight( - MathUtils.lerp(stackEndHeight * StackScrollAlgorithm.START_FRACTION, - stackEndHeight, fraction)); + 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); + 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)); + } + /** * Add a listener when the StackY changes. The argument signifies whether an animation is * needed. diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index 46ba097951438..bdcbbbc99ea34 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -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);