package com.blundell.quicksand;
import android.os.CountDownTimer;
import com.blundell.quicksand.act.Act;
import java.util.HashMap;
import java.util.Map;
class AnimationTracker {
private final Map<String, CountDownTimer> monitoredAnimations = new HashMap<>();
private final AnimationCounter animationCounter;
private final CountDownTimerFactory timerFactory;
AnimationTracker(AnimationCounter animationCounter, CountDownTimerFactory timerFactory) {
this.animationCounter = animationCounter;
this.timerFactory = timerFactory;
}
/**
* <p/>
* We define a set of animations by:
* all having the same key
* starting in a chain like fashion i.e. start before the previous ends
* <p/>
* Once the first animation duration has finished any new animation with the same key is defined as a new start
*
* @param key the key that binds the set of animations
* @param duration how long this animation (key) will run for
* @return true if this is the first animation in a set of animations
*/
public boolean isTheStartOfANewAnimationSet(final String key, long duration) {
CountDownTimer latestAnimationCountdown = timerFactory.getTimer(
duration, new Runnable() {
@Override
public void run() {
monitoredAnimations.remove(key);
}
});
latestAnimationCountdown.start();
CountDownTimer parallelAnimationCountdown = monitoredAnimations.get(key);
boolean isANewAnimationSet;
if (parallelAnimationCountdown == null) {
isANewAnimationSet = true;
} else {
parallelAnimationCountdown.cancel();
isANewAnimationSet = false;
}
monitoredAnimations.put(key, latestAnimationCountdown);
return isANewAnimationSet;
}
public void incrementAnimationViewCount(String key) {
animationCounter.incrementCount(key);
}
public long getCount(String key) {
return animationCounter.getCount(key);
}
public void reset(String key) {
animationCounter.reset(key);
}
public void saveDuration(String key, long duration) {
animationCounter.saveDuration(key, duration);
}
public long getCurrentDuration(String key, Act act) {
long storedDuration = animationCounter.getDuration(key);
return storedDuration == 0 ? act.getDuration() : storedDuration;
}
}