Skip to content
This repository was archived by the owner on Dec 27, 2024. It is now read-only.

Commit 4450b7c

Browse files
authored
Do not query baselines when unused in constraints (#249)
Co-authored-by: Mihai Popa <[email protected]>
1 parent 3380d9a commit 4450b7c

File tree

1 file changed

+40
-8
lines changed

1 file changed

+40
-8
lines changed

constraintlayout/compose/src/main/java/androidx/constraintlayout/compose/ConstraintLayout.kt

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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
12901294
class 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

Comments
 (0)