package com.ftinc.scoop.binding;
import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
import android.graphics.Color;
import android.os.Build;
import android.support.annotation.ColorInt;
import android.view.animation.Interpolator;
import com.ftinc.scoop.Topping;
/**
* Project: ThemeEngineTest
* Package: com.ftinc.scoop.model
* Created by drew.heavner on 6/21/16.
*/
public abstract class AnimatedBinding extends IBinding {
private ValueAnimator mAnimator;
private Interpolator mInterpolator;
private long duration;
public AnimatedBinding(int toppingId, Interpolator interpolator) {
this(toppingId, interpolator, DEFAULT_ANIMATION_DURATION);
}
public AnimatedBinding(int toppingId, Interpolator mInterpolator, long duration) {
super(toppingId);
this.mInterpolator = mInterpolator;
this.duration = duration;
}
public void update(Topping topping, boolean animate){
int fromColor = topping.getPreviousColor() != 0 ?
topping.getPreviousColor() : getCurrentColor() != 0 ?
getCurrentColor() : Color.WHITE;
int toColor = topping.getColor();
if (fromColor != toColor && animate) {
if (mAnimator != null) {
mAnimator.cancel();
mAnimator = null;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mAnimator = ValueAnimator.ofArgb(fromColor, toColor)
.setDuration(duration);
} else {
mAnimator = ValueAnimator.ofInt(fromColor, toColor)
.setDuration(duration);
mAnimator.setEvaluator(new ArgbEvaluator());
}
if (mInterpolator != null) mAnimator.setInterpolator(mInterpolator);
mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int colorValue = (int) valueAnimator.getAnimatedValue();
applyColor(colorValue);
}
});
mAnimator.start();
} else {
applyColor(toColor);
}
}
@Override
public void update(Topping topping) {
update(topping, true);
}
@Override
public void unbind() {
mInterpolator = null;
if(mAnimator != null){
mAnimator.cancel();
mAnimator = null;
}
}
@ColorInt
abstract int getCurrentColor();
abstract void applyColor(@ColorInt int color);
}