xref: /aosp_15_r20/external/lottie/lottie/src/main/java/com/airbnb/lottie/parser/ContentModelParser.java (revision bb5273fecd5c61b9ace70f9ff4fcd88f0e12e3f7)
1 package com.airbnb.lottie.parser;
2 
3 import androidx.annotation.Nullable;
4 
5 import com.airbnb.lottie.LottieComposition;
6 import com.airbnb.lottie.model.content.ContentModel;
7 import com.airbnb.lottie.parser.moshi.JsonReader;
8 import com.airbnb.lottie.utils.Logger;
9 
10 import java.io.IOException;
11 
12 class ContentModelParser {
13 
14   private static final JsonReader.Options NAMES = JsonReader.Options.of(
15       "ty",
16       "d"
17   );
18 
ContentModelParser()19   private ContentModelParser() {
20   }
21 
22   @Nullable
parse(JsonReader reader, LottieComposition composition)23   static ContentModel parse(JsonReader reader, LottieComposition composition)
24       throws IOException {
25     String type = null;
26 
27     reader.beginObject();
28     // Unfortunately, for an ellipse, d is before "ty" which means that it will get parsed
29     // before we are in the ellipse parser.
30     // "d" is 2 for normal and 3 for reversed.
31     int d = 2;
32     typeLoop:
33     while (reader.hasNext()) {
34       switch (reader.selectName(NAMES)) {
35         case 0:
36           type = reader.nextString();
37           break typeLoop;
38         case 1:
39           d = reader.nextInt();
40           break;
41         default:
42           reader.skipName();
43           reader.skipValue();
44       }
45     }
46 
47     if (type == null) {
48       return null;
49     }
50 
51     ContentModel model = null;
52     switch (type) {
53       case "gr":
54         model = ShapeGroupParser.parse(reader, composition);
55         break;
56       case "st":
57         model = ShapeStrokeParser.parse(reader, composition);
58         break;
59       case "gs":
60         model = GradientStrokeParser.parse(reader, composition);
61         break;
62       case "fl":
63         model = ShapeFillParser.parse(reader, composition);
64         break;
65       case "gf":
66         model = GradientFillParser.parse(reader, composition);
67         break;
68       case "tr":
69         model = AnimatableTransformParser.parse(reader, composition);
70         break;
71       case "sh":
72         model = ShapePathParser.parse(reader, composition);
73         break;
74       case "el":
75         model = CircleShapeParser.parse(reader, composition, d);
76         break;
77       case "rc":
78         model = RectangleShapeParser.parse(reader, composition);
79         break;
80       case "tm":
81         model = ShapeTrimPathParser.parse(reader, composition);
82         break;
83       case "sr":
84         model = PolystarShapeParser.parse(reader, composition, d);
85         break;
86       case "mm":
87         model = MergePathsParser.parse(reader);
88         composition.addWarning("Animation contains merge paths. Merge paths are only " +
89             "supported on KitKat+ and must be manually enabled by calling " +
90             "enableMergePathsForKitKatAndAbove().");
91         break;
92       case "rp":
93         model = RepeaterParser.parse(reader, composition);
94         break;
95       case "rd":
96         model = RoundedCornersParser.parse(reader, composition);
97         break;
98       default:
99         Logger.warning("Unknown shape type " + type);
100     }
101 
102     while (reader.hasNext()) {
103       reader.skipValue();
104     }
105     reader.endObject();
106 
107     return model;
108   }
109 }
110