blob: 211da7fad018984848f0d8cbaf712cff55bba64d [file] [log] [blame]
package com.airbnb.lottie;
import android.support.annotation.Nullable;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.Collections;
import java.util.List;
class AnimatableValueParser<T> {
@Nullable private final JSONObject json;
private final float scale;
private final LottieComposition composition;
private final AnimatableValue.Factory<T> valueFactory;
private AnimatableValueParser(@Nullable JSONObject json, float scale, LottieComposition
composition, AnimatableValue.Factory<T> valueFactory) {
this.json = json;
this.scale = scale;
this.composition = composition;
this.valueFactory = valueFactory;
}
static <T> AnimatableValueParser<T> newInstance(@Nullable JSONObject json, float scale,
LottieComposition composition, AnimatableValue.Factory<T> valueFactory) {
return new AnimatableValueParser<>(json, scale, composition, valueFactory);
}
Result<T> parseJson() {
List<Keyframe<T>> keyframes = parseKeyframes();
T initialValue = parseInitialValue(keyframes);
return new Result<>(keyframes, initialValue);
}
private List<Keyframe<T>> parseKeyframes() {
if (json != null) {
Object k = json.opt("k");
if (hasKeyframes(k)) {
return Keyframe.Factory.parseKeyframes((JSONArray) k, composition, scale, valueFactory);
} else {
return Collections.emptyList();
}
} else {
return Collections.emptyList();
}
}
@Nullable private T parseInitialValue(List<Keyframe<T>> keyframes) {
if (json != null) {
if (!keyframes.isEmpty()) {
return keyframes.get(0).startValue;
} else {
return valueFactory.valueFromObject(json.opt("k"), scale);
}
} else {
return null;
}
}
private static boolean hasKeyframes(Object json) {
if (!(json instanceof JSONArray)) {
return false;
} else {
Object firstObject = ((JSONArray) json).opt(0);
return firstObject instanceof JSONObject && ((JSONObject) firstObject).has("t");
}
}
static class Result<T> {
final List<Keyframe<T>> keyframes;
final @Nullable T initialValue;
Result(List<Keyframe<T>> keyframes, @Nullable T initialValue) {
this.keyframes = keyframes;
this.initialValue = initialValue;
}
}
}