code: private void startProgressUpdateAnimation() {
          clearAnimation();
  
          progressAnimator = ValueAnimator.ofFloat(drawnProgress, userProgress);
          progressAnimator.setDuration(UPDATE_ANIM_MS);
          progressAnimator.setRepeatCount(0);
          progressAnimator.setRepeatMode(ValueAnimator.RESTART);
          progressAnimator.setInterpolator(new DecelerateInterpolator());
  
          progressAnimator.addUpdateListener(this);
  
          // start striped animation after progress update if needed
          progressAnimator.addListener(this);
          progressAnimator.start();
      }
docs: Starts an animation which moves the progress bar from one value to another, in response to
  a call to setProgress(). Animation update callbacks allow the interpolator value to be used
  to calculate the current progress value, which is stored in a temporary variable. The view is
  then invalidated.
  <p/>
  If this method is called when a progress update animation is already running, the previous
  animation will be cancelled, and the currently drawn progress recorded. A new animation will
  then be started from the last drawn point.