diff options
author | Oscar Adame Vazquez <oscarad@google.com> | 2018-06-07 17:15:26 -0700 |
---|---|---|
committer | Oscar Adame Vazquez <oscarad@google.com> | 2018-06-07 17:15:26 -0700 |
commit | 6c6d76490f56ff2e73646eee5158efad5029240a (patch) | |
tree | 5f2eb4abbe21f508eb863ff19446fbd4e64f867c | |
parent | db7542da7aec8e442a8f2fc5c4ff40bd86086837 (diff) | |
download | sherpa-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
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); + } + } |