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

Commit 92e8d71c authored by Josh Tsuji's avatar Josh Tsuji
Browse files

Fix notification launch from alternate bouncer.

Bug: 307976454
Flag: ACONFIG com.android.systemui.keyguard_state_refactor DEVELOPMENT
Test: atest SystemUITests
Change-Id: Ie0021fb2ad810daa50fc74b282aa7c168f0a72fa
parent 256a2727
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -33,7 +33,11 @@ import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.launch

@SysUISingleton
@@ -66,6 +70,25 @@ constructor(
        listenForTransitionToCamera(scope, keyguardInteractor)
    }

    val surfaceBehindVisibility: Flow<Boolean?> =
        combine(
                transitionInteractor.startedKeyguardTransitionStep,
                transitionInteractor.transitionStepsFromState(KeyguardState.ALTERNATE_BOUNCER)
            ) { startedStep, fromBouncerStep ->
                if (startedStep.to != KeyguardState.GONE) {
                    return@combine null
                }

                // The alt bouncer is pretty fast to hide, so start the surface behind animation
                // around 30%.
                fromBouncerStep.value > 0.3f
            }
            .onStart {
                // Default to null ("don't care, use a reasonable default").
                emit(null)
            }
            .distinctUntilChanged()

    private fun listenForAlternateBouncerToLockscreenHubAodOrDozing() {
        scope.launch {
            keyguardInteractor.alternateBouncerShowing
+0 −31
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import com.android.systemui.flags.FeatureFlags
import com.android.systemui.keyguard.KeyguardWmStateRefactor
import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.KeyguardSurfaceBehindModel
import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
@@ -96,36 +95,6 @@ constructor(
            }
            .distinctUntilChanged()

    val surfaceBehindModel: Flow<KeyguardSurfaceBehindModel?> =
        combine(
                transitionInteractor.startedKeyguardTransitionStep,
                transitionInteractor.transitionStepsFromState(KeyguardState.PRIMARY_BOUNCER)
            ) { startedStep, fromBouncerStep ->
                if (startedStep.to != KeyguardState.GONE) {
                    // BOUNCER to anything but GONE does not require any special surface
                    // visibility handling.
                    return@combine null
                }

                if (fromBouncerStep.value > 0.5f) {
                    KeyguardSurfaceBehindModel(
                        animateFromAlpha = 0f,
                        alpha = 1f,
                        animateFromTranslationY = 500f,
                        translationY = 0f,
                    )
                } else {
                    KeyguardSurfaceBehindModel(
                        alpha = 0f,
                    )
                }
            }
            .onStart {
                // Default to null ("don't care, use a reasonable default").
                emit(null)
            }
            .distinctUntilChanged()

    fun dismissPrimaryBouncer() {
        scope.launch { startTransitionTo(KeyguardState.GONE) }
    }
+11 −1
Original line number Diff line number Diff line
@@ -95,7 +95,17 @@ constructor(
            }
            .distinctUntilChanged()

    val isAnimatingSurface = repository.isAnimatingSurface
    /**
     * Whether we're animating the surface, or a notification launch animation is running (which
     * means we're going to animate the surface, even if animators aren't yet running).
     */
    val isAnimatingSurface =
        combine(
            repository.isAnimatingSurface,
            notificationLaunchInteractor.isLaunchAnimationRunning
        ) { animatingSurface, animatingLaunch ->
            animatingSurface || animatingLaunch
        }

    fun setAnimatingSurface(animating: Boolean) {
        repository.setAnimatingSurface(animating)
+4 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ constructor(
    surfaceBehindInteractor: KeyguardSurfaceBehindInteractor,
    fromLockscreenInteractor: FromLockscreenTransitionInteractor,
    fromBouncerInteractor: FromPrimaryBouncerTransitionInteractor,
    fromAlternateBouncerInteractor: FromAlternateBouncerTransitionInteractor,
    notificationLaunchAnimationInteractor: NotificationLaunchAnimationInteractor,
) {
    private val defaultSurfaceBehindVisibility =
@@ -65,6 +66,9 @@ constructor(
                    KeyguardState.PRIMARY_BOUNCER -> {
                        fromBouncerInteractor.surfaceBehindVisibility
                    }
                    KeyguardState.ALTERNATE_BOUNCER -> {
                        fromAlternateBouncerInteractor.surfaceBehindVisibility
                    }
                    else -> flowOf(null)
                }
            }
+17 −1
Original line number Diff line number Diff line
@@ -18,12 +18,16 @@ package com.android.systemui.statusbar.domain.interactor

import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.domain.interactor.KeyguardOcclusionInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardSurfaceBehindInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.domain.interactor.WindowManagerLockscreenVisibilityInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.util.kotlin.sample
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.distinctUntilChangedBy
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map
@@ -46,6 +50,8 @@ constructor(
    keyguardTransitionInteractor: KeyguardTransitionInteractor,
    keyguardOcclusionInteractor: KeyguardOcclusionInteractor,
    powerInteractor: PowerInteractor,
    wmLockscreenVisibilityInteractor: WindowManagerLockscreenVisibilityInteractor,
    surfaceBehindInteractor: KeyguardSurfaceBehindInteractor,
) {
    /** Occlusion state to apply whenever a keyguard transition is STARTED, if any. */
    private val occlusionStateFromStartedStep: Flow<OccludedState> =
@@ -98,11 +104,21 @@ constructor(
                OccludedState(occluded = occluded, animate = false)
            }

    /** Occlusion state to apply to SKBVM's setOccluded call. */
    /** Occlusion state to apply to SBKVM's setOccluded call. */
    val keyguardViewOcclusionState =
        merge(occlusionStateFromStartedStep, occlusionStateFromFinishedStep)
            .distinctUntilChangedBy {
                // Don't switch 'animate' values mid-transition.
                it.occluded
            }

    /** Visibility state to apply to SBKVM via show() and hide(). */
    val keyguardViewVisibility =
        combine(
                wmLockscreenVisibilityInteractor.lockscreenVisibility,
                surfaceBehindInteractor.isAnimatingSurface,
            ) { lockscreenVisible, animatingSurface ->
                lockscreenVisible || animatingSurface
            }
            .distinctUntilChanged()
}
Loading