From 3a2191ee43691acb229e36dc29de611580a6e883 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Fri, 5 Jan 2024 13:40:25 +0100 Subject: [PATCH] Use `SubcomposeLayout` for `ContentAvoidingLayout` (#2171) Use `SubcomposeLayout` for `ContentAvoidingLayout` --- changelog.d/2155.bugfix | 1 + .../components/layout/ContentAvoidingLayout.kt | 14 +++++--------- 2 files changed, 6 insertions(+), 9 deletions(-) create mode 100644 changelog.d/2155.bugfix diff --git a/changelog.d/2155.bugfix b/changelog.d/2155.bugfix new file mode 100644 index 0000000000..cc868cdaee --- /dev/null +++ b/changelog.d/2155.bugfix @@ -0,0 +1 @@ +Use `SubomposeLayout` for `ContentAvoidingLayout` to prevent wrong measurements in the layout process, leading to cut-off text messages in the timeline. diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/layout/ContentAvoidingLayout.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/layout/ContentAvoidingLayout.kt index c09221000f..2ed094c7a4 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/layout/ContentAvoidingLayout.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/layout/ContentAvoidingLayout.kt @@ -21,6 +21,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.layout.Layout +import androidx.compose.ui.layout.SubcomposeLayout import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.text.TextLayoutResult import androidx.compose.ui.unit.Constraints @@ -58,23 +59,18 @@ fun ContentAvoidingLayout( ) { val scope = remember { ContentAvoidingLayoutScopeInstance() } - Layout( + SubcomposeLayout( modifier = modifier, - content = { - scope.content() - overlay() - } - ) { measurables, constraints -> - assert(measurables.size == 2) { "ContentAvoidingLayout must have exactly 2 children" } + ) { constraints -> // Measure the `overlay` view first, in case we need to shrink the `content` - val overlayPlaceable = measurables.last().measure(Constraints(minWidth = 0, maxWidth = constraints.maxWidth)) + val overlayPlaceable = subcompose(0, overlay).first().measure(Constraints(minWidth = 0, maxWidth = constraints.maxWidth)) val contentConstraints = if (shrinkContent) { Constraints(minWidth = 0, maxWidth = constraints.maxWidth - overlayPlaceable.width) } else { Constraints(minWidth = 0, maxWidth = constraints.maxWidth) } - val contentPlaceable = measurables.first().measure(contentConstraints) + val contentPlaceable = subcompose(1) { scope.content() }.first().measure(contentConstraints) var layoutWidth = contentPlaceable.width var layoutHeight = contentPlaceable.height