summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOscar Adame Vazquez <oscarad@google.com>2018-05-31 14:50:27 -0700
committerOscar Adame Vazquez <oscarad@google.com>2018-05-31 14:50:27 -0700
commitefb9f6ddf518048b621b33c56788f3f1090884a2 (patch)
tree7a07d789d4f197c07f12a4dacb663e4fced28cb6
parente157e51768c9a17f1bff8dedd7113ab63b209080 (diff)
downloadsherpa-efb9f6ddf518048b621b33c56788f3f1090884a2.tar.gz
Fixed issue with widget gone positioning
A widget with match_constraint on any dimension would get positioned on a wrong place, ignoring vertical/horizontal bias. Additionally, bias would get handled inversely on gone widgets. Fixed VisibilityTest based on old behavior. Bug: 78541266 Test: testGoneMatchConstraint and UI Change-Id: I5d8ebe3c17d0b47b61e4cfce73030c6797930ce9
-rw-r--r--solver/src/main/java/android/support/constraint/solver/widgets/Optimizer.java20
-rw-r--r--solver/src/main/java/android/support/constraint/solver/widgets/ResolutionAnchor.java7
-rw-r--r--solver/src/test/java/android/support/constraint/solver/OptimizationsTest.java40
-rw-r--r--solver/src/test/java/android/support/constraint/solver/VisibilityTest.java10
4 files changed, 63 insertions, 14 deletions
diff --git a/solver/src/main/java/android/support/constraint/solver/widgets/Optimizer.java b/solver/src/main/java/android/support/constraint/solver/widgets/Optimizer.java
index c80ca07..d60c069 100644
--- a/solver/src/main/java/android/support/constraint/solver/widgets/Optimizer.java
+++ b/solver/src/main/java/android/support/constraint/solver/widgets/Optimizer.java
@@ -159,9 +159,13 @@ public class Optimizer {
// First the horizontal nodes...
+ boolean isOptimizableHorizontalMatch = widget.mListDimensionBehaviors[HORIZONTAL] == MATCH_CONSTRAINT
+ && optimizableMatchConstraint(widget, HORIZONTAL);
+
if (leftNode.type != ResolutionAnchor.CHAIN_CONNECTION
&& rightNode.type != ResolutionAnchor.CHAIN_CONNECTION) {
- if (widget.mListDimensionBehaviors[HORIZONTAL] == FIXED) {
+ if (widget.mListDimensionBehaviors[HORIZONTAL] == FIXED
+ || (isOptimizableHorizontalMatch && widget.getVisibility() == ConstraintWidget.GONE)) {
if (widget.mLeft.mTarget == null && widget.mRight.mTarget == null) {
leftNode.setType(ResolutionAnchor.DIRECT_CONNECTION);
rightNode.setType(ResolutionAnchor.DIRECT_CONNECTION);
@@ -200,8 +204,7 @@ public class Optimizer {
rightNode.setOpposite(leftNode, widget.getWidth());
}
}
- } else if (widget.mListDimensionBehaviors[HORIZONTAL] == MATCH_CONSTRAINT
- && optimizableMatchConstraint(widget, HORIZONTAL)) {
+ } else if (isOptimizableHorizontalMatch) {
int width = widget.getWidth();
// TODO: ratio won't work with optimiseDimensions as it is
// ...but ratio won't work period for now as optimizableMatchConstraint will return false
@@ -252,10 +255,14 @@ public class Optimizer {
// ...then the vertical ones
- if (topNode.type != ResolutionAnchor.CHAIN_CONNECTION
+ boolean isOptimizableVerticalMatch = widget.mListDimensionBehaviors[VERTICAL] == MATCH_CONSTRAINT
+ && optimizableMatchConstraint(widget, VERTICAL);
+
+ if (topNode.type != ResolutionAnchor.CHAIN_CONNECTION
&& bottomNode.type != ResolutionAnchor.CHAIN_CONNECTION
/* && mBaseline.getResolutionNode().type == ResolutionAnchor.UNCONNECTED */) {
- if (widget.mListDimensionBehaviors[VERTICAL] == FIXED) {
+ if (widget.mListDimensionBehaviors[VERTICAL] == FIXED
+ || (isOptimizableVerticalMatch && widget.getVisibility() == ConstraintWidget.GONE)) {
if (widget.mTop.mTarget == null && widget.mBottom.mTarget == null) {
topNode.setType(ResolutionAnchor.DIRECT_CONNECTION);
bottomNode.setType(ResolutionAnchor.DIRECT_CONNECTION);
@@ -307,8 +314,7 @@ public class Optimizer {
widget.mBaseline.getResolutionNode().dependsOn(ResolutionAnchor.DIRECT_CONNECTION, topNode, widget.mBaselineDistance);
}
}
- } else if (widget.mListDimensionBehaviors[VERTICAL] == MATCH_CONSTRAINT
- && optimizableMatchConstraint(widget, VERTICAL)) {
+ } else if (isOptimizableVerticalMatch) {
int height = widget.getHeight();
// TODO: fix ratio (right it won't work, optimizableMatchConstraint will return false
// if (widget.mDimensionRatio != 0) {
diff --git a/solver/src/main/java/android/support/constraint/solver/widgets/ResolutionAnchor.java b/solver/src/main/java/android/support/constraint/solver/widgets/ResolutionAnchor.java
index 32e2b6e..67865aa 100644
--- a/solver/src/main/java/android/support/constraint/solver/widgets/ResolutionAnchor.java
+++ b/solver/src/main/java/android/support/constraint/solver/widgets/ResolutionAnchor.java
@@ -17,6 +17,7 @@ package android.support.constraint.solver.widgets;
import android.support.constraint.solver.LinearSystem;
import android.support.constraint.solver.SolverVariable;
+import android.support.constraint.solver.widgets.ConstraintAnchor.Type;
/**
* Implements a mechanism to resolve nodes via a dependency graph
@@ -154,7 +155,9 @@ public class ResolutionAnchor extends ResolutionNode {
float distance = 0;
float percent = 0.5f;
- if (oppositeOffset > 0) {
+ boolean isEndAnchor = myAnchor.mType == Type.RIGHT || myAnchor.mType == Type.BOTTOM;
+
+ if (isEndAnchor) {
// we are right or bottom
distance = target.resolvedOffset - opposite.target.resolvedOffset;
} else {
@@ -180,7 +183,7 @@ public class ResolutionAnchor extends ResolutionNode {
distance -= margin;
distance -= oppositeMargin;
- if (oppositeOffset > 0) {
+ if (isEndAnchor) {
// we are right or bottom
opposite.resolvedOffset = opposite.target.resolvedOffset
+ oppositeMargin + distance * percent;
diff --git a/solver/src/test/java/android/support/constraint/solver/OptimizationsTest.java b/solver/src/test/java/android/support/constraint/solver/OptimizationsTest.java
index 90e672a..7b7abb7 100644
--- a/solver/src/test/java/android/support/constraint/solver/OptimizationsTest.java
+++ b/solver/src/test/java/android/support/constraint/solver/OptimizationsTest.java
@@ -16,11 +16,51 @@
package android.support.constraint.solver;
import android.support.constraint.solver.widgets.*;
+import android.support.constraint.solver.widgets.ConstraintAnchor.Type;
+import android.support.constraint.solver.widgets.ConstraintWidget.DimensionBehaviour;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
public class OptimizationsTest {
+ @Test
+ public void testGoneMatchConstraint() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 600, 800);
+ ConstraintWidget A = new ConstraintWidget( 0, 10);
+
+ root.setDebugName("root");
+ A.setDebugName("A");
+
+ root.add(A);
+
+ A.connect(Type.TOP, root, Type.TOP, 8);
+ A.connect(Type.LEFT, root, Type.LEFT, 8);
+ A.connect(Type.RIGHT, root, Type.RIGHT, 8);
+ A.connect(Type.BOTTOM, root, Type.BOTTOM, 8);
+ A.setVerticalBiasPercent(0.2f);
+ A.setHorizontalBiasPercent(0.2f);
+ A.setHorizontalDimensionBehaviour(DimensionBehaviour.MATCH_CONSTRAINT);
+
+ Metrics metrics = new Metrics();
+ root.fillMetrics(metrics);
+ root.setOptimizationLevel(Optimizer.OPTIMIZATION_STANDARD);
+ root.layout();
+
+ System.out.println("1) A: " + A);
+ assertEquals(A.getLeft(), 8);
+ assertEquals(A.getTop(), 162);
+ assertEquals(A.getRight(), 592);
+ assertEquals(A.getBottom(), 172);
+
+ A.setVisibility(ConstraintWidget.GONE);
+ root.layout();
+
+ System.out.println("2) A: " + A);
+ assertEquals(A.getLeft(), 120);
+ assertEquals(A.getTop(), 160);
+ assertEquals(A.getRight(), 120);
+ assertEquals(A.getBottom(), 160);
+ }
@Test
public void test3EltsChain() {
diff --git a/solver/src/test/java/android/support/constraint/solver/VisibilityTest.java b/solver/src/test/java/android/support/constraint/solver/VisibilityTest.java
index 4c4b8ac..dd71b8b 100644
--- a/solver/src/test/java/android/support/constraint/solver/VisibilityTest.java
+++ b/solver/src/test/java/android/support/constraint/solver/VisibilityTest.java
@@ -141,14 +141,14 @@ public class VisibilityTest {
assertEquals(root.getHeight(), 600);
assertEquals(A.getWidth(), 0);
assertEquals(A.getHeight(), 0);
- assertEquals(A.getLeft(), 0);
- assertEquals(A.getRight(), 0);
+ assertEquals(A.getLeft(), 400);
+ assertEquals(A.getRight(), 400);
assertEquals(B.getLeft(), root.getLeft());
assertEquals(B.getRight(), root.getRight());
assertEquals(guideline.getTop(), root.getHeight() / 2);
- assertEquals(A.getTop(), 0);
- assertEquals(A.getBottom(), 0);
- assertEquals(B.getTop(), 300);
+ assertEquals(A.getTop(), 150);
+ assertEquals(A.getBottom(), 150);
+ assertEquals(B.getTop(), 150);
assertEquals(B.getBottom(), root.getBottom());
}
}