summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOscar Adame Vazquez <oscarad@google.com>2018-06-07 17:15:26 -0700
committerOscar Adame Vazquez <oscarad@google.com>2018-06-07 17:15:26 -0700
commit6c6d76490f56ff2e73646eee5158efad5029240a (patch)
tree5f2eb4abbe21f508eb863ff19446fbd4e64f867c
parentdb7542da7aec8e442a8f2fc5c4ff40bd86086837 (diff)
downloadsherpa-6c6d76490f56ff2e73646eee5158efad5029240a.tar.gz
Added match constraint linked list to ChainHead
Added some extra common fields into Chainhead related to match constraint chains. Bug: N/A Test: Expanded ChainHeadTest Change-Id: Ib226809bdc4ae259c8a74df5c3fbdf20cf817eb0
-rw-r--r--solver/src/main/java/android/support/constraint/solver/widgets/Chain.java30
-rw-r--r--solver/src/main/java/android/support/constraint/solver/widgets/ChainHead.java57
-rw-r--r--solver/src/main/java/android/support/constraint/solver/widgets/Optimizer.java16
-rw-r--r--solver/src/test/java/android/support/constraint/solver/ChainHeadTest.java47
4 files changed, 102 insertions, 48 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 6d6f12b..f992d66 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
@@ -85,12 +85,11 @@ class Chain {
ConstraintWidget widget = first;
ConstraintWidget next = null;
-
boolean done = false;
- int numMatchConstraints = 0;
- float totalWeights = 0;
- ConstraintWidget firstMatchConstraintsWidget = null;
- ConstraintWidget previousMatchConstraintsWidget = null;
+
+ float totalWeights = chainHead.mTotalWeight;
+ ConstraintWidget firstMatchConstraintsWidget = chainHead.mFirstMatchConstraintWidget;
+ ConstraintWidget previousMatchConstraintsWidget = chainHead.mLastMatchConstraintWidget;
boolean isWrapContent = container.mListDimensionBehaviors[orientation] == ConstraintWidget.DimensionBehaviour.WRAP_CONTENT;
boolean isChainSpread = false;
@@ -143,26 +142,13 @@ class Chain {
strength);
}
- // First, let's maintain a linked list of matched widgets for the chain
- widget.mListNextMatchConstraintsWidget[orientation] = null;
- if (widget.getVisibility() != ConstraintWidget.GONE
- && widget.mListDimensionBehaviors[orientation] == ConstraintWidget.DimensionBehaviour.MATCH_CONSTRAINT) {
- numMatchConstraints++;
- totalWeights += widget.mWeight[orientation];
- if (firstMatchConstraintsWidget == null) {
- firstMatchConstraintsWidget = widget;
- } else {
- previousMatchConstraintsWidget.mListNextMatchConstraintsWidget[orientation] = widget;
- }
- previousMatchConstraintsWidget = widget;
- if (isWrapContent) {
+ if (isWrapContent) {
+ if(widget.getVisibility() != ConstraintWidget.GONE
+ && widget.mListDimensionBehaviors[orientation] == ConstraintWidget.DimensionBehaviour.MATCH_CONSTRAINT){
system.addGreaterThan(widget.mListAnchors[offset + 1].mSolverVariable,
widget.mListAnchors[offset].mSolverVariable, 0,
SolverVariable.STRENGTH_EQUALITY);
}
- }
-
- if (isWrapContent) {
system.addGreaterThan(widget.mListAnchors[offset].mSolverVariable,
container.mListAnchors[offset].mSolverVariable,
0, SolverVariable.STRENGTH_FIXED);
@@ -201,7 +187,7 @@ class Chain {
}
// Now, let's apply the centering / spreading for matched constraints widgets
- if (numMatchConstraints > 0) {
+ if (firstMatchConstraintsWidget != null) {
// TODO: we should not try to apply the constraints for weights = 0
widget = firstMatchConstraintsWidget;
while (widget != null) {
diff --git a/solver/src/main/java/android/support/constraint/solver/widgets/ChainHead.java b/solver/src/main/java/android/support/constraint/solver/widgets/ChainHead.java
index ee56b7a..70bfc38 100644
--- a/solver/src/main/java/android/support/constraint/solver/widgets/ChainHead.java
+++ b/solver/src/main/java/android/support/constraint/solver/widgets/ChainHead.java
@@ -16,6 +16,8 @@
package android.support.constraint.solver.widgets;
+import android.support.constraint.solver.widgets.ConstraintWidget.DimensionBehaviour;
+
/**
* Class to represent a chain by its main elements.
*/
@@ -26,12 +28,15 @@ public class ChainHead {
protected ConstraintWidget mLast;
protected ConstraintWidget mLastVisibleWidget;
protected ConstraintWidget mHead;
+ protected ConstraintWidget mFirstMatchConstraintWidget;
+ protected ConstraintWidget mLastMatchConstraintWidget;
+ protected float mTotalWeight = 0f;
private int mOrientation;
private boolean mIsRtl = false;
- // TODO: Apply linked list of matched constraint widgets.
/**
- * Initialize variables, then determine visible widgets and head.
+ * Initialize variables, then determine visible widgets, the head of chain and
+ * matched constraint widgets.
*
* @param first first widget in a chain
* @param orientation orientation of the chain (either Horizontal or Vertical)
@@ -51,9 +56,32 @@ public class ChainHead {
ConstraintWidget widget = mFirst;
ConstraintWidget next = mFirst;
boolean done = false;
- widget.mListNextVisibleWidget[mOrientation] = null;
-
while (!done) {
+ widget.mListNextVisibleWidget[mOrientation] = null;
+ widget.mListNextMatchConstraintsWidget[mOrientation] = null;
+ if(widget.getVisibility() != ConstraintWidget.GONE) {
+ // Visible widgets linked list.
+ if (mFirstVisibleWidget == null) {
+ mFirstVisibleWidget = widget;
+ }
+ if(mLastVisibleWidget != null){
+ mLastVisibleWidget.mListNextVisibleWidget[mOrientation] = widget;
+ }
+ mLastVisibleWidget = widget;
+
+ // Match constraint linked list.
+ if(widget.mListDimensionBehaviors[mOrientation] == DimensionBehaviour.MATCH_CONSTRAINT){
+ mTotalWeight += widget.mWeight[mOrientation];
+ if(mFirstMatchConstraintWidget == null){
+ mFirstMatchConstraintWidget = widget;
+ }
+ if(mLastMatchConstraintWidget != null){
+ mLastMatchConstraintWidget.mListNextMatchConstraintsWidget[mOrientation] = widget;
+ }
+ mLastMatchConstraintWidget = widget;
+ }
+ }
+
// go to the next widget
ConstraintAnchor nextAnchor = widget.mListAnchors[offset + 1].mTarget;
if (nextAnchor != null) {
@@ -65,15 +93,6 @@ public class ChainHead {
} else {
next = null;
}
- if(widget.getVisibility() != ConstraintWidget.GONE) {
- if (mFirstVisibleWidget == null) {
- mFirstVisibleWidget = widget;
- }
- if(mLastVisibleWidget != null){
- mLastVisibleWidget.mListNextVisibleWidget[mOrientation] = widget;
- }
- mLastVisibleWidget = widget;
- }
if (next != null) {
widget = next;
} else {
@@ -108,4 +127,16 @@ public class ChainHead {
public ConstraintWidget getHead() {
return mHead;
}
+
+ public ConstraintWidget getFirstMatchConstraintWidget() {
+ return mFirstMatchConstraintWidget;
+ }
+
+ public ConstraintWidget getLastMatchConstraintWidget() {
+ return mLastMatchConstraintWidget;
+ }
+
+ public float getTotalWeight() {
+ return mTotalWeight;
+ }
}
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 4fb16d3..a0a3fe6 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
@@ -387,13 +387,12 @@ public class Optimizer {
ConstraintWidget widget = first;
ConstraintWidget next = null;
-
boolean done = false;
int numMatchConstraints = 0;
- float totalWeights = 0;
- ConstraintWidget firstMatchConstraintsWidget = null;
- ConstraintWidget previousMatchConstraintsWidget = null;
+ float totalWeights = chainHead.mTotalWeight;
+ ConstraintWidget firstMatchConstraintsWidget = chainHead.mFirstMatchConstraintWidget;
+ ConstraintWidget previousMatchConstraintsWidget = chainHead.mLastMatchConstraintWidget;
boolean isWrapContent = container.mListDimensionBehaviors[orientation] == DimensionBehaviour.WRAP_CONTENT;
boolean isChainSpread = false;
@@ -436,8 +435,6 @@ public class Optimizer {
ConstraintAnchor begin = widget.mListAnchors[offset];
- // First, let's maintain a linked list of matched widgets for the chain
- widget.mListNextMatchConstraintsWidget[orientation] = null;
if (widget.getVisibility() != ConstraintWidget.GONE
&& widget.mListDimensionBehaviors[orientation] == MATCH_CONSTRAINT) {
numMatchConstraints++;
@@ -455,13 +452,6 @@ public class Optimizer {
return false;
}
}
- totalWeights += widget.mWeight[orientation];
- if (firstMatchConstraintsWidget == null) {
- firstMatchConstraintsWidget = widget;
- } else {
- previousMatchConstraintsWidget.mListNextMatchConstraintsWidget[orientation] = widget;
- }
- previousMatchConstraintsWidget = widget;
}
// go to the next widget
diff --git a/solver/src/test/java/android/support/constraint/solver/ChainHeadTest.java b/solver/src/test/java/android/support/constraint/solver/ChainHeadTest.java
index 99bf0a2..f6c8e8a 100644
--- a/solver/src/test/java/android/support/constraint/solver/ChainHeadTest.java
+++ b/solver/src/test/java/android/support/constraint/solver/ChainHeadTest.java
@@ -126,4 +126,51 @@ public class ChainHeadTest {
assertEquals(chainHead.getFirstVisibleWidget(), B);
}
+ @Test
+ public void basicMatchConstraintTest(){
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 600, 600);
+ ConstraintWidget A = new ConstraintWidget(100, 20);
+ ConstraintWidget B = new ConstraintWidget(100, 20);
+ ConstraintWidget C = new ConstraintWidget(100, 20);
+
+ root.setDebugName("root");
+ A.setDebugName("A");
+ B.setDebugName("B");
+ C.setDebugName("C");
+
+ root.add(A);
+ root.add(B);
+ root.add(C);
+
+ A.connect(ConstraintAnchor.Type.LEFT, root, ConstraintAnchor.Type.LEFT);
+ A.connect(ConstraintAnchor.Type.RIGHT, B, ConstraintAnchor.Type.LEFT);
+ B.connect(ConstraintAnchor.Type.LEFT, A, ConstraintAnchor.Type.RIGHT);
+ B.connect(ConstraintAnchor.Type.RIGHT, C, ConstraintAnchor.Type.LEFT);
+ C.connect(ConstraintAnchor.Type.LEFT, B, ConstraintAnchor.Type.RIGHT);
+ C.connect(ConstraintAnchor.Type.RIGHT, root, ConstraintAnchor.Type.RIGHT);
+ A.connect(ConstraintAnchor.Type.TOP, root, ConstraintAnchor.Type.TOP);
+ B.connect(ConstraintAnchor.Type.TOP, root, ConstraintAnchor.Type.TOP);
+ C.connect(ConstraintAnchor.Type.TOP, root, ConstraintAnchor.Type.TOP);
+ A.setHorizontalDimensionBehaviour(ConstraintWidget.DimensionBehaviour.MATCH_CONSTRAINT);
+ B.setHorizontalDimensionBehaviour(ConstraintWidget.DimensionBehaviour.MATCH_CONSTRAINT);
+ C.setHorizontalDimensionBehaviour(ConstraintWidget.DimensionBehaviour.MATCH_CONSTRAINT);
+ A.setHorizontalWeight(1f);
+ B.setHorizontalWeight(2f);
+ C.setHorizontalWeight(3f);
+
+ ChainHead chainHead = new ChainHead(A, ConstraintWidget.HORIZONTAL, false);
+
+ assertEquals(chainHead.getFirstMatchConstraintWidget(), A);
+ assertEquals(chainHead.getLastMatchConstraintWidget(), C);
+ assertEquals(chainHead.getTotalWeight(), 6f);
+
+ C.setVisibility(ConstraintWidget.GONE);
+
+ chainHead = new ChainHead(A, ConstraintWidget.HORIZONTAL, false);
+
+ assertEquals(chainHead.getFirstMatchConstraintWidget(), A);
+ assertEquals(chainHead.getLastMatchConstraintWidget(), B);
+ assertEquals(chainHead.getTotalWeight(), 3f);
+ }
+
}