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

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

Transitions - Better dozing/aod support

Add callbacks to BatteryController in order to feed AOD availability
into the KeyguardRepository. This allows for better decisions when
transitioning to both DOZING and AOD states.

Remove released lockscreen animations flag

Fixes: 254512713
Bug: 195430376
Test: atest KeyguardRepositoryImplTest KeyguardTransitionScenariosTest DozeParametersTest
Change-Id: I2ab4c15e1b0289acb9e3505ca3ef4475c2f143ae
parent d991f01a
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -114,8 +114,6 @@ object Flags {
    // ** Flag retired **
    // public static final BooleanFlag KEYGUARD_LAYOUT =
    //         new BooleanFlag(200, true);
    // TODO(b/254512713): Tracking Bug
    @JvmField val LOCKSCREEN_ANIMATIONS = releasedFlag(201, "lockscreen_animations")

    // TODO(b/254512750): Tracking Bug
    val NEW_UNLOCK_SWIPE_ANIMATION = releasedFlag(202, "new_unlock_swipe_animation")
+30 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import com.android.systemui.keyguard.shared.model.WakefulnessModel
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.phone.BiometricUnlockController
import com.android.systemui.statusbar.phone.BiometricUnlockController.WakeAndUnlockMode
import com.android.systemui.statusbar.phone.DozeParameters
import com.android.systemui.statusbar.policy.KeyguardStateController
import javax.inject.Inject
import kotlinx.coroutines.channels.awaitClose
@@ -88,6 +89,9 @@ interface KeyguardRepository {
    /** Observable for whether the bouncer is showing. */
    val isBouncerShowing: Flow<Boolean>

    /** Is the always-on display available to be used? */
    val isAodAvailable: Flow<Boolean>

    /**
     * Observable for whether we are in doze state.
     *
@@ -182,6 +186,7 @@ constructor(
    private val keyguardStateController: KeyguardStateController,
    private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
    private val dozeTransitionListener: DozeTransitionListener,
    private val dozeParameters: DozeParameters,
    private val authController: AuthController,
    private val dreamOverlayCallbackController: DreamOverlayCallbackController,
) : KeyguardRepository {
@@ -220,6 +225,31 @@ constructor(
            }
            .distinctUntilChanged()

    override val isAodAvailable: Flow<Boolean> =
        conflatedCallbackFlow {
                val callback =
                    object : DozeParameters.Callback {
                        override fun onAlwaysOnChange() {
                            trySendWithFailureLogging(
                                dozeParameters.getAlwaysOn(),
                                TAG,
                                "updated isAodAvailable"
                            )
                        }
                    }

                dozeParameters.addCallback(callback)
                // Adding the callback does not send an initial update.
                trySendWithFailureLogging(
                    dozeParameters.getAlwaysOn(),
                    TAG,
                    "initial isAodAvailable"
                )

                awaitClose { dozeParameters.removeCallback(callback) }
            }
            .distinctUntilChanged()

    override val isKeyguardOccluded: Flow<Boolean> =
        conflatedCallbackFlow {
                val callback =
+4 −5
Original line number Diff line number Diff line
@@ -21,9 +21,9 @@ import com.android.systemui.animation.Interpolators
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.DozeStateModel.Companion.isDozeOff
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionInfo
import com.android.systemui.keyguard.shared.model.WakefulnessModel.Companion.isWakingOrStartingToWake
import com.android.systemui.util.kotlin.sample
import javax.inject.Inject
import kotlin.time.Duration
@@ -48,12 +48,11 @@ constructor(

    private fun listenForDozingToLockscreen() {
        scope.launch {
            keyguardInteractor.dozeTransitionModel
            keyguardInteractor.wakefulnessModel
                .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair)
                .collect { pair ->
                    val (dozeTransitionModel, lastStartedTransition) = pair
                .collect { (wakefulnessModel, lastStartedTransition) ->
                    if (
                        isDozeOff(dozeTransitionModel.to) &&
                        isWakingOrStartingToWake(wakefulnessModel) &&
                            lastStartedTransition.to == KeyguardState.DOZING
                    ) {
                        keyguardTransitionRepository.startTransition(
+24 −10
Original line number Diff line number Diff line
@@ -26,7 +26,10 @@ import com.android.systemui.keyguard.shared.model.TransitionInfo
import com.android.systemui.keyguard.shared.model.WakefulnessState
import com.android.systemui.util.kotlin.sample
import javax.inject.Inject
import kotlin.time.Duration
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch

@SysUISingleton
@@ -40,7 +43,7 @@ constructor(
) : TransitionInteractor(FromGoneTransitionInteractor::class.simpleName!!) {

    override fun start() {
        listenForGoneToAod()
        listenForGoneToAodOrDozing()
        listenForGoneToDreaming()
    }

@@ -56,7 +59,7 @@ constructor(
                                name,
                                KeyguardState.GONE,
                                KeyguardState.DREAMING,
                                getAnimator(),
                                getAnimator(TO_DREAMING_DURATION),
                            )
                        )
                    }
@@ -64,12 +67,18 @@ constructor(
        }
    }

    private fun listenForGoneToAod() {
    private fun listenForGoneToAodOrDozing() {
        scope.launch {
            keyguardInteractor.wakefulnessModel
                .sample(keyguardTransitionInteractor.finishedKeyguardState, ::Pair)
                .collect { pair ->
                    val (wakefulnessState, keyguardState) = pair
                .sample(
                    combine(
                        keyguardTransitionInteractor.finishedKeyguardState,
                        keyguardInteractor.isAodAvailable,
                        ::Pair
                    ),
                    ::toTriple
                )
                .collect { (wakefulnessState, keyguardState, isAodAvailable) ->
                    if (
                        keyguardState == KeyguardState.GONE &&
                            wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP
@@ -78,7 +87,11 @@ constructor(
                            TransitionInfo(
                                name,
                                KeyguardState.GONE,
                                KeyguardState.AOD,
                                if (isAodAvailable) {
                                    KeyguardState.AOD
                                } else {
                                    KeyguardState.DOZING
                                },
                                getAnimator(),
                            )
                        )
@@ -87,14 +100,15 @@ constructor(
        }
    }

    private fun getAnimator(): ValueAnimator {
    private fun getAnimator(duration: Duration = DEFAULT_DURATION): ValueAnimator {
        return ValueAnimator().apply {
            setInterpolator(Interpolators.LINEAR)
            setDuration(TRANSITION_DURATION_MS)
            setDuration(duration.inWholeMilliseconds)
        }
    }

    companion object {
        private const val TRANSITION_DURATION_MS = 500L
        private val DEFAULT_DURATION = 500.milliseconds
        val TO_DREAMING_DURATION = 933.milliseconds
    }
}
+22 −10
Original line number Diff line number Diff line
@@ -21,11 +21,11 @@ import com.android.systemui.animation.Interpolators
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.DozeStateModel
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.StatusBarState.KEYGUARD
import com.android.systemui.keyguard.shared.model.TransitionInfo
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.WakefulnessState
import com.android.systemui.shade.data.repository.ShadeRepository
import com.android.systemui.util.kotlin.sample
import java.util.UUID
@@ -54,7 +54,7 @@ constructor(
        listenForLockscreenToGone()
        listenForLockscreenToOccluded()
        listenForLockscreenToCamera()
        listenForLockscreenToAod()
        listenForLockscreenToAodOrDozing()
        listenForLockscreenToBouncer()
        listenForLockscreenToDreaming()
        listenForLockscreenToBouncerDragging()
@@ -230,19 +230,31 @@ constructor(
        }
    }

    private fun listenForLockscreenToAod() {
    private fun listenForLockscreenToAodOrDozing() {
        scope.launch {
            keyguardInteractor
                .dozeTransitionTo(DozeStateModel.DOZE_AOD)
                .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair)
                .collect { pair ->
                    val (dozeToAod, lastStartedStep) = pair
                    if (lastStartedStep.to == KeyguardState.LOCKSCREEN) {
            keyguardInteractor.wakefulnessModel
                .sample(
                    combine(
                        keyguardTransitionInteractor.startedKeyguardTransitionStep,
                        keyguardInteractor.isAodAvailable,
                        ::Pair
                    ),
                    ::toTriple
                )
                .collect { (wakefulnessState, lastStartedStep, isAodAvailable) ->
                    if (
                        lastStartedStep.to == KeyguardState.LOCKSCREEN &&
                            wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP
                    ) {
                        keyguardTransitionRepository.startTransition(
                            TransitionInfo(
                                name,
                                KeyguardState.LOCKSCREEN,
                                KeyguardState.AOD,
                                if (isAodAvailable) {
                                    KeyguardState.AOD
                                } else {
                                    KeyguardState.DOZING
                                },
                                getAnimator(),
                            )
                        )
Loading