summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt158
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SwipeToDismissInteractor.kt25
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)
}