diff options
-rw-r--r-- | packages/SystemUI/Android.bp | 1 | ||||
-rw-r--r-- | packages/SystemUI/compose/features/Android.bp | 1 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/Android.bp | 39 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/AndroidManifest.xml | 22 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/OWNERS | 13 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/TEST_MAPPING | 48 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/AnimateSharedAsState.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/AnimateSharedAsState.kt) | 84 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/AnimateToScene.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/AnimateToScene.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/Element.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ElementMatcher.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/ElementMatcher.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Key.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/Key.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MovableElement.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/MovableElement.kt) | 26 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ObservableTransitionState.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/ObservableTransitionState.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Scene.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/Scene.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitionLayout.kt) | 11 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitions.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitions.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SwipeToScene.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/TransitionDsl.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDslImpl.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/TransitionDslImpl.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/AnchoredSize.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/AnchoredSize.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/AnchoredTranslate.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/AnchoredTranslate.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/EdgeTranslate.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/EdgeTranslate.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/Fade.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/Fade.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/PunchHole.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/PunchHole.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/ScaleSize.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/ScaleSize.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/Transformation.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/Transformation.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/Translate.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/Translate.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/grid/Grids.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/grid/Grids.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/modifiers/ConditionalModifiers.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/modifiers/ConditionalModifiers.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityPostNestedScrollConnection.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/nestedscroll/PriorityPostNestedScrollConnection.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/ui/util/ListUtils.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/ui/util/ListUtils.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/src/com/android/compose/ui/util/MathHelpers.kt (renamed from packages/SystemUI/compose/core/src/com/android/compose/ui/util/MathHelpers.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/Android.bp | 50 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/AndroidManifest.xml | 28 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/AnimatedSharedAsStateTest.kt | 218 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MovableElementTest.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/MovableElementTest.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ObservableTransitionStateTest.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/ObservableTransitionStateTest.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/TestTransition.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/TestTransition.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/TestValues.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/TestValues.kt) | 3 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/TransitionDslTest.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/TransitionDslTest.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/AnchoredSizeTest.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/AnchoredSizeTest.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/AnchoredTranslateTest.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/AnchoredTranslateTest.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/EdgeTranslateTest.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/EdgeTranslateTest.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/ScaleSizeTest.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/ScaleSizeTest.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/SharedElementTest.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/SharedElementTest.kt) | 1 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/TranslateTest.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/TranslateTest.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnectionTest.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnectionTest.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityPostNestedScrollConnectionTest.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/nestedscroll/PriorityPostNestedScrollConnectionTest.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/test/Selectors.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/test/Selectors.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/test/SizeAssertions.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/test/SizeAssertions.kt) | 0 | ||||
-rw-r--r-- | packages/SystemUI/compose/scene/tests/src/com/android/compose/test/subjects/DpOffsetSubject.kt (renamed from packages/SystemUI/compose/core/tests/src/com/android/compose/test/subjects/DpOffsetSubject.kt) | 0 |
56 files changed, 519 insertions, 26 deletions
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index f65f5a3c9297..4f55e8b3bd4e 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -62,6 +62,7 @@ systemui_compose_java_defaults { static_libs: [ "CommunalLayoutLib", "PlatformComposeCore", + "PlatformComposeSceneTransitionLayout", "androidx.compose.runtime_runtime", "androidx.compose.material3_material3", diff --git a/packages/SystemUI/compose/features/Android.bp b/packages/SystemUI/compose/features/Android.bp index e4426fe97859..796abf4b52d6 100644 --- a/packages/SystemUI/compose/features/Android.bp +++ b/packages/SystemUI/compose/features/Android.bp @@ -33,6 +33,7 @@ android_library { static_libs: [ "SystemUI-core", "PlatformComposeCore", + "PlatformComposeSceneTransitionLayout", "androidx.compose.runtime_runtime", "androidx.compose.animation_animation-graphics", diff --git a/packages/SystemUI/compose/scene/Android.bp b/packages/SystemUI/compose/scene/Android.bp new file mode 100644 index 000000000000..050d1d5651ad --- /dev/null +++ b/packages/SystemUI/compose/scene/Android.bp @@ -0,0 +1,39 @@ +// Copyright (C) 2023 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_packages_SystemUI_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_packages_SystemUI_license"], +} + +android_library { + name: "PlatformComposeSceneTransitionLayout", + manifest: "AndroidManifest.xml", + + srcs: [ + "src/**/*.kt", + ], + + static_libs: [ + "androidx.compose.runtime_runtime", + "androidx.compose.material3_material3", + ], + + kotlincflags: ["-Xjvm-default=all"], + use_resource_processor: true, +} diff --git a/packages/SystemUI/compose/scene/AndroidManifest.xml b/packages/SystemUI/compose/scene/AndroidManifest.xml new file mode 100644 index 000000000000..81131bb689e4 --- /dev/null +++ b/packages/SystemUI/compose/scene/AndroidManifest.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2023 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.compose.animation.scene"> + + +</manifest> diff --git a/packages/SystemUI/compose/scene/OWNERS b/packages/SystemUI/compose/scene/OWNERS new file mode 100644 index 000000000000..33a59c2bcab3 --- /dev/null +++ b/packages/SystemUI/compose/scene/OWNERS @@ -0,0 +1,13 @@ +set noparent + +# Bug component: 1184816 + +jdemeulenaere@google.com +omarmt@google.com + +# SysUI Dr No's. +# Don't send reviews here. +dsandler@android.com +cinek@google.com +juliacr@google.com +pixel@google.com
\ No newline at end of file diff --git a/packages/SystemUI/compose/scene/TEST_MAPPING b/packages/SystemUI/compose/scene/TEST_MAPPING new file mode 100644 index 000000000000..f644a23ba0a3 --- /dev/null +++ b/packages/SystemUI/compose/scene/TEST_MAPPING @@ -0,0 +1,48 @@ +{ + "presubmit": [ + { + "name": "PlatformComposeSceneTransitionLayoutTests", + "options": [ + { + "exclude-annotation": "org.junit.Ignore" + }, + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + } + ] + }, + { + "name": "PlatformComposeCoreTests", + "options": [ + { + "exclude-annotation": "org.junit.Ignore" + }, + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + } + ] + }, + { + "name": "SystemUIComposeFeaturesTests", + "options": [ + { + "exclude-annotation": "org.junit.Ignore" + }, + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + } + ] + }, + { + "name": "SystemUIComposeGalleryTests", + "options": [ + { + "exclude-annotation": "org.junit.Ignore" + }, + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + } + ] + } + ] +}
\ No newline at end of file diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/AnimateSharedAsState.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/AnimateSharedAsState.kt index 566967f920d3..041fc48dd09e 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/AnimateSharedAsState.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/AnimateSharedAsState.kt @@ -17,12 +17,10 @@ package com.android.compose.animation.scene import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.DisposableEffectResult -import androidx.compose.runtime.DisposableEffectScope import androidx.compose.runtime.State import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.snapshots.Snapshot import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.lerp import androidx.compose.ui.unit.Dp @@ -45,6 +43,20 @@ fun SceneScope.animateSharedIntAsState( } /** + * Animate a shared Int value. + * + * @see MovableElementScope.animateSharedValueAsState + */ +@Composable +fun MovableElementScope.animateSharedIntAsState( + value: Int, + debugName: String, + canOverflow: Boolean = true, +): State<Int> { + return animateSharedValueAsState(value, debugName, ::lerp, canOverflow) +} + +/** * Animate a shared Float value. * * @see SceneScope.animateSharedValueAsState @@ -60,6 +72,20 @@ fun SceneScope.animateSharedFloatAsState( } /** + * Animate a shared Float value. + * + * @see MovableElementScope.animateSharedValueAsState + */ +@Composable +fun MovableElementScope.animateSharedFloatAsState( + value: Float, + debugName: String, + canOverflow: Boolean = true, +): State<Float> { + return animateSharedValueAsState(value, debugName, ::lerp, canOverflow) +} + +/** * Animate a shared Dp value. * * @see SceneScope.animateSharedValueAsState @@ -75,6 +101,20 @@ fun SceneScope.animateSharedDpAsState( } /** + * Animate a shared Dp value. + * + * @see MovableElementScope.animateSharedValueAsState + */ +@Composable +fun MovableElementScope.animateSharedDpAsState( + value: Dp, + debugName: String, + canOverflow: Boolean = true, +): State<Dp> { + return animateSharedValueAsState(value, debugName, ::lerp, canOverflow) +} + +/** * Animate a shared Color value. * * @see SceneScope.animateSharedValueAsState @@ -88,6 +128,19 @@ fun SceneScope.animateSharedColorAsState( return animateSharedValueAsState(value, key, element, ::lerp, canOverflow = false) } +/** + * Animate a shared Color value. + * + * @see MovableElementScope.animateSharedValueAsState + */ +@Composable +fun MovableElementScope.animateSharedColorAsState( + value: Color, + debugName: String, +): State<Color> { + return animateSharedValueAsState(value, debugName, ::lerp, canOverflow = false) +} + @Composable internal fun <T> animateSharedValueAsState( layoutImpl: SceneTransitionLayoutImpl, @@ -98,33 +151,22 @@ internal fun <T> animateSharedValueAsState( lerp: (T, T, Float) -> T, canOverflow: Boolean, ): State<T> { - val sharedValue = remember(key) { Element.SharedValue(key, value) } + val sharedValue = + Snapshot.withoutReadObservation { + element.sceneValues.getValue(scene.key).sharedValues.getOrPut(key) { + Element.SharedValue(key, value) + } as Element.SharedValue<T> + } + if (value != sharedValue.value) { sharedValue.value = value } - DisposableEffect(element, scene, sharedValue) { - addSharedValueToElement(element, scene, sharedValue) - } - return remember(layoutImpl, element, sharedValue, lerp, canOverflow) { derivedStateOf { computeValue(layoutImpl, element, sharedValue, lerp, canOverflow) } } } -private fun <T> DisposableEffectScope.addSharedValueToElement( - element: Element, - scene: Scene, - sharedValue: Element.SharedValue<T>, -): DisposableEffectResult { - val sceneValues = - element.sceneValues[scene.key] ?: error("Element $element is not present in $scene") - val sharedValues = sceneValues.sharedValues - - sharedValues[sharedValue.key] = sharedValue - return onDispose { sharedValues.remove(sharedValue.key) } -} - private fun <T> computeValue( layoutImpl: SceneTransitionLayoutImpl, element: Element, diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/AnimateToScene.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/AnimateToScene.kt index 88944f10eab9..88944f10eab9 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/AnimateToScene.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/AnimateToScene.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/Element.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt index ce96bbfc7976..ce96bbfc7976 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/Element.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/ElementMatcher.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ElementMatcher.kt index 98dbb67d7c66..98dbb67d7c66 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/ElementMatcher.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ElementMatcher.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/Key.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Key.kt index bc015eedb1b4..bc015eedb1b4 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/Key.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Key.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/MovableElement.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MovableElement.kt index 11bbf2aa987e..6dbeb69ff450 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/MovableElement.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MovableElement.kt @@ -21,6 +21,7 @@ import android.util.Log import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Spacer import androidx.compose.runtime.Composable +import androidx.compose.runtime.State import androidx.compose.runtime.remember import androidx.compose.runtime.snapshots.Snapshot import androidx.compose.ui.Modifier @@ -36,8 +37,6 @@ import androidx.compose.ui.unit.IntSize private const val TAG = "MovableElement" -private object MovableElementScopeImpl : MovableElementScope - @Composable internal fun MovableElement( layoutImpl: SceneTransitionLayoutImpl, @@ -51,6 +50,10 @@ internal fun MovableElement( // every time an element is added/removed from SceneTransitionLayoutImpl.elements, so we // disable read observation during the look-up in that map. val element = Snapshot.withoutReadObservation { layoutImpl.elements.getValue(key) } + val movableElementScope = + remember(layoutImpl, element, scene) { + MovableElementScopeImpl(layoutImpl, element, scene) + } // The [Picture] to which we save the last drawing commands of this element. This is // necessary because the content of this element might not be composed in this scene, in @@ -77,7 +80,7 @@ internal fun MovableElement( } } ) { - element.movableContent { MovableElementScopeImpl.content() } + element.movableContent { movableElementScope.content() } } } else { // If we are not composed, we draw the previous drawing commands at the same size as the @@ -178,3 +181,20 @@ private fun shouldComposeMovableElement( isHighestScene } } + +private class MovableElementScopeImpl( + private val layoutImpl: SceneTransitionLayoutImpl, + private val element: Element, + private val scene: Scene, +) : MovableElementScope { + @Composable + override fun <T> animateSharedValueAsState( + value: T, + debugName: String, + lerp: (start: T, stop: T, fraction: Float) -> T, + canOverflow: Boolean, + ): State<T> { + val key = remember { ValueKey(debugName) } + return animateSharedValueAsState(layoutImpl, scene, element, key, value, lerp, canOverflow) + } +} diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/ObservableTransitionState.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ObservableTransitionState.kt index ccdec6ea8c5e..ccdec6ea8c5e 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/ObservableTransitionState.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ObservableTransitionState.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/Scene.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Scene.kt index 3fd6828fca6b..3fd6828fca6b 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/Scene.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Scene.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitionLayout.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt index 4283c0e61df8..74e66d2a9949 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitionLayout.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt @@ -160,7 +160,16 @@ interface SceneScope { // TODO(b/291053742): Add animateSharedValueAsState(targetValue) without any ValueKey and ElementKey // arguments to allow sharing values inside a movable element. -@ElementDsl interface MovableElementScope +@ElementDsl +interface MovableElementScope { + @Composable + fun <T> animateSharedValueAsState( + value: T, + debugName: String, + lerp: (start: T, stop: T, fraction: Float) -> T, + canOverflow: Boolean, + ): State<T> +} /** An action performed by the user. */ sealed interface UserAction diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt index 4952270cb5f2..4952270cb5f2 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt index 7a21211c3dde..7a21211c3dde 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitions.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitions.kt index 75dcb2e44c13..75dcb2e44c13 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitions.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitions.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SwipeToScene.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt index 1cbfe3057ff0..1cbfe3057ff0 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SwipeToScene.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/TransitionDsl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt index 49669775fedd..49669775fedd 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/TransitionDsl.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/TransitionDslImpl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDslImpl.kt index f1c27178391c..f1c27178391c 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/TransitionDslImpl.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDslImpl.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/AnchoredSize.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/AnchoredSize.kt index 95385d51cb25..95385d51cb25 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/AnchoredSize.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/AnchoredSize.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/AnchoredTranslate.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/AnchoredTranslate.kt index a1d63193bc73..a1d63193bc73 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/AnchoredTranslate.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/AnchoredTranslate.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/EdgeTranslate.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/EdgeTranslate.kt index 840800d838db..840800d838db 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/EdgeTranslate.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/EdgeTranslate.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/Fade.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/Fade.kt index 17032dc288e0..17032dc288e0 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/Fade.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/Fade.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/PunchHole.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/PunchHole.kt index 62d67f03f1d0..62d67f03f1d0 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/PunchHole.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/PunchHole.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/ScaleSize.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/ScaleSize.kt index 233ae597090b..233ae597090b 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/ScaleSize.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/ScaleSize.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/Transformation.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/Transformation.kt index 2ef8d56c6bc6..2ef8d56c6bc6 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/Transformation.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/Transformation.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/Translate.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/Translate.kt index 864b937a3fe0..864b937a3fe0 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/transformation/Translate.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/Translate.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/grid/Grids.kt b/packages/SystemUI/compose/scene/src/com/android/compose/grid/Grids.kt index 27f0948d5377..27f0948d5377 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/grid/Grids.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/grid/Grids.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/modifiers/ConditionalModifiers.kt b/packages/SystemUI/compose/scene/src/com/android/compose/modifiers/ConditionalModifiers.kt index 135a6e4ec4e4..135a6e4ec4e4 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/modifiers/ConditionalModifiers.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/modifiers/ConditionalModifiers.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt index cea8d9a65b43..cea8d9a65b43 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/nestedscroll/PriorityPostNestedScrollConnection.kt b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityPostNestedScrollConnection.kt index 793a9a59405a..793a9a59405a 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/nestedscroll/PriorityPostNestedScrollConnection.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityPostNestedScrollConnection.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/ui/util/ListUtils.kt b/packages/SystemUI/compose/scene/src/com/android/compose/ui/util/ListUtils.kt index 741f00d9f19b..741f00d9f19b 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/ui/util/ListUtils.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/ui/util/ListUtils.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/ui/util/MathHelpers.kt b/packages/SystemUI/compose/scene/src/com/android/compose/ui/util/MathHelpers.kt index eb1a634ff491..eb1a634ff491 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/ui/util/MathHelpers.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/ui/util/MathHelpers.kt diff --git a/packages/SystemUI/compose/scene/tests/Android.bp b/packages/SystemUI/compose/scene/tests/Android.bp new file mode 100644 index 000000000000..b53fae24865c --- /dev/null +++ b/packages/SystemUI/compose/scene/tests/Android.bp @@ -0,0 +1,50 @@ +// Copyright (C) 2023 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_packages_SystemUI_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_packages_SystemUI_license"], +} + +android_test { + name: "PlatformComposeSceneTransitionLayoutTests", + manifest: "AndroidManifest.xml", + test_suites: ["device-tests"], + sdk_version: "current", + certificate: "platform", + + srcs: [ + "src/**/*.kt", + ], + + static_libs: [ + "PlatformComposeSceneTransitionLayout", + + "androidx.test.runner", + "androidx.test.ext.junit", + + "androidx.compose.runtime_runtime", + "androidx.compose.ui_ui-test-junit4", + "androidx.compose.ui_ui-test-manifest", + + "truth", + ], + + kotlincflags: ["-Xjvm-default=all"], + use_resource_processor: true, +} diff --git a/packages/SystemUI/compose/scene/tests/AndroidManifest.xml b/packages/SystemUI/compose/scene/tests/AndroidManifest.xml new file mode 100644 index 000000000000..1a9172ee20e0 --- /dev/null +++ b/packages/SystemUI/compose/scene/tests/AndroidManifest.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2023 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.compose.animation.scene.tests" > + + <application> + <uses-library android:name="android.test.runner" /> + </application> + + <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" + android:targetPackage="com.android.compose.animation.scene.tests" + android:label="Tests for SceneTransitionLayout"/> + +</manifest>
\ No newline at end of file diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/AnimatedSharedAsStateTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/AnimatedSharedAsStateTest.kt new file mode 100644 index 000000000000..7b7695eebd2f --- /dev/null +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/AnimatedSharedAsStateTest.kt @@ -0,0 +1,218 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.compose.animation.scene + +import androidx.compose.animation.core.LinearEasing +import androidx.compose.animation.core.tween +import androidx.compose.foundation.layout.Box +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.lerp +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.lerp +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.compose.ui.util.lerp +import com.google.common.truth.Truth.assertThat +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class AnimatedSharedAsStateTest { + @get:Rule val rule = createComposeRule() + + private data class Values( + val int: Int, + val float: Float, + val dp: Dp, + val color: Color, + ) + + private fun lerp(start: Values, stop: Values, fraction: Float): Values { + return Values( + int = lerp(start.int, stop.int, fraction), + float = lerp(start.float, stop.float, fraction), + dp = lerp(start.dp, stop.dp, fraction), + color = lerp(start.color, stop.color, fraction), + ) + } + + @Composable + private fun SceneScope.Foo( + targetValues: Values, + onCurrentValueChanged: (Values) -> Unit, + ) { + val key = TestElements.Foo + Box(Modifier.element(key)) { + val int by animateSharedIntAsState(targetValues.int, TestValues.Value1, key) + val float by animateSharedFloatAsState(targetValues.float, TestValues.Value2, key) + val dp by animateSharedDpAsState(targetValues.dp, TestValues.Value3, key) + val color by animateSharedColorAsState(targetValues.color, TestValues.Value4, key) + + // Make sure we read the values during composition, so that we recompose and call + // onCurrentValueChanged() with the latest values. + val currentValues = Values(int, float, dp, color) + SideEffect { onCurrentValueChanged(currentValues) } + } + } + + @Composable + private fun SceneScope.MovableFoo( + targetValues: Values, + onCurrentValueChanged: (Values) -> Unit, + ) { + val key = TestElements.Foo + MovableElement(key = key, Modifier) { + val int by + animateSharedIntAsState(targetValues.int, debugName = TestValues.Value1.debugName) + val float by + animateSharedFloatAsState( + targetValues.float, + debugName = TestValues.Value2.debugName + ) + val dp by + animateSharedDpAsState(targetValues.dp, debugName = TestValues.Value3.debugName) + val color by + animateSharedColorAsState( + targetValues.color, + debugName = TestValues.Value4.debugName + ) + + // Make sure we read the values during composition, so that we recompose and call + // onCurrentValueChanged() with the latest values. + val currentValues = Values(int, float, dp, color) + SideEffect { onCurrentValueChanged(currentValues) } + } + } + + @Test + fun animateSharedValues() { + val fromValues = Values(int = 0, float = 0f, dp = 0.dp, color = Color.Red) + val toValues = Values(int = 100, float = 100f, dp = 100.dp, color = Color.Blue) + + var lastValueInFrom = fromValues + var lastValueInTo = toValues + + rule.testTransition( + fromSceneContent = { + Foo(targetValues = fromValues, onCurrentValueChanged = { lastValueInFrom = it }) + }, + toSceneContent = { + Foo(targetValues = toValues, onCurrentValueChanged = { lastValueInTo = it }) + }, + transition = { + // The transition lasts 64ms = 4 frames. + spec = tween(durationMillis = 16 * 4, easing = LinearEasing) + }, + fromScene = TestScenes.SceneA, + toScene = TestScenes.SceneB, + ) { + before { + assertThat(lastValueInFrom).isEqualTo(fromValues) + + // to was not composed yet, so lastValueInTo was not set yet. + assertThat(lastValueInTo).isEqualTo(toValues) + } + + at(16) { + // Given that we use Modifier.element() here, animateSharedXAsState is composed in + // both scenes and values should be interpolated with the transition fraction. + val expectedValues = lerp(fromValues, toValues, fraction = 0.25f) + assertThat(lastValueInFrom).isEqualTo(expectedValues) + assertThat(lastValueInTo).isEqualTo(expectedValues) + } + + at(32) { + val expectedValues = lerp(fromValues, toValues, fraction = 0.5f) + assertThat(lastValueInFrom).isEqualTo(expectedValues) + assertThat(lastValueInTo).isEqualTo(expectedValues) + } + + at(48) { + val expectedValues = lerp(fromValues, toValues, fraction = 0.75f) + assertThat(lastValueInFrom).isEqualTo(expectedValues) + assertThat(lastValueInTo).isEqualTo(expectedValues) + } + + after { + assertThat(lastValueInFrom).isEqualTo(toValues) + assertThat(lastValueInTo).isEqualTo(toValues) + } + } + } + + @Test + fun movableAnimateSharedValues() { + val fromValues = Values(int = 0, float = 0f, dp = 0.dp, color = Color.Red) + val toValues = Values(int = 100, float = 100f, dp = 100.dp, color = Color.Blue) + + var lastValueInFrom = fromValues + var lastValueInTo = toValues + + rule.testTransition( + fromSceneContent = { + MovableFoo( + targetValues = fromValues, + onCurrentValueChanged = { lastValueInFrom = it } + ) + }, + toSceneContent = { + MovableFoo(targetValues = toValues, onCurrentValueChanged = { lastValueInTo = it }) + }, + transition = { + // The transition lasts 64ms = 4 frames. + spec = tween(durationMillis = 16 * 4, easing = LinearEasing) + }, + fromScene = TestScenes.SceneA, + toScene = TestScenes.SceneB, + ) { + before { + assertThat(lastValueInFrom).isEqualTo(fromValues) + + // to was not composed yet, so lastValueInTo was not set yet. + assertThat(lastValueInTo).isEqualTo(toValues) + } + + at(16) { + // Given that we use MovableElement here, animateSharedXAsState is composed only + // once, in the highest scene (in this case, in toScene). + assertThat(lastValueInFrom).isEqualTo(fromValues) + assertThat(lastValueInTo).isEqualTo(lerp(fromValues, toValues, fraction = 0.25f)) + } + + at(32) { + assertThat(lastValueInFrom).isEqualTo(fromValues) + assertThat(lastValueInTo).isEqualTo(lerp(fromValues, toValues, fraction = 0.5f)) + } + + at(48) { + assertThat(lastValueInFrom).isEqualTo(fromValues) + assertThat(lastValueInTo).isEqualTo(lerp(fromValues, toValues, fraction = 0.75f)) + } + + after { + assertThat(lastValueInFrom).isEqualTo(fromValues) + assertThat(lastValueInTo).isEqualTo(toValues) + } + } + } +} diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/MovableElementTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MovableElementTest.kt index 4204cd5f0da0..4204cd5f0da0 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/MovableElementTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MovableElementTest.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/ObservableTransitionStateTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ObservableTransitionStateTest.kt index 04b3f8a1dfe7..04b3f8a1dfe7 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/ObservableTransitionStateTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ObservableTransitionStateTest.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt index 5afd420a5e16..5afd420a5e16 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt index df3b72aa5533..df3b72aa5533 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/TestTransition.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/TestTransition.kt index e0ae1be69aaf..e0ae1be69aaf 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/TestTransition.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/TestTransition.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/TestValues.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/TestValues.kt index 83572620c88a..b4c393e9bfbe 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/TestValues.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/TestValues.kt @@ -37,6 +37,9 @@ object TestElements { /** Value keys that can be reused by tests. */ object TestValues { val Value1 = ValueKey("Value1") + val Value2 = ValueKey("Value2") + val Value3 = ValueKey("Value3") + val Value4 = ValueKey("Value4") } // We use a transition duration of 480ms here because it is a multiple of 16, the time of a frame in diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/TransitionDslTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/TransitionDslTest.kt index fa94b25028a2..fa94b25028a2 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/TransitionDslTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/TransitionDslTest.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/AnchoredSizeTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/AnchoredSizeTest.kt index 8ef6757d33bd..8ef6757d33bd 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/AnchoredSizeTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/AnchoredSizeTest.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/AnchoredTranslateTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/AnchoredTranslateTest.kt index d1205e727cf9..d1205e727cf9 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/AnchoredTranslateTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/AnchoredTranslateTest.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/EdgeTranslateTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/EdgeTranslateTest.kt index 2a27763f1d5c..2a27763f1d5c 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/EdgeTranslateTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/EdgeTranslateTest.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/ScaleSizeTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/ScaleSizeTest.kt index 384355ca951f..384355ca951f 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/ScaleSizeTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/ScaleSizeTest.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/SharedElementTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/SharedElementTest.kt index 2af363860272..e94eff32c30c 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/SharedElementTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/SharedElementTest.kt @@ -32,7 +32,6 @@ import com.android.compose.animation.scene.TestElements import com.android.compose.animation.scene.TestScenes import com.android.compose.animation.scene.inScene import com.android.compose.animation.scene.testTransition -import com.android.compose.modifiers.size import com.android.compose.test.assertSizeIsEqualTo import com.android.compose.test.onEach import org.junit.Rule diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/TranslateTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/TranslateTest.kt index 1d559fd6bd8a..1d559fd6bd8a 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/transformation/TranslateTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/TranslateTest.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnectionTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnectionTest.kt index 03d231a7fcc6..03d231a7fcc6 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnectionTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnectionTest.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/nestedscroll/PriorityPostNestedScrollConnectionTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityPostNestedScrollConnectionTest.kt index 8e2b77a2f2a0..8e2b77a2f2a0 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/nestedscroll/PriorityPostNestedScrollConnectionTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityPostNestedScrollConnectionTest.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/test/Selectors.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/test/Selectors.kt index d6f64bfe4974..d6f64bfe4974 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/test/Selectors.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/test/Selectors.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/test/SizeAssertions.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/test/SizeAssertions.kt index fbd1b512c50a..fbd1b512c50a 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/test/SizeAssertions.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/test/SizeAssertions.kt diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/test/subjects/DpOffsetSubject.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/test/subjects/DpOffsetSubject.kt index bf7bf98878e6..bf7bf98878e6 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/test/subjects/DpOffsetSubject.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/test/subjects/DpOffsetSubject.kt |