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

Commit 95b947a4 authored by omarmt's avatar omarmt Committed by Omar Miatello
Browse files

STL support of motion spatial and effects animation specs 1/2

This change includes:
- Refactoring SceneTransitions to support both motion spatial and
effects animation specs.
- Removing unused SpringSpec from TransformationSpec.

Test: atest SceneTransitionLayoutTest
Bug: 374893616
Flag: com.android.systemui.scene_container
Change-Id: Id774d683e765777119f921732def4282041ee643
parent 8daf84f1
Loading
Loading
Loading
Loading
+5 −11
Original line number Diff line number Diff line
@@ -18,10 +18,10 @@ package com.android.compose.gesture.effect

import androidx.annotation.VisibleForTesting
import androidx.compose.animation.core.AnimationSpec
import androidx.compose.animation.core.Spring
import androidx.compose.animation.core.spring
import androidx.compose.foundation.OverscrollEffect
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
@@ -41,7 +41,7 @@ import kotlinx.coroutines.CoroutineScope
class OffsetOverscrollEffect(
    orientation: Orientation,
    animationScope: CoroutineScope,
    animationSpec: AnimationSpec<Float> = DefaultAnimationSpec,
    animationSpec: AnimationSpec<Float>,
) : BaseContentOverscrollEffect(orientation, animationScope, animationSpec) {
    private var _node: DelegatableNode = newNode()
    override val node: DelegatableNode
@@ -71,13 +71,6 @@ class OffsetOverscrollEffect(
    companion object {
        private val MaxDistance = 400.dp

        internal val DefaultAnimationSpec =
            spring(
                stiffness = Spring.StiffnessLow,
                dampingRatio = Spring.DampingRatioLowBouncy,
                visibilityThreshold = 0.5f,
            )

        @VisibleForTesting
        fun computeOffset(density: Density, overscrollDistance: Float): Int {
            val maxDistancePx = with(density) { MaxDistance.toPx() }
@@ -87,10 +80,11 @@ class OffsetOverscrollEffect(
    }
}

@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
fun rememberOffsetOverscrollEffect(
    orientation: Orientation,
    animationSpec: AnimationSpec<Float> = OffsetOverscrollEffect.DefaultAnimationSpec,
    animationSpec: AnimationSpec<Float> = MaterialTheme.motionScheme.defaultSpatialSpec(),
): OffsetOverscrollEffect {
    val animationScope = rememberCoroutineScope()
    return remember(orientation, animationScope, animationSpec) {
+2 −2
Original line number Diff line number Diff line
@@ -89,9 +89,9 @@ import com.android.compose.PlatformButton
import com.android.compose.animation.Easings
import com.android.compose.animation.scene.ContentScope
import com.android.compose.animation.scene.ElementKey
import com.android.compose.animation.scene.MutableSceneTransitionLayoutState
import com.android.compose.animation.scene.SceneKey
import com.android.compose.animation.scene.SceneTransitionLayout
import com.android.compose.animation.scene.rememberMutableSceneTransitionLayoutState
import com.android.compose.animation.scene.transitions
import com.android.compose.windowsizeclass.LocalWindowSizeClass
import com.android.systemui.bouncer.shared.model.BouncerActionButtonModel
@@ -494,7 +494,7 @@ private fun FoldAware(
    val currentSceneKey =
        if (isSplitAroundTheFold) SceneKeys.SplitSceneKey else SceneKeys.ContiguousSceneKey

    val state = remember { MutableSceneTransitionLayoutState(currentSceneKey, SceneTransitions) }
    val state = rememberMutableSceneTransitionLayoutState(currentSceneKey, SceneTransitions)

    // Update state whenever currentSceneKey has changed.
    LaunchedEffect(state, currentSceneKey) {
+4 −3
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import com.android.compose.animation.scene.SceneKey
import com.android.compose.animation.scene.SceneTransitionLayout
import com.android.compose.animation.scene.Swipe
import com.android.compose.animation.scene.observableTransitionState
import com.android.compose.animation.scene.rememberMutableSceneTransitionLayoutState
import com.android.compose.animation.scene.transitions
import com.android.compose.modifiers.thenIf
import com.android.systemui.communal.shared.model.CommunalBackgroundType
@@ -165,13 +166,13 @@ fun CommunalContainer(
        viewModel.communalBackground.collectAsStateWithLifecycle(
            initialValue = CommunalBackgroundType.ANIMATED
        )
    val state: MutableSceneTransitionLayoutState = remember {
        MutableSceneTransitionLayoutState(
    val state: MutableSceneTransitionLayoutState =
        rememberMutableSceneTransitionLayoutState(
            initialScene = currentSceneKey,
            canChangeScene = { _ -> viewModel.canChangeScene() },
            transitions = if (viewModel.v2FlagEnabled()) sceneTransitionsV2 else sceneTransitions,
        )
    }

    val isUiBlurred by viewModel.isUiBlurred.collectAsStateWithLifecycle()

    val detector = remember { CommunalSwipeDetector() }
+6 −5
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
@@ -36,7 +35,7 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.IntOffset
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.animation.scene.ContentScope
import com.android.compose.animation.scene.MutableSceneTransitionLayoutState
import com.android.compose.animation.scene.rememberMutableSceneTransitionLayoutState
import com.android.compose.modifiers.thenIf
import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes.largeClockScene
@@ -82,9 +81,11 @@ constructor(
                    WeatherClockScenes.splitShadeLargeClockScene
            }

        val state = remember {
            MutableSceneTransitionLayoutState(currentScene, ClockTransition.defaultClockTransitions)
        }
        val state =
            rememberMutableSceneTransitionLayoutState(
                currentScene,
                ClockTransition.defaultClockTransitions,
            )

        // Update state whenever currentSceneKey has changed.
        LaunchedEffect(state, currentScene) {
+22 −24
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.animation.scene.ContentKey
import com.android.compose.animation.scene.MutableSceneTransitionLayoutState
import com.android.compose.animation.scene.OverlayKey
import com.android.compose.animation.scene.SceneKey
import com.android.compose.animation.scene.SceneTransitionLayout
@@ -44,6 +43,7 @@ import com.android.compose.animation.scene.SceneTransitions
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserActionResult
import com.android.compose.animation.scene.observableTransitionState
import com.android.compose.animation.scene.rememberMutableSceneTransitionLayoutState
import com.android.systemui.lifecycle.rememberActivated
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.qs.ui.composable.QuickSettingsTheme
@@ -94,9 +94,8 @@ fun SceneContainer(
    val sceneJankMonitor =
        rememberActivated(traceName = "sceneJankMonitor") { sceneJankMonitorFactory.create() }

    val state: MutableSceneTransitionLayoutState =
        remember(view, sceneJankMonitor) {
            MutableSceneTransitionLayoutState(
    val state =
        rememberMutableSceneTransitionLayoutState(
            initialScene = initialSceneKey,
            canChangeScene = { toScene -> viewModel.canChangeScene(toScene) },
            transitions = sceneTransitions,
@@ -116,7 +115,6 @@ fun SceneContainer(
                )
            },
        )
        }

    DisposableEffect(state) {
        val dataSource = SceneTransitionLayoutDataSource(state, coroutineScope)
Loading