diff options
author | Oscar Adame Vazquez <oscarad@google.com> | 2018-05-31 14:50:27 -0700 |
---|---|---|
committer | Oscar Adame Vazquez <oscarad@google.com> | 2018-05-31 14:50:27 -0700 |
commit | efb9f6ddf518048b621b33c56788f3f1090884a2 (patch) | |
tree | 7a07d789d4f197c07f12a4dacb663e4fced28cb6 | |
parent | e157e51768c9a17f1bff8dedd7113ab63b209080 (diff) | |
download | sherpa-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
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()); } } |