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;
|
|
}
|
|
}
|