package oxim.digital.rxanim;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import rx.Observable;
import rx.subjects.BehaviorSubject;
public final class RxObservableValueAnimator {
private final ValueAnimator valueAnimator;
private BehaviorSubject<Object> valueUpdateSubject;
public static RxObservableValueAnimator from(final ValueAnimator valueAnimator) {
return new RxObservableValueAnimator(valueAnimator);
}
private RxObservableValueAnimator(final ValueAnimator valueAnimator) {
this.valueAnimator = valueAnimator;
this.valueUpdateSubject = BehaviorSubject.create();
this.valueAnimator.addUpdateListener(animation -> valueUpdateSubject.onNext(animation.getAnimatedValue()));
this.valueAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(final Animator animation) {
valueUpdateSubject.onCompleted();
}
});
}
public Observable<Object> schedule() {
checkSubject();
valueAnimator.start();
return valueUpdateSubject;
}
public Observable<Object> scheduleReversed() {
checkSubject();
valueAnimator.reverse();
return valueUpdateSubject;
}
private void checkSubject() {
if (valueUpdateSubject.hasCompleted() || valueUpdateSubject.hasThrowable()) {
valueUpdateSubject = BehaviorSubject.create();
}
}
public float getAnimatedFraction() {
return valueAnimator.getAnimatedFraction();
}
public void end() {
valueAnimator.end();
valueUpdateSubject.onCompleted();
}
}