From 18a6c10e71a2fc9d35ddf257f834db595cd21593 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 Merged-In: I569dbea4c6346ecfff8141d8378b4952fb1fa530 Change-Id: I569dbea4c6346ecfff8141d8378b4952fb1fa530 (cherry picked from commit 589552766cfcee56fcb4c31803f0b54126b30f02) --- 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 970d70cf1fb4c..4b32e10d083b6 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; @@ -245,6 +247,8 @@ public class ProgressBar extends View { private final ArrayList mRefreshData = new ArrayList(); + private ObjectAnimator mLastProgressAnimator; + /** * Create a new progress bar with range 0...100 and initial progress of 0. * @param context the application environment @@ -1546,8 +1550,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); }