From 2e2664fa50afe9459e24636157a7f6913eed65dc Mon Sep 17 00:00:00 2001 From: Tetsutoki Shiozawa Date: Mon, 27 Jan 2020 15:37:10 +0900 Subject: [PATCH] [ProgressBar] Fix: Media volume bar indicates a wrong value Symptom: Media volume bar shows non-zero value even during the mute state. Root cause: A request for updating progress of ProgressBar has 2 kind of updating ways, animated and non-animated. If a non-animated request is invoked before completing an animated request, the visual progress can be overwritten by the old animated request. As a result, the visual progress value becomes different from the actual value. Solution: A running animation on the primary progress should be canceled before handling a new non-animated request. Bug: 148759348 Test: atest CtsWidgetTestCases:ProgressBarTest Change-Id: I569dbea4c6346ecfff8141d8378b4952fb1fa530 Merged-In: I569dbea4c6346ecfff8141d8378b4952fb1fa530 --- core/java/android/widget/ProgressBar.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java index 9cbb03508d676..f44f24a4d4923 100644 --- a/core/java/android/widget/ProgressBar.java +++ b/core/java/android/widget/ProgressBar.java @@ -16,6 +16,8 @@ package android.widget; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.annotation.InterpolatorRes; import android.annotation.NonNull; @@ -246,6 +248,8 @@ public class ProgressBar extends View { private AccessibilityEventSender mAccessibilityEventSender; + private ObjectAnimator mLastProgressAnimator; + /** * Create a new progress bar with range 0...100 and initial progress of 0. * @param context the application environment @@ -1544,8 +1548,19 @@ public class ProgressBar extends View { animator.setAutoCancel(true); animator.setDuration(PROGRESS_ANIM_DURATION); animator.setInterpolator(PROGRESS_ANIM_INTERPOLATOR); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mLastProgressAnimator = null; + } + }); animator.start(); + mLastProgressAnimator = animator; } else { + if (isPrimary && mLastProgressAnimator != null) { + mLastProgressAnimator.cancel(); + mLastProgressAnimator = null; + } setVisualProgress(id, scale); }