377 lines
19 KiB
Java
377 lines
19 KiB
Java
package androidx.constraintlayout.solver.widgets.analyzer;
|
|
|
|
import androidx.constraintlayout.solver.LinearSystem;
|
|
import androidx.constraintlayout.solver.Metrics;
|
|
import androidx.constraintlayout.solver.widgets.Barrier;
|
|
import androidx.constraintlayout.solver.widgets.ConstraintAnchor;
|
|
import androidx.constraintlayout.solver.widgets.ConstraintWidget;
|
|
import androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer;
|
|
import androidx.constraintlayout.solver.widgets.Guideline;
|
|
import androidx.constraintlayout.solver.widgets.Helper;
|
|
import androidx.constraintlayout.solver.widgets.Optimizer;
|
|
import androidx.constraintlayout.solver.widgets.VirtualLayout;
|
|
import java.util.ArrayList;
|
|
public class BasicMeasure {
|
|
public static final int AT_MOST = Integer.MIN_VALUE;
|
|
private static final boolean DEBUG = false;
|
|
public static final int EXACTLY = 1073741824;
|
|
public static final int FIXED = -3;
|
|
public static final int MATCH_PARENT = -1;
|
|
private static final int MODE_SHIFT = 30;
|
|
public static final int UNSPECIFIED = 0;
|
|
public static final int WRAP_CONTENT = -2;
|
|
private ConstraintWidgetContainer constraintWidgetContainer;
|
|
private Measure mMeasure = new Measure();
|
|
private final ArrayList<ConstraintWidget> mVariableDimensionsWidgets = new ArrayList<>();
|
|
|
|
public static class Measure {
|
|
public static int SELF_DIMENSIONS = 0;
|
|
public static int TRY_GIVEN_DIMENSIONS = 1;
|
|
public static int USE_GIVEN_DIMENSIONS = 2;
|
|
public ConstraintWidget.DimensionBehaviour horizontalBehavior;
|
|
public int horizontalDimension;
|
|
public int measureStrategy;
|
|
public int measuredBaseline;
|
|
public boolean measuredHasBaseline;
|
|
public int measuredHeight;
|
|
public boolean measuredNeedsSolverPass;
|
|
public int measuredWidth;
|
|
public ConstraintWidget.DimensionBehaviour verticalBehavior;
|
|
public int verticalDimension;
|
|
}
|
|
|
|
public interface Measurer {
|
|
void didMeasures();
|
|
|
|
void measure(ConstraintWidget constraintWidget, Measure measure);
|
|
}
|
|
|
|
public BasicMeasure(ConstraintWidgetContainer constraintWidgetContainer) {
|
|
this.constraintWidgetContainer = constraintWidgetContainer;
|
|
}
|
|
|
|
private boolean measure(Measurer measurer, ConstraintWidget constraintWidget, int i) {
|
|
this.mMeasure.horizontalBehavior = constraintWidget.getHorizontalDimensionBehaviour();
|
|
this.mMeasure.verticalBehavior = constraintWidget.getVerticalDimensionBehaviour();
|
|
this.mMeasure.horizontalDimension = constraintWidget.getWidth();
|
|
this.mMeasure.verticalDimension = constraintWidget.getHeight();
|
|
Measure measure = this.mMeasure;
|
|
measure.measuredNeedsSolverPass = false;
|
|
measure.measureStrategy = i;
|
|
ConstraintWidget.DimensionBehaviour dimensionBehaviour = measure.horizontalBehavior;
|
|
ConstraintWidget.DimensionBehaviour dimensionBehaviour2 = ConstraintWidget.DimensionBehaviour.MATCH_CONSTRAINT;
|
|
boolean z2 = dimensionBehaviour == dimensionBehaviour2;
|
|
boolean z3 = measure.verticalBehavior == dimensionBehaviour2;
|
|
boolean z4 = z2 && constraintWidget.mDimensionRatio > 0.0f;
|
|
boolean z5 = z3 && constraintWidget.mDimensionRatio > 0.0f;
|
|
if (z4 && constraintWidget.mResolvedMatchConstraintDefault[0] == 4) {
|
|
measure.horizontalBehavior = ConstraintWidget.DimensionBehaviour.FIXED;
|
|
}
|
|
if (z5 && constraintWidget.mResolvedMatchConstraintDefault[1] == 4) {
|
|
measure.verticalBehavior = ConstraintWidget.DimensionBehaviour.FIXED;
|
|
}
|
|
measurer.measure(constraintWidget, measure);
|
|
constraintWidget.setWidth(this.mMeasure.measuredWidth);
|
|
constraintWidget.setHeight(this.mMeasure.measuredHeight);
|
|
constraintWidget.setHasBaseline(this.mMeasure.measuredHasBaseline);
|
|
constraintWidget.setBaselineDistance(this.mMeasure.measuredBaseline);
|
|
Measure measure2 = this.mMeasure;
|
|
measure2.measureStrategy = Measure.SELF_DIMENSIONS;
|
|
return measure2.measuredNeedsSolverPass;
|
|
}
|
|
|
|
/* JADX WARNING: Code restructure failed: missing block: B:46:0x008e, code lost:
|
|
if (r8 != r9) goto L_0x0098;
|
|
*/
|
|
/* JADX WARNING: Code restructure failed: missing block: B:48:0x0095, code lost:
|
|
if (r5.mDimensionRatio <= 0.0f) goto L_0x0098;
|
|
*/
|
|
private void measureChildren(ConstraintWidgetContainer constraintWidgetContainer) {
|
|
HorizontalWidgetRun horizontalWidgetRun;
|
|
VerticalWidgetRun verticalWidgetRun;
|
|
int size = constraintWidgetContainer.mChildren.size();
|
|
boolean optimizeFor = constraintWidgetContainer.optimizeFor(64);
|
|
Measurer measurer = constraintWidgetContainer.getMeasurer();
|
|
for (int i = 0; i < size; i++) {
|
|
ConstraintWidget constraintWidget = constraintWidgetContainer.mChildren.get(i);
|
|
if (!(constraintWidget instanceof Guideline) && !(constraintWidget instanceof Barrier) && !constraintWidget.isInVirtualLayout() && (!optimizeFor || (horizontalWidgetRun = constraintWidget.horizontalRun) == null || (verticalWidgetRun = constraintWidget.verticalRun) == null || !horizontalWidgetRun.dimension.resolved || !verticalWidgetRun.dimension.resolved)) {
|
|
ConstraintWidget.DimensionBehaviour dimensionBehaviour = constraintWidget.getDimensionBehaviour(0);
|
|
boolean z2 = true;
|
|
ConstraintWidget.DimensionBehaviour dimensionBehaviour2 = constraintWidget.getDimensionBehaviour(1);
|
|
ConstraintWidget.DimensionBehaviour dimensionBehaviour3 = ConstraintWidget.DimensionBehaviour.MATCH_CONSTRAINT;
|
|
boolean z3 = dimensionBehaviour == dimensionBehaviour3 && constraintWidget.mMatchConstraintDefaultWidth != 1 && dimensionBehaviour2 == dimensionBehaviour3 && constraintWidget.mMatchConstraintDefaultHeight != 1;
|
|
if (!z3 && constraintWidgetContainer.optimizeFor(1) && !(constraintWidget instanceof VirtualLayout)) {
|
|
if (dimensionBehaviour == dimensionBehaviour3 && constraintWidget.mMatchConstraintDefaultWidth == 0 && dimensionBehaviour2 != dimensionBehaviour3 && !constraintWidget.isInHorizontalChain()) {
|
|
z3 = true;
|
|
}
|
|
if (dimensionBehaviour2 == dimensionBehaviour3 && constraintWidget.mMatchConstraintDefaultHeight == 0 && dimensionBehaviour != dimensionBehaviour3 && !constraintWidget.isInHorizontalChain()) {
|
|
z3 = true;
|
|
}
|
|
if (dimensionBehaviour != dimensionBehaviour3) {
|
|
}
|
|
}
|
|
z2 = z3;
|
|
if (!z2) {
|
|
measure(measurer, constraintWidget, Measure.SELF_DIMENSIONS);
|
|
Metrics metrics = constraintWidgetContainer.mMetrics;
|
|
if (metrics != null) {
|
|
metrics.measuredWidgets++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
measurer.didMeasures();
|
|
}
|
|
|
|
private void solveLinearSystem(ConstraintWidgetContainer constraintWidgetContainer, String str, int i, int i2) {
|
|
int minWidth = constraintWidgetContainer.getMinWidth();
|
|
int minHeight = constraintWidgetContainer.getMinHeight();
|
|
constraintWidgetContainer.setMinWidth(0);
|
|
constraintWidgetContainer.setMinHeight(0);
|
|
constraintWidgetContainer.setWidth(i);
|
|
constraintWidgetContainer.setHeight(i2);
|
|
constraintWidgetContainer.setMinWidth(minWidth);
|
|
constraintWidgetContainer.setMinHeight(minHeight);
|
|
this.constraintWidgetContainer.layout();
|
|
}
|
|
|
|
public long solverMeasure(ConstraintWidgetContainer constraintWidgetContainer, int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9) {
|
|
int i10;
|
|
boolean z2;
|
|
int i11;
|
|
boolean z3;
|
|
boolean z4;
|
|
int i12;
|
|
boolean z5;
|
|
Measurer measurer;
|
|
int i13;
|
|
int i14;
|
|
int i15;
|
|
boolean z6;
|
|
Metrics metrics;
|
|
Measurer measurer2 = constraintWidgetContainer.getMeasurer();
|
|
int size = constraintWidgetContainer.mChildren.size();
|
|
int width = constraintWidgetContainer.getWidth();
|
|
int height = constraintWidgetContainer.getHeight();
|
|
boolean enabled = Optimizer.enabled(i, 128);
|
|
boolean z7 = enabled || Optimizer.enabled(i, 64);
|
|
if (z7) {
|
|
int i16 = 0;
|
|
while (true) {
|
|
if (i16 >= size) {
|
|
break;
|
|
}
|
|
ConstraintWidget constraintWidget = constraintWidgetContainer.mChildren.get(i16);
|
|
ConstraintWidget.DimensionBehaviour horizontalDimensionBehaviour = constraintWidget.getHorizontalDimensionBehaviour();
|
|
ConstraintWidget.DimensionBehaviour dimensionBehaviour = ConstraintWidget.DimensionBehaviour.MATCH_CONSTRAINT;
|
|
boolean z8 = (horizontalDimensionBehaviour == dimensionBehaviour) && (constraintWidget.getVerticalDimensionBehaviour() == dimensionBehaviour) && constraintWidget.getDimensionRatio() > 0.0f;
|
|
if ((!constraintWidget.isInHorizontalChain() || !z8) && ((!constraintWidget.isInVerticalChain() || !z8) && !(constraintWidget instanceof VirtualLayout) && !constraintWidget.isInHorizontalChain() && !constraintWidget.isInVerticalChain())) {
|
|
i16++;
|
|
}
|
|
}
|
|
z7 = false;
|
|
}
|
|
if (z7 && (metrics = LinearSystem.sMetrics) != null) {
|
|
metrics.measures++;
|
|
}
|
|
boolean z9 = z7 & ((i4 == 1073741824 && i6 == 1073741824) || enabled);
|
|
if (z9) {
|
|
int min = Math.min(constraintWidgetContainer.getMaxWidth(), i5);
|
|
int min2 = Math.min(constraintWidgetContainer.getMaxHeight(), i7);
|
|
if (i4 == 1073741824 && constraintWidgetContainer.getWidth() != min) {
|
|
constraintWidgetContainer.setWidth(min);
|
|
constraintWidgetContainer.invalidateGraph();
|
|
}
|
|
if (i6 == 1073741824 && constraintWidgetContainer.getHeight() != min2) {
|
|
constraintWidgetContainer.setHeight(min2);
|
|
constraintWidgetContainer.invalidateGraph();
|
|
}
|
|
if (i4 == 1073741824 && i6 == 1073741824) {
|
|
z2 = constraintWidgetContainer.directMeasure(enabled);
|
|
i10 = 2;
|
|
} else {
|
|
boolean directMeasureSetup = constraintWidgetContainer.directMeasureSetup(enabled);
|
|
if (i4 == 1073741824) {
|
|
directMeasureSetup &= constraintWidgetContainer.directMeasureWithOrientation(enabled, 0);
|
|
i10 = 1;
|
|
} else {
|
|
i10 = 0;
|
|
}
|
|
if (i6 == 1073741824) {
|
|
z2 = constraintWidgetContainer.directMeasureWithOrientation(enabled, 1) & directMeasureSetup;
|
|
i10++;
|
|
} else {
|
|
z2 = directMeasureSetup;
|
|
}
|
|
}
|
|
if (z2) {
|
|
constraintWidgetContainer.updateFromRuns(i4 == 1073741824, i6 == 1073741824);
|
|
}
|
|
} else {
|
|
z2 = false;
|
|
i10 = 0;
|
|
}
|
|
if (z2 && i10 == 2) {
|
|
return 0;
|
|
}
|
|
int optimizationLevel = constraintWidgetContainer.getOptimizationLevel();
|
|
if (size > 0) {
|
|
measureChildren(constraintWidgetContainer);
|
|
}
|
|
updateHierarchy(constraintWidgetContainer);
|
|
int size2 = this.mVariableDimensionsWidgets.size();
|
|
if (size > 0) {
|
|
solveLinearSystem(constraintWidgetContainer, "First pass", width, height);
|
|
}
|
|
if (size2 > 0) {
|
|
ConstraintWidget.DimensionBehaviour horizontalDimensionBehaviour2 = constraintWidgetContainer.getHorizontalDimensionBehaviour();
|
|
ConstraintWidget.DimensionBehaviour dimensionBehaviour2 = ConstraintWidget.DimensionBehaviour.WRAP_CONTENT;
|
|
boolean z10 = horizontalDimensionBehaviour2 == dimensionBehaviour2;
|
|
boolean z11 = constraintWidgetContainer.getVerticalDimensionBehaviour() == dimensionBehaviour2;
|
|
int max = Math.max(constraintWidgetContainer.getWidth(), this.constraintWidgetContainer.getMinWidth());
|
|
int max2 = Math.max(constraintWidgetContainer.getHeight(), this.constraintWidgetContainer.getMinHeight());
|
|
int i17 = 0;
|
|
boolean z12 = false;
|
|
while (i17 < size2) {
|
|
ConstraintWidget constraintWidget2 = this.mVariableDimensionsWidgets.get(i17);
|
|
if (!(constraintWidget2 instanceof VirtualLayout)) {
|
|
i13 = optimizationLevel;
|
|
i15 = width;
|
|
i14 = height;
|
|
} else {
|
|
int width2 = constraintWidget2.getWidth();
|
|
i13 = optimizationLevel;
|
|
int height2 = constraintWidget2.getHeight();
|
|
i15 = width;
|
|
boolean measure = measure(measurer2, constraintWidget2, Measure.TRY_GIVEN_DIMENSIONS) | z12;
|
|
Metrics metrics2 = constraintWidgetContainer.mMetrics;
|
|
i14 = height;
|
|
if (metrics2 != null) {
|
|
metrics2.measuredMatchWidgets++;
|
|
}
|
|
int width3 = constraintWidget2.getWidth();
|
|
int height3 = constraintWidget2.getHeight();
|
|
if (width3 != width2) {
|
|
constraintWidget2.setWidth(width3);
|
|
if (z10 && constraintWidget2.getRight() > max) {
|
|
max = Math.max(max, constraintWidget2.getAnchor(ConstraintAnchor.Type.RIGHT).getMargin() + constraintWidget2.getRight());
|
|
}
|
|
z6 = true;
|
|
} else {
|
|
z6 = measure;
|
|
}
|
|
if (height3 != height2) {
|
|
constraintWidget2.setHeight(height3);
|
|
if (z11 && constraintWidget2.getBottom() > max2) {
|
|
max2 = Math.max(max2, constraintWidget2.getAnchor(ConstraintAnchor.Type.BOTTOM).getMargin() + constraintWidget2.getBottom());
|
|
}
|
|
z6 = true;
|
|
}
|
|
z12 = z6 | ((VirtualLayout) constraintWidget2).needSolverPass();
|
|
}
|
|
i17++;
|
|
optimizationLevel = i13;
|
|
width = i15;
|
|
height = i14;
|
|
}
|
|
int i18 = 0;
|
|
int i19 = 2;
|
|
while (i18 < i19) {
|
|
int i20 = 0;
|
|
while (i20 < size2) {
|
|
ConstraintWidget constraintWidget3 = this.mVariableDimensionsWidgets.get(i20);
|
|
if ((!(constraintWidget3 instanceof Helper) || (constraintWidget3 instanceof VirtualLayout)) && !(constraintWidget3 instanceof Guideline) && constraintWidget3.getVisibility() != 8 && ((!z9 || !constraintWidget3.horizontalRun.dimension.resolved || !constraintWidget3.verticalRun.dimension.resolved) && !(constraintWidget3 instanceof VirtualLayout))) {
|
|
int width4 = constraintWidget3.getWidth();
|
|
int height4 = constraintWidget3.getHeight();
|
|
int baselineDistance = constraintWidget3.getBaselineDistance();
|
|
int i21 = Measure.TRY_GIVEN_DIMENSIONS;
|
|
z5 = z9;
|
|
if (i18 == 1) {
|
|
i21 = Measure.USE_GIVEN_DIMENSIONS;
|
|
}
|
|
boolean measure2 = measure(measurer2, constraintWidget3, i21) | z12;
|
|
Metrics metrics3 = constraintWidgetContainer.mMetrics;
|
|
i12 = size2;
|
|
measurer = measurer2;
|
|
if (metrics3 != null) {
|
|
metrics3.measuredMatchWidgets++;
|
|
}
|
|
int width5 = constraintWidget3.getWidth();
|
|
int height5 = constraintWidget3.getHeight();
|
|
if (width5 != width4) {
|
|
constraintWidget3.setWidth(width5);
|
|
if (z10 && constraintWidget3.getRight() > max) {
|
|
max = Math.max(max, constraintWidget3.getAnchor(ConstraintAnchor.Type.RIGHT).getMargin() + constraintWidget3.getRight());
|
|
}
|
|
measure2 = true;
|
|
}
|
|
if (height5 != height4) {
|
|
constraintWidget3.setHeight(height5);
|
|
if (z11 && constraintWidget3.getBottom() > max2) {
|
|
max2 = Math.max(max2, constraintWidget3.getAnchor(ConstraintAnchor.Type.BOTTOM).getMargin() + constraintWidget3.getBottom());
|
|
}
|
|
measure2 = true;
|
|
}
|
|
z12 = (!constraintWidget3.hasBaseline() || baselineDistance == constraintWidget3.getBaselineDistance()) ? measure2 : true;
|
|
} else {
|
|
z5 = z9;
|
|
i12 = size2;
|
|
measurer = measurer2;
|
|
}
|
|
i20++;
|
|
size2 = i12;
|
|
measurer2 = measurer;
|
|
z9 = z5;
|
|
}
|
|
if (!z12) {
|
|
break;
|
|
}
|
|
solveLinearSystem(constraintWidgetContainer, "intermediate pass", width, height);
|
|
i18++;
|
|
measurer2 = measurer2;
|
|
z9 = z9;
|
|
i19 = 2;
|
|
z12 = false;
|
|
size2 = size2;
|
|
}
|
|
if (z12) {
|
|
solveLinearSystem(constraintWidgetContainer, "2nd pass", width, height);
|
|
if (constraintWidgetContainer.getWidth() < max) {
|
|
constraintWidgetContainer.setWidth(max);
|
|
z3 = true;
|
|
} else {
|
|
z3 = false;
|
|
}
|
|
if (constraintWidgetContainer.getHeight() < max2) {
|
|
constraintWidgetContainer.setHeight(max2);
|
|
z4 = true;
|
|
} else {
|
|
z4 = z3;
|
|
}
|
|
if (z4) {
|
|
solveLinearSystem(constraintWidgetContainer, "3rd pass", width, height);
|
|
}
|
|
}
|
|
i11 = optimizationLevel;
|
|
} else {
|
|
i11 = optimizationLevel;
|
|
}
|
|
constraintWidgetContainer.setOptimizationLevel(i11);
|
|
return 0;
|
|
}
|
|
|
|
public void updateHierarchy(ConstraintWidgetContainer constraintWidgetContainer) {
|
|
this.mVariableDimensionsWidgets.clear();
|
|
int size = constraintWidgetContainer.mChildren.size();
|
|
for (int i = 0; i < size; i++) {
|
|
ConstraintWidget constraintWidget = constraintWidgetContainer.mChildren.get(i);
|
|
ConstraintWidget.DimensionBehaviour horizontalDimensionBehaviour = constraintWidget.getHorizontalDimensionBehaviour();
|
|
ConstraintWidget.DimensionBehaviour dimensionBehaviour = ConstraintWidget.DimensionBehaviour.MATCH_CONSTRAINT;
|
|
if (horizontalDimensionBehaviour == dimensionBehaviour || constraintWidget.getVerticalDimensionBehaviour() == dimensionBehaviour) {
|
|
this.mVariableDimensionsWidgets.add(constraintWidget);
|
|
}
|
|
}
|
|
constraintWidgetContainer.invalidateGraph();
|
|
}
|
|
}
|