1 package com.android.systemui.scene.ui.composable.transitions
2 
3 import androidx.compose.animation.core.tween
4 import androidx.compose.foundation.gestures.Orientation
5 import androidx.compose.ui.unit.IntSize
6 import com.android.compose.animation.scene.Edge
7 import com.android.compose.animation.scene.TransitionBuilder
8 import com.android.compose.animation.scene.UserActionDistance
9 import com.android.compose.animation.scene.UserActionDistanceScope
10 import com.android.systemui.notifications.ui.composable.Notifications
11 import com.android.systemui.qs.ui.composable.QuickSettings
12 import com.android.systemui.scene.shared.model.Scenes
13 import com.android.systemui.shade.ui.composable.ShadeHeader
14 import kotlin.time.Duration.Companion.milliseconds
15 
TransitionBuildernull16 fun TransitionBuilder.shadeToQuickSettingsTransition(
17     durationScale: Double = 1.0,
18 ) {
19     spec = tween(durationMillis = (DefaultDuration * durationScale).inWholeMilliseconds.toInt())
20     distance =
21         object : UserActionDistance {
22             override fun UserActionDistanceScope.absoluteDistance(
23                 fromSceneSize: IntSize,
24                 orientation: Orientation,
25             ): Float {
26                 val distance =
27                     Notifications.Elements.NotificationScrim.targetOffset(Scenes.Shade)?.y
28                         ?: return 0f
29                 return fromSceneSize.height - distance
30             }
31         }
32 
33     translate(Notifications.Elements.NotificationScrim, Edge.Bottom)
34     timestampRange(endMillis = 83) { fade(QuickSettings.Elements.FooterActions) }
35 
36     translate(
37         ShadeHeader.Elements.CollapsedContentStart,
38         y = ShadeHeader.Dimensions.CollapsedHeight
39     )
40     translate(ShadeHeader.Elements.CollapsedContentEnd, y = ShadeHeader.Dimensions.CollapsedHeight)
41     translate(
42         ShadeHeader.Elements.ExpandedContent,
43         y = -(ShadeHeader.Dimensions.ExpandedHeight - ShadeHeader.Dimensions.CollapsedHeight)
44     )
45     translate(ShadeHeader.Elements.ShadeCarrierGroup, y = -ShadeHeader.Dimensions.CollapsedHeight)
46 
47     fractionRange(end = .14f) {
48         fade(ShadeHeader.Elements.CollapsedContentStart)
49         fade(ShadeHeader.Elements.CollapsedContentEnd)
50     }
51 
52     fractionRange(start = .58f) {
53         fade(ShadeHeader.Elements.ExpandedContent)
54         fade(ShadeHeader.Elements.ShadeCarrierGroup)
55     }
56 }
57 
58 private val DefaultDuration = 500.milliseconds
59