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

Commit ddb9efea authored by Ioana Alexandru's avatar Ioana Alexandru
Browse files

[flexiglass] Prevent notifications from flickering on unlock

Keep the alpha 0 when notifications aren't supposed to be showing during
transitions, for AOD->GONE and LOCKSCREEN->GONE with bypass enabled.

Fix: 376676082
Fix: 390995816
Test: manually verify the transitions, including the insecure camera
launch
Flag: com.android.systemui.scene_container

Change-Id: If380c2820db377875af5f0e2bc4021e46c3da5b3
parent 14a1f944
Loading
Loading
Loading
Loading
+20 −13
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Scenes
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
@@ -33,9 +34,7 @@ import kotlinx.coroutines.flow.Flow
@SysUISingleton
class AodToGoneTransitionViewModel
@Inject
constructor(
    animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
constructor(animationFlow: KeyguardTransitionAnimationFlow) : DeviceEntryIconTransition {

    private val transitionAnimation =
        animationFlow
@@ -43,9 +42,7 @@ constructor(
                duration = FromAodTransitionInteractor.TO_GONE_DURATION,
                edge = Edge.create(from = AOD, to = Scenes.Gone),
            )
            .setupWithoutSceneContainer(
                edge = Edge.create(from = AOD, to = GONE),
            )
            .setupWithoutSceneContainer(edge = Edge.create(from = AOD, to = GONE))

    /**
     * AOD -> GONE should fade out the lockscreen contents. This transition plays both during wake
@@ -62,6 +59,15 @@ constructor(
    }

    fun notificationAlpha(viewState: ViewStateAccessor): Flow<Float> {
        if (SceneContainerFlag.isEnabled) {
            // Keep notifications hidden until the end of the transition to prevent flickers, then
            // reset the alpha to 1.
            return transitionAnimation.sharedFlow(
                duration = 200.milliseconds,
                onStep = { 0f },
                onFinish = { 1f },
            )
        } else {
            var startAlpha = 1f
            return transitionAnimation.sharedFlow(
                duration = 200.milliseconds,
@@ -70,6 +76,7 @@ constructor(
                onFinish = { 1f },
            )
        }
    }

    override val deviceEntryParentViewAlpha = transitionAnimation.immediatelyTransitionTo(0f)
}
+42 −20
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.phone.KeyguardBypassController
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.flow.Flow
@@ -41,6 +42,7 @@ class LockscreenToGoneTransitionViewModel
constructor(
    animationFlow: KeyguardTransitionAnimationFlow,
    private val statusBarStateController: SysuiStatusBarStateController,
    private val keyguardBypassController: KeyguardBypassController,
) : DeviceEntryIconTransition {

    private val transitionAnimation: FlowBuilder =
@@ -62,11 +64,32 @@ constructor(
    fun notificationAlpha(viewState: ViewStateAccessor): Flow<Float> {
        var startAlpha = 1f
        var leaveShadeOpen = false
        val endAction: (() -> Float)? =

        if (SceneContainerFlag.isEnabled) {
                { 1f }
            } else null
            var bypassEnabled = false

            return transitionAnimation.sharedFlow(
                duration = 80.milliseconds,
                onStart = {
                    leaveShadeOpen = statusBarStateController.leaveOpenOnKeyguardHide()
                    bypassEnabled = keyguardBypassController.isBypassEnabled()
                    startAlpha = viewState.alpha()
                },
                onStep = {
                    if (leaveShadeOpen) {
                        1f
                    } else if (bypassEnabled) {
                        // Keep notifications hidden until the end of the transition if bypass is
                        // enabled, to prevent flickers.
                        0f
                    } else {
                        MathUtils.lerp(startAlpha, 0f, it)
                    }
                },
                onFinish = { 1f },
                onCancel = { 1f },
            )
        } else {
            return transitionAnimation.sharedFlow(
                duration = 80.milliseconds,
                onStart = {
@@ -80,10 +103,9 @@ constructor(
                        MathUtils.lerp(startAlpha, 0f, it)
                    }
                },
            onFinish = endAction,
            onCancel = endAction,
            )
        }
    }

    fun lockscreenAlpha(viewState: ViewStateAccessor): Flow<Float> {
        var startAlpha = 1f
+2 −0
Original line number Diff line number Diff line
@@ -19,11 +19,13 @@ package com.android.systemui.keyguard.ui.viewmodel
import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import com.android.systemui.statusbar.phone.keyguardBypassController
import com.android.systemui.statusbar.sysuiStatusBarStateController

val Kosmos.lockscreenToGoneTransitionViewModel by Fixture {
    LockscreenToGoneTransitionViewModel(
        animationFlow = keyguardTransitionAnimationFlow,
        statusBarStateController = sysuiStatusBarStateController,
        keyguardBypassController = keyguardBypassController,
    )
}