content: package com.airbnb.lottie;
  
  import android.graphics.Paint;
  import android.support.annotation.Nullable;
  
  import org.json.JSONArray;
  import org.json.JSONObject;
  
  import java.util.ArrayList;
  import java.util.List;
  
  class ShapeStroke {
    enum LineCapType {
      Butt,
      Round,
      Unknown;
  
      Paint.Cap toPaintCap() {
        switch (this) {
          case Butt:
            return Paint.Cap.BUTT;
          case Round:
            return Paint.Cap.ROUND;
          case Unknown:
          default:
            return Paint.Cap.SQUARE;
        }
      }
    }
  
    enum LineJoinType {
      Miter,
      Round,
      Bevel;
  
      Paint.Join toPaintJoin() {
        switch (this) {
          case Bevel:
            return Paint.Join.BEVEL;
          case Miter:
            return Paint.Join.MITER;
          case Round:
            return Paint.Join.ROUND;
        }
        return null;
      }
    }
  
    @Nullable private final AnimatableFloatValue offset;
    private final List<AnimatableFloatValue> lineDashPattern;
    private final AnimatableColorValue color;
    private final AnimatableIntegerValue opacity;
    private final AnimatableFloatValue width;
    private final LineCapType capType;
    private final LineJoinType joinType;
  
    private ShapeStroke(@Nullable AnimatableFloatValue offset,
        List<AnimatableFloatValue> lineDashPattern, AnimatableColorValue color,
        AnimatableIntegerValue opacity, AnimatableFloatValue width, LineCapType capType,
        LineJoinType joinType) {
      this.offset = offset;
      this.lineDashPattern = lineDashPattern;
      this.color = color;
      this.opacity = opacity;
      this.width = width;
      this.capType = capType;
      this.joinType = joinType;
    }
  
    static class Factory {
      private Factory() {
      }
  
      static ShapeStroke newInstance(JSONObject json, LottieComposition composition) {
        List<AnimatableFloatValue> lineDashPattern = new ArrayList<>();
        AnimatableColorValue color = AnimatableColorValue.Factory.newInstance(json.optJSONObject("c"),
            composition);
        AnimatableFloatValue width = AnimatableFloatValue.Factory.newInstance(json.optJSONObject("w"),
            composition);
        AnimatableIntegerValue opacity = AnimatableIntegerValue.Factory.newInstance(
            json.optJSONObject("o"), composition);
        LineCapType capType = LineCapType.values()[json.optInt("lc") - 1];
        LineJoinType joinType = LineJoinType.values()[json.optInt("lj") - 1];
        AnimatableFloatValue offset = null;
  
        if (json.has("d")) {
          JSONArray dashesJson = json.optJSONArray("d");
          for (int i = 0; i < dashesJson.length(); i++) {
            JSONObject dashJson = dashesJson.optJSONObject(i);
            String n = dashJson.optString("n");
            if (n.equals("o")) {
              JSONObject value = dashJson.optJSONObject("v");
              offset = AnimatableFloatValue.Factory.newInstance(value, composition);
            } else if (n.equals("d") || n.equals("g")) {
              JSONObject value = dashJson.optJSONObject("v");
              lineDashPattern.add(AnimatableFloatValue.Factory.newInstance(value, composition));
            }
          }
          if (lineDashPattern.size() == 1) {
            // If there is only 1 value then it is assumed to be equal parts on and off.
            lineDashPattern.add(lineDashPattern.get(0));
          }
        }
        return new ShapeStroke(offset, lineDashPattern, color, opacity, width, capType, joinType);
      }
    }
  
    AnimatableColorValue getColor() {
      return color;
    }
  
    AnimatableIntegerValue getOpacity() {
      return opacity;
    }
  
    AnimatableFloatValue getWidth() {
      return width;
    }
  
    List<AnimatableFloatValue> getLineDashPattern() {
      return lineDashPattern;
    }
  
    AnimatableFloatValue getDashOffset() {
      return offset;
    }
  
    LineCapType getCapType() {
      return capType;
    }
  
    LineJoinType getJoinType() {
      return joinType;
    }
  }
  