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

Commit e86f6f45 authored by Matt Pietal's avatar Matt Pietal
Browse files

Add support for more transitions

For both notifications and keyguard, apply alpha transition values
from more edges in the tranistion graph.

Also, make sure SharedNotificationContainerViewModel is a singleton.

Also, slightly adjust the delay from ALTERNATE_BOUNCER. A pending
refactor will fix this for good.

Fixes: 322159440
Test: manually run through LOCKSCREEN->*->GONE cases and look for any
visible flickers on any elements
Flag: ACONFIG com.android.systemui.keyguard_shade_migration_nssl
DEVELOPMENT

Change-Id: I2e3f2fc47ca2abb3ce7717e47235cbbf7debbcb9
parent e475ab6a
Loading
Loading
Loading
Loading
+6 −1
Original line number Original line Diff line number Diff line
@@ -30,6 +30,8 @@ import com.android.systemui.communal.shared.model.CommunalSceneKey
import com.android.systemui.communal.shared.model.ObservableCommunalTransitionState
import com.android.systemui.communal.shared.model.ObservableCommunalTransitionState
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
import com.android.systemui.flags.Flags
import com.android.systemui.flags.fakeFeatureFlagsClassic
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
@@ -57,7 +59,10 @@ import org.junit.runner.RunWith
@SmallTest
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWith(AndroidJUnit4::class)
class KeyguardRootViewModelTest : SysuiTestCase() {
class KeyguardRootViewModelTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val kosmos =
        testKosmos().apply {
            fakeFeatureFlagsClassic.apply { set(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT, false) }
        }
    private val testScope = kosmos.testScope
    private val testScope = kosmos.testScope
    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
    private val keyguardInteractor = kosmos.keyguardInteractor
    private val keyguardInteractor = kosmos.keyguardInteractor
+13 −5
Original line number Original line Diff line number Diff line
@@ -109,8 +109,12 @@ public class KeyguardVisibilityHelper {
                animProps.setDelay(0).setDuration(160);
                animProps.setDelay(0).setDuration(160);
                log("goingToFullShade && !keyguardFadingAway");
                log("goingToFullShade && !keyguardFadingAway");
            }
            }
            if (KeyguardShadeMigrationNssl.isEnabled()) {
                log("Using LockscreenToGoneTransition 1");
            } else {
                PropertyAnimator.setProperty(
                PropertyAnimator.setProperty(
                        mView, AnimatableProperty.ALPHA, 0f, animProps, true /* animate */);
                        mView, AnimatableProperty.ALPHA, 0f, animProps, true /* animate */);
            }
        } else if (oldStatusBarState == StatusBarState.SHADE_LOCKED && statusBarState == KEYGUARD) {
        } else if (oldStatusBarState == StatusBarState.SHADE_LOCKED && statusBarState == KEYGUARD) {
            mView.setVisibility(View.VISIBLE);
            mView.setVisibility(View.VISIBLE);
            mKeyguardViewVisibilityAnimating = true;
            mKeyguardViewVisibilityAnimating = true;
@@ -178,11 +182,15 @@ public class KeyguardVisibilityHelper {
                log("Direct set Visibility to VISIBLE");
                log("Direct set Visibility to VISIBLE");
                mView.setVisibility(View.VISIBLE);
                mView.setVisibility(View.VISIBLE);
            }
            }
        } else {
            if (KeyguardShadeMigrationNssl.isEnabled()) {
                log("Using LockscreenToGoneTransition 2");
            } else {
            } else {
                log("Direct set Visibility to GONE");
                log("Direct set Visibility to GONE");
                mView.setVisibility(View.GONE);
                mView.setVisibility(View.GONE);
                mView.setAlpha(1f);
                mView.setAlpha(1f);
            }
            }
        }


        mLastOccludedState = isOccluded;
        mLastOccludedState = isOccluded;
    }
    }
+16 −12
Original line number Original line Diff line number Diff line
@@ -24,15 +24,15 @@ import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.util.kotlin.Utils.Companion.sample
import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine
import com.android.systemui.util.kotlin.sample
import com.android.systemui.util.kotlin.sample as sampleUtil
import com.android.wm.shell.animation.Interpolators
import com.android.wm.shell.animation.Interpolators
import javax.inject.Inject
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.sample
import kotlinx.coroutines.launch
import kotlinx.coroutines.launch


@SysUISingleton
@SysUISingleton
@@ -62,14 +62,17 @@ constructor(
        listenForTransitionToCamera(scope, keyguardInteractor)
        listenForTransitionToCamera(scope, keyguardInteractor)
    }
    }


    @FlowPreview
    private fun listenForAlternateBouncerToLockscreenHubAodOrDozing() {
    private fun listenForAlternateBouncerToLockscreenHubAodOrDozing() {
        scope.launch {
        scope.launch {
            keyguardInteractor.alternateBouncerShowing
            keyguardInteractor.alternateBouncerShowing
                // Add a slight delay, as alternateBouncer and primaryBouncer showing event changes
                // Add a slight delay, as alternateBouncer and primaryBouncer showing event changes
                // will arrive with a small gap in time. This prevents a transition to LOCKSCREEN
                // will arrive with a small gap in time. This prevents a transition to LOCKSCREEN
                // happening prematurely.
                // happening prematurely.
                .onEach { delay(50) }
                // This should eventually be removed in favor of
                .sample(
                // [KeyguardTransitionInteractor#startDismissKeyguardTransition]
                .sample(150L)
                .sampleCombine(
                    keyguardInteractor.primaryBouncerShowing,
                    keyguardInteractor.primaryBouncerShowing,
                    startedKeyguardTransitionStep,
                    startedKeyguardTransitionStep,
                    powerInteractor.isAwake,
                    powerInteractor.isAwake,
@@ -111,8 +114,9 @@ constructor(


    private fun listenForAlternateBouncerToGone() {
    private fun listenForAlternateBouncerToGone() {
        scope.launch {
        scope.launch {
            keyguardInteractor.isKeyguardGoingAway.sample(finishedKeyguardState, ::Pair).collect {
            keyguardInteractor.isKeyguardGoingAway
                (isKeyguardGoingAway, keyguardState) ->
                .sampleUtil(finishedKeyguardState, ::Pair)
                .collect { (isKeyguardGoingAway, keyguardState) ->
                    if (isKeyguardGoingAway && keyguardState == KeyguardState.ALTERNATE_BOUNCER) {
                    if (isKeyguardGoingAway && keyguardState == KeyguardState.ALTERNATE_BOUNCER) {
                        startTransitionTo(KeyguardState.GONE)
                        startTransitionTo(KeyguardState.GONE)
                    }
                    }
@@ -123,7 +127,7 @@ constructor(
    private fun listenForAlternateBouncerToPrimaryBouncer() {
    private fun listenForAlternateBouncerToPrimaryBouncer() {
        scope.launch {
        scope.launch {
            keyguardInteractor.primaryBouncerShowing
            keyguardInteractor.primaryBouncerShowing
                .sample(startedKeyguardTransitionStep, ::Pair)
                .sampleUtil(startedKeyguardTransitionStep, ::Pair)
                .collect { (isPrimaryBouncerShowing, startedKeyguardState) ->
                .collect { (isPrimaryBouncerShowing, startedKeyguardState) ->
                    if (
                    if (
                        isPrimaryBouncerShowing &&
                        isPrimaryBouncerShowing &&
+9 −0
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import com.android.systemui.keyguard.shared.model.ScrimAlpha
import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
import javax.inject.Inject
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.Flow


@@ -46,6 +47,14 @@ constructor(
            to = KeyguardState.GONE,
            to = KeyguardState.GONE,
        )
        )


    val lockscreenAlpha: Flow<Float> =
        transitionAnimation.sharedFlow(
            duration = 200.milliseconds,
            onStep = { 1 - it },
            onFinish = { 0f },
            onCancel = { 1f },
        )

    /** Scrim alpha values */
    /** Scrim alpha values */
    val scrimAlpha: Flow<ScrimAlpha> =
    val scrimAlpha: Flow<ScrimAlpha> =
        bouncerToGoneFlows.scrimAlpha(TO_GONE_DURATION, ALTERNATE_BOUNCER)
        bouncerToGoneFlows.scrimAlpha(TO_GONE_DURATION, ALTERNATE_BOUNCER)
+7 −1
Original line number Original line Diff line number Diff line
@@ -28,6 +28,9 @@ import com.android.systemui.keyguard.domain.interactor.BurnInInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.BurnInModel
import com.android.systemui.keyguard.shared.model.BurnInModel
import com.android.systemui.keyguard.shared.model.KeyguardState.ALTERNATE_BOUNCER
import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
import com.android.systemui.plugins.clocks.ClockController
import com.android.systemui.plugins.clocks.ClockController
import com.android.systemui.res.R
import com.android.systemui.res.R
import javax.inject.Inject
import javax.inject.Inject
@@ -117,7 +120,10 @@ constructor(
    ): Flow<BurnInModel> {
    ): Flow<BurnInModel> {
        return combine(
        return combine(
            merge(
            merge(
                    keyguardTransitionInteractor.goneToAodTransition.map { it.value },
                    keyguardTransitionInteractor.transition(GONE, AOD).map { it.value },
                    keyguardTransitionInteractor.transition(ALTERNATE_BOUNCER, AOD).map {
                        it.value
                    },
                    keyguardTransitionInteractor.dozeAmountTransition.map { it.value },
                    keyguardTransitionInteractor.dozeAmountTransition.map { it.value },
                )
                )
                .map { dozeAmount -> Interpolators.FAST_OUT_SLOW_IN.getInterpolation(dozeAmount) },
                .map { dozeAmount -> Interpolators.FAST_OUT_SLOW_IN.getInterpolation(dozeAmount) },
Loading