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

Commit 24d2b4c1 authored by burakov's avatar burakov
Browse files

[bc25] Allow dual quick settings shade to align to the bottom.

This allows QuickSettingsShadeScene to be customized such that instead
of align to the top, it is now align to the bottom (positioning to the
horizontal side remains unchanged).

This also adds a new transition to the framework so that when it is on
the bottom, the scene appears from the bottom edge rather than the top.

Flag: com.android.systemui.dual_shade
Bug: 343744476
Test: Manual; Change config.xml content to be true instead, and then
call on adb shell service call statusbar 1 to see animation.
Test: Manual; verify on device with flexiglass flag off still works.

Change-Id: I2cf2dacf6902220e9b8ba9e9fdf49fd85f4d0e10
parent 8f36a932
Loading
Loading
Loading
Loading
+12 −28
Original line number Original line Diff line number Diff line
@@ -50,30 +50,22 @@ val SceneContainerTransitions = transitions {
    from(Scenes.Gone, to = Scenes.NotificationsShade, key = OpenBottomShade) {
    from(Scenes.Gone, to = Scenes.NotificationsShade, key = OpenBottomShade) {
        goneToNotificationsShadeTransition(Edge.Bottom)
        goneToNotificationsShadeTransition(Edge.Bottom)
    }
    }
    from(Scenes.Gone, to = Scenes.Shade) { goneToShadeTransition() }
    from(Scenes.Gone, to = Scenes.QuickSettingsShade) {
    from(
        goneToQuickSettingsShadeTransition(Edge.Top)
        Scenes.Gone,
    }
        to = Scenes.Shade,
    from(Scenes.Gone, to = Scenes.QuickSettingsShade, key = OpenBottomShade) {
        key = ToSplitShade,
        goneToQuickSettingsShadeTransition(Edge.Bottom)
    ) {
        goneToSplitShadeTransition()
    }
    }
    from(
    from(Scenes.Gone, to = Scenes.Shade) { goneToShadeTransition() }
        Scenes.Gone,
    from(Scenes.Gone, to = Scenes.Shade, key = ToSplitShade) { goneToSplitShadeTransition() }
        to = Scenes.Shade,
    from(Scenes.Gone, to = Scenes.Shade, key = SlightlyFasterShadeCollapse) {
        key = SlightlyFasterShadeCollapse,
    ) {
        goneToShadeTransition(durationScale = 0.9)
        goneToShadeTransition(durationScale = 0.9)
    }
    }
    from(Scenes.Gone, to = Scenes.QuickSettings) { goneToQuickSettingsTransition() }
    from(Scenes.Gone, to = Scenes.QuickSettings) { goneToQuickSettingsTransition() }
    from(
    from(Scenes.Gone, to = Scenes.QuickSettings, key = SlightlyFasterShadeCollapse) {
        Scenes.Gone,
        to = Scenes.QuickSettings,
        key = SlightlyFasterShadeCollapse,
    ) {
        goneToQuickSettingsTransition(durationScale = 0.9)
        goneToQuickSettingsTransition(durationScale = 0.9)
    }
    }
    from(Scenes.Gone, to = Scenes.QuickSettingsShade) { goneToQuickSettingsShadeTransition() }

    from(Scenes.Lockscreen, to = Scenes.Bouncer) { lockscreenToBouncerTransition() }
    from(Scenes.Lockscreen, to = Scenes.Bouncer) { lockscreenToBouncerTransition() }
    from(Scenes.Lockscreen, to = Scenes.Communal) { lockscreenToCommunalTransition() }
    from(Scenes.Lockscreen, to = Scenes.Communal) { lockscreenToCommunalTransition() }
    from(Scenes.Lockscreen, to = Scenes.NotificationsShade) {
    from(Scenes.Lockscreen, to = Scenes.NotificationsShade) {
@@ -83,18 +75,10 @@ val SceneContainerTransitions = transitions {
        lockscreenToQuickSettingsShadeTransition()
        lockscreenToQuickSettingsShadeTransition()
    }
    }
    from(Scenes.Lockscreen, to = Scenes.Shade) { lockscreenToShadeTransition() }
    from(Scenes.Lockscreen, to = Scenes.Shade) { lockscreenToShadeTransition() }
    from(
    from(Scenes.Lockscreen, to = Scenes.Shade, key = ToSplitShade) {
        Scenes.Lockscreen,
        to = Scenes.Shade,
        key = ToSplitShade,
    ) {
        lockscreenToSplitShadeTransition()
        lockscreenToSplitShadeTransition()
    }
    }
    from(
    from(Scenes.Lockscreen, to = Scenes.Shade, key = SlightlyFasterShadeCollapse) {
        Scenes.Lockscreen,
        to = Scenes.Shade,
        key = SlightlyFasterShadeCollapse,
    ) {
        lockscreenToShadeTransition(durationScale = 0.9)
        lockscreenToShadeTransition(durationScale = 0.9)
    }
    }
    from(Scenes.Lockscreen, to = Scenes.QuickSettings) { lockscreenToQuickSettingsTransition() }
    from(Scenes.Lockscreen, to = Scenes.QuickSettings) { lockscreenToQuickSettingsTransition() }
+3 −1
Original line number Original line Diff line number Diff line
@@ -16,10 +16,12 @@


package com.android.systemui.scene.ui.composable.transitions
package com.android.systemui.scene.ui.composable.transitions


import com.android.compose.animation.scene.Edge
import com.android.compose.animation.scene.TransitionBuilder
import com.android.compose.animation.scene.TransitionBuilder


fun TransitionBuilder.goneToQuickSettingsShadeTransition(
fun TransitionBuilder.goneToQuickSettingsShadeTransition(
    edge: Edge = Edge.Top,
    durationScale: Double = 1.0,
    durationScale: Double = 1.0,
) {
) {
    toQuickSettingsShadeTransition(durationScale)
    toQuickSettingsShadeTransition(edge, durationScale)
}
}
+2 −1
Original line number Original line Diff line number Diff line
@@ -16,10 +16,11 @@


package com.android.systemui.scene.ui.composable.transitions
package com.android.systemui.scene.ui.composable.transitions


import com.android.compose.animation.scene.Edge
import com.android.compose.animation.scene.TransitionBuilder
import com.android.compose.animation.scene.TransitionBuilder


fun TransitionBuilder.lockscreenToQuickSettingsShadeTransition(
fun TransitionBuilder.lockscreenToQuickSettingsShadeTransition(
    durationScale: Double = 1.0,
    durationScale: Double = 1.0,
) {
) {
    toQuickSettingsShadeTransition(durationScale)
    toQuickSettingsShadeTransition(Edge.Top, durationScale)
}
}
+3 −13
Original line number Original line Diff line number Diff line
@@ -19,17 +19,15 @@ package com.android.systemui.scene.ui.composable.transitions
import androidx.compose.animation.core.Spring
import androidx.compose.animation.core.Spring
import androidx.compose.animation.core.spring
import androidx.compose.animation.core.spring
import androidx.compose.animation.core.tween
import androidx.compose.animation.core.tween
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.ui.unit.IntSize
import com.android.compose.animation.scene.Edge
import com.android.compose.animation.scene.Edge
import com.android.compose.animation.scene.TransitionBuilder
import com.android.compose.animation.scene.TransitionBuilder
import com.android.compose.animation.scene.UserActionDistance
import com.android.compose.animation.scene.UserActionDistance
import com.android.compose.animation.scene.UserActionDistanceScope
import com.android.systemui.shade.ui.composable.OverlayShade
import com.android.systemui.shade.ui.composable.OverlayShade
import com.android.systemui.shade.ui.composable.Shade
import com.android.systemui.shade.ui.composable.Shade
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.milliseconds


fun TransitionBuilder.toQuickSettingsShadeTransition(
fun TransitionBuilder.toQuickSettingsShadeTransition(
    edge: Edge = Edge.Top,
    durationScale: Double = 1.0,
    durationScale: Double = 1.0,
) {
) {
    spec = tween(durationMillis = (DefaultDuration * durationScale).inWholeMilliseconds.toInt())
    spec = tween(durationMillis = (DefaultDuration * durationScale).inWholeMilliseconds.toInt())
@@ -38,17 +36,9 @@ fun TransitionBuilder.toQuickSettingsShadeTransition(
            stiffness = Spring.StiffnessMediumLow,
            stiffness = Spring.StiffnessMediumLow,
            visibilityThreshold = Shade.Dimensions.ScrimVisibilityThreshold,
            visibilityThreshold = Shade.Dimensions.ScrimVisibilityThreshold,
        )
        )
    distance =
    distance = UserActionDistance { fromSceneSize, _ -> fromSceneSize.height.toFloat() * 2 / 3f }
        object : UserActionDistance {
            override fun UserActionDistanceScope.absoluteDistance(
                fromSceneSize: IntSize,
                orientation: Orientation,
            ): Float {
                return fromSceneSize.height.toFloat() * 2 / 3f
            }
        }


    translate(OverlayShade.Elements.Panel, Edge.Top)
    translate(OverlayShade.Elements.Panel, edge)


    fractionRange(end = .5f) { fade(OverlayShade.Elements.Scrim) }
    fractionRange(end = .5f) { fade(OverlayShade.Elements.Scrim) }
}
}
+19 −8
Original line number Original line Diff line number Diff line
@@ -64,6 +64,16 @@ constructor(
                    // TODO(b/338577208): Remove this once we add Dual Shade invocation zones.
                    // TODO(b/338577208): Remove this once we add Dual Shade invocation zones.
                    shadeMode is ShadeMode.Dual
                    shadeMode is ShadeMode.Dual
            ) {
            ) {
                if (shadeInteractor.shadeAlignment == Alignment.BottomEnd) {
                    put(
                        Swipe(
                            pointerCount = 2,
                            fromSource = Edge.Bottom,
                            direction = SwipeDirection.Up,
                        ),
                        UserActionResult(SceneFamilies.QuickSettings, OpenBottomShade)
                    )
                } else {
                    put(
                    put(
                        Swipe(
                        Swipe(
                            pointerCount = 2,
                            pointerCount = 2,
@@ -73,6 +83,7 @@ constructor(
                        UserActionResult(SceneFamilies.QuickSettings)
                        UserActionResult(SceneFamilies.QuickSettings)
                    )
                    )
                }
                }
            }


            if (shadeInteractor.shadeAlignment == Alignment.BottomEnd) {
            if (shadeInteractor.shadeAlignment == Alignment.BottomEnd) {
                put(Swipe.Up, UserActionResult(SceneFamilies.NotifShade, OpenBottomShade))
                put(Swipe.Up, UserActionResult(SceneFamilies.NotifShade, OpenBottomShade))
Loading