diff options
2 files changed, 29 insertions, 14 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java index b38d619a4434..fb14a9121861 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java @@ -460,15 +460,8 @@ public class StackStateAnimator { mHeadsUpAppearChildren.add(changingView); mTmpState.copyFrom(changingView.getViewState()); - if (event.headsUpFromBottom) { - // start from the bottom of the screen - mTmpState.setYTranslation( - mHeadsUpAppearHeightBottom + mHeadsUpAppearStartAboveScreen); - } else { - // start from the top of the screen - mTmpState.setYTranslation( - -mStackTopMargin - mHeadsUpAppearStartAboveScreen); - } + // translate the HUN in from the top, or the bottom of the screen + mTmpState.setYTranslation(getHeadsUpYTranslationStart(event.headsUpFromBottom)); // set the height and the initial position mTmpState.applyToView(changingView); mAnimationProperties.setCustomInterpolator(View.TRANSLATION_Y, @@ -512,12 +505,20 @@ public class StackStateAnimator { || event.animationType == ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK) { mHeadsUpDisappearChildren.add(changingView); Runnable endRunnable = null; + mTmpState.copyFrom(changingView.getViewState()); if (changingView.getParent() == null) { // This notification was actually removed, so we need to add it // transiently mHostLayout.addTransientView(changingView, 0); changingView.setTransientContainer(mHostLayout); - mTmpState.initFrom(changingView); + if (NotificationsImprovedHunAnimation.isEnabled()) { + // StackScrollAlgorithm cannot find this view because it has been removed + // from the NSSL. To correctly translate the view to the top or bottom of + // the screen (where it animated from), we need to update its translation. + mTmpState.setYTranslation( + getHeadsUpYTranslationStart(event.headsUpFromBottom) + ); + } endRunnable = changingView::removeFromTransientContainer; } @@ -565,16 +566,19 @@ public class StackStateAnimator { changingView.setInRemovalAnimation(true); }; } - if (NotificationsImprovedHunAnimation.isEnabled()) { - mAnimationProperties.setCustomInterpolator(View.TRANSLATION_Y, - Interpolators.FAST_OUT_SLOW_IN_REVERSE); - } long removeAnimationDelay = changingView.performRemoveAnimation( ANIMATION_DURATION_HEADS_UP_DISAPPEAR, 0, 0.0f, true /* isHeadsUpAppear */, startAnimation, postAnimation, getGlobalAnimationFinishedListener()); mAnimationProperties.delay += removeAnimationDelay; + if (NotificationsImprovedHunAnimation.isEnabled()) { + mAnimationProperties.duration = ANIMATION_DURATION_HEADS_UP_DISAPPEAR; + mAnimationProperties.setCustomInterpolator(View.TRANSLATION_Y, + Interpolators.FAST_OUT_SLOW_IN_REVERSE); + mAnimationProperties.getAnimationFilter().animateY = true; + mTmpState.animateTo(changingView, mAnimationProperties); + } } else if (endRunnable != null) { endRunnable.run(); } @@ -585,6 +589,15 @@ public class StackStateAnimator { return needsCustomAnimation; } + private float getHeadsUpYTranslationStart(boolean headsUpFromBottom) { + if (headsUpFromBottom) { + // start from the bottom of the screen + return mHeadsUpAppearHeightBottom + mHeadsUpAppearStartAboveScreen; + } + // start from the top of the screen + return -mStackTopMargin - mHeadsUpAppearStartAboveScreen; + } + public void animateOverScrollToAmount(float targetAmount, final boolean onTop, final boolean isRubberbanded) { final float startOverScrollAmount = mHostLayout.getCurrentOverScrollAmount(onTop); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackStateAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackStateAnimatorTest.kt index 5a5703512a39..3d90cd2185cf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackStateAnimatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackStateAnimatorTest.kt @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.notification.stack import android.platform.test.annotations.EnableFlags import android.testing.AndroidTestingRunner +import android.testing.TestableLooper.RunWithLooper import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.statusbar.notification.row.ExpandableView @@ -41,6 +42,7 @@ private const val VIEW_HEIGHT = 100 @SmallTest @RunWith(AndroidTestingRunner::class) +@RunWithLooper class StackStateAnimatorTest : SysuiTestCase() { private lateinit var stackStateAnimator: StackStateAnimator |