summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOscar Adame Vazquez <oscarad@google.com>2018-05-25 15:48:22 -0700
committerOscar Adame Vázquez <oscarad@google.com>2018-05-26 00:04:41 +0000
commita0864c1507cd4b8abf3b88d13c469e3dfc0cd2d9 (patch)
tree847aa75f3dead8277922a1a71efc22453b186c22
parent5b05ef1cf5cdd95a9449d42d364f8f2c5572f1c0 (diff)
downloadsherpa-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
-rw-r--r--solver/src/main/java/android/support/constraint/solver/widgets/Chain.java20
-rw-r--r--solver/src/test/java/android/support/constraint/solver/AdvancedChainTest.java79
-rw-r--r--solver/src/test/java/android/support/constraint/solver/ChainTest.java2
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);