summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Roard <nicolasroard@google.com>2018-06-04 14:21:47 -0700
committerNicolas Roard <nicolasroard@google.com>2018-06-04 14:23:36 -0700
commitf2a27e62f206f6c2cf80fa2f7aa2b0c62766dfb1 (patch)
tree335ecb11a9621af60acf0de9a02a23a5af613901
parent406e6406c502b4467775a417155e7a4b92e787f7 (diff)
downloadsherpa-f2a27e62f206f6c2cf80fa2f7aa2b0c62766dfb1.tar.gz
Handles weights == 0 when other weights > 0
Fixes: 80149154 Test: added check 202 added AdvancedChainTest.testChainWeights() added AdvancedChainTest.testChain3Weights() Change-Id: I42125edcf3d985bb75afd6fa99bda0ef01f45627
-rw-r--r--solver/src/main/java/android/support/constraint/solver/ArrayRow.java9
-rw-r--r--solver/src/main/java/android/support/constraint/solver/widgets/Chain.java1
-rw-r--r--solver/src/test/java/android/support/constraint/solver/AdvancedChainTest.java83
3 files changed, 93 insertions, 0 deletions
diff --git a/solver/src/main/java/android/support/constraint/solver/ArrayRow.java b/solver/src/main/java/android/support/constraint/solver/ArrayRow.java
index 19a3b93..3647cad 100644
--- a/solver/src/main/java/android/support/constraint/solver/ArrayRow.java
+++ b/solver/src/main/java/android/support/constraint/solver/ArrayRow.java
@@ -24,6 +24,7 @@ public class ArrayRow implements LinearSystem.Row {
SolverVariable variable = null;
float constantValue = 0;
boolean used = false;
+ private static final float epsilon = 0.001f;
public final ArrayLinkedVariables variables;
@@ -220,9 +221,17 @@ public class ArrayRow implements LinearSystem.Row {
variables.put(variableEndB, 1);
variables.put(variableStartB, -1);
} else {
+ if (currentWeight == 0) {
+ currentWeight = epsilon;
+ }
+ if (nextWeight == 0) {
+ nextWeight = epsilon;
+ }
+
float cw = currentWeight / totalWeights;
float nw = nextWeight / totalWeights;
float w = cw / nw;
+
// endA - startA == w * (endB - startB)
// 0 = startA - endA + w * (endB - startB)
constantValue = 0;
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 b2e8c1e..e51fbaa 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
@@ -240,6 +240,7 @@ class Chain {
// Now, let's apply the centering / spreading for matched constraints widgets
if (numMatchConstraints > 0) {
+ // TODO: we should not try to apply the constraints for weights = 0
widget = firstMatchConstraintsWidget;
while (widget != null) {
next = widget.mListNextMatchConstraintsWidget[orientation];
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 20436bd..79df53c 100644
--- a/solver/src/test/java/android/support/constraint/solver/AdvancedChainTest.java
+++ b/solver/src/test/java/android/support/constraint/solver/AdvancedChainTest.java
@@ -30,6 +30,89 @@ import static org.testng.Assert.assertEquals;
public class AdvancedChainTest {
@Test
+ public void testChainWeights() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
+ ConstraintWidget A = new ConstraintWidget(100, 20);
+ ConstraintWidget B = new ConstraintWidget(100, 20);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+
+ A.connect(Type.LEFT, root, Type.LEFT, 0);
+ A.connect(Type.RIGHT, B, Type.LEFT, 0);
+
+ B.connect(Type.LEFT, A, Type.RIGHT, 0);
+ B.connect(Type.RIGHT, root, Type.RIGHT, 0);
+
+ root.add(A);
+ root.add(B);
+
+ A.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT);
+ B.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT);
+ A.setHorizontalWeight(1);
+ B.setHorizontalWeight(0);
+
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_NONE);
+ root.layout();
+
+ System.out.println("A: " + A);
+ System.out.println("B: " + B);
+ assertEquals(A.getWidth(), 800, 1);
+ assertEquals(B.getWidth(), 0, 1);
+ assertEquals(A.getLeft(), 0, 1);
+ assertEquals(B.getLeft(), 800, 1);
+ }
+
+ @Test
+ public void testChain3Weights() {
+ 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);
+
+ root.setDebugSolverName(root.getSystem(), "root");
+ A.setDebugSolverName(root.getSystem(), "A");
+ B.setDebugSolverName(root.getSystem(), "B");
+ C.setDebugSolverName(root.getSystem(), "C");
+
+ A.connect(Type.LEFT, root, Type.LEFT, 0);
+ A.connect(Type.RIGHT, B, Type.LEFT, 0);
+
+ B.connect(Type.LEFT, A, Type.RIGHT, 0);
+ B.connect(Type.RIGHT, C, Type.LEFT, 0);
+
+ C.connect(Type.LEFT, B, Type.RIGHT, 0);
+ C.connect(Type.RIGHT, root, Type.RIGHT, 0);
+
+ root.add(A);
+ root.add(B);
+ root.add(C);
+
+ A.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT);
+ B.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT);
+ C.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT);
+
+ A.setHorizontalWeight(1);
+ B.setHorizontalWeight(0);
+ C.setHorizontalWeight(1);
+
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_NONE);
+ root.layout();
+
+ System.out.println("A: " + A);
+ System.out.println("B: " + B);
+ System.out.println("C: " + C);
+
+ assertEquals(A.getWidth(), 400);
+ assertEquals(B.getWidth(), 0);
+ assertEquals(C.getWidth(), 400);
+ assertEquals(A.getLeft(), 0);
+ assertEquals(B.getLeft(), 400);
+ assertEquals(C.getLeft(), 400);
+ }
+
+ @Test
public void testChainLastGone() {
ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 800, 800);
ConstraintWidget A = new ConstraintWidget(100, 20);