From: Tony Wickham Date: Tue, 18 Apr 2017 18:05:37 +0000 (-0700) Subject: Handle back-to-back height reduction animations X-Git-Url: http://git.osdn.net/view?p=android-x86%2Fpackages-apps-Launcher3.git;a=commitdiff_plain;h=24ba787ded0391d37327b972ca850b2710124a71 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 --- diff --git a/src/com/android/launcher3/notification/NotificationItemView.java b/src/com/android/launcher3/notification/NotificationItemView.java index 5e8e2c768..e5bf35a1e 100644 --- a/src/com/android/launcher3/notification/NotificationItemView.java +++ b/src/com/android/launcher3/notification/NotificationItemView.java @@ -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, diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index dc7fa05f7..fb7f80ceb 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -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 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); } - 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) { + 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. setTranslationY(getTranslationY() + translateYBy); } - }); - } - return animatorSet; + mReduceHeightAnimatorSet = null; + } + }); + return mReduceHeightAnimatorSet; } @Override