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

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

Keyguard Transitions - Add REVERSE option

When a transition is canceled and a new one starts, there are multiple
ways to continue from the cancellation point: RESET, LAST_VALUE, or
REVERSE. REVERSE was added in order to support a smooth transition
from AOD<->LOCKSCREEN when the power button is pushed the middle.

Fixes: 305978396
Test: atest KeyguardRepositoryImplTest KeyguardTransitionScenariosTest
Change-Id: Ie03ba8a55707cceeb69a591db1bd5fd9636164f1
parent f0053467
Loading
Loading
Loading
Loading
+9 −14
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.util.Log
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionInfo
import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
import java.util.UUID
@@ -48,8 +49,8 @@ import kotlinx.coroutines.flow.filter
 * [TransitionInteractor]. These interactors will call [startTransition] and [updateTransition] on
 * this repository.
 *
 * To print all transitions to logcat to help with debugging, run this command:
 * adb shell settings put global systemui/buffer/KeyguardLog VERBOSE
 * To print all transitions to logcat to help with debugging, run this command: adb shell settings
 * put global systemui/buffer/KeyguardLog VERBOSE
 *
 * This will print all keyguard transitions to logcat with the KeyguardTransitionAuditLogger tag.
 */
@@ -73,11 +74,8 @@ interface KeyguardTransitionRepository {
    /**
     * Begin a transition from one state to another. Transitions are interruptible, and will issue a
     * [TransitionStep] with state = [TransitionState.CANCELED] before beginning the next one.
     *
     * When canceled, there are two options: to continue from the current position of the prior
     * transition, or to reset the position. When [resetIfCanceled] == true, it will do the latter.
     */
    fun startTransition(info: TransitionInfo, resetIfCanceled: Boolean = false): UUID?
    fun startTransition(info: TransitionInfo): UUID?

    /**
     * Allows manual control of a transition. When calling [startTransition], the consumer must pass
@@ -138,10 +136,7 @@ class KeyguardTransitionRepositoryImpl @Inject constructor() : KeyguardTransitio
        )
    }

    override fun startTransition(
        info: TransitionInfo,
        resetIfCanceled: Boolean,
    ): UUID? {
    override fun startTransition(info: TransitionInfo): UUID? {
        if (lastStep.from == info.from && lastStep.to == info.to) {
            Log.i(TAG, "Duplicate call to start the transition, rejecting: $info")
            return null
@@ -149,10 +144,10 @@ class KeyguardTransitionRepositoryImpl @Inject constructor() : KeyguardTransitio
        val startingValue =
            if (lastStep.transitionState != TransitionState.FINISHED) {
                Log.i(TAG, "Transition still active: $lastStep, canceling")
                if (resetIfCanceled) {
                    0f
                } else {
                    lastStep.value
                when (info.modeOnCanceled) {
                    TransitionModeOnCanceled.LAST_VALUE -> lastStep.value
                    TransitionModeOnCanceled.RESET -> 0f
                    TransitionModeOnCanceled.REVERSE -> 1f - lastStep.value
                }
            } else {
                0f
+15 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepositor
import com.android.systemui.keyguard.shared.model.BiometricUnlockModel.Companion.isWakeAndUnlock
import com.android.systemui.keyguard.shared.model.DozeStateModel
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
import com.android.systemui.util.kotlin.Utils.Companion.toTriple
import com.android.systemui.util.kotlin.sample
import javax.inject.Inject
@@ -65,8 +66,21 @@ constructor(
                )
                .collect { (_, lastStartedStep, occluded) ->
                    if (lastStartedStep.to == KeyguardState.AOD) {
                        startTransitionTo(
                        val toState =
                            if (occluded) KeyguardState.OCCLUDED else KeyguardState.LOCKSCREEN
                        val modeOnCanceled =
                            if (
                                toState == KeyguardState.LOCKSCREEN &&
                                    lastStartedStep.from == KeyguardState.LOCKSCREEN
                            ) {
                                TransitionModeOnCanceled.REVERSE
                            } else {
                                TransitionModeOnCanceled.LAST_VALUE
                            }

                        startTransitionTo(
                            toState = toState,
                            modeOnCanceled = modeOnCanceled,
                        )
                    }
                }
+4 −2
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ 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.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.util.kotlin.Utils.Companion.toTriple
import com.android.systemui.util.kotlin.sample
@@ -114,8 +115,9 @@ constructor(
                .collect { (isAsleep, lastStartedStep, isAodAvailable) ->
                    if (lastStartedStep.to == KeyguardState.GONE && isAsleep) {
                        startTransitionTo(
                            toState =
                                if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING,
                            resetIfCancelled = true,
                            modeOnCanceled = TransitionModeOnCanceled.RESET,
                        )
                    }
                }
+14 −1
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.KeyguardSurfaceBehindModel
import com.android.systemui.keyguard.shared.model.StatusBarState.KEYGUARD
import com.android.systemui.keyguard.shared.model.TransitionInfo
import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.shade.data.repository.ShadeRepository
@@ -340,8 +341,20 @@ constructor(
                )
                .collect { (isAsleep, lastStartedStep, isAodAvailable) ->
                    if (lastStartedStep.to == KeyguardState.LOCKSCREEN && isAsleep) {
                        startTransitionTo(
                        val toState =
                            if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING
                        val modeOnCanceled =
                            if (
                                toState == KeyguardState.AOD &&
                                    lastStartedStep.from == KeyguardState.AOD
                            ) {
                                TransitionModeOnCanceled.REVERSE
                            } else {
                                TransitionModeOnCanceled.LAST_VALUE
                            }
                        startTransitionTo(
                            toState = toState,
                            modeOnCanceled = modeOnCanceled,
                        )
                    }
                }
+23 −24
Original line number Diff line number Diff line
@@ -26,20 +26,21 @@ import com.android.systemui.flags.Flags
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.util.kotlin.Utils.Companion.toQuad
import com.android.systemui.util.kotlin.Utils.Companion.toQuint
import com.android.systemui.util.kotlin.Utils.Companion.toTriple
import com.android.systemui.util.kotlin.sample
import com.android.wm.shell.animation.Interpolators
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.launch
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds

@SysUISingleton
class FromPrimaryBouncerTransitionInteractor
@@ -162,8 +163,7 @@ constructor(
                    ),
                    ::toQuad
                )
                .collect {
                    (isBouncerShowing, isAsleep, lastStartedTransitionStep, isAodAvailable)
                .collect { (isBouncerShowing, isAsleep, lastStartedTransitionStep, isAodAvailable)
                    ->
                    if (
                        !isBouncerShowing &&
@@ -189,9 +189,8 @@ constructor(
                    ),
                    ::toTriple
                )
                    .collect { (isBouncerShowing,
                                       isActiveDreamLockscreenHosted,
                                       lastStartedTransitionStep) ->
                .collect {
                    (isBouncerShowing, isActiveDreamLockscreenHosted, lastStartedTransitionStep) ->
                    if (
                        !isBouncerShowing &&
                            isActiveDreamLockscreenHosted &&
@@ -237,7 +236,7 @@ constructor(
                                getDefaultAnimatorForTransitionsToState(KeyguardState.GONE).apply {
                                    this.duration = duration.inWholeMilliseconds
                                },
                            resetIfCancelled = true
                            modeOnCanceled = TransitionModeOnCanceled.RESET,
                        )
                    }
                }
Loading