blob: 7701962242b620f3b6dc9be6ff1b157054b27b49 [file] [log] [blame]
package com.airbnb.lottie.model.content;
import android.support.annotation.Nullable;
import android.util.JsonReader;
import android.util.Log;
import com.airbnb.lottie.L;
import com.airbnb.lottie.LottieComposition;
import com.airbnb.lottie.LottieDrawable;
import com.airbnb.lottie.animation.content.Content;
import com.airbnb.lottie.animation.content.ContentGroup;
import com.airbnb.lottie.model.animatable.AnimatableTransform;
import com.airbnb.lottie.model.layer.BaseLayer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ShapeGroup implements ContentModel {
@Nullable
public static ContentModel shapeItemWithJson(JsonReader reader, LottieComposition composition)
throws IOException {
String type = null;
reader.beginObject();
while (reader.hasNext()) {
if (reader.nextName().equals("ty")) {
type = reader.nextString();
break;
} else {
reader.skipValue();
}
}
ContentModel model = null;
//noinspection ConstantConditions
switch (type) {
case "gr":
model = ShapeGroup.Factory.newInstance(reader, composition);
break;
case "st":
model = ShapeStroke.Factory.newInstance(reader, composition);
break;
case "gs":
model = GradientStroke.Factory.newInstance(reader, composition);
break;
case "fl":
model = ShapeFill.Factory.newInstance(reader, composition);
break;
case "gf":
model = GradientFill.Factory.newInstance(reader, composition);
break;
case "tr":
model = AnimatableTransform.Factory.newInstance(reader, composition);
break;
case "sh":
model = ShapePath.Factory.newInstance(reader, composition);
break;
case "el":
model = CircleShape.Factory.newInstance(reader, composition);
break;
case "rc":
model = RectangleShape.Factory.newInstance(reader, composition);
break;
case "tm":
model = ShapeTrimPath.Factory.newInstance(reader, composition);
break;
case "sr":
model = PolystarShape.Factory.newInstance(reader, composition);
break;
case "mm":
model = MergePaths.Factory.newInstance(reader);
break;
case "rp":
model = Repeater.Factory.newInstance(reader, composition);
break;
default:
Log.w(L.TAG, "Unknown shape type " + type);
}
while (reader.hasNext()) {
reader.skipValue();
}
reader.endObject();
return model;
}
private final String name;
private final List<ContentModel> items;
public ShapeGroup(String name, List<ContentModel> items) {
this.name = name;
this.items = items;
}
static class Factory {
private Factory() {
}
private static ShapeGroup newInstance(
JsonReader reader, LottieComposition composition) throws IOException {
String name = null;
List<ContentModel> items = new ArrayList<>();
while (reader.hasNext()) {
switch (reader.nextName()) {
case "nm":
name = reader.nextString();
break;
case "it":
reader.beginArray();
while (reader.hasNext()) {
ContentModel newItem = shapeItemWithJson(reader, composition);
if (newItem != null) {
items.add(newItem);
}
}
reader.endArray();
break;
default:
reader.skipValue();
}
}
return new ShapeGroup(name, items);
}
}
public String getName() {
return name;
}
public List<ContentModel> getItems() {
return items;
}
@Override public Content toContent(LottieDrawable drawable, BaseLayer layer) {
return new ContentGroup(drawable, layer, this);
}
@Override public String toString() {
return "ShapeGroup{" + "name='" + name + "\' Shapes: " + Arrays.toString(items.toArray()) + '}';
}
}