package com.bumptech.glide.request.transition;

import android.view.View;

/**
 * A {@link Transition} that accepts an interface that can apply an animation like a {@link
 * android.view.ViewPropertyAnimator} or a {@link android.animation.ObjectAnimator} that can be used
 * to transition a resource into a {@link View}.
 *
 * @param <R> The type of the resource that will be transitioned into a view.
 */
public class ViewPropertyTransition<R> implements Transition<R> {

  private final Animator animator;

  /**
   * Constructor for a view property animation that takes an {@link ViewPropertyTransition.Animator}
   * interface that can apply a transition to a view.
   *
   * @param animator The animator to use.
   */
  public ViewPropertyTransition(Animator animator) {
    this.animator = animator;
  }

  /**
   * Always applies the {@link ViewPropertyTransition.Animator} given in the constructor to the
   * given view and returns {@code false} because the animator cannot put the new resource on the
   * view.
   *
   * @param current {@inheritDoc}
   * @param adapter {@inheritDoc}
   * @return {@inheritDoc}
   */
  @Override
  public boolean transition(R current, ViewAdapter adapter) {
    final View view = adapter.getView();
    if (view != null) {
      animator.animate(adapter.getView());
    }
    return false;
  }

  /**
   * An interface that allows an animation to be applied on or started from an {@link
   * android.view.View}.
   */
  public interface Animator {
    /**
     * Starts an animation on the given {@link android.view.View}.
     *
     * @param view The view to transition.
     */
    void animate(View view);
  }

}
