Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db41a304 authored by Jordan Demeulenaere's avatar Jordan Demeulenaere
Browse files

Propagate min size constraints in (Movable)Element

This CL ensures that we correctly propagate the min size constraints in
(Movable)Element. Otherwise, the size computed by the Modifier.element()
in those (Movable)Elements during transitions will be ignored.

Bug: 353679003
Test: atest ElementTest
Flag: com.android.systemui.scene_container
Change-Id: Ic7aa972a63bd46dc034ca427c96c1d31698a4484
parent de8d634c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ internal fun Element(
    modifier: Modifier,
    content: @Composable ElementScope<ElementContentScope>.() -> Unit,
) {
    Box(modifier.element(layoutImpl, sceneOrOverlay, key)) {
    Box(modifier.element(layoutImpl, sceneOrOverlay, key), propagateMinConstraints = true) {
        val contentScope = sceneOrOverlay.scope
        val boxScope = this
        val elementScope =
@@ -64,7 +64,7 @@ internal fun MovableElement(
            "MovableElementKey($elementName).contentPicker.contents does not contain $contentName"
    }

    Box(modifier.element(layoutImpl, sceneOrOverlay, key)) {
    Box(modifier.element(layoutImpl, sceneOrOverlay, key), propagateMinConstraints = true) {
        val contentScope = sceneOrOverlay.scope
        val boxScope = this
        val elementScope =
+31 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsNotDisplayed
import androidx.compose.ui.test.assertPositionInRootIsEqualTo
import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
import androidx.compose.ui.test.hasParent
import androidx.compose.ui.test.hasTestTag
import androidx.compose.ui.test.hasText
import androidx.compose.ui.test.junit4.createComposeRule
@@ -2488,4 +2489,34 @@ class ElementTest {
        rule.waitForIdle()
        return layoutImpl
    }

    @Test
    fun elementComposableShouldPropagateMinConstraints() {
        val contentTestTag = "content"
        val movable = MovableElementKey("movable", contents = setOf(SceneA))
        rule.setContent {
            TestContentScope(currentScene = SceneA) {
                Column {
                    Element(TestElements.Foo, Modifier.size(40.dp)) {
                        content {
                            // Modifier.size() sets a preferred size and this should be ignored
                            // because of the previously set 40dp size.
                            Box(Modifier.testTag(contentTestTag).size(20.dp))
                        }
                    }

                    MovableElement(movable, Modifier.size(40.dp)) {
                        content { Box(Modifier.testTag(contentTestTag).size(20.dp)) }
                    }
                }
            }
        }

        rule
            .onNode(hasTestTag(contentTestTag) and hasParent(isElement(TestElements.Foo)))
            .assertSizeIsEqualTo(40.dp)
        rule
            .onNode(hasTestTag(contentTestTag) and hasParent(isElement(movable)))
            .assertSizeIsEqualTo(40.dp)
    }
}
+8 −4
Original line number Diff line number Diff line
@@ -309,12 +309,14 @@ class MovableElementTest {
            TestContentScope {
                Element(TestElements.Foo, Modifier.size(200.dp)) {
                    content {
                        Box {
                            Box(Modifier.testTag("bottomEnd").align(Alignment.BottomEnd))
                            Box(Modifier.testTag("matchParentSize").matchParentSize())
                        }
                    }
                }
            }
        }

        rule.onNodeWithTag("bottomEnd").assertPositionInRootIsEqualTo(200.dp, 200.dp)
        rule.onNodeWithTag("matchParentSize").assertSizeIsEqualTo(200.dp, 200.dp)
@@ -327,12 +329,14 @@ class MovableElementTest {
            TestContentScope(currentScene = SceneA) {
                MovableElement(key, Modifier.size(200.dp)) {
                    content {
                        Box {
                            Box(Modifier.testTag("bottomEnd").align(Alignment.BottomEnd))
                            Box(Modifier.testTag("matchParentSize").matchParentSize())
                        }
                    }
                }
            }
        }

        rule.onNodeWithTag("bottomEnd").assertPositionInRootIsEqualTo(200.dp, 200.dp)
        rule.onNodeWithTag("matchParentSize").assertSizeIsEqualTo(200.dp, 200.dp)