306 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			306 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| 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;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |