From 7d42430dc29487fa6de7d0748658ad3427f70900 Mon Sep 17 00:00:00 2001 From: Aaron Liu Date: Tue, 19 Apr 2022 15:21:15 +0000 Subject: [PATCH] [Bouncer] Reset y translation and alpha When doing the appear animation, sometimes, the animation will not complete. I am unable to repro reliably, but I have experienced the behavior more than 3 times, and QA has seen it too. I'm thinking that this code change will fix the issue, but it's not guaranteed. Bug: 228886154 Test: Manual Change-Id: Ie6b138468e3f8ef3e27bc2e3249c0de13709ed57 --- .../animation/AppearAnimationUtils.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/animation/AppearAnimationUtils.java b/packages/SettingsLib/src/com/android/settingslib/animation/AppearAnimationUtils.java index 43ec1e23daad6..d19469575296a 100644 --- a/packages/SettingsLib/src/com/android/settingslib/animation/AppearAnimationUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/animation/AppearAnimationUtils.java @@ -181,10 +181,12 @@ public class AppearAnimationUtils implements AppearAnimationCreator { public void createAnimation(final View view, long delay, long duration, float translationY, boolean appearing, Interpolator interpolator, final Runnable endRunnable) { if (view != null) { - view.setAlpha(appearing ? 0f : 1.0f); - view.setTranslationY(appearing ? translationY : 0); + float targetAlpha = appearing ? 1f : 0f; + float targetTranslationY = appearing ? 0 : translationY; + view.setAlpha(1.0f - targetAlpha); + view.setTranslationY(translationY - targetTranslationY); Animator alphaAnim; - float targetAlpha = appearing ? 1f : 0f; + if (view.isHardwareAccelerated()) { RenderNodeAnimator alphaAnimRt = new RenderNodeAnimator(RenderNodeAnimator.ALPHA, targetAlpha); @@ -205,14 +207,21 @@ public class AppearAnimationUtils implements AppearAnimationCreator { } }); } - if (endRunnable != null) { - alphaAnim.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { + alphaAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationCancel(Animator animation) { + // If Animation is canceled, we want to ensure UI is reset. + view.setAlpha(targetAlpha); + view.setTranslationY(targetTranslationY); + } + + @Override + public void onAnimationEnd(Animator animation) { + if (endRunnable != null) { endRunnable.run(); } - }); - } + } + }); alphaAnim.start(); startTranslationYAnimation(view, delay, duration, appearing ? 0 : translationY, interpolator);