package oxim.digital.rxanim;
import android.support.v4.view.ViewPropertyAnimatorCompat;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.Interpolator;
import java.lang.ref.WeakReference;
import java.util.LinkedList;
import java.util.List;
import rx.Completable;
import rx.functions.Action1;
public final class RxAnimationBuilder {
private static final float OPAQUE = 1f;
private static final float TRANSPARENT = 0f;
private static final int DEFAULT_DURATION = 300;
private static final int DEFAULT_DELAY = 0;
public static RxAnimationBuilder animate(final View view) {
return new RxAnimationBuilder(view, DEFAULT_DURATION, DEFAULT_DELAY, defaultInterpolator());
}
public static RxAnimationBuilder animate(final View view, final int duration) {
return new RxAnimationBuilder(view, duration, DEFAULT_DELAY, new AccelerateDecelerateInterpolator());
}
public static RxAnimationBuilder animate(final int delay, final View view) {
return new RxAnimationBuilder(view, DEFAULT_DURATION, delay, new AccelerateDecelerateInterpolator());
}
public static RxAnimationBuilder animate(final View view, final int duration, final int delay) {
return new RxAnimationBuilder(view, duration, delay, new AccelerateDecelerateInterpolator());
}
public static RxAnimationBuilder animate(final View view, final Interpolator interpolator) {
return new RxAnimationBuilder(view, DEFAULT_DURATION, DEFAULT_DELAY, interpolator);
}
public static RxAnimationBuilder animate(final View view, final int duration, final int delay, final Interpolator interpolator) {
return new RxAnimationBuilder(view, duration, delay, interpolator);
}
private RxAnimationBuilder(final View view, final int duration, final int delay, final Interpolator interpolator) {
this.viewWeakRef = new WeakReference<>(view);
this.preTransformActions = new LinkedList<>();
this.animateActions = new LinkedList<>();
this.animateActions.add(animate -> animate.setDuration(duration).setStartDelay(delay).setInterpolator(interpolator));
}
private final List<Action1<ViewPropertyAnimatorCompat>> preTransformActions;
private final List<Action1<ViewPropertyAnimatorCompat>> animateActions;
private Action1<View> onAnimationCancelAction = view -> {};
final WeakReference<View> viewWeakRef;
public RxAnimationBuilder duration(final int duration) {
animateActions.add(animate -> animate.setDuration(duration));
return this;
}
public RxAnimationBuilder delay(final int delay) {
animateActions.add(animate -> animate.setStartDelay(delay));
return this;
}
public RxAnimationBuilder interpolator(final Interpolator interpolator) {
animateActions.add(animate -> animate.setInterpolator(interpolator));
return this;
}
public RxAnimationBuilder fadeIn() {
preTransformActions.add(preTransform -> preTransform.alpha(0f));
animateActions.add(animate -> animate.alpha(OPAQUE));
return this;
}
public RxAnimationBuilder fadeOut() {
animateActions.add(animate -> animate.alpha(TRANSPARENT));
return this;
}
public RxAnimationBuilder rotate(final float rotation) {
animateActions.add(animate -> animate.rotation(rotation));
return this;
}
public RxAnimationBuilder rotateBy(final float rotation) {
animateActions.add(animate -> animate.rotationBy(rotation));
return this;
}
public RxAnimationBuilder counterRotateBy(final float rotation) {
preTransformActions.add(preTransform -> preTransform.rotationBy(-rotation));
animateActions.add(animate -> animate.rotationBy(rotation));
return this;
}
public RxAnimationBuilder translateX(final int dX) {
preTransformActions.add(preTransform -> preTransform.xBy(-dX));
animateActions.add(animate -> animate.xBy(dX));
return this;
}
public RxAnimationBuilder translateY(final int dY) {
preTransformActions.add(preTransform -> preTransform.yBy(-dY));
animateActions.add(animate -> animate.yBy(dY));
return this;
}
public RxAnimationBuilder elevationBy(final int dZ) {
preTransformActions.add(preTransform -> preTransform.zBy(-dZ));
animateActions.add(animate -> animate.zBy(dZ));
return this;
}
public RxAnimationBuilder translateBy(final int dX, final int dY) {
preTransformActions.add(preTransform -> preTransform.xBy(-dX).yBy(-dY));
animateActions.add(animate -> animate.xBy(dX).yBy(dY));
return this;
}
public RxAnimationBuilder translateBy(final int dX, final int dY, final int dZ) {
preTransformActions.add(preTransform -> preTransform.xBy(-dX).yBy(-dY).zBy(-dZ));
animateActions.add(animate -> animate.xBy(dX).yBy(dY).zBy(dZ));
return this;
}
public RxAnimationBuilder scaleX(final float dX) {
animateActions.add(animate -> animate.scaleXBy(dX));
return this;
}
public RxAnimationBuilder scaleY(final float dY) {
animateActions.add(animate -> animate.scaleYBy(dY));
return this;
}
public RxAnimationBuilder scale(final float dX, final float dY) {
animateActions.add(animate -> animate.scaleXBy(dX).scaleYBy(dY));
return this;
}
public RxAnimationBuilder onAnimationCancel(final Action1<View> onAnimationCancelAction) {
this.onAnimationCancelAction = onAnimationCancelAction;
return this;
}
public Completable schedule() {
return Completable.create(new AnimateOnSubscribe(viewWeakRef, preTransformActions, animateActions, onAnimationCancelAction));
}
public Completable schedule(final boolean preTransform) {
return Completable.create(new AnimateOnSubscribe(viewWeakRef,
preTransform ? preTransformActions : null,
animateActions,
onAnimationCancelAction));
}
private static Interpolator defaultInterpolator() {
return new AccelerateDecelerateInterpolator();
}
}