@MainThread
  public void playAnimation() {
    if (compositionLayer == null) {
      lazyCompositionTasks.add(c -> playAnimation());
      return;
    }

    computeRenderMode();
    if (animationsEnabled(getContext()) || getRepeatCount() == 0) {
      if (isVisible()) {
        animator.playAnimation();
        onVisibleAction = OnVisibleAction.NONE;
      } else {
        onVisibleAction = OnVisibleAction.PLAY;
      }
    }
    if (!animationsEnabled(getContext())) {
      Marker markerForAnimationsDisabled = getMarkerForAnimationsDisabled();
      if (markerForAnimationsDisabled != null) {
        setFrame((int) markerForAnimationsDisabled.startFrame);
      } else {
        setFrame((int) (getSpeed() < 0 ? getMinFrame() : getMaxFrame()));
      }
      animator.endAnimation();
      if (!isVisible()) {
        onVisibleAction = OnVisibleAction.NONE;
      }
    }
  }
Plays the animation from the beginning. If speed is {@literal <} 0, it will start at the end
and play towards the beginning
lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java