Merge "Added a workaround for ValueAnimator issue" into oc-support-26.0-dev
diff --git a/core-ui/java/android/support/v4/widget/CircularProgressDrawable.java b/core-ui/java/android/support/v4/widget/CircularProgressDrawable.java
index d4fdc5a..ac29541 100644
--- a/core-ui/java/android/support/v4/widget/CircularProgressDrawable.java
+++ b/core-ui/java/android/support/v4/widget/CircularProgressDrawable.java
@@ -523,10 +523,12 @@
     /**
      * Update the ring start and end trim according to current time of the animation.
      */
-    private void applyTransformation(float interpolatedTime, Ring ring) {
+    private void applyTransformation(float interpolatedTime, Ring ring, boolean lastFrame) {
         if (mFinishing) {
             applyFinishTranslation(interpolatedTime, ring);
-        } else {
+            // Below condition is to work around a ValueAnimator issue where onAnimationRepeat is
+            // called before last frame (1f).
+        } else if (interpolatedTime != 1f || lastFrame) {
             final float startingRotation = ring.getStartingRotation();
             float startTrim, endTrim;
 
@@ -561,7 +563,7 @@
             public void onAnimationUpdate(ValueAnimator animation) {
                 float interpolatedTime = (float) animation.getAnimatedValue();
                 updateRingColor(interpolatedTime, ring);
-                applyTransformation(interpolatedTime, ring);
+                applyTransformation(interpolatedTime, ring, false);
                 invalidateSelf();
             }
         });
@@ -587,7 +589,7 @@
 
             @Override
             public void onAnimationRepeat(Animator animator) {
-                applyTransformation(1f, ring); // Set ring to last frame
+                applyTransformation(1f, ring, true);
                 ring.storeOriginals();
                 ring.goToNextColor();
                 if (mFinishing) {