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

Commit 23ec5976 authored by Julia Tuttle's avatar Julia Tuttle
Browse files

Clean up NotificationScrollViewModel.expandFraction

It got kind of tangly and squished with all the (necessary) nested
logic, so split some things out into helper functions.

Bug: 347769238
Flag: com.android.systemui.scene_container
Test: manual: examine various scene transitions involving the stack
Change-Id: I02fe1a1558614bbf45621cde06d076dcc9b259b1
parent ab7548ec
Loading
Loading
Loading
Loading
+46 −35
Original line number Diff line number Diff line
@@ -63,55 +63,61 @@ constructor(
        activateFlowDumper()
    }

    /**
     * The expansion fraction of the notification stack. It should go from 0 to 1 when transitioning
     * from Gone to Shade scenes, and remain at 1 when in Lockscreen or Shade scenes and while
     * transitioning from Shade to QuickSettings scenes.
     */
    val expandFraction: Flow<Float> =
        combine(
                shadeInteractor.shadeExpansion,
                shadeInteractor.shadeMode,
                shadeInteractor.qsExpansion,
                sceneInteractor.transitionState,
                sceneInteractor.resolveSceneFamily(SceneFamilies.QuickSettings),
            ) { shadeExpansion, shadeMode, qsExpansion, transitionState, quickSettingsScene ->
                when (transitionState) {
                    is ObservableTransitionState.Idle -> {
                        when (transitionState.currentScene) {
    private fun expandFractionForScene(scene: SceneKey, shadeExpansion: Float): Float =
        when (scene) {
            Scenes.Lockscreen,
            Scenes.QuickSettings -> 1f
            else -> shadeExpansion
        }
                    }
                    is ObservableTransitionState.Transition -> {

    private fun expandFractionForTransition(
        state: ObservableTransitionState.Transition,
        shadeExpansion: Float,
        shadeMode: ShadeMode,
        qsExpansion: Float,
        quickSettingsScene: SceneKey
    ): Float =
        if (
                            (transitionState.fromScene in SceneFamilies.NotifShade &&
                                transitionState.toScene == quickSettingsScene) ||
                                (transitionState.fromScene in quickSettingsScene &&
                                    transitionState.toScene in SceneFamilies.NotifShade) ||
                                (transitionState.fromScene == Scenes.Lockscreen &&
                                    transitionState.toScene in SceneFamilies.NotifShade) ||
                                (transitionState.fromScene in SceneFamilies.NotifShade &&
                                    transitionState.toScene == Scenes.Lockscreen)
            state.isBetween({ it == Scenes.Lockscreen }, { it in SceneFamilies.NotifShade }) ||
                state.isBetween({ it in SceneFamilies.NotifShade }, { it == quickSettingsScene })
        ) {
            1f
        } else if (
            shadeMode != ShadeMode.Split &&
                                (transitionState.fromScene in SceneFamilies.Home &&
                                    transitionState.toScene == quickSettingsScene) ||
                                (transitionState.fromScene == quickSettingsScene &&
                                    transitionState.toScene in SceneFamilies.Home)
                state.isBetween({ it in SceneFamilies.Home }, { it == quickSettingsScene })
        ) {
            // during QS expansion, increase fraction at same rate as scrim alpha,
            // but start when scrim alpha is at EXPANSION_FOR_DELAYED_STACK_FADE_IN.
                            (qsExpansion / EXPANSION_FOR_MAX_SCRIM_ALPHA -
                                    EXPANSION_FOR_DELAYED_STACK_FADE_IN)
            (qsExpansion / EXPANSION_FOR_MAX_SCRIM_ALPHA - EXPANSION_FOR_DELAYED_STACK_FADE_IN)
                .coerceIn(0f, 1f)
        } else {
            shadeExpansion
        }
                    }

    /**
     * The expansion fraction of the notification stack. It should go from 0 to 1 when transitioning
     * from Gone to Shade scenes, and remain at 1 when in Lockscreen or Shade scenes and while
     * transitioning from Shade to QuickSettings scenes.
     */
    val expandFraction: Flow<Float> =
        combine(
                shadeInteractor.shadeExpansion,
                shadeInteractor.shadeMode,
                shadeInteractor.qsExpansion,
                sceneInteractor.transitionState,
                sceneInteractor.resolveSceneFamily(SceneFamilies.QuickSettings),
            ) { shadeExpansion, shadeMode, qsExpansion, transitionState, quickSettingsScene ->
                when (transitionState) {
                    is ObservableTransitionState.Idle ->
                        expandFractionForScene(transitionState.currentScene, shadeExpansion)
                    is ObservableTransitionState.Transition ->
                        expandFractionForTransition(
                            transitionState,
                            shadeExpansion,
                            shadeMode,
                            qsExpansion,
                            quickSettingsScene
                        )
                }
            }
            .distinctUntilChanged()
@@ -200,3 +206,8 @@ constructor(
        fun create(): NotificationScrollViewModel
    }
}

private fun ObservableTransitionState.Transition.isBetween(
    a: (SceneKey) -> Boolean,
    b: (SceneKey) -> Boolean
): Boolean = (a(fromScene) && b(toScene)) || (b(fromScene) && a(toScene))