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

Commit 9523b841 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic "bouncer-to-gone--flows" into main

* changes:
  Fix scrim alphas getting reset during the bouncer/alt-bouncer->gone transition
  Move old implementation to a separate method to make reviews easier.
parents dc56cd41 e5a3fb93
Loading
Loading
Loading
Loading
+8 −27
Original line number Diff line number Diff line
@@ -97,12 +97,7 @@ class BouncerToGoneFlowsTest(flags: FlagsParameterization) : SysuiTestCase() {
            whenever(primaryBouncerInteractor.willRunDismissFromKeyguard()).thenReturn(true)

            keyguardTransitionRepository.sendTransitionSteps(
                listOf(
                    step(0f, TransitionState.STARTED),
                    step(0.3f),
                    step(0.6f),
                    step(1f),
                ),
                listOf(step(0f, TransitionState.STARTED), step(0.3f), step(0.6f), step(1f)),
                testScope,
            )

@@ -124,12 +119,7 @@ class BouncerToGoneFlowsTest(flags: FlagsParameterization) : SysuiTestCase() {
            whenever(primaryBouncerInteractor.willRunDismissFromKeyguard()).thenReturn(true)

            keyguardTransitionRepository.sendTransitionSteps(
                listOf(
                    step(0f, TransitionState.STARTED),
                    step(0.3f),
                    step(0.6f),
                    step(1f),
                ),
                listOf(step(0f, TransitionState.STARTED), step(0.3f), step(0.6f), step(1f)),
                testScope,
            )

@@ -147,18 +137,14 @@ class BouncerToGoneFlowsTest(flags: FlagsParameterization) : SysuiTestCase() {
            sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(true)

            keyguardTransitionRepository.sendTransitionSteps(
                listOf(
                    step(0f, TransitionState.STARTED),
                    step(0.3f),
                    step(0.6f),
                    step(1f),
                ),
                listOf(step(0f, TransitionState.STARTED), step(0.3f), step(0.6f), step(1f)),
                testScope,
            )

            assertThat(values.size).isEqualTo(4)
            values.forEach {
                assertThat(it).isEqualTo(ScrimAlpha(notificationsAlpha = 1f, behindAlpha = 1f))
                assertThat(it.notificationsAlpha).isWithin(0.05f).of(1f)
                assertThat(it.behindAlpha).isWithin(0.05f).of(1f)
            }
        }

@@ -204,12 +190,7 @@ class BouncerToGoneFlowsTest(flags: FlagsParameterization) : SysuiTestCase() {
            runCurrent()

            keyguardTransitionRepository.sendTransitionSteps(
                listOf(
                    step(0f, TransitionState.STARTED),
                    step(0.3f),
                    step(0.6f),
                    step(1f),
                ),
                listOf(step(0f, TransitionState.STARTED), step(0.3f), step(0.6f), step(1f)),
                testScope,
            )

@@ -222,14 +203,14 @@ class BouncerToGoneFlowsTest(flags: FlagsParameterization) : SysuiTestCase() {

    private fun step(
        value: Float,
        state: TransitionState = TransitionState.RUNNING
        state: TransitionState = TransitionState.RUNNING,
    ): TransitionStep {
        return TransitionStep(
            from = KeyguardState.PRIMARY_BOUNCER,
            to = KeyguardState.GONE,
            value = value,
            transitionState = state,
            ownerName = "PrimaryBouncerToGoneTransitionViewModelTest"
            ownerName = "PrimaryBouncerToGoneTransitionViewModelTest",
        )
    }
}
+131 −31
Original line number Diff line number Diff line
@@ -16,9 +16,15 @@

package com.android.systemui.keyguard.ui.viewmodel

import android.annotation.ColorInt
import android.content.Context
import android.util.Log
import androidx.core.graphics.alpha
import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE
import com.android.systemui.Flags
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.bouncer.shared.flag.ComposeBouncerFlags
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor
import com.android.systemui.keyguard.shared.model.Edge
import com.android.systemui.keyguard.shared.model.KeyguardState
@@ -28,7 +34,11 @@ import com.android.systemui.keyguard.shared.model.ScrimAlpha
import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shade.ui.ShadeColors.notificationScrim
import com.android.systemui.shade.ui.ShadeColors.shadePanel
import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.phone.ScrimController
import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor
import dagger.Lazy
import javax.inject.Inject
import kotlin.time.Duration
@@ -41,11 +51,13 @@ import kotlinx.coroutines.flow.map
class BouncerToGoneFlows
@Inject
constructor(
    @Application private val context: Context,
    private val statusBarStateController: SysuiStatusBarStateController,
    private val primaryBouncerInteractor: PrimaryBouncerInteractor,
    private val keyguardDismissActionInteractor: Lazy<KeyguardDismissActionInteractor>,
    private val shadeInteractor: ShadeInteractor,
    private val animationFlow: KeyguardTransitionAnimationFlow,
    private val windowRootViewBlurInteractor: WindowRootViewBlurInteractor,
) {
    /** Common fade for scrim alpha values during *BOUNCER->GONE */
    fun scrimAlpha(duration: Duration, fromState: KeyguardState): Flow<ScrimAlpha> {
@@ -58,7 +70,7 @@ constructor(
            createScrimAlphaFlow(
                duration,
                fromState,
                primaryBouncerInteractor::willRunDismissFromKeyguard
                primaryBouncerInteractor::willRunDismissFromKeyguard,
            )
        }
    }
@@ -79,11 +91,9 @@ constructor(
                        Edge.INVALID
                    } else {
                        Edge.create(from = from, to = Scenes.Gone)
                    }
            )
            .setupWithoutSceneContainer(
                edge = Edge.create(from = from, to = GONE),
                    },
            )
            .setupWithoutSceneContainer(edge = Edge.create(from = from, to = GONE))
            .sharedFlow(
                duration = duration,
                onStart = { leaveShadeOpen = statusBarStateController.leaveOpenOnKeyguardHide() },
@@ -98,11 +108,9 @@ constructor(
    private fun createScrimAlphaFlow(
        duration: Duration,
        fromState: KeyguardState,
        willRunAnimationOnKeyguard: () -> Boolean
        willRunAnimationOnKeyguard: () -> Boolean,
    ): Flow<ScrimAlpha> {
        var isShadeExpanded = false
        var leaveShadeOpen: Boolean = false
        var willRunDismissFromKeyguard: Boolean = false
        var startState = StartState()
        val transitionAnimation =
            animationFlow
                .setup(
@@ -112,11 +120,9 @@ constructor(
                            Edge.INVALID
                        } else {
                            Edge.create(from = fromState, to = Scenes.Gone)
                        }
                )
                .setupWithoutSceneContainer(
                    edge = Edge.create(from = fromState, to = GONE),
                        },
                )
                .setupWithoutSceneContainer(edge = Edge.create(from = fromState, to = GONE))

        return shadeInteractor.anyExpansion
            .map { it > 0f }
@@ -127,31 +133,125 @@ constructor(
                        duration = duration,
                        interpolator = EMPHASIZED_ACCELERATE,
                        onStart = {
                            leaveShadeOpen = statusBarStateController.leaveOpenOnKeyguardHide()
                            willRunDismissFromKeyguard = willRunAnimationOnKeyguard()
                            isShadeExpanded = isAnyExpanded
                            startState =
                                toStartState(
                                    leaveShadeOpen =
                                        statusBarStateController.leaveOpenOnKeyguardHide(),
                                    willRunDismissFromKeyguard = willRunAnimationOnKeyguard(),
                                    isShadeExpanded = isAnyExpanded,
                                )
                            Log.d(TAG, "onStart BouncerToGone with $startState")
                        },
                        onStep = { 1f - it },
                        onStep = { it },
                    )
                    .map {
                        if (willRunDismissFromKeyguard) {
                        if (Flags.bouncerUiRevamp() || Flags.notificationShadeBlur()) {
                            mapToScrimAlphasWithCustomMaxAlphas(
                                transitionProgress = it,
                                startState = startState,
                            )
                        } else {
                            mapToScrimAlphas(transitionProgress = it, startState = startState)
                        }
                    }
            }
    }

    private fun mapToScrimAlphasWithCustomMaxAlphas(
        transitionProgress: Float,
        startState: StartState,
    ): ScrimAlpha {
        // convert to a value that goes from 1 -> 0 and scale down the max allowed alpha with it.
        val invertedTransitionProgress = 1 - transitionProgress
        return with(startState) {
            when {
                willRunDismissFromKeyguard && isShadeExpanded ->
                    ScrimAlpha(
                        behindAlpha = shadeBehindAlpha * invertedTransitionProgress,
                        notificationsAlpha = shadeNotifAlpha * invertedTransitionProgress,
                    )
                willRunDismissFromKeyguard && !isShadeExpanded -> ScrimAlpha()
                leaveShadeOpen ->
                    ScrimAlpha(behindAlpha = shadeBehindAlpha, notificationsAlpha = shadeNotifAlpha)
                else -> ScrimAlpha(behindAlpha = bouncerBehindAlpha * invertedTransitionProgress)
            }
        }
    }

    private fun toStartState(
        willRunDismissFromKeyguard: Boolean,
        isShadeExpanded: Boolean,
        leaveShadeOpen: Boolean,
    ): StartState {
        val isBlurCurrentlySupported = windowRootViewBlurInteractor.isBlurCurrentlySupported.value
        val defaultValue =
            StartState(
                willRunDismissFromKeyguard = willRunDismissFromKeyguard,
                isShadeExpanded = isShadeExpanded,
                leaveShadeOpen = leaveShadeOpen,
                shadeNotifAlpha = 1.0f,
                shadeBehindAlpha = 1.0f,
                bouncerBehindAlpha = 1.0f,
            )
        val shadeNotifAlpha = colorAlpha(notificationScrim(context, isBlurCurrentlySupported))
        val shadeBehindAlpha = colorAlpha(shadePanel(context, isBlurCurrentlySupported))
        val bouncerBehindAlpha =
            if (isBlurCurrentlySupported) ScrimController.TRANSPARENT_BOUNCER_SCRIM_ALPHA else 1.0f
        return when {
            Flags.bouncerUiRevamp() && Flags.notificationShadeBlur() -> {
                defaultValue.copy(
                    shadeBehindAlpha = shadeBehindAlpha,
                    shadeNotifAlpha = shadeNotifAlpha,
                    bouncerBehindAlpha = bouncerBehindAlpha,
                )
            }
            Flags.bouncerUiRevamp() && !Flags.notificationShadeBlur() -> {
                defaultValue.copy(bouncerBehindAlpha = bouncerBehindAlpha)
            }
            !Flags.bouncerUiRevamp() && Flags.notificationShadeBlur() -> {
                defaultValue.copy(
                    shadeBehindAlpha = shadeBehindAlpha,
                    shadeNotifAlpha = shadeNotifAlpha,
                )
            }
            else -> defaultValue
        }
    }

    private fun colorAlpha(@ColorInt colorInt: Int): Float = colorInt.alpha / 255.0f

    private fun mapToScrimAlphas(transitionProgress: Float, startState: StartState): ScrimAlpha {
        val willRunDismissFromKeyguard = startState.willRunDismissFromKeyguard
        val isShadeExpanded: Boolean = startState.isShadeExpanded
        val leaveShadeOpen: Boolean = startState.leaveShadeOpen
        val invertedTransitionProgress = 1 - transitionProgress
        return if (willRunDismissFromKeyguard) {
            if (isShadeExpanded) {
                ScrimAlpha(
                                    behindAlpha = it,
                                    notificationsAlpha = it,
                    behindAlpha = invertedTransitionProgress,
                    notificationsAlpha = invertedTransitionProgress,
                )
            } else {
                ScrimAlpha()
            }
        } else if (leaveShadeOpen) {
                            ScrimAlpha(
                                behindAlpha = 1f,
                                notificationsAlpha = 1f,
                            )
            ScrimAlpha(behindAlpha = 1f, notificationsAlpha = 1f)
        } else {
                            ScrimAlpha(behindAlpha = it)
                        }
            ScrimAlpha(behindAlpha = invertedTransitionProgress)
        }
    }

    private data class StartState(
        val isShadeExpanded: Boolean = false,
        val leaveShadeOpen: Boolean = false,
        val willRunDismissFromKeyguard: Boolean = false,
        val isBlurCurrentlySupported: Boolean = false,
        val shadeNotifAlpha: Float = 1.0f,
        val shadeBehindAlpha: Float = 1.0f,
        val bouncerBehindAlpha: Float = 1.0f,
    )

    private companion object {
        const val TAG = "BouncerToGoneFlows"
    }
}
+4 −4
Original line number Diff line number Diff line
@@ -252,7 +252,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
    // Combined scrim behind keyguard alpha of default scrim + additional scrim
    private float mScrimBehindAlphaKeyguard = KEYGUARD_SCRIM_ALPHA;

    static final float TRANSPARENT_BOUNCER_SCRIM_ALPHA = 0.54f;
    public static final float TRANSPARENT_BOUNCER_SCRIM_ALPHA = 0.54f;

    private float mRawPanelExpansionFraction;
    private float mPanelScrimMinFraction;
@@ -304,7 +304,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
    private boolean mIsBouncerToGoneTransitionRunning = false;
    private PrimaryBouncerToGoneTransitionViewModel mPrimaryBouncerToGoneTransitionViewModel;
    private AlternateBouncerToGoneTransitionViewModel mAlternateBouncerToGoneTransitionViewModel;
    private final Consumer<ScrimAlpha> mScrimAlphaConsumer =
    private final Consumer<ScrimAlpha> mBouncerToGoneScrimAlphaConsumer =
            (ScrimAlpha alphas) -> {
                mInFrontAlpha = alphas.getFrontAlpha();
                mScrimInFront.setViewAlpha(mInFrontAlpha);
@@ -489,7 +489,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
                Edge.Companion.create(PRIMARY_BOUNCER, GONE)),
                mBouncerToGoneTransition, mMainDispatcher);
        collectFlow(behindScrim, mPrimaryBouncerToGoneTransitionViewModel.getScrimAlpha(),
                mScrimAlphaConsumer, mMainDispatcher);
                mBouncerToGoneScrimAlphaConsumer, mMainDispatcher);

        // ALTERNATE_BOUNCER->GONE
        collectFlow(behindScrim, mKeyguardTransitionInteractor.transition(
@@ -497,7 +497,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
                Edge.Companion.create(ALTERNATE_BOUNCER, GONE)),
                mBouncerToGoneTransition, mMainDispatcher);
        collectFlow(behindScrim, mAlternateBouncerToGoneTransitionViewModel.getScrimAlpha(),
                mScrimAlphaConsumer, mMainDispatcher);
                mBouncerToGoneScrimAlphaConsumer, mMainDispatcher);

        // LOCKSCREEN<->GLANCEABLE_HUB
        collectFlow(
+4 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.keyguard.ui.viewmodel

import android.content.applicationContext
import com.android.systemui.bouncer.domain.interactor.mockPrimaryBouncerInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardDismissActionInteractor
import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
@@ -23,13 +24,16 @@ import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.statusbar.sysuiStatusBarStateController
import com.android.systemui.window.domain.interactor.windowRootViewBlurInteractor

val Kosmos.bouncerToGoneFlows by Fixture {
    BouncerToGoneFlows(
        context = applicationContext,
        statusBarStateController = sysuiStatusBarStateController,
        primaryBouncerInteractor = mockPrimaryBouncerInteractor,
        keyguardDismissActionInteractor = { keyguardDismissActionInteractor },
        shadeInteractor = shadeInteractor,
        animationFlow = keyguardTransitionAnimationFlow,
        windowRootViewBlurInteractor = windowRootViewBlurInteractor,
    )
}