@@ -885,6 +885,10 @@ class ConstrainScope internal constructor(internal val id: Any) {
885885 // TODO(popam, b/158069248): add parameter for gone margin
886886 fun linkTo (anchor : ConstraintLayoutBaseScope .BaselineAnchor , margin : Dp = 0.dp) {
887887 tasks.add { state ->
888+ (state as ? State )?.let {
889+ it.baselineNeededFor(id)
890+ it.baselineNeededFor(anchor.id)
891+ }
888892 with (state.constraints(id)) {
889893 baselineAnchorFunction.invoke(this , anchor.id).margin(margin)
890894 }
@@ -1290,6 +1294,9 @@ fun ConstraintSet(description: ConstraintSetScope.() -> Unit) = object : Constra
12901294class State (val density : Density ) : SolverState() {
12911295 var rootIncomingConstraints: Constraints = Constraints ()
12921296 lateinit var layoutDirection: LayoutDirection
1297+ internal val baselineNeeded = mutableListOf<Any >()
1298+ private var dirtyBaselineNeededWidgets = true
1299+ private val baselineNeededWidgets = mutableSetOf<ConstraintWidget >()
12931300
12941301 override fun convertDimension (value : Any? ): Int {
12951302 return if (value is Dp ) {
@@ -1306,9 +1313,28 @@ class State(val density: Density) : SolverState() {
13061313 }
13071314 mReferences.clear()
13081315 mReferences[PARENT ] = mParent
1316+ baselineNeeded.clear()
1317+ dirtyBaselineNeededWidgets = true
13091318 super .reset()
13101319 }
13111320
1321+ internal fun baselineNeededFor (id : Any ) {
1322+ baselineNeeded.add(id)
1323+ dirtyBaselineNeededWidgets = true
1324+ }
1325+
1326+ internal fun isBaselineNeeded (constraintWidget : ConstraintWidget ): Boolean {
1327+ if (dirtyBaselineNeededWidgets) {
1328+ baselineNeededWidgets.clear()
1329+ baselineNeeded.forEach { id ->
1330+ val widget = mReferences[id]?.constraintWidget
1331+ if (widget != null ) baselineNeededWidgets.add(widget)
1332+ }
1333+ dirtyBaselineNeededWidgets = false
1334+ }
1335+ return constraintWidget in baselineNeededWidgets
1336+ }
1337+
13121338 internal fun getKeyId (helperWidget : HelperWidget ): Any? {
13131339 return mHelperReferences.entries.firstOrNull { it.value.helperWidget == helperWidget }?.key
13141340 }
@@ -1444,10 +1470,16 @@ internal open class Measurer : BasicMeasure.Measurer, DesignInfoProvider {
14441470 val currentPlaceable = placeables[measurable]
14451471 measure.measuredWidth = currentPlaceable?.width ? : constraintWidget.width
14461472 measure.measuredHeight = currentPlaceable?.height ? : constraintWidget.height
1447- val baseline = currentPlaceable?.get(FirstBaseline )
1448- measure.measuredHasBaseline = baseline != null
1449- if (baseline != null ) measure.measuredBaseline = baseline
1450- lastMeasures.getOrPut(measurable, { arrayOf(0 , 0 , 0 ) }).copyFrom(measure)
1473+ val baseline =
1474+ if (currentPlaceable != null && state.isBaselineNeeded(constraintWidget)) {
1475+ currentPlaceable[FirstBaseline ]
1476+ } else {
1477+ AlignmentLine .Unspecified
1478+ }
1479+ measure.measuredHasBaseline = baseline != AlignmentLine .Unspecified
1480+ measure.measuredBaseline = baseline
1481+ lastMeasures.getOrPut(measurable, { arrayOf(0 , 0 , AlignmentLine .Unspecified ) })
1482+ .copyFrom(measure)
14511483
14521484 measure.measuredNeedsSolverPass = measure.measuredWidth != measure.horizontalDimension ||
14531485 measure.measuredHeight != measure.verticalDimension
@@ -1480,10 +1512,10 @@ internal open class Measurer : BasicMeasure.Measurer, DesignInfoProvider {
14801512 }
14811513 MATCH_CONSTRAINT -> {
14821514 if (DEBUG ) {
1483- Log .d(" CCL2 " , " Measure strategy ${measureStrategy} " )
1484- Log .d(" CCL2 " , " DW ${matchConstraintDefaultDimension} " )
1485- Log .d(" CCL2 " , " ODR ${otherDimensionResolved} " )
1486- Log .d(" CCL2 " , " IRH ${currentDimensionResolved} " )
1515+ Log .d(" CCL " , " Measure strategy ${measureStrategy} " )
1516+ Log .d(" CCL " , " DW ${matchConstraintDefaultDimension} " )
1517+ Log .d(" CCL " , " ODR ${otherDimensionResolved} " )
1518+ Log .d(" CCL " , " IRH ${currentDimensionResolved} " )
14871519 }
14881520 val useDimension = currentDimensionResolved ||
14891521 (measureStrategy == TRY_GIVEN_DIMENSIONS ||
0 commit comments