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

Commit 24ba787d authored by Tony Wickham's avatar Tony Wickham
Browse files

Handle back-to-back height reduction animations

We reduce the height of the notification item when the second to last
notification is dismissed (to remove the unused footer) and when the
last notification is removed (to remove the unused notification item).
If the former is runninng when the latter starts, the end result is
janky because we weren't properly cleaning up the first animation when
the second began. We now cancel the existing animation before starting
the second.

Bug: 36172954
Change-Id: I742c15b6f59874bc675b4c20a83e9578ac5e5387
parent f77a6f7f
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -76,6 +76,11 @@ public class NotificationItemView extends PopupItemView implements LogContainerP
        mSwipeHelper.setDisableHardwareLayers(true);
    }

    public int getHeightMinusFooter() {
        int footerHeight = mFooter.getParent() == null ? 0 : mFooter.getHeight();
        return getHeight() - footerHeight;
    }

    public Animator animateHeightRemoval(int heightToRemove) {
        final int newHeight = getHeight() - heightToRemove;
        return new PillHeightRevealOutlineProvider(mPillRect,
+19 −14
Original line number Diff line number Diff line
@@ -107,6 +107,7 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra

    protected Animator mOpenCloseAnimator;
    private boolean mDeferContainerRemoval;
    private AnimatorSet mReduceHeightAnimatorSet;

    public PopupContainerWithArrow(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
@@ -584,7 +585,7 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra
                    R.integer.config_removeNotificationViewDuration);
            final int spacing = getResources().getDimensionPixelSize(R.dimen.popup_items_spacing);
            removeNotification.play(reduceNotificationViewHeight(
                    mNotificationItemView.getHeight() + spacing, duration));
                    mNotificationItemView.getHeightMinusFooter() + spacing, duration));
            final View removeMarginView = mIsAboveIcon ? getItemViewAt(getItemCount() - 2)
                    : mNotificationItemView;
            if (removeMarginView != null) {
@@ -642,9 +643,12 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra
     * Animates the height of the notification item and the translationY of other items accordingly.
     */
    public Animator reduceNotificationViewHeight(int heightToRemove, int duration) {
        if (mReduceHeightAnimatorSet != null) {
            mReduceHeightAnimatorSet.cancel();
        }
        final int translateYBy = mIsAboveIcon ? heightToRemove : -heightToRemove;
        AnimatorSet animatorSet = LauncherAnimUtils.createAnimatorSet();
        animatorSet.play(mNotificationItemView.animateHeightRemoval(heightToRemove));
        mReduceHeightAnimatorSet = LauncherAnimUtils.createAnimatorSet();
        mReduceHeightAnimatorSet.play(mNotificationItemView.animateHeightRemoval(heightToRemove));
        PropertyResetListener<View, Float> resetTranslationYListener
                = new PropertyResetListener<>(TRANSLATION_Y, 0f);
        for (int i = 0; i < getItemCount(); i++) {
@@ -656,20 +660,21 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra
            ValueAnimator translateItem = ObjectAnimator.ofFloat(itemView, TRANSLATION_Y,
                    itemView.getTranslationY() + translateYBy).setDuration(duration);
            translateItem.addListener(resetTranslationYListener);
            animatorSet.play(translateItem);
            mReduceHeightAnimatorSet.play(translateItem);
        }
        mReduceHeightAnimatorSet.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                if (mIsAboveIcon) {
                    // All the items, including the notification item, translated down, but the
                    // container itself did not. This means the items would jump back to their
                    // original translation unless we update the container's translationY here.
            animatorSet.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    setTranslationY(getTranslationY() + translateYBy);
                }
            });
                mReduceHeightAnimatorSet = null;
            }
        return animatorSet;
        });
        return mReduceHeightAnimatorSet;
    }

    @Override