diff options
3 files changed, 86 insertions, 105 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt index b60e98a68162..f3eeed2682a0 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt @@ -39,7 +39,6 @@ import com.android.systemui.power.shared.model.WakeSleepReason.FOLD import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.data.repository.ShadeRepository -import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine import com.android.systemui.util.kotlin.sample import java.util.UUID import javax.inject.Inject @@ -52,7 +51,6 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart -import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class FromLockscreenTransitionInteractor @@ -176,99 +174,89 @@ constructor( if (SceneContainerFlag.isEnabled) return var transitionId: UUID? = null scope.launch("$TAG#listenForLockscreenToPrimaryBouncerDragging") { - shadeRepository.legacyShadeExpansion - .sampleCombine( - transitionInteractor.startedKeyguardTransitionStep, - keyguardInteractor.statusBarState, - keyguardInteractor.isKeyguardDismissible, - keyguardInteractor.isKeyguardOccluded, - ) - .collect { - ( - shadeExpansion, - startedStep, - statusBarState, - isKeyguardUnlocked, - isKeyguardOccluded) -> - val id = transitionId - val currentTransitionInfo = - internalTransitionInteractor.currentTransitionInfoInternal() - if (id != null) { - if (startedStep.to == KeyguardState.PRIMARY_BOUNCER) { - // An existing `id` means a transition is started, and calls to - // `updateTransition` will control it until FINISHED or CANCELED - var nextState = - if (shadeExpansion == 0f) { - TransitionState.FINISHED - } else if (shadeExpansion == 1f) { - TransitionState.CANCELED - } else { - TransitionState.RUNNING - } + shadeRepository.legacyShadeExpansion.collect { shadeExpansion -> + val statusBarState = keyguardInteractor.statusBarState.value + val isKeyguardUnlocked = keyguardInteractor.isKeyguardDismissible.value + val isKeyguardOccluded = keyguardInteractor.isKeyguardOccluded.value + val startedStep = transitionInteractor.startedKeyguardTransitionStep.value - // startTransition below will issue the CANCELED directly - if (nextState != TransitionState.CANCELED) { - transitionRepository.updateTransition( - id, - // This maps the shadeExpansion to a much faster curve, to match - // the existing logic - 1f - - MathUtils.constrainedMap(0f, 1f, 0.95f, 1f, shadeExpansion), - nextState, - ) - } - - if ( - nextState == TransitionState.CANCELED || - nextState == TransitionState.FINISHED - ) { - transitionId = null + val id = transitionId + val currentTransitionInfo = + internalTransitionInteractor.currentTransitionInfoInternal() + if (id != null) { + if (startedStep.to == KeyguardState.PRIMARY_BOUNCER) { + // An existing `id` means a transition is started, and calls to + // `updateTransition` will control it until FINISHED or CANCELED + var nextState = + if (shadeExpansion == 0f) { + TransitionState.FINISHED + } else if (shadeExpansion == 1f) { + TransitionState.CANCELED + } else { + TransitionState.RUNNING } - // If canceled, just put the state back - // TODO(b/278086361): This logic should happen in - // FromPrimaryBouncerInteractor. - if (nextState == TransitionState.CANCELED) { - transitionRepository.startTransition( - TransitionInfo( - ownerName = - "$name " + - "(on behalf of FromPrimaryBouncerInteractor)", - from = KeyguardState.PRIMARY_BOUNCER, - to = - if (isKeyguardOccluded) KeyguardState.OCCLUDED - else KeyguardState.LOCKSCREEN, - modeOnCanceled = TransitionModeOnCanceled.REVERSE, - animator = - getDefaultAnimatorForTransitionsToState( - KeyguardState.LOCKSCREEN - ) - .apply { duration = 100L }, - ) - ) - } + // startTransition below will issue the CANCELED directly + if (nextState != TransitionState.CANCELED) { + transitionRepository.updateTransition( + id, + // This maps the shadeExpansion to a much faster curve, to match + // the existing logic + 1f - MathUtils.constrainedMap(0f, 1f, 0.95f, 1f, shadeExpansion), + nextState, + ) } - } else { - // TODO (b/251849525): Remove statusbarstate check when that state is - // integrated into KeyguardTransitionRepository + if ( - // Use currentTransitionInfo to decide whether to start the transition. - currentTransitionInfo.to == KeyguardState.LOCKSCREEN && - shadeExpansion > 0f && - shadeExpansion < 1f && - shadeRepository.legacyShadeTracking.value && - !isKeyguardUnlocked && - statusBarState == KEYGUARD + nextState == TransitionState.CANCELED || + nextState == TransitionState.FINISHED ) { - transitionId = - startTransitionTo( - toState = KeyguardState.PRIMARY_BOUNCER, - animator = null, // transition will be manually controlled, - ownerReason = "#listenForLockscreenToPrimaryBouncerDragging", + transitionId = null + } + + // If canceled, just put the state back + // TODO(b/278086361): This logic should happen in + // FromPrimaryBouncerInteractor. + if (nextState == TransitionState.CANCELED) { + transitionRepository.startTransition( + TransitionInfo( + ownerName = + "$name " + "(on behalf of FromPrimaryBouncerInteractor)", + from = KeyguardState.PRIMARY_BOUNCER, + to = + if (isKeyguardOccluded) KeyguardState.OCCLUDED + else KeyguardState.LOCKSCREEN, + modeOnCanceled = TransitionModeOnCanceled.REVERSE, + animator = + getDefaultAnimatorForTransitionsToState( + KeyguardState.LOCKSCREEN + ) + .apply { duration = 100L }, ) + ) } } + } else { + // TODO (b/251849525): Remove statusbarstate check when that state is + // integrated into KeyguardTransitionRepository + if ( + // Use currentTransitionInfo to decide whether to start the transition. + currentTransitionInfo.to == KeyguardState.LOCKSCREEN && + shadeExpansion > 0f && + shadeExpansion < 1f && + shadeRepository.legacyShadeTracking.value && + !isKeyguardUnlocked && + statusBarState == KEYGUARD + ) { + transitionId = + startTransitionTo( + toState = KeyguardState.PRIMARY_BOUNCER, + animator = null, // transition will be manually controlled, + ownerReason = "#listenForLockscreenToPrimaryBouncerDragging", + ) + } } + } } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt index b24ca1a8d345..2e0a160bfd16 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt @@ -284,7 +284,7 @@ constructor( } /** Observable for the [StatusBarState] */ - val statusBarState: Flow<StatusBarState> = repository.statusBarState + val statusBarState: StateFlow<StatusBarState> = repository.statusBarState /** Observable for [BiometricUnlockModel] when biometrics are used to unlock the device. */ val biometricUnlockState: StateFlow<BiometricUnlockModel> = repository.biometricUnlockState @@ -350,23 +350,21 @@ constructor( val dismissAlpha: Flow<Float> = shadeRepository.legacyShadeExpansion .sampleCombine( - statusBarState, keyguardTransitionInteractor.currentKeyguardState, keyguardTransitionInteractor.transitionState, isKeyguardDismissible, keyguardTransitionInteractor.isFinishedIn(Scenes.Communal, GLANCEABLE_HUB), ) - .filter { (_, _, _, step, _, _) -> !step.transitionState.isTransitioning() } + .filter { (_, _, step, _, _) -> !step.transitionState.isTransitioning() } .transform { ( legacyShadeExpansion, - statusBarState, currentKeyguardState, step, isKeyguardDismissible, onGlanceableHub) -> if ( - statusBarState == StatusBarState.KEYGUARD && + statusBarState.value == StatusBarState.KEYGUARD && isKeyguardDismissible && currentKeyguardState == LOCKSCREEN && legacyShadeExpansion != 1f diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SwipeToDismissInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SwipeToDismissInteractor.kt index e404f273a768..2e3a095740ab 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SwipeToDismissInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SwipeToDismissInteractor.kt @@ -20,13 +20,13 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.StatusBarState +import com.android.systemui.shade.data.repository.FlingInfo import com.android.systemui.shade.data.repository.ShadeRepository -import com.android.systemui.util.kotlin.Utils.Companion.sample import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn /** @@ -39,8 +39,8 @@ class SwipeToDismissInteractor constructor( @Background backgroundScope: CoroutineScope, shadeRepository: ShadeRepository, - transitionInteractor: KeyguardTransitionInteractor, - keyguardInteractor: KeyguardInteractor, + private val transitionInteractor: KeyguardTransitionInteractor, + private val keyguardInteractor: KeyguardInteractor, ) { /** * Emits a [FlingInfo] whenever a swipe to dismiss gesture has started a fling animation on the @@ -50,20 +50,15 @@ constructor( * LOCKSCREEN -> GONE, and by [KeyguardSurfaceBehindInteractor] to match the surface remote * animation's velocity to the fling velocity, if applicable. */ - val dismissFling = + val dismissFling: StateFlow<FlingInfo?> = shadeRepository.currentFling - .sample( - transitionInteractor.startedKeyguardTransitionStep, - keyguardInteractor.isKeyguardDismissible, - keyguardInteractor.statusBarState, - ) - .filter { (flingInfo, startedStep, keyguardDismissable, statusBarState) -> + .filter { flingInfo -> flingInfo != null && !flingInfo.expand && - statusBarState != StatusBarState.SHADE_LOCKED && - startedStep.to == KeyguardState.LOCKSCREEN && - keyguardDismissable + keyguardInteractor.statusBarState.value != StatusBarState.SHADE_LOCKED && + transitionInteractor.startedKeyguardTransitionStep.value.to == + KeyguardState.LOCKSCREEN && + keyguardInteractor.isKeyguardDismissible.value } - .map { (flingInfo, _) -> flingInfo } .stateIn(backgroundScope, SharingStarted.Eagerly, null) } |