@@ -885,6 +885,10 @@ class ConstrainScope internal constructor(internal val id: Any) {
885
885
// TODO(popam, b/158069248): add parameter for gone margin
886
886
fun linkTo (anchor : ConstraintLayoutBaseScope .BaselineAnchor , margin : Dp = 0.dp) {
887
887
tasks.add { state ->
888
+ (state as ? State )?.let {
889
+ it.baselineNeededFor(id)
890
+ it.baselineNeededFor(anchor.id)
891
+ }
888
892
with (state.constraints(id)) {
889
893
baselineAnchorFunction.invoke(this , anchor.id).margin(margin)
890
894
}
@@ -1290,6 +1294,9 @@ fun ConstraintSet(description: ConstraintSetScope.() -> Unit) = object : Constra
1290
1294
class State (val density : Density ) : SolverState() {
1291
1295
var rootIncomingConstraints: Constraints = Constraints ()
1292
1296
lateinit var layoutDirection: LayoutDirection
1297
+ internal val baselineNeeded = mutableListOf<Any >()
1298
+ private var dirtyBaselineNeededWidgets = true
1299
+ private val baselineNeededWidgets = mutableSetOf<ConstraintWidget >()
1293
1300
1294
1301
override fun convertDimension (value : Any? ): Int {
1295
1302
return if (value is Dp ) {
@@ -1306,9 +1313,28 @@ class State(val density: Density) : SolverState() {
1306
1313
}
1307
1314
mReferences.clear()
1308
1315
mReferences[PARENT ] = mParent
1316
+ baselineNeeded.clear()
1317
+ dirtyBaselineNeededWidgets = true
1309
1318
super .reset()
1310
1319
}
1311
1320
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
+
1312
1338
internal fun getKeyId (helperWidget : HelperWidget ): Any? {
1313
1339
return mHelperReferences.entries.firstOrNull { it.value.helperWidget == helperWidget }?.key
1314
1340
}
@@ -1444,10 +1470,16 @@ internal open class Measurer : BasicMeasure.Measurer, DesignInfoProvider {
1444
1470
val currentPlaceable = placeables[measurable]
1445
1471
measure.measuredWidth = currentPlaceable?.width ? : constraintWidget.width
1446
1472
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)
1451
1483
1452
1484
measure.measuredNeedsSolverPass = measure.measuredWidth != measure.horizontalDimension ||
1453
1485
measure.measuredHeight != measure.verticalDimension
@@ -1480,10 +1512,10 @@ internal open class Measurer : BasicMeasure.Measurer, DesignInfoProvider {
1480
1512
}
1481
1513
MATCH_CONSTRAINT -> {
1482
1514
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} " )
1487
1519
}
1488
1520
val useDimension = currentDimensionResolved ||
1489
1521
(measureStrategy == TRY_GIVEN_DIMENSIONS ||
0 commit comments