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
This commit is contained in:
Lyn
2022-01-25 12:35:34 -06:00
parent 9aaf48a2c4
commit eab25b8967
3 changed files with 70 additions and 8 deletions

View File

@@ -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.

View File

@@ -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.

View File

@@ -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);