Merge "Revert "Fixed bug having to do with Row/Column not having the right intrinsic settings"" into androidx-main
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/RowColumnModifierTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/RowColumnModifierTest.kt
index 2a853de..e213172 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/RowColumnModifierTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/RowColumnModifierTest.kt
@@ -16,33 +16,20 @@
package androidx.compose.foundation.layout
-import androidx.compose.foundation.background
-import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.layout.IntrinsicMeasurable
-import androidx.compose.ui.layout.IntrinsicMeasureScope
-import androidx.compose.ui.layout.Layout
-import androidx.compose.ui.layout.Measurable
-import androidx.compose.ui.layout.MeasurePolicy
-import androidx.compose.ui.layout.MeasureResult
-import androidx.compose.ui.layout.MeasureScope
import androidx.compose.ui.layout.Measured
import androidx.compose.ui.layout.onPlaced
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.layout.positionInParent
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.unit.dp
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.google.common.truth.Truth
-import kotlin.math.ceil
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -231,170 +218,6 @@
}
}
- @OptIn(ExperimentalLayoutApi::class)
- @Test
- fun testRow_correctlyCalculatesIntrinsicCrossAxis() {
- var totalFakeTextPlaced = 0
-
- rule.setContent {
- Row(Modifier.width(200.dp).background(Color.Green).height(IntrinsicSize.Max)) {
- Box(modifier = Modifier.size(24.dp).background(Color.Blue))
-
- Column(Modifier.wrapContentHeight()) {
- FakeText(modifier = Modifier.onPlaced { totalFakeTextPlaced++ }, text = "Text")
- FlowRow(Modifier) {
- FakeText(
- modifier = Modifier.onPlaced { totalFakeTextPlaced++ },
- text = "Really long text 1"
- )
- FakeText(
- modifier = Modifier.onPlaced { totalFakeTextPlaced++ },
- text = "Really long text 2"
- )
- }
- }
-
- Box(modifier = Modifier.width(120.dp).height(60.dp).background(Color.Red))
- }
- }
-
- rule.runOnIdle { Truth.assertThat(totalFakeTextPlaced).isEqualTo(3) }
- }
-
- @OptIn(ExperimentalLayoutApi::class)
- @Test
- fun testColumn_correctlyCalculatesIntrinsicCrossAxis() {
- var totalFakeTextPlaced = 0
- val forRow = false
- rule.setContent {
- Column(Modifier.height(176.dp).background(Color.Green).width(IntrinsicSize.Max)) {
- Row(Modifier.wrapContentWidth()) {
- FakeText(
- modifier = Modifier.onPlaced { totalFakeTextPlaced++ },
- text = "Text",
- forRow
- )
- FlowColumn(Modifier) {
- FakeText(
- modifier = Modifier.onPlaced { totalFakeTextPlaced++ },
- text = "Really long text 1",
- forRow
- )
- FakeText(
- modifier = Modifier.onPlaced { totalFakeTextPlaced++ },
- text = "Really long text 2",
- forRow
- )
- }
- }
-
- Box(modifier = Modifier.width(60.dp).height(120.dp).background(Color.Red))
- }
- }
-
- rule.runOnIdle { Truth.assertThat(totalFakeTextPlaced).isEqualTo(3) }
- }
-
- /**
- * @param forRow creates the bug setting for row. Otherwise, make it work for Column by laying
- * out the text top to bottom.
- */
- @Composable
- fun FakeText(modifier: Modifier = Modifier, text: String, forRow: Boolean = true) {
- val characterSizeMainAxis = 8.dp
- val textCrossAxisSize = 30.dp
-
- val maxIntrinsicMainAxisSize = (characterSizeMainAxis * text.length)
- val orientation = if (forRow) LayoutOrientation.Horizontal else LayoutOrientation.Vertical
- Layout(
- content = {},
- modifier = modifier,
- measurePolicy =
- object : MeasurePolicy {
- override fun MeasureScope.measure(
- measurables: List<Measurable>,
- constraints: Constraints
- ): MeasureResult {
- val constraintsIndependent =
- OrientationIndependentConstraints(constraints, orientation)
- val maxMainAxis = constraintsIndependent.mainAxisMax
- val lengthNeeded = text.length * characterSizeMainAxis.roundToPx()
- val crossAxis = getCrossAxisNeeded(maxMainAxis)
- val mainAxis = lengthNeeded.coerceAtMost(maxMainAxis)
-
- var width: Int
- var height: Int
- if (forRow) {
- width = mainAxis
- height = crossAxis
- } else {
- width = crossAxis
- height = mainAxis
- }
-
- return layout(width, height) {
- measurables.forEach { measurable ->
- val placeable = measurable.measure(constraints)
- placeable.place(0, 0)
- }
- }
- }
-
- override fun IntrinsicMeasureScope.maxIntrinsicHeight(
- measurables: List<IntrinsicMeasurable>,
- width: Int
- ): Int {
- return if (forRow) {
- getCrossAxisNeeded(width)
- } else {
- maxIntrinsicMainAxisSize.roundToPx()
- }
- }
-
- override fun IntrinsicMeasureScope.maxIntrinsicWidth(
- measurables: List<IntrinsicMeasurable>,
- height: Int
- ): Int {
- return if (forRow) {
- maxIntrinsicMainAxisSize.roundToPx()
- } else {
- getCrossAxisNeeded(height)
- }
- }
-
- override fun IntrinsicMeasureScope.minIntrinsicHeight(
- measurables: List<IntrinsicMeasurable>,
- width: Int
- ): Int {
- return if (forRow) {
- getCrossAxisNeeded(width)
- } else {
- characterSizeMainAxis.roundToPx()
- }
- }
-
- override fun IntrinsicMeasureScope.minIntrinsicWidth(
- measurables: List<IntrinsicMeasurable>,
- height: Int
- ): Int {
- return if (forRow) {
- characterSizeMainAxis.roundToPx()
- } else {
- getCrossAxisNeeded(height)
- }
- }
-
- private fun IntrinsicMeasureScope.getCrossAxisNeeded(mainAxisSize: Int): Int {
- val lengthNeeded = text.length * characterSizeMainAxis.roundToPx()
- val noOfLines =
- if (mainAxisSize == Constraints.Infinity) 1
- else ceil((lengthNeeded.toFloat() / mainAxisSize).toDouble()).toInt()
- return (textCrossAxisSize.roundToPx() * noOfLines)
- }
- }
- )
- }
-
@Test
fun testColumn_updatesOnAlignmentChange() {
var positionInParentX = 0f
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
index 64c786f..5f82c58 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
@@ -376,7 +376,7 @@
): Int {
return intrinsicCrossAxisSize(
measurables,
- { w -> minIntrinsicHeight(w) },
+ { w -> maxIntrinsicHeight(w) },
{ h -> maxIntrinsicWidth(h) },
availableHeight,
mainAxisSpacing,
@@ -390,7 +390,7 @@
): Int {
return intrinsicCrossAxisSize(
measurables,
- { h -> minIntrinsicWidth(h) },
+ { h -> maxIntrinsicWidth(h) },
{ w -> maxIntrinsicHeight(w) },
availableWidth,
mainAxisSpacing,