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

Commit f8ab19e4 authored by Johannes Gallmann's avatar Johannes Gallmann Committed by Android (Google) Code Review
Browse files

Merge "[flexiglass] Add predictive back animation to Bouncer" into main

parents ac4d3298 127bf6de
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@ package com.android.systemui.scene.ui.composable

import androidx.compose.foundation.gestures.Orientation
import com.android.compose.animation.scene.ProgressConverter
import com.android.compose.animation.scene.TransitionKey
import com.android.compose.animation.scene.transitions
import com.android.systemui.bouncer.ui.composable.Bouncer
import com.android.systemui.notifications.ui.composable.Notifications
@@ -9,6 +10,7 @@ import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.shared.model.TransitionKeys.SlightlyFasterShadeCollapse
import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade
import com.android.systemui.scene.ui.composable.transitions.bouncerToGoneTransition
import com.android.systemui.scene.ui.composable.transitions.bouncerToLockscreenPreview
import com.android.systemui.scene.ui.composable.transitions.goneToNotificationsShadeTransition
import com.android.systemui.scene.ui.composable.transitions.goneToQuickSettingsShadeTransition
import com.android.systemui.scene.ui.composable.transitions.goneToQuickSettingsTransition
@@ -59,6 +61,14 @@ val SceneContainerTransitions = transitions {
    }

    from(Scenes.Lockscreen, to = Scenes.Bouncer) { lockscreenToBouncerTransition() }
    from(
        Scenes.Lockscreen,
        to = Scenes.Bouncer,
        key = TransitionKey.PredictiveBack,
        reversePreview = { bouncerToLockscreenPreview() }
    ) {
        lockscreenToBouncerTransition()
    }
    from(Scenes.Lockscreen, to = Scenes.Communal) { lockscreenToCommunalTransition() }
    from(Scenes.Lockscreen, to = Scenes.NotificationsShade) {
        lockscreenToNotificationsShadeTransition()
+7 −0
Original line number Diff line number Diff line
package com.android.systemui.scene.ui.composable.transitions

import androidx.compose.animation.core.CubicBezierEasing
import androidx.compose.animation.core.tween
import androidx.compose.ui.unit.dp
import com.android.compose.animation.scene.TransitionBuilder
@@ -18,3 +19,9 @@ fun TransitionBuilder.lockscreenToBouncerTransition() {
        fade(Bouncer.Elements.Content)
    }
}

fun TransitionBuilder.bouncerToLockscreenPreview() {
    fractionRange(easing = CubicBezierEasing(0.1f, 0.1f, 0f, 1f)) {
        scaleDraw(Bouncer.Elements.Content, scaleY = 0.8f, scaleX = 0.8f)
    }
}
+27 −13
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@ import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flatMapConcat
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
@@ -73,14 +75,24 @@ constructor(
            sceneInteractorProvider
                .get()
                .transitionState
                .map { state ->
                .flatMapConcat { state ->
                    when (state) {
                        is ObservableTransitionState.Idle ->
                            flowOf(
                                state.currentScene == Scenes.Shade ||
                                    state.currentScene == Scenes.NotificationsShade ||
                                    state.currentScene == Scenes.QuickSettingsShade ||
                                    state.currentScene == Scenes.Lockscreen
                            )
                        is ObservableTransitionState.Transition ->
                            if (
                                state.fromContent == Scenes.Bouncer &&
                                    state.toContent == Scenes.Lockscreen
                            ) {
                                // Lockscreen is not visible during preview stage of predictive back
                                state.isInPreviewStage.map { !it }
                            } else {
                                flowOf(
                                    state.toContent == Scenes.Shade ||
                                        state.toContent == Scenes.NotificationsShade ||
                                        state.toContent == Scenes.QuickSettingsShade ||
@@ -89,6 +101,8 @@ constructor(
                                        state.fromContent == Scenes.NotificationsShade ||
                                        state.fromContent == Scenes.QuickSettingsShade ||
                                        state.fromContent == Scenes.Lockscreen
                                )
                            }
                    }
                }
                .distinctUntilChanged()