diff options
| author | 2025-02-11 04:35:06 -0800 | |
|---|---|---|
| committer | 2025-02-11 04:35:06 -0800 | |
| commit | a110f901878fd45527eaca330d39c329b58112ca (patch) | |
| tree | 8275cd6520e92adb12d00e9ec3891d3acfbaae47 | |
| parent | 9f528d89e741651165b91b17ae84859fa96a9fd2 (diff) | |
| parent | 92efbbfc1d010709caf996e2048e0256a26d7751 (diff) | |
Merge "Don't implicitly add test tags to all elements and scenes (1/2)" into main
14 files changed, 53 insertions, 36 deletions
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt index fad8ae7e3ba2..2f38dc2a825e 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt @@ -24,6 +24,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import com.android.compose.animation.scene.ContentScope import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.UserAction @@ -102,6 +103,8 @@ private fun ContentScope.BouncerScene( viewModel, dialogFactory, Modifier.element(Bouncer.Elements.Content) + // TODO(b/393516240): Use the same sysuiResTag() as views instead. + .testTag(Bouncer.Elements.Content.testTag) .overscroll(verticalOverscrollEffect) .sysuiResTag(Bouncer.TestTags.Root) .fillMaxSize(), diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt index 5e61af634bbc..aa07370aa9cf 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt @@ -19,6 +19,7 @@ package com.android.systemui.keyguard.ui.composable import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import com.android.compose.animation.scene.ContentScope import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult @@ -55,7 +56,11 @@ constructor( @Composable override fun ContentScope.Content(modifier: Modifier) { - LockscreenScene(lockscreenContent = lockscreenContent, modifier = modifier) + LockscreenScene( + lockscreenContent = lockscreenContent, + // TODO(b/393516240): Use the same sysuiResTag() as views instead. + modifier = modifier.testTag(key.rootElementKey.testTag), + ) } } diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt index 907b5bc2143a..05958a212f47 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt @@ -169,7 +169,7 @@ internal fun Modifier.element( Modifier.maybeElevateInContent(layoutImpl, content, key, currentTransitionStates) } .then(ElementModifier(layoutImpl, currentTransitionStates, content, key)) - .testTag(key.testTag) + .thenIf(layoutImpl.implicitTestTags) { Modifier.testTag(key.testTag) } } /** diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt index 72bb82bd41bb..d47210cfc428 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt @@ -65,6 +65,8 @@ fun SceneTransitionLayout( swipeSourceDetector: SwipeSourceDetector = DefaultEdgeDetector, swipeDetector: SwipeDetector = DefaultSwipeDetector, @FloatRange(from = 0.0, to = 0.5) transitionInterceptionThreshold: Float = 0.05f, + // TODO(b/240432457) Remove this once test utils can access the internal STLForTesting(). + implicitTestTags: Boolean = false, builder: SceneTransitionLayoutScope<ContentScope>.() -> Unit, ) { SceneTransitionLayoutForTesting( @@ -73,6 +75,7 @@ fun SceneTransitionLayout( swipeSourceDetector, swipeDetector, transitionInterceptionThreshold, + implicitTestTags = implicitTestTags, onLayoutImpl = null, builder = builder, ) @@ -725,10 +728,8 @@ class FixedDistance(private val distance: Dp) : UserActionDistance { } /** - * An internal version of [SceneTransitionLayout] to be used for tests. - * - * Important: You should use this only in tests and if you need to access the underlying - * [SceneTransitionLayoutImpl]. In other cases, you should use [SceneTransitionLayout]. + * An internal version of [SceneTransitionLayout] to be used for tests, that provides access to the + * internal [SceneTransitionLayoutImpl] and implicitly tags all scenes and elements. */ @Composable internal fun SceneTransitionLayoutForTesting( @@ -741,6 +742,7 @@ internal fun SceneTransitionLayoutForTesting( sharedElementMap: MutableMap<ElementKey, Element> = remember { mutableMapOf() }, ancestors: List<Ancestor> = remember { emptyList() }, lookaheadScope: LookaheadScope? = null, + implicitTestTags: Boolean = true, builder: SceneTransitionLayoutScope<InternalContentScope>.() -> Unit, ) { val density = LocalDensity.current @@ -765,6 +767,7 @@ internal fun SceneTransitionLayoutForTesting( directionChangeSlop = directionChangeSlop, defaultEffectFactory = defaultEffectFactory, decayAnimationSpec = decayAnimationSpec, + implicitTestTags = implicitTestTags, ) .also { onLayoutImpl?.invoke(it) } } diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt index 53996d25afdb..e3c4eb0f8bea 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt @@ -122,6 +122,9 @@ internal class SceneTransitionLayoutImpl( * This is used to enable transformations and shared elements across NestedSTLs. */ internal val ancestors: List<Ancestor> = emptyList(), + + /** Whether elements and scene should be tagged using `Modifier.testTag`. */ + internal val implicitTestTags: Boolean = false, lookaheadScope: LookaheadScope? = null, defaultEffectFactory: OverscrollFactory, ) { diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt index 95d6440d585e..64cfe38d3dd5 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt @@ -171,7 +171,7 @@ internal sealed class Content( .thenIf(layoutImpl.state.isElevationPossible(content = key, element = null)) { Modifier.container(containerState) } - .testTag(key.testTag) + .thenIf(layoutImpl.implicitTestTags) { Modifier.testTag(key.testTag) } ) { CompositionLocalProvider(LocalOverscrollFactory provides lastFactory) { scope.content() @@ -290,6 +290,7 @@ internal class ContentScopeImpl( sharedElementMap = layoutImpl.elements, ancestors = ancestors, lookaheadScope = layoutImpl.lookaheadScope, + implicitTestTags = layoutImpl.implicitTestTags, ) } } diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt index f625add0648b..fa10f66ab5a2 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt @@ -227,7 +227,7 @@ class ElementTest { to = SceneB, transitionLayout = { state -> coroutineScope = rememberCoroutineScope() - SceneTransitionLayout(state) { + SceneTransitionLayoutForTesting(state) { scene(SceneA) { Box(Modifier.size(layoutSize)) { // Transformed element @@ -633,7 +633,7 @@ class ElementTest { val scope = rule.setContentAndCreateMainScope { - SceneTransitionLayout(state) { + SceneTransitionLayoutForTesting(state) { scene(SceneA) { Box(Modifier.element(TestElements.Foo).size(20.dp)) } scene(SceneB) {} } @@ -674,7 +674,7 @@ class ElementTest { CompositionLocalProvider( LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory() ) { - SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) { + SceneTransitionLayoutForTesting(state, Modifier.size(layoutWidth, layoutHeight)) { scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) { Spacer(Modifier.fillMaxSize()) } @@ -734,7 +734,7 @@ class ElementTest { CompositionLocalProvider( LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory() ) { - SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) { + SceneTransitionLayoutForTesting(state, Modifier.size(layoutWidth, layoutHeight)) { scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) { Spacer( Modifier.overscroll(verticalOverscrollEffect) @@ -834,7 +834,7 @@ class ElementTest { CompositionLocalProvider( LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory() ) { - SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) { + SceneTransitionLayoutForTesting(state, Modifier.size(layoutWidth, layoutHeight)) { scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) { Spacer(Modifier.fillMaxSize()) } @@ -893,7 +893,7 @@ class ElementTest { CompositionLocalProvider( LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory() ) { - SceneTransitionLayout( + SceneTransitionLayoutForTesting( state = state, modifier = Modifier.size(layoutWidth, layoutHeight), ) { @@ -970,7 +970,7 @@ class ElementTest { rule.setContent { touchSlop = LocalViewConfiguration.current.touchSlop - SceneTransitionLayout( + SceneTransitionLayoutForTesting( state = state, modifier = Modifier.size(layoutWidth, layoutHeight), ) { @@ -1057,7 +1057,7 @@ class ElementTest { rule.setContent { coroutineScope = rememberCoroutineScope() - SceneTransitionLayout(state) { + SceneTransitionLayoutForTesting(state) { scene(SceneA) { Box(Modifier.size(layoutSize)) { Box( @@ -1374,7 +1374,7 @@ class ElementTest { val scope = rule.setContentAndCreateMainScope { - SceneTransitionLayout(state, Modifier.size(layoutSize)) { + SceneTransitionLayoutForTesting(state, Modifier.size(layoutSize)) { scene(SceneA) { Box(Modifier.fillMaxSize()) { Foo(Modifier.align(Alignment.TopStart)) } } @@ -1742,7 +1742,7 @@ class ElementTest { val scope = rule.setContentAndCreateMainScope { - SceneTransitionLayout(state, Modifier.size(200.dp)) { + SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) { scene(SceneA) { Foo(offset = 0.dp) } scene(SceneB) { Foo(offset = 20.dp) } scene(SceneC) { Foo(offset = 40.dp) } @@ -1828,7 +1828,7 @@ class ElementTest { val scope = rule.setContentAndCreateMainScope { - SceneTransitionLayout(state) { + SceneTransitionLayoutForTesting(state) { scene(SceneB) { Foo(Modifier.offset(40.dp, 60.dp)) } // Define A after B so that Foo is placed in A during A <=> B. @@ -1887,7 +1887,7 @@ class ElementTest { val scope = rule.setContentAndCreateMainScope { - SceneTransitionLayout(state) { + SceneTransitionLayoutForTesting(state) { scene(SceneA) { Foo() } scene(SceneB) { Foo(Modifier.offset(40.dp, 60.dp)) } } diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt index 04c762f43907..98ecb644878b 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt @@ -90,7 +90,7 @@ class OverlayTest { lateinit var coroutineScope: CoroutineScope rule.setContent { coroutineScope = rememberCoroutineScope() - SceneTransitionLayout(state, Modifier.size(200.dp)) { + SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) { scene(SceneA) { Box(Modifier.fillMaxSize()) { Foo() } } overlay(OverlayA) { Foo() } } @@ -132,7 +132,7 @@ class OverlayTest { lateinit var coroutineScope: CoroutineScope rule.setContent { coroutineScope = rememberCoroutineScope() - SceneTransitionLayout(state, Modifier.size(200.dp)) { + SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) { scene(SceneA) { Box(Modifier.fillMaxSize()) { Foo() } } overlay(OverlayA) { Foo() } overlay(OverlayB) { Foo() } @@ -230,7 +230,7 @@ class OverlayTest { lateinit var coroutineScope: CoroutineScope rule.setContent { coroutineScope = rememberCoroutineScope() - SceneTransitionLayout(state, Modifier.size(200.dp)) { + SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) { scene(SceneA) { Box(Modifier.fillMaxSize()) { MovableBar() } } overlay(OverlayA) { MovableBar() } overlay(OverlayB) { MovableBar() } @@ -302,7 +302,7 @@ class OverlayTest { } var alignment by mutableStateOf(Alignment.Center) rule.setContent { - SceneTransitionLayout(state, Modifier.size(200.dp)) { + SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) { scene(SceneA) { Box(Modifier.fillMaxSize()) { Foo() } } overlay(OverlayA, alignment = alignment) { Foo() } } @@ -761,7 +761,7 @@ class OverlayTest { val movableElementChildTag = "movableElementChildTag" val scope = rule.setContentAndCreateMainScope { - SceneTransitionLayout(state) { + SceneTransitionLayoutForTesting(state) { scene(SceneA) { MovableElement(key, Modifier) { content { Box(Modifier.testTag(movableElementChildTag).size(100.dp)) } diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/PredictiveBackHandlerTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/PredictiveBackHandlerTest.kt index 2bf235846b32..366b11d9fabd 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/PredictiveBackHandlerTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/PredictiveBackHandlerTest.kt @@ -250,7 +250,7 @@ class PredictiveBackHandlerTest { } rule.setContent { - SceneTransitionLayout(state, Modifier.size(200.dp)) { + SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) { scene(SceneA) { Box(Modifier.fillMaxSize()) } overlay(OverlayA) { Box(Modifier.fillMaxSize()) } overlay(OverlayB) { Box(Modifier.fillMaxSize()) } diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt index 3c490ae614a3..c877d99a77d3 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt @@ -97,7 +97,7 @@ class SceneTransitionLayoutTest { MutableSceneTransitionLayoutStateForTests(SceneA, EmptyTestTransitions) } - SceneTransitionLayout(state = layoutState, modifier = Modifier.size(LayoutSize)) { + SceneTransitionLayoutForTesting(state = layoutState, modifier = Modifier.size(LayoutSize)) { scene(SceneA, userActions = mapOf(Back to SceneB)) { Box(Modifier.fillMaxSize()) { SharedFoo(size = 50.dp, childOffset = 0.dp, Modifier.align(Alignment.TopEnd)) diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt index 751b31481e3a..11abbbec79bf 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt @@ -763,7 +763,7 @@ class SwipeToSceneTest { var touchSlop = 0f rule.setContent { touchSlop = LocalViewConfiguration.current.touchSlop - SceneTransitionLayout(state, Modifier.size(layoutSize)) { + SceneTransitionLayoutForTesting(state, Modifier.size(layoutSize)) { scene(SceneA, userActions = mapOf(Swipe.Start to SceneB, Swipe.End to SceneC)) { Box(Modifier.fillMaxSize()) } @@ -837,7 +837,7 @@ class SwipeToSceneTest { rule.setContent { touchSlop = LocalViewConfiguration.current.touchSlop CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) { - SceneTransitionLayout(state, Modifier.size(layoutSize)) { + SceneTransitionLayoutForTesting(state, Modifier.size(layoutSize)) { scene(SceneA, userActions = mapOf(Swipe.Start to SceneB, Swipe.End to SceneC)) { Box(Modifier.fillMaxSize()) } diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/NestedElementTransformationTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/NestedElementTransformationTest.kt index bb511bc27317..8b568928bde0 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/NestedElementTransformationTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/NestedElementTransformationTest.kt @@ -40,7 +40,7 @@ import com.android.compose.animation.scene.MutableSceneTransitionLayoutState import com.android.compose.animation.scene.MutableSceneTransitionLayoutStateForTests import com.android.compose.animation.scene.Scale import com.android.compose.animation.scene.SceneKey -import com.android.compose.animation.scene.SceneTransitionLayout +import com.android.compose.animation.scene.SceneTransitionLayoutForTesting import com.android.compose.animation.scene.SceneTransitions import com.android.compose.animation.scene.TestScenes import com.android.compose.animation.scene.testNestedTransition @@ -114,7 +114,7 @@ class NestedElementTransformationTest { @Composable (states: List<MutableSceneTransitionLayoutState>) -> Unit = { states -> - SceneTransitionLayout(states[0]) { + SceneTransitionLayoutForTesting(states[0]) { scene(TestScenes.SceneA, content = { TestElement(elementVariant0A) }) scene( TestScenes.SceneB, diff --git a/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestContentScope.kt b/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestContentScope.kt index 6d47babd716a..e56d1bed4c25 100644 --- a/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestContentScope.kt +++ b/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestContentScope.kt @@ -30,5 +30,7 @@ fun TestContentScope( content: @Composable ContentScope.() -> Unit, ) { val state = rememberMutableSceneTransitionLayoutState(currentScene) - SceneTransitionLayout(state, modifier) { scene(currentScene, content = content) } + SceneTransitionLayout(state, modifier, implicitTestTags = true) { + scene(currentScene, content = content) + } } diff --git a/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestTransition.kt b/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestTransition.kt index f94a7ed77341..a362a370328a 100644 --- a/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestTransition.kt +++ b/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestTransition.kt @@ -137,7 +137,7 @@ fun ComposeContentTestRule.testTransition( }, changeState = changeState, transitionLayout = { state -> - SceneTransitionLayout(state, layoutModifier) { + SceneTransitionLayout(state, layoutModifier, implicitTestTags = true) { scene(fromScene, content = fromSceneContent) scene(toScene, content = toSceneContent) } @@ -163,7 +163,7 @@ fun ComposeContentTestRule.testShowOverlayTransition( ) }, transitionLayout = { state -> - SceneTransitionLayout(state) { + SceneTransitionLayout(state, implicitTestTags = true) { scene(fromScene) { fromSceneContent() } overlay(overlay) { overlayContent() } } @@ -191,7 +191,7 @@ fun ComposeContentTestRule.testHideOverlayTransition( ) }, transitionLayout = { state -> - SceneTransitionLayout(state) { + SceneTransitionLayout(state, implicitTestTags = true) { scene(toScene) { toSceneContent() } overlay(overlay) { overlayContent() } } @@ -223,7 +223,7 @@ fun ComposeContentTestRule.testReplaceOverlayTransition( ) }, transitionLayout = { state -> - SceneTransitionLayout(state) { + SceneTransitionLayout(state, implicitTestTags = true) { scene(currentScene) { currentSceneContent() } overlay(from, alignment = fromAlignment) { fromContent() } overlay(to, alignment = toAlignment) { toContent() } @@ -273,7 +273,7 @@ fun MotionTestRule<ComposeToolkit>.recordTransition( } } - SceneTransitionLayout(state, layoutModifier) { + SceneTransitionLayout(state, layoutModifier, implicitTestTags = true) { scene(fromScene, content = fromSceneContent) scene(toScene, content = toSceneContent) } |