350 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			350 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package androidx.constraintlayout.helper.widget;
 | |
| 
 | |
| import android.content.Context;
 | |
| import android.content.res.TypedArray;
 | |
| import android.util.AttributeSet;
 | |
| import android.util.Log;
 | |
| import android.view.View;
 | |
| import androidx.constraintlayout.widget.ConstraintLayout;
 | |
| import androidx.constraintlayout.widget.ConstraintSet;
 | |
| import androidx.constraintlayout.widget.R;
 | |
| import androidx.constraintlayout.widget.VirtualLayout;
 | |
| import java.util.Arrays;
 | |
| 
 | |
| /* loaded from: classes.dex */
 | |
| public class CircularFlow extends VirtualLayout {
 | |
|     private static float DEFAULT_ANGLE = 0.0f;
 | |
|     private static int DEFAULT_RADIUS = 0;
 | |
|     private static final String TAG = "CircularFlow";
 | |
|     private float[] mAngles;
 | |
|     ConstraintLayout mContainer;
 | |
|     private int mCountAngle;
 | |
|     private int mCountRadius;
 | |
|     private int[] mRadius;
 | |
|     private String mReferenceAngles;
 | |
|     private Float mReferenceDefaultAngle;
 | |
|     private Integer mReferenceDefaultRadius;
 | |
|     private String mReferenceRadius;
 | |
|     int mViewCenter;
 | |
| 
 | |
|     public void setDefaultAngle(float angle) {
 | |
|         DEFAULT_ANGLE = angle;
 | |
|     }
 | |
| 
 | |
|     public void setDefaultRadius(int radius) {
 | |
|         DEFAULT_RADIUS = radius;
 | |
|     }
 | |
| 
 | |
|     public CircularFlow(Context context) {
 | |
|         super(context);
 | |
|     }
 | |
| 
 | |
|     public CircularFlow(Context context, AttributeSet attrs) {
 | |
|         super(context, attrs);
 | |
|     }
 | |
| 
 | |
|     public CircularFlow(Context context, AttributeSet attrs, int defStyleAttr) {
 | |
|         super(context, attrs, defStyleAttr);
 | |
|     }
 | |
| 
 | |
|     public int[] getRadius() {
 | |
|         return Arrays.copyOf(this.mRadius, this.mCountRadius);
 | |
|     }
 | |
| 
 | |
|     public float[] getAngles() {
 | |
|         return Arrays.copyOf(this.mAngles, this.mCountAngle);
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.constraintlayout.widget.VirtualLayout, androidx.constraintlayout.widget.ConstraintHelper
 | |
|     protected void init(AttributeSet attrs) {
 | |
|         super.init(attrs);
 | |
|         if (attrs != null) {
 | |
|             TypedArray obtainStyledAttributes = getContext().obtainStyledAttributes(attrs, R.styleable.ConstraintLayout_Layout);
 | |
|             int indexCount = obtainStyledAttributes.getIndexCount();
 | |
|             for (int i = 0; i < indexCount; i++) {
 | |
|                 int index = obtainStyledAttributes.getIndex(i);
 | |
|                 if (index == R.styleable.ConstraintLayout_Layout_circularflow_viewCenter) {
 | |
|                     this.mViewCenter = obtainStyledAttributes.getResourceId(index, 0);
 | |
|                 } else if (index == R.styleable.ConstraintLayout_Layout_circularflow_angles) {
 | |
|                     String string = obtainStyledAttributes.getString(index);
 | |
|                     this.mReferenceAngles = string;
 | |
|                     setAngles(string);
 | |
|                 } else if (index == R.styleable.ConstraintLayout_Layout_circularflow_radiusInDP) {
 | |
|                     String string2 = obtainStyledAttributes.getString(index);
 | |
|                     this.mReferenceRadius = string2;
 | |
|                     setRadius(string2);
 | |
|                 } else if (index == R.styleable.ConstraintLayout_Layout_circularflow_defaultAngle) {
 | |
|                     Float valueOf = Float.valueOf(obtainStyledAttributes.getFloat(index, DEFAULT_ANGLE));
 | |
|                     this.mReferenceDefaultAngle = valueOf;
 | |
|                     setDefaultAngle(valueOf.floatValue());
 | |
|                 } else if (index == R.styleable.ConstraintLayout_Layout_circularflow_defaultRadius) {
 | |
|                     Integer valueOf2 = Integer.valueOf(obtainStyledAttributes.getDimensionPixelSize(index, DEFAULT_RADIUS));
 | |
|                     this.mReferenceDefaultRadius = valueOf2;
 | |
|                     setDefaultRadius(valueOf2.intValue());
 | |
|                 }
 | |
|             }
 | |
|             obtainStyledAttributes.recycle();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.constraintlayout.widget.VirtualLayout, androidx.constraintlayout.widget.ConstraintHelper, android.view.View
 | |
|     public void onAttachedToWindow() {
 | |
|         super.onAttachedToWindow();
 | |
|         String str = this.mReferenceAngles;
 | |
|         if (str != null) {
 | |
|             this.mAngles = new float[1];
 | |
|             setAngles(str);
 | |
|         }
 | |
|         String str2 = this.mReferenceRadius;
 | |
|         if (str2 != null) {
 | |
|             this.mRadius = new int[1];
 | |
|             setRadius(str2);
 | |
|         }
 | |
|         Float f = this.mReferenceDefaultAngle;
 | |
|         if (f != null) {
 | |
|             setDefaultAngle(f.floatValue());
 | |
|         }
 | |
|         Integer num = this.mReferenceDefaultRadius;
 | |
|         if (num != null) {
 | |
|             setDefaultRadius(num.intValue());
 | |
|         }
 | |
|         anchorReferences();
 | |
|     }
 | |
| 
 | |
|     private void anchorReferences() {
 | |
|         this.mContainer = (ConstraintLayout) getParent();
 | |
|         for (int i = 0; i < this.mCount; i++) {
 | |
|             View viewById = this.mContainer.getViewById(this.mIds[i]);
 | |
|             if (viewById != null) {
 | |
|                 int i2 = DEFAULT_RADIUS;
 | |
|                 float f = DEFAULT_ANGLE;
 | |
|                 int[] iArr = this.mRadius;
 | |
|                 if (iArr != null && i < iArr.length) {
 | |
|                     i2 = iArr[i];
 | |
|                 } else {
 | |
|                     Integer num = this.mReferenceDefaultRadius;
 | |
|                     if (num == null || num.intValue() == -1) {
 | |
|                         Log.e(TAG, "Added radius to view with id: " + this.mMap.get(Integer.valueOf(viewById.getId())));
 | |
|                     } else {
 | |
|                         this.mCountRadius++;
 | |
|                         if (this.mRadius == null) {
 | |
|                             this.mRadius = new int[1];
 | |
|                         }
 | |
|                         int[] radius = getRadius();
 | |
|                         this.mRadius = radius;
 | |
|                         radius[this.mCountRadius - 1] = i2;
 | |
|                     }
 | |
|                 }
 | |
|                 float[] fArr = this.mAngles;
 | |
|                 if (fArr == null || i >= fArr.length) {
 | |
|                     Float f2 = this.mReferenceDefaultAngle;
 | |
|                     if (f2 == null || f2.floatValue() == -1.0f) {
 | |
|                         Log.e(TAG, "Added angle to view with id: " + this.mMap.get(Integer.valueOf(viewById.getId())));
 | |
|                     } else {
 | |
|                         this.mCountAngle++;
 | |
|                         if (this.mAngles == null) {
 | |
|                             this.mAngles = new float[1];
 | |
|                         }
 | |
|                         float[] angles = getAngles();
 | |
|                         this.mAngles = angles;
 | |
|                         angles[this.mCountAngle - 1] = f;
 | |
|                     }
 | |
|                 } else {
 | |
|                     f = fArr[i];
 | |
|                 }
 | |
|                 ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) viewById.getLayoutParams();
 | |
|                 layoutParams.circleAngle = f;
 | |
|                 layoutParams.circleConstraint = this.mViewCenter;
 | |
|                 layoutParams.circleRadius = i2;
 | |
|                 viewById.setLayoutParams(layoutParams);
 | |
|             }
 | |
|         }
 | |
|         applyLayoutFeatures();
 | |
|     }
 | |
| 
 | |
|     public void addViewToCircularFlow(View view, int radius, float angle) {
 | |
|         if (containsId(view.getId())) {
 | |
|             return;
 | |
|         }
 | |
|         addView(view);
 | |
|         this.mCountAngle++;
 | |
|         float[] angles = getAngles();
 | |
|         this.mAngles = angles;
 | |
|         angles[this.mCountAngle - 1] = angle;
 | |
|         this.mCountRadius++;
 | |
|         int[] radius2 = getRadius();
 | |
|         this.mRadius = radius2;
 | |
|         radius2[this.mCountRadius - 1] = (int) (radius * this.myContext.getResources().getDisplayMetrics().density);
 | |
|         anchorReferences();
 | |
|     }
 | |
| 
 | |
|     public void updateRadius(View view, int radius) {
 | |
|         if (!isUpdatable(view)) {
 | |
|             Log.e(TAG, "It was not possible to update radius to view with id: " + view.getId());
 | |
|             return;
 | |
|         }
 | |
|         int indexFromId = indexFromId(view.getId());
 | |
|         if (indexFromId > this.mRadius.length) {
 | |
|             return;
 | |
|         }
 | |
|         int[] radius2 = getRadius();
 | |
|         this.mRadius = radius2;
 | |
|         radius2[indexFromId] = (int) (radius * this.myContext.getResources().getDisplayMetrics().density);
 | |
|         anchorReferences();
 | |
|     }
 | |
| 
 | |
|     public void updateAngle(View view, float angle) {
 | |
|         if (!isUpdatable(view)) {
 | |
|             Log.e(TAG, "It was not possible to update angle to view with id: " + view.getId());
 | |
|             return;
 | |
|         }
 | |
|         int indexFromId = indexFromId(view.getId());
 | |
|         if (indexFromId > this.mAngles.length) {
 | |
|             return;
 | |
|         }
 | |
|         float[] angles = getAngles();
 | |
|         this.mAngles = angles;
 | |
|         angles[indexFromId] = angle;
 | |
|         anchorReferences();
 | |
|     }
 | |
| 
 | |
|     public void updateReference(View view, int radius, float angle) {
 | |
|         if (!isUpdatable(view)) {
 | |
|             Log.e(TAG, "It was not possible to update radius and angle to view with id: " + view.getId());
 | |
|             return;
 | |
|         }
 | |
|         int indexFromId = indexFromId(view.getId());
 | |
|         if (getAngles().length > indexFromId) {
 | |
|             float[] angles = getAngles();
 | |
|             this.mAngles = angles;
 | |
|             angles[indexFromId] = angle;
 | |
|         }
 | |
|         if (getRadius().length > indexFromId) {
 | |
|             int[] radius2 = getRadius();
 | |
|             this.mRadius = radius2;
 | |
|             radius2[indexFromId] = (int) (radius * this.myContext.getResources().getDisplayMetrics().density);
 | |
|         }
 | |
|         anchorReferences();
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.constraintlayout.widget.ConstraintHelper
 | |
|     public int removeView(View view) {
 | |
|         int removeView = super.removeView(view);
 | |
|         if (removeView == -1) {
 | |
|             return removeView;
 | |
|         }
 | |
|         ConstraintSet constraintSet = new ConstraintSet();
 | |
|         constraintSet.clone(this.mContainer);
 | |
|         constraintSet.clear(view.getId(), 8);
 | |
|         constraintSet.applyTo(this.mContainer);
 | |
|         float[] fArr = this.mAngles;
 | |
|         if (removeView < fArr.length) {
 | |
|             this.mAngles = removeAngle(fArr, removeView);
 | |
|             this.mCountAngle--;
 | |
|         }
 | |
|         int[] iArr = this.mRadius;
 | |
|         if (removeView < iArr.length) {
 | |
|             this.mRadius = removeRadius(iArr, removeView);
 | |
|             this.mCountRadius--;
 | |
|         }
 | |
|         anchorReferences();
 | |
|         return removeView;
 | |
|     }
 | |
| 
 | |
|     private float[] removeAngle(float[] angles, int index) {
 | |
|         return (angles == null || index < 0 || index >= this.mCountAngle) ? angles : removeElementFromArray(angles, index);
 | |
|     }
 | |
| 
 | |
|     private int[] removeRadius(int[] radius, int index) {
 | |
|         return (radius == null || index < 0 || index >= this.mCountRadius) ? radius : removeElementFromArray(radius, index);
 | |
|     }
 | |
| 
 | |
|     private void setAngles(String idList) {
 | |
|         if (idList == null) {
 | |
|             return;
 | |
|         }
 | |
|         int i = 0;
 | |
|         this.mCountAngle = 0;
 | |
|         while (true) {
 | |
|             int indexOf = idList.indexOf(44, i);
 | |
|             if (indexOf == -1) {
 | |
|                 addAngle(idList.substring(i).trim());
 | |
|                 return;
 | |
|             } else {
 | |
|                 addAngle(idList.substring(i, indexOf).trim());
 | |
|                 i = indexOf + 1;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private void setRadius(String idList) {
 | |
|         if (idList == null) {
 | |
|             return;
 | |
|         }
 | |
|         int i = 0;
 | |
|         this.mCountRadius = 0;
 | |
|         while (true) {
 | |
|             int indexOf = idList.indexOf(44, i);
 | |
|             if (indexOf == -1) {
 | |
|                 addRadius(idList.substring(i).trim());
 | |
|                 return;
 | |
|             } else {
 | |
|                 addRadius(idList.substring(i, indexOf).trim());
 | |
|                 i = indexOf + 1;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private void addAngle(String angleString) {
 | |
|         float[] fArr;
 | |
|         if (angleString == null || angleString.length() == 0 || this.myContext == null || (fArr = this.mAngles) == null) {
 | |
|             return;
 | |
|         }
 | |
|         if (this.mCountAngle + 1 > fArr.length) {
 | |
|             this.mAngles = Arrays.copyOf(fArr, fArr.length + 1);
 | |
|         }
 | |
|         this.mAngles[this.mCountAngle] = Integer.parseInt(angleString);
 | |
|         this.mCountAngle++;
 | |
|     }
 | |
| 
 | |
|     private void addRadius(String radiusString) {
 | |
|         int[] iArr;
 | |
|         if (radiusString == null || radiusString.length() == 0 || this.myContext == null || (iArr = this.mRadius) == null) {
 | |
|             return;
 | |
|         }
 | |
|         if (this.mCountRadius + 1 > iArr.length) {
 | |
|             this.mRadius = Arrays.copyOf(iArr, iArr.length + 1);
 | |
|         }
 | |
|         this.mRadius[this.mCountRadius] = (int) (Integer.parseInt(radiusString) * this.myContext.getResources().getDisplayMetrics().density);
 | |
|         this.mCountRadius++;
 | |
|     }
 | |
| 
 | |
|     public static int[] removeElementFromArray(int[] array, int index) {
 | |
|         int[] iArr = new int[array.length - 1];
 | |
|         int i = 0;
 | |
|         for (int i2 = 0; i2 < array.length; i2++) {
 | |
|             if (i2 != index) {
 | |
|                 iArr[i] = array[i2];
 | |
|                 i++;
 | |
|             }
 | |
|         }
 | |
|         return iArr;
 | |
|     }
 | |
| 
 | |
|     public static float[] removeElementFromArray(float[] array, int index) {
 | |
|         float[] fArr = new float[array.length - 1];
 | |
|         int i = 0;
 | |
|         for (int i2 = 0; i2 < array.length; i2++) {
 | |
|             if (i2 != index) {
 | |
|                 fArr[i] = array[i2];
 | |
|                 i++;
 | |
|             }
 | |
|         }
 | |
|         return fArr;
 | |
|     }
 | |
| 
 | |
|     public boolean isUpdatable(View view) {
 | |
|         return containsId(view.getId()) && indexFromId(view.getId()) != -1;
 | |
|     }
 | |
| }
 |