ADD week 5
This commit is contained in:
		| @@ -0,0 +1,305 @@ | ||||
| package androidx.constraintlayout.widget; | ||||
|  | ||||
| import android.content.Context; | ||||
| import android.content.res.TypedArray; | ||||
| import android.content.res.XmlResourceParser; | ||||
| import android.util.Log; | ||||
| import android.util.SparseArray; | ||||
| import android.util.Xml; | ||||
| import java.io.IOException; | ||||
| import java.util.ArrayList; | ||||
| import org.xmlpull.v1.XmlPullParser; | ||||
| import org.xmlpull.v1.XmlPullParserException; | ||||
|  | ||||
| /* loaded from: classes.dex */ | ||||
| public class ConstraintLayoutStates { | ||||
|     private static final boolean DEBUG = false; | ||||
|     public static final String TAG = "ConstraintLayoutStates"; | ||||
|     private final ConstraintLayout mConstraintLayout; | ||||
|     ConstraintSet mDefaultConstraintSet; | ||||
|     int mCurrentStateId = -1; | ||||
|     int mCurrentConstraintNumber = -1; | ||||
|     private SparseArray<State> mStateList = new SparseArray<>(); | ||||
|     private SparseArray<ConstraintSet> mConstraintSetMap = new SparseArray<>(); | ||||
|     private ConstraintsChangedListener mConstraintsChangedListener = null; | ||||
|  | ||||
|     public void setOnConstraintsChanged(ConstraintsChangedListener constraintsChangedListener) { | ||||
|         this.mConstraintsChangedListener = constraintsChangedListener; | ||||
|     } | ||||
|  | ||||
|     ConstraintLayoutStates(Context context, ConstraintLayout layout, int resourceID) { | ||||
|         this.mConstraintLayout = layout; | ||||
|         load(context, resourceID); | ||||
|     } | ||||
|  | ||||
|     public boolean needsToChange(int id, float width, float height) { | ||||
|         int i = this.mCurrentStateId; | ||||
|         if (i != id) { | ||||
|             return true; | ||||
|         } | ||||
|         State valueAt = id == -1 ? this.mStateList.valueAt(0) : this.mStateList.get(i); | ||||
|         return (this.mCurrentConstraintNumber == -1 || !valueAt.mVariants.get(this.mCurrentConstraintNumber).match(width, height)) && this.mCurrentConstraintNumber != valueAt.findMatch(width, height); | ||||
|     } | ||||
|  | ||||
|     public void updateConstraints(int id, float width, float height) { | ||||
|         ConstraintSet constraintSet; | ||||
|         int i; | ||||
|         State state; | ||||
|         int findMatch; | ||||
|         int i2; | ||||
|         int i3 = this.mCurrentStateId; | ||||
|         if (i3 == id) { | ||||
|             if (id == -1) { | ||||
|                 state = this.mStateList.valueAt(0); | ||||
|             } else { | ||||
|                 state = this.mStateList.get(i3); | ||||
|             } | ||||
|             if ((this.mCurrentConstraintNumber == -1 || !state.mVariants.get(this.mCurrentConstraintNumber).match(width, height)) && this.mCurrentConstraintNumber != (findMatch = state.findMatch(width, height))) { | ||||
|                 ConstraintSet constraintSet2 = findMatch == -1 ? this.mDefaultConstraintSet : state.mVariants.get(findMatch).mConstraintSet; | ||||
|                 if (findMatch == -1) { | ||||
|                     i2 = state.mConstraintID; | ||||
|                 } else { | ||||
|                     i2 = state.mVariants.get(findMatch).mConstraintID; | ||||
|                 } | ||||
|                 if (constraintSet2 == null) { | ||||
|                     return; | ||||
|                 } | ||||
|                 this.mCurrentConstraintNumber = findMatch; | ||||
|                 ConstraintsChangedListener constraintsChangedListener = this.mConstraintsChangedListener; | ||||
|                 if (constraintsChangedListener != null) { | ||||
|                     constraintsChangedListener.preLayoutChange(-1, i2); | ||||
|                 } | ||||
|                 constraintSet2.applyTo(this.mConstraintLayout); | ||||
|                 ConstraintsChangedListener constraintsChangedListener2 = this.mConstraintsChangedListener; | ||||
|                 if (constraintsChangedListener2 != null) { | ||||
|                     constraintsChangedListener2.postLayoutChange(-1, i2); | ||||
|                     return; | ||||
|                 } | ||||
|                 return; | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
|         this.mCurrentStateId = id; | ||||
|         State state2 = this.mStateList.get(id); | ||||
|         int findMatch2 = state2.findMatch(width, height); | ||||
|         if (findMatch2 == -1) { | ||||
|             constraintSet = state2.mConstraintSet; | ||||
|         } else { | ||||
|             constraintSet = state2.mVariants.get(findMatch2).mConstraintSet; | ||||
|         } | ||||
|         if (findMatch2 == -1) { | ||||
|             i = state2.mConstraintID; | ||||
|         } else { | ||||
|             i = state2.mVariants.get(findMatch2).mConstraintID; | ||||
|         } | ||||
|         if (constraintSet == null) { | ||||
|             Log.v("ConstraintLayoutStates", "NO Constraint set found ! id=" + id + ", dim =" + width + ", " + height); | ||||
|             return; | ||||
|         } | ||||
|         this.mCurrentConstraintNumber = findMatch2; | ||||
|         ConstraintsChangedListener constraintsChangedListener3 = this.mConstraintsChangedListener; | ||||
|         if (constraintsChangedListener3 != null) { | ||||
|             constraintsChangedListener3.preLayoutChange(id, i); | ||||
|         } | ||||
|         constraintSet.applyTo(this.mConstraintLayout); | ||||
|         ConstraintsChangedListener constraintsChangedListener4 = this.mConstraintsChangedListener; | ||||
|         if (constraintsChangedListener4 != null) { | ||||
|             constraintsChangedListener4.postLayoutChange(id, i); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static class State { | ||||
|         int mConstraintID; | ||||
|         ConstraintSet mConstraintSet; | ||||
|         int mId; | ||||
|         ArrayList<Variant> mVariants = new ArrayList<>(); | ||||
|  | ||||
|         public State(Context context, XmlPullParser parser) { | ||||
|             this.mConstraintID = -1; | ||||
|             TypedArray obtainStyledAttributes = context.obtainStyledAttributes(Xml.asAttributeSet(parser), R.styleable.State); | ||||
|             int indexCount = obtainStyledAttributes.getIndexCount(); | ||||
|             for (int i = 0; i < indexCount; i++) { | ||||
|                 int index = obtainStyledAttributes.getIndex(i); | ||||
|                 if (index == R.styleable.State_android_id) { | ||||
|                     this.mId = obtainStyledAttributes.getResourceId(index, this.mId); | ||||
|                 } else if (index == R.styleable.State_constraints) { | ||||
|                     this.mConstraintID = obtainStyledAttributes.getResourceId(index, this.mConstraintID); | ||||
|                     String resourceTypeName = context.getResources().getResourceTypeName(this.mConstraintID); | ||||
|                     context.getResources().getResourceName(this.mConstraintID); | ||||
|                     if ("layout".equals(resourceTypeName)) { | ||||
|                         ConstraintSet constraintSet = new ConstraintSet(); | ||||
|                         this.mConstraintSet = constraintSet; | ||||
|                         constraintSet.clone(context, this.mConstraintID); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             obtainStyledAttributes.recycle(); | ||||
|         } | ||||
|  | ||||
|         void add(Variant size) { | ||||
|             this.mVariants.add(size); | ||||
|         } | ||||
|  | ||||
|         public int findMatch(float width, float height) { | ||||
|             for (int i = 0; i < this.mVariants.size(); i++) { | ||||
|                 if (this.mVariants.get(i).match(width, height)) { | ||||
|                     return i; | ||||
|                 } | ||||
|             } | ||||
|             return -1; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static class Variant { | ||||
|         int mConstraintID; | ||||
|         ConstraintSet mConstraintSet; | ||||
|         int mId; | ||||
|         float mMaxHeight; | ||||
|         float mMaxWidth; | ||||
|         float mMinHeight; | ||||
|         float mMinWidth; | ||||
|  | ||||
|         public Variant(Context context, XmlPullParser parser) { | ||||
|             this.mMinWidth = Float.NaN; | ||||
|             this.mMinHeight = Float.NaN; | ||||
|             this.mMaxWidth = Float.NaN; | ||||
|             this.mMaxHeight = Float.NaN; | ||||
|             this.mConstraintID = -1; | ||||
|             TypedArray obtainStyledAttributes = context.obtainStyledAttributes(Xml.asAttributeSet(parser), R.styleable.Variant); | ||||
|             int indexCount = obtainStyledAttributes.getIndexCount(); | ||||
|             for (int i = 0; i < indexCount; i++) { | ||||
|                 int index = obtainStyledAttributes.getIndex(i); | ||||
|                 if (index == R.styleable.Variant_constraints) { | ||||
|                     this.mConstraintID = obtainStyledAttributes.getResourceId(index, this.mConstraintID); | ||||
|                     String resourceTypeName = context.getResources().getResourceTypeName(this.mConstraintID); | ||||
|                     context.getResources().getResourceName(this.mConstraintID); | ||||
|                     if ("layout".equals(resourceTypeName)) { | ||||
|                         ConstraintSet constraintSet = new ConstraintSet(); | ||||
|                         this.mConstraintSet = constraintSet; | ||||
|                         constraintSet.clone(context, this.mConstraintID); | ||||
|                     } | ||||
|                 } else if (index == R.styleable.Variant_region_heightLessThan) { | ||||
|                     this.mMaxHeight = obtainStyledAttributes.getDimension(index, this.mMaxHeight); | ||||
|                 } else if (index == R.styleable.Variant_region_heightMoreThan) { | ||||
|                     this.mMinHeight = obtainStyledAttributes.getDimension(index, this.mMinHeight); | ||||
|                 } else if (index == R.styleable.Variant_region_widthLessThan) { | ||||
|                     this.mMaxWidth = obtainStyledAttributes.getDimension(index, this.mMaxWidth); | ||||
|                 } else if (index == R.styleable.Variant_region_widthMoreThan) { | ||||
|                     this.mMinWidth = obtainStyledAttributes.getDimension(index, this.mMinWidth); | ||||
|                 } else { | ||||
|                     Log.v("ConstraintLayoutStates", "Unknown tag"); | ||||
|                 } | ||||
|             } | ||||
|             obtainStyledAttributes.recycle(); | ||||
|         } | ||||
|  | ||||
|         boolean match(float widthDp, float heightDp) { | ||||
|             if (!Float.isNaN(this.mMinWidth) && widthDp < this.mMinWidth) { | ||||
|                 return false; | ||||
|             } | ||||
|             if (!Float.isNaN(this.mMinHeight) && heightDp < this.mMinHeight) { | ||||
|                 return false; | ||||
|             } | ||||
|             if (Float.isNaN(this.mMaxWidth) || widthDp <= this.mMaxWidth) { | ||||
|                 return Float.isNaN(this.mMaxHeight) || heightDp <= this.mMaxHeight; | ||||
|             } | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void load(Context context, int resourceId) { | ||||
|         XmlResourceParser xml = context.getResources().getXml(resourceId); | ||||
|         try { | ||||
|             int eventType = xml.getEventType(); | ||||
|             State state = null; | ||||
|             while (true) { | ||||
|                 char c = 1; | ||||
|                 if (eventType == 1) { | ||||
|                     return; | ||||
|                 } | ||||
|                 if (eventType == 0) { | ||||
|                     xml.getName(); | ||||
|                 } else if (eventType == 2) { | ||||
|                     String name = xml.getName(); | ||||
|                     switch (name.hashCode()) { | ||||
|                         case -1349929691: | ||||
|                             if (name.equals("ConstraintSet")) { | ||||
|                                 c = 4; | ||||
|                                 break; | ||||
|                             } | ||||
|                             c = 65535; | ||||
|                             break; | ||||
|                         case 80204913: | ||||
|                             if (name.equals("State")) { | ||||
|                                 c = 2; | ||||
|                                 break; | ||||
|                             } | ||||
|                             c = 65535; | ||||
|                             break; | ||||
|                         case 1382829617: | ||||
|                             if (name.equals("StateSet")) { | ||||
|                                 break; | ||||
|                             } | ||||
|                             c = 65535; | ||||
|                             break; | ||||
|                         case 1657696882: | ||||
|                             if (name.equals("layoutDescription")) { | ||||
|                                 c = 0; | ||||
|                                 break; | ||||
|                             } | ||||
|                             c = 65535; | ||||
|                             break; | ||||
|                         case 1901439077: | ||||
|                             if (name.equals("Variant")) { | ||||
|                                 c = 3; | ||||
|                                 break; | ||||
|                             } | ||||
|                             c = 65535; | ||||
|                             break; | ||||
|                         default: | ||||
|                             c = 65535; | ||||
|                             break; | ||||
|                     } | ||||
|                     if (c == 2) { | ||||
|                         state = new State(context, xml); | ||||
|                         this.mStateList.put(state.mId, state); | ||||
|                     } else if (c == 3) { | ||||
|                         Variant variant = new Variant(context, xml); | ||||
|                         if (state != null) { | ||||
|                             state.add(variant); | ||||
|                         } | ||||
|                     } else if (c == 4) { | ||||
|                         parseConstraintSet(context, xml); | ||||
|                     } | ||||
|                 } | ||||
|                 eventType = xml.next(); | ||||
|             } | ||||
|         } catch (IOException e) { | ||||
|             e.printStackTrace(); | ||||
|         } catch (XmlPullParserException e2) { | ||||
|             e2.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void parseConstraintSet(Context context, XmlPullParser parser) { | ||||
|         ConstraintSet constraintSet = new ConstraintSet(); | ||||
|         int attributeCount = parser.getAttributeCount(); | ||||
|         for (int i = 0; i < attributeCount; i++) { | ||||
|             String attributeName = parser.getAttributeName(i); | ||||
|             String attributeValue = parser.getAttributeValue(i); | ||||
|             if (attributeName != null && attributeValue != null && "id".equals(attributeName)) { | ||||
|                 int identifier = attributeValue.contains("/") ? context.getResources().getIdentifier(attributeValue.substring(attributeValue.indexOf(47) + 1), "id", context.getPackageName()) : -1; | ||||
|                 if (identifier == -1) { | ||||
|                     if (attributeValue.length() > 1) { | ||||
|                         identifier = Integer.parseInt(attributeValue.substring(1)); | ||||
|                     } else { | ||||
|                         Log.e("ConstraintLayoutStates", "error in parsing id"); | ||||
|                     } | ||||
|                 } | ||||
|                 constraintSet.load(context, parser); | ||||
|                 this.mConstraintSetMap.put(identifier, constraintSet); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user