diff options
author | Oscar Adame Vazquez <oscarad@google.com> | 2018-05-25 15:48:22 -0700 |
---|---|---|
committer | Oscar Adame Vázquez <oscarad@google.com> | 2018-05-26 00:04:41 +0000 |
commit | a0864c1507cd4b8abf3b88d13c469e3dfc0cd2d9 (patch) | |
tree | 847aa75f3dead8277922a1a71efc22453b186c22 | |
parent | 5b05ef1cf5cdd95a9449d42d364f8f2c5572f1c0 (diff) | |
download | sherpa-a0864c1507cd4b8abf3b88d13c469e3dfc0cd2d9.tar.gz |
Fixed issue with wrap content and match constraint
Widgets would get erroneous dimensions when chained together
with "GONE" widgets.
Added corresponding test in AdvancedChainTest.
Fixed old test related to goneMargin.
Test: testRatioChainGone
Bug: 79122164
Change-Id: I1c1b09410a0303f357f2b2b593b4201558e02a3b
3 files changed, 94 insertions, 7 deletions
diff --git a/solver/src/main/java/android/support/constraint/solver/widgets/Chain.java b/solver/src/main/java/android/support/constraint/solver/widgets/Chain.java index de222a1..9fef62b 100644 --- a/solver/src/main/java/android/support/constraint/solver/widgets/Chain.java +++ b/solver/src/main/java/android/support/constraint/solver/widgets/Chain.java @@ -159,16 +159,23 @@ class Chain { if (isChainPacked && widget != first && widget != firstVisibleWidget) { strength = SolverVariable.STRENGTH_FIXED; + } else if (isChainSpread && isWrapContent) { + // on chain spread, keep the default strength connecting to endpoints to highest + // this makes it on par with ratio strength. + strength = SolverVariable.STRENGTH_HIGHEST; } - if (widget == firstVisibleWidget) { - system.addGreaterThan(begin.mSolverVariable, begin.mTarget.mSolverVariable, + if (begin.mTarget != null) { + if (widget == firstVisibleWidget) { + system.addGreaterThan(begin.mSolverVariable, begin.mTarget.mSolverVariable, margin, SolverVariable.STRENGTH_EQUALITY); - } else { - system.addGreaterThan(begin.mSolverVariable, begin.mTarget.mSolverVariable, + } else { + system.addGreaterThan(begin.mSolverVariable, begin.mTarget.mSolverVariable, margin, SolverVariable.STRENGTH_FIXED); + } + system.addEquality(begin.mSolverVariable, begin.mTarget.mSolverVariable, margin, + strength); } - system.addEquality(begin.mSolverVariable, begin.mTarget.mSolverVariable, margin, strength); // First, let's maintain a linked list of matched widgets for the chain widget.mListNextMatchConstraintsWidget[orientation] = null; @@ -184,7 +191,8 @@ class Chain { previousMatchConstraintsWidget = widget; if (isWrapContent) { system.addGreaterThan(widget.mListAnchors[offset + 1].mSolverVariable, - widget.mListAnchors[offset].mSolverVariable, 0, SolverVariable.STRENGTH_FIXED); + widget.mListAnchors[offset].mSolverVariable, 0, + SolverVariable.STRENGTH_EQUALITY); } } diff --git a/solver/src/test/java/android/support/constraint/solver/AdvancedChainTest.java b/solver/src/test/java/android/support/constraint/solver/AdvancedChainTest.java index 6df8489..a9715ec 100644 --- a/solver/src/test/java/android/support/constraint/solver/AdvancedChainTest.java +++ b/solver/src/test/java/android/support/constraint/solver/AdvancedChainTest.java @@ -16,8 +16,11 @@ package android.support.constraint.solver; import android.support.constraint.solver.widgets.ConstraintAnchor; +import android.support.constraint.solver.widgets.ConstraintAnchor.Type; import android.support.constraint.solver.widgets.ConstraintWidget; +import android.support.constraint.solver.widgets.ConstraintWidget.DimensionBehaviour; import android.support.constraint.solver.widgets.ConstraintWidgetContainer; +import android.support.constraint.solver.widgets.Optimizer; import org.testng.annotations.Test; import java.util.ArrayList; @@ -27,6 +30,82 @@ import static org.testng.Assert.assertEquals; public class AdvancedChainTest { @Test + public void testRatioChainGone() { + ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800); + ConstraintWidget A = new ConstraintWidget(100, 20); + ConstraintWidget B = new ConstraintWidget(100, 20); + ConstraintWidget C = new ConstraintWidget(100, 20); + ConstraintWidget ratio = new ConstraintWidget(100, 20); + + root.setDebugSolverName(root.getSystem(), "root"); + A.setDebugSolverName(root.getSystem(), "A"); + B.setDebugSolverName(root.getSystem(), "B"); + C.setDebugSolverName(root.getSystem(), "C"); + ratio.setDebugSolverName(root.getSystem(), "ratio"); + + root.add(A); + root.add(B); + root.add(C); + root.add(ratio); + + A.connect(Type.LEFT, root, Type.LEFT, 0); + A.connect(Type.RIGHT, root, Type.RIGHT, 0); + + B.connect(Type.LEFT, root, Type.LEFT, 0); + B.connect(Type.RIGHT, root, Type.RIGHT, 0); + + C.connect(Type.LEFT, root, Type.LEFT, 0); + C.connect(Type.RIGHT, root, Type.RIGHT, 0); + + ratio.connect(Type.TOP, root, Type.TOP, 0); + ratio.connect(Type.LEFT, root, Type.LEFT, 0); + ratio.connect(Type.RIGHT, root, Type.RIGHT, 0); + + A.connect(Type.TOP, root, Type.TOP, 0); + A.connect(Type.BOTTOM, B, Type.TOP, 0); + B.connect(Type.TOP, A, Type.BOTTOM, 0); + B.connect(Type.BOTTOM, ratio, Type.BOTTOM, 0); + C.connect(Type.TOP, B, Type.TOP, 0); + C.connect(Type.BOTTOM, ratio, Type.BOTTOM, 0); + + A.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT); + B.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT); + C.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT); + ratio.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT); + + A.setVerticalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT); + B.setVerticalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT); + C.setVerticalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT); + ratio.setVerticalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT); + ratio.setDimensionRatio("4:3"); + + B.setVisibility(ConstraintWidget.GONE); + C.setVisibility(ConstraintWidget.GONE); + + root.setOptimizationLevel(Optimizer.OPTIMIZATION_NONE); + root.layout(); + + System.out.println("A: " + A); + System.out.println("B: " + B); + System.out.println("C: " + C); + System.out.println("ratio: " + ratio); + + assertEquals(A.getHeight(), 600); + + root.setVerticalDimensionBehaviour(DimensionBehaviour.WRAP_CONTENT); + + root.layout(); + + System.out.println("A: " + A); + System.out.println("B: " + B); + System.out.println("C: " + C); + System.out.println("ratio: " + ratio); + System.out.println("root: " + root); + + assertEquals(A.getHeight(), 600); + } + + @Test public void testSimpleHorizontalChainPacked() { ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 600); ConstraintWidget A = new ConstraintWidget(100, 20); diff --git a/solver/src/test/java/android/support/constraint/solver/ChainTest.java b/solver/src/test/java/android/support/constraint/solver/ChainTest.java index a3fcf7b..abfabff 100644 --- a/solver/src/test/java/android/support/constraint/solver/ChainTest.java +++ b/solver/src/test/java/android/support/constraint/solver/ChainTest.java @@ -130,7 +130,7 @@ public class ChainTest { System.out.println("A: " + A + " B: " + B + " C: " + C); assertEquals(A.getLeft(), 200); assertEquals(B.getLeft(), 300); - assertEquals(C.getLeft(), 400); + assertEquals(C.getLeft(), 500); assertEquals(A.getWidth(), 100); assertEquals(B.getWidth(), 100); assertEquals(C.getWidth(), 0); |