From 993197d27373abf34ef32142f83561276dca6ba3 Mon Sep 17 00:00:00 2001 From: Andreas Miko Date: Wed, 19 Jun 2024 14:43:59 +0200 Subject: Consolidate isInTransitionWhere() Bug: 349785004 Flag: com.android.systemui.scene_container Test: Added unit test Change-Id: I49ec149204f2ad0b6d6fa0819492fed2b50bddbe --- .../interactor/KeyguardTransitionInteractorTest.kt | 131 +++++++-------------- .../scene/domain/interactor/SceneInteractorTest.kt | 8 ++ .../repository/DeviceEntryFaceAuthRepository.kt | 2 +- .../interactor/KeyguardTransitionInteractor.kt | 67 +++-------- .../WindowManagerLockscreenVisibilityInteractor.kt | 10 +- .../scene/domain/interactor/SceneInteractor.kt | 9 +- .../SharedNotificationContainerViewModel.kt | 2 +- .../NotificationPanelViewControllerBaseTest.java | 2 +- .../KeyguardTransitionInteractorKosmos.kt | 2 +- .../domain/interactor/SceneInteractorKosmos.kt | 4 +- 10 files changed, 85 insertions(+), 152 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt index 40918a48f6c3..5e4ffddeb942 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt @@ -318,7 +318,7 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { @Test fun isInTransitionToAnyState() = testScope.runTest { - val inTransition by collectValues(underTest.isInTransitionToAnyState) + val inTransition by collectValues(underTest.isInTransition) assertEquals( listOf( @@ -373,10 +373,51 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { ) } + @Test + @EnableSceneContainer + fun isInTransition_withScene() = + testScope.runTest { + val inTransition by collectValues(underTest.isInTransition) + + assertEquals( + listOf( + false, + true, // The repo is seeded with a transition from OFF to LOCKSCREEN. + false, + ), + inTransition + ) + + kosmos.setSceneTransition(Transition(Scenes.Gone, Scenes.Bouncer)) + + assertEquals( + listOf( + false, + true, + false, + true, + ), + inTransition + ) + + kosmos.setSceneTransition(Idle(Scenes.Bouncer)) + + assertEquals( + listOf( + false, + true, + false, + true, + false, + ), + inTransition + ) + } + @Test fun isInTransitionToAnyState_finishedStateIsStartedStateAfterCancels() = testScope.runTest { - val inTransition by collectValues(underTest.isInTransitionToAnyState) + val inTransition by collectValues(underTest.isInTransition) assertEquals( listOf( @@ -730,92 +771,6 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { ) } - @Test - fun isInTransitionFromStateWhere() = - testScope.runTest { - val results by collectValues(underTest.isInTransitionFromStateWhere { it == DOZING }) - - sendSteps( - TransitionStep(AOD, DOZING, 0f, STARTED), - TransitionStep(AOD, DOZING, 0.5f, RUNNING), - TransitionStep(AOD, DOZING, 1f, FINISHED), - ) - - assertThat(results) - .isEqualTo( - listOf( - false, - ) - ) - - sendSteps( - TransitionStep(DOZING, GONE, 0f, STARTED), - ) - - assertThat(results) - .isEqualTo( - listOf( - false, - true, - ) - ) - - sendSteps( - TransitionStep(DOZING, GONE, 0f, RUNNING), - ) - - assertThat(results) - .isEqualTo( - listOf( - false, - true, - ) - ) - - sendSteps( - TransitionStep(DOZING, GONE, 0f, FINISHED), - ) - - assertThat(results) - .isEqualTo( - listOf( - false, - true, - false, - ) - ) - - sendSteps( - TransitionStep(GONE, DOZING, 0f, STARTED), - TransitionStep(GONE, DOZING, 0f, RUNNING), - TransitionStep(GONE, DOZING, 1f, FINISHED), - ) - - assertThat(results) - .isEqualTo( - listOf( - false, - true, - false, - ) - ) - - sendSteps( - TransitionStep(DOZING, GONE, 0f, STARTED), - TransitionStep(DOZING, GONE, 0f, RUNNING), - ) - - assertThat(results) - .isEqualTo( - listOf( - false, - true, - false, - true, - ) - ) - } - @Test fun isInTransitionWhere() = testScope.runTest { diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt index 5242fe33a281..3acb328e81af 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt @@ -24,6 +24,7 @@ import com.android.compose.animation.scene.ObservableTransitionState import com.android.compose.animation.scene.SceneKey import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository import com.android.systemui.keyguard.domain.interactor.keyguardEnabledInteractor @@ -62,6 +63,13 @@ class SceneInteractorTest : SysuiTestCase() { private val underTest = kosmos.sceneInteractor + init { + // Init lazy Fixtures. Accessing them once makes sure that the singletons are initialized + // and therefore starts to collect StateFlows eagerly (when there are any). + kosmos.deviceUnlockedInteractor + kosmos.keyguardEnabledInteractor + } + @Test fun allSceneKeys() { assertThat(underTest.allSceneKeys()).isEqualTo(kosmos.sceneKeys) diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepository.kt index 17202639136b..ed30d59a94fa 100644 --- a/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepository.kt @@ -397,7 +397,7 @@ constructor( Pair(keyguardRepository.isKeyguardGoingAway.isFalse(), "keyguardNotGoingAway"), Pair( keyguardTransitionInteractor - .isInTransitionToStateWhere(KeyguardState::deviceIsAsleepInState) + .isInTransitionWhere(toStatePredicate = KeyguardState::deviceIsAsleepInState) .isFalse(), "deviceNotTransitioningToAsleepState" ), diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt index 2d389aa93d76..76c6ffbb52f7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt @@ -50,6 +50,7 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map @@ -75,7 +76,7 @@ constructor( private val fromAlternateBouncerTransitionInteractor: dagger.Lazy, private val fromDozingTransitionInteractor: dagger.Lazy, - private val sceneInteractor: dagger.Lazy, + private val sceneInteractor: SceneInteractor, ) { private val transitionMap = mutableMapOf>() @@ -194,7 +195,7 @@ constructor( fun SceneKey?.isLockscreenOrNull() = this == Scenes.Lockscreen || this == null return@filter (fromScene.isLockscreenOrNull() && toScene.isLockscreenOrNull()) || - sceneInteractor.get().transitionState.value.isTransitioning(fromScene, toScene) + sceneInteractor.transitionState.value.isTransitioning(fromScene, toScene) } } else { flow @@ -228,7 +229,7 @@ constructor( stateWithoutSceneContainer: KeyguardState, ): Flow { return if (SceneContainerFlag.isEnabled) { - sceneInteractor.get().transitionProgress(scene) + sceneInteractor.transitionProgress(scene) } else { transitionValue(stateWithoutSceneContainer) } @@ -408,8 +409,14 @@ constructor( internal val currentTransitionInfoInternal: StateFlow = repository.currentTransitionInfoInternal - /** Whether we've currently STARTED a transition and haven't yet FINISHED it. */ - val isInTransitionToAnyState = isInTransitionWhere({ true }, { true }) + val isInTransition = + combine( + isInTransitionWhere({ true }, { true }), + sceneInteractor.transitionState, + ) { isKeyguardTransitioning, sceneTransitionState -> + isKeyguardTransitioning || + (SceneContainerFlag.isEnabled && sceneTransitionState.isTransitioning()) + } /** * Called to start a transition that will ultimately dismiss the keyguard from the current @@ -448,7 +455,7 @@ constructor( fun isInTransition(edge: Edge, edgeWithoutSceneContainer: Edge? = null): Flow { return if (SceneContainerFlag.isEnabled) { if (edge.isSceneWildcardEdge()) { - sceneInteractor.get().transitionState.map { + sceneInteractor.transitionState.map { when (edge) { is Edge.StateToState -> throw IllegalStateException("Should not be reachable.") @@ -468,30 +475,6 @@ constructor( .distinctUntilChanged() } - /** - * Whether we're in a transition to a [KeyguardState] that matches the given predicate, but - * haven't yet completed it. - * - * If you only care about a single state, instead use the optimized [isInTransition]. - */ - fun isInTransitionToStateWhere( - stateMatcher: (KeyguardState) -> Boolean, - ): Flow { - return isInTransitionWhere(fromStatePredicate = { true }, toStatePredicate = stateMatcher) - } - - /** - * Whether we're in a transition out of a [KeyguardState] that matches the given predicate, but - * haven't yet completed it. - * - * If you only care about a single state, instead use the optimized [isInTransition]. - */ - fun isInTransitionFromStateWhere( - stateMatcher: (KeyguardState) -> Boolean, - ): Flow { - return isInTransitionWhere(fromStatePredicate = stateMatcher, toStatePredicate = { true }) - } - /** * Whether we're in a transition between two [KeyguardState]s that match the given predicates, * but haven't yet completed it. @@ -500,27 +483,15 @@ constructor( * [isInTransition]. */ fun isInTransitionWhere( - fromStatePredicate: (KeyguardState) -> Boolean, - toStatePredicate: (KeyguardState) -> Boolean, - ): Flow { - return isInTransitionWhere { from, to -> fromStatePredicate(from) && toStatePredicate(to) } - } - - /** - * Whether we're in a transition between two [KeyguardState]s that match the given predicates, - * but haven't yet completed it. - * - * If you only care about a single state for both from and to, instead use the optimized - * [isInTransition]. - */ - private fun isInTransitionWhere( - fromToStatePredicate: (KeyguardState, KeyguardState) -> Boolean + fromStatePredicate: (KeyguardState) -> Boolean = { true }, + toStatePredicate: (KeyguardState) -> Boolean = { true }, ): Flow { return repository.transitions .filter { it.transitionState != TransitionState.CANCELED } .mapLatest { it.transitionState != TransitionState.FINISHED && - fromToStatePredicate(it.from, it.to) + fromStatePredicate(it.from) && + toStatePredicate(it.to) } .distinctUntilChanged() } @@ -532,9 +503,7 @@ constructor( fun isFinishedIn(scene: SceneKey, stateWithoutSceneContainer: KeyguardState): Flow { return if (SceneContainerFlag.isEnabled) { - sceneInteractor - .get() - .transitionState + sceneInteractor.transitionState .map { it.isIdle(scene) || it.isTransitioning(from = scene) } .distinctUntilChanged() } else { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt index 069f65b4efa6..3355ffd83138 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt @@ -129,7 +129,7 @@ constructor( } } } else { - transitionInteractor.isInTransitionToAnyState.flatMapLatest { isInTransition -> + transitionInteractor.isInTransition.flatMapLatest { isInTransition -> if (!isInTransition) { defaultSurfaceBehindVisibility } else { @@ -206,11 +206,11 @@ constructor( transitionInteractor.currentKeyguardState .sample(transitionInteractor.startedStepWithPrecedingStep, ::Pair) .map { (currentState, startedWithPrev) -> - val startedFromStep = startedWithPrev?.previousValue - val startedStep = startedWithPrev?.newValue + val startedFromStep = startedWithPrev.previousValue + val startedStep = startedWithPrev.newValue val returningToGoneAfterCancellation = - startedStep?.to == KeyguardState.GONE && - startedFromStep?.transitionState == TransitionState.CANCELED && + startedStep.to == KeyguardState.GONE && + startedFromStep.transitionState == TransitionState.CANCELED && startedFromStep.from == KeyguardState.GONE if (!returningToGoneAfterCancellation) { diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt index ef011945b5c8..5885193aa017 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt @@ -28,6 +28,7 @@ import com.android.systemui.scene.domain.resolver.SceneResolver import com.android.systemui.scene.shared.logger.SceneLogger import com.android.systemui.scene.shared.model.SceneFamilies import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.util.kotlin.getValue import com.android.systemui.util.kotlin.pairwiseBy import dagger.Lazy import javax.inject.Inject @@ -60,8 +61,8 @@ constructor( private val repository: SceneContainerRepository, private val logger: SceneLogger, private val sceneFamilyResolvers: Lazy>, - private val deviceUnlockedInteractor: DeviceUnlockedInteractor, - private val keyguardEnabledInteractor: KeyguardEnabledInteractor, + private val deviceUnlockedInteractor: Lazy, + private val keyguardEnabledInteractor: Lazy, ) { interface OnSceneAboutToChangeListener { @@ -387,8 +388,8 @@ constructor( val isChangeAllowed = to != Scenes.Gone || inMidTransitionFromGone || - deviceUnlockedInteractor.deviceUnlockStatus.value.isUnlocked || - !keyguardEnabledInteractor.isKeyguardEnabled.value + deviceUnlockedInteractor.get().deviceUnlockStatus.value.isUnlocked || + !keyguardEnabledInteractor.get().isKeyguardEnabled.value check(isChangeAllowed) { "Cannot change to the Gone scene while the device is locked and not currently" + " transitioning from Gone. Current transition state is ${transitionState.value}." + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt index 1c57346b18e0..900201f54bd7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt @@ -372,7 +372,7 @@ constructor( paddingTopDimen, interactor.topPosition .sampleCombine( - keyguardTransitionInteractor.isInTransitionToAnyState, + keyguardTransitionInteractor.isInTransition, shadeInteractor.qsExpansion, ) .onStart { emit(Triple(0f, false, 0f)) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java index e7ca091aaf4c..b80d1a472a72 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -419,7 +419,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mShadeAnimationInteractor = new ShadeAnimationInteractorLegacyImpl( new ShadeAnimationRepository(), mShadeRepository); mPowerInteractor = keyguardInteractorDeps.getPowerInteractor(); - when(mKeyguardTransitionInteractor.isInTransitionToStateWhere(any())).thenReturn( + when(mKeyguardTransitionInteractor.isInTransitionWhere(any(), any())).thenReturn( MutableStateFlow(false)); when(mKeyguardTransitionInteractor.isInTransition(any(), any())) .thenReturn(emptyFlow()); diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorKosmos.kt index c90642d93939..c5da10e59369 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorKosmos.kt @@ -33,6 +33,6 @@ val Kosmos.keyguardTransitionInteractor: KeyguardTransitionInteractor by fromAodTransitionInteractor = { fromAodTransitionInteractor }, fromAlternateBouncerTransitionInteractor = { fromAlternateBouncerTransitionInteractor }, fromDozingTransitionInteractor = { fromDozingTransitionInteractor }, - sceneInteractor = { sceneInteractor } + sceneInteractor = sceneInteractor ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneInteractorKosmos.kt index 0921eb9e83d3..ae8b411a4b95 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneInteractorKosmos.kt @@ -31,7 +31,7 @@ val Kosmos.sceneInteractor by repository = sceneContainerRepository, logger = sceneLogger, sceneFamilyResolvers = { sceneFamilyResolvers }, - deviceUnlockedInteractor = deviceUnlockedInteractor, - keyguardEnabledInteractor = keyguardEnabledInteractor, + deviceUnlockedInteractor = { deviceUnlockedInteractor }, + keyguardEnabledInteractor = { keyguardEnabledInteractor }, ) } -- cgit v1.2.3-59-g8ed1b From b0c39fa728f7085215b9dd48103131be06e4630b Mon Sep 17 00:00:00 2001 From: Andreas Miko Date: Wed, 19 Jun 2024 15:28:02 +0200 Subject: Fix KeyguardTransitionInteractorTest Two tests were failing because of inconsistent `runCurrent` behavior, but this test is currently disabled in presubmit for other flaky tests. Bug: 349785004 Flag: com.android.systemui.scene_container Test: test_only Change-Id: Ia6c4e104e1be41123393ce18b0c60e71993dddc1 --- .../interactor/KeyguardTransitionInteractorTest.kt | 47 +++------------------- 1 file changed, 6 insertions(+), 41 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt index 5e4ffddeb942..a8eccc5add1a 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt @@ -19,7 +19,6 @@ package com.android.systemui.keyguard.domain.interactor import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest -import com.android.compose.animation.scene.ObservableTransitionState import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectValues import com.android.systemui.flags.DisableSceneContainer @@ -42,19 +41,15 @@ import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.kosmos.testScope import com.android.systemui.scene.data.repository.Idle import com.android.systemui.scene.data.repository.Transition -import com.android.systemui.scene.data.repository.sceneContainerRepository import com.android.systemui.scene.data.repository.setSceneTransition import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import junit.framework.Assert.assertEquals import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Assert.assertThrows -import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -67,36 +62,6 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { val repository = kosmos.fakeKeyguardTransitionRepository val testScope = kosmos.testScope - private val sceneTransitions = - MutableStateFlow( - ObservableTransitionState.Idle(Scenes.Lockscreen) - ) - - private val lsToGone = - ObservableTransitionState.Transition( - Scenes.Lockscreen, - Scenes.Gone, - flowOf(Scenes.Lockscreen), - flowOf(0f), - false, - flowOf(false) - ) - - private val goneToLs = - ObservableTransitionState.Transition( - Scenes.Gone, - Scenes.Lockscreen, - flowOf(Scenes.Lockscreen), - flowOf(0f), - false, - flowOf(false) - ) - - @Before - fun setUp() { - kosmos.sceneContainerRepository.setTransitionState(sceneTransitions) - } - @Test fun transitionCollectorsReceivesOnlyAppropriateEvents() = testScope.runTest { @@ -1554,7 +1519,7 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { val currentStatesConverted by collectValues(underTest.transition(Edge.create(LOCKSCREEN, UNDEFINED))) - sceneTransitions.value = lsToGone + kosmos.setSceneTransition(Transition(Scenes.Lockscreen, Scenes.Gone)) val sendStep1 = TransitionStep(LOCKSCREEN, UNDEFINED, 0f, STARTED) val sendStep2 = TransitionStep(LOCKSCREEN, UNDEFINED, 1f, FINISHED) val sendStep3 = TransitionStep(LOCKSCREEN, AOD, 0f, STARTED) @@ -1570,7 +1535,7 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { testScope.runTest { val currentStates by collectValues(underTest.transition(Edge.create(LOCKSCREEN, GONE))) - sceneTransitions.value = goneToLs + kosmos.setSceneTransition(Transition(Scenes.Gone, Scenes.Lockscreen)) val sendStep1 = TransitionStep(LOCKSCREEN, UNDEFINED, 0f, STARTED) val sendStep2 = TransitionStep(LOCKSCREEN, UNDEFINED, 1f, FINISHED) val sendStep3 = TransitionStep(LOCKSCREEN, AOD, 0f, STARTED) @@ -1586,7 +1551,7 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { val currentStates by collectValues(underTest.transition(Edge.create(LOCKSCREEN, DOZING))) - sceneTransitions.value = goneToLs + kosmos.setSceneTransition(Transition(Scenes.Gone, Scenes.Lockscreen)) val sendStep1 = TransitionStep(LOCKSCREEN, DOZING, 0f, STARTED) val sendStep2 = TransitionStep(LOCKSCREEN, DOZING, 1f, FINISHED) val sendStep3 = TransitionStep(LOCKSCREEN, AOD, 0f, STARTED) @@ -1603,7 +1568,7 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { val currentStatesReversed by collectValues(underTest.transition(Edge.create(null, LOCKSCREEN))) - sceneTransitions.value = goneToLs + kosmos.setSceneTransition(Transition(Scenes.Gone, Scenes.Lockscreen)) val sendStep1 = TransitionStep(LOCKSCREEN, DOZING, 0f, STARTED) val sendStep2 = TransitionStep(LOCKSCREEN, DOZING, 1f, FINISHED) val sendStep3 = TransitionStep(LOCKSCREEN, AOD, 0f, STARTED) @@ -1621,7 +1586,7 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { val currentStates by collectValues(underTest.transition(Edge.create(null, UNDEFINED))) val currentStatesMapped by collectValues(underTest.transition(Edge.create(null, GONE))) - sceneTransitions.value = lsToGone + kosmos.setSceneTransition(Transition(Scenes.Lockscreen, Scenes.Gone)) val sendStep1 = TransitionStep(LOCKSCREEN, UNDEFINED, 0f, STARTED) val sendStep2 = TransitionStep(LOCKSCREEN, UNDEFINED, 1f, FINISHED) val sendStep3 = TransitionStep(UNDEFINED, AOD, 0f, STARTED) @@ -1638,7 +1603,7 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { testScope.runTest { val currentStatesMapped by collectValues(underTest.transition(Edge.create(null, GONE))) - sceneTransitions.value = goneToLs + kosmos.setSceneTransition(Transition(Scenes.Gone, Scenes.Lockscreen)) val sendStep1 = TransitionStep(LOCKSCREEN, UNDEFINED, 0f, STARTED) val sendStep2 = TransitionStep(LOCKSCREEN, UNDEFINED, 1f, FINISHED) val sendStep3 = TransitionStep(UNDEFINED, AOD, 0f, STARTED) -- cgit v1.2.3-59-g8ed1b From b7e165a2222dcc04552393bf979055356e448eab Mon Sep 17 00:00:00 2001 From: Andreas Miko Date: Wed, 19 Jun 2024 16:10:29 +0200 Subject: Refactor internal functions to InternalKeyguardTransitionInteractor KeyguardTransitionInteractor exposes these internal functions that should not be lightly used by any of its (many) callers. Also by virtue of its size and scope the Single Responsibility Principle is not adhered to. Bug: 349785004 Flag: com.android.systemui.scene_container Test: refactor_only Change-Id: Ieeea795cbf75f1d68624142ef701a663a7f0c200 --- .../FromAlternateBouncerTransitionInteractor.kt | 1 + .../interactor/FromAodTransitionInteractor.kt | 1 + .../interactor/FromDozingTransitionInteractor.kt | 1 + ...DreamingLockscreenHostedTransitionInteractor.kt | 1 + .../interactor/FromDreamingTransitionInteractor.kt | 1 + .../FromGlanceableHubTransitionInteractor.kt | 1 + .../interactor/FromGoneTransitionInteractor.kt | 1 + .../FromLockscreenTransitionInteractor.kt | 5 +- .../interactor/FromOccludedTransitionInteractor.kt | 1 + .../FromPrimaryBouncerTransitionInteractor.kt | 1 + .../InternalKeyguardTransitionInteractor.kt | 71 ++++++++++++++++++++++ .../domain/interactor/KeyguardEnabledInteractor.kt | 5 +- .../interactor/KeyguardOcclusionInteractor.kt | 3 +- .../interactor/KeyguardTransitionBootInteractor.kt | 3 +- .../interactor/KeyguardTransitionInteractor.kt | 38 +----------- .../domain/interactor/TransitionInteractor.kt | 17 +++--- .../LockscreenSceneTransitionInteractor.kt | 21 ++++--- ...omAlternateBouncerTransitionInteractorKosmos.kt | 1 + .../FromAodTransitionInteractorKosmos.kt | 1 + .../FromDozingTransitionInteractorKosmos.kt | 1 + ...ngLockscreenHostedTransitionInteractorKosmos.kt | 1 + .../FromDreamingTransitionInteractorKosmos.kt | 1 + .../FromGlanceableHubTransitionInteractorKosmos.kt | 1 + .../FromGoneTransitionInteractorKosmos.kt | 1 + .../FromLockscreenTransitionInteractorKosmos.kt | 1 + .../FromOccludedTransitionInteractorKosmos.kt | 1 + ...FromPrimaryBouncerTransitionInteractorKosmos.kt | 1 + .../InternalKeyguardTransitionInteractorKosmos.kt | 27 ++++++++ .../interactor/KeyguardEnabledInteractorKosmos.kt | 1 + .../KeyguardTransitionBootInteractorKosmos.kt | 1 + .../LockscreenSceneTransitionInteractor.kt | 2 + .../KeyguardOcclusionInteractorKosmos.kt | 2 + 32 files changed, 155 insertions(+), 60 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/InternalKeyguardTransitionInteractor.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/InternalKeyguardTransitionInteractorKosmos.kt diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt index 5573f0d5f644..b44a8cf70328 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt @@ -56,6 +56,7 @@ class FromAlternateBouncerTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, + override val internalTransitionInteractor: InternalKeyguardTransitionInteractor, transitionInteractor: KeyguardTransitionInteractor, @Background private val scope: CoroutineScope, @Background bgDispatcher: CoroutineDispatcher, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt index 2a9ee9fb8779..868c4629dbb3 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt @@ -44,6 +44,7 @@ class FromAodTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, + override val internalTransitionInteractor: InternalKeyguardTransitionInteractor, transitionInteractor: KeyguardTransitionInteractor, @Background private val scope: CoroutineScope, @Background bgDispatcher: CoroutineDispatcher, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt index b423ed980060..3877e7ae1e55 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt @@ -44,6 +44,7 @@ class FromDozingTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, + override val internalTransitionInteractor: InternalKeyguardTransitionInteractor, transitionInteractor: KeyguardTransitionInteractor, @Background private val scope: CoroutineScope, @Background bgDispatcher: CoroutineDispatcher, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractor.kt index 47aa02a0be52..117dbcfe52c8 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractor.kt @@ -41,6 +41,7 @@ class FromDreamingLockscreenHostedTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, + override val internalTransitionInteractor: InternalKeyguardTransitionInteractor, transitionInteractor: KeyguardTransitionInteractor, @Background private val scope: CoroutineScope, @Background bgDispatcher: CoroutineDispatcher, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt index 7fa197c11e57..97006486b6f1 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt @@ -47,6 +47,7 @@ class FromDreamingTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, + override val internalTransitionInteractor: InternalKeyguardTransitionInteractor, transitionInteractor: KeyguardTransitionInteractor, @Background private val scope: CoroutineScope, @Background bgDispatcher: CoroutineDispatcher, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt index e516fa3c44bb..8041dd933143 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt @@ -50,6 +50,7 @@ constructor( private val glanceableHubTransitions: GlanceableHubTransitions, keyguardInteractor: KeyguardInteractor, override val transitionRepository: KeyguardTransitionRepository, + override val internalTransitionInteractor: InternalKeyguardTransitionInteractor, transitionInteractor: KeyguardTransitionInteractor, powerInteractor: PowerInteractor, keyguardOcclusionInteractor: KeyguardOcclusionInteractor, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt index 07a2b0424aba..b084824cd348 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt @@ -45,6 +45,7 @@ class FromGoneTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, + override val internalTransitionInteractor: InternalKeyguardTransitionInteractor, transitionInteractor: KeyguardTransitionInteractor, @Background private val scope: CoroutineScope, @Background bgDispatcher: CoroutineDispatcher, 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 35a2d58816b4..ff15a1bc34d0 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 @@ -57,6 +57,7 @@ class FromLockscreenTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, + override val internalTransitionInteractor: InternalKeyguardTransitionInteractor, transitionInteractor: KeyguardTransitionInteractor, @Background private val scope: CoroutineScope, @Background bgDispatcher: CoroutineDispatcher, @@ -128,7 +129,7 @@ constructor( keyguardInteractor.isAbleToDream .filterRelevantKeyguardState() .sampleCombine( - transitionInteractor.currentTransitionInfoInternal, + internalTransitionInteractor.currentTransitionInfoInternal, finishedKeyguardState, keyguardInteractor.isActiveDreamLockscreenHosted, ) @@ -185,7 +186,7 @@ constructor( shadeRepository.legacyShadeExpansion .sampleCombine( startedKeyguardTransitionStep, - transitionInteractor.currentTransitionInfoInternal, + internalTransitionInteractor.currentTransitionInfoInternal, keyguardInteractor.statusBarState, keyguardInteractor.isKeyguardDismissible, ) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt index 86d4cfb916ed..84ca6672d509 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt @@ -41,6 +41,7 @@ class FromOccludedTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, + override val internalTransitionInteractor: InternalKeyguardTransitionInteractor, transitionInteractor: KeyguardTransitionInteractor, @Background private val scope: CoroutineScope, @Background bgDispatcher: CoroutineDispatcher, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt index f23b12f35977..f98ed15a21c6 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt @@ -50,6 +50,7 @@ class FromPrimaryBouncerTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, + override val internalTransitionInteractor: InternalKeyguardTransitionInteractor, transitionInteractor: KeyguardTransitionInteractor, @Background private val scope: CoroutineScope, @Background bgDispatcher: CoroutineDispatcher, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/InternalKeyguardTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/InternalKeyguardTransitionInteractor.kt new file mode 100644 index 000000000000..a51421c10309 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/InternalKeyguardTransitionInteractor.kt @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.domain.interactor + +import android.annotation.FloatRange +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository +import com.android.systemui.keyguard.shared.model.TransitionInfo +import com.android.systemui.keyguard.shared.model.TransitionState +import java.util.UUID +import javax.inject.Inject +import kotlinx.coroutines.flow.StateFlow + +/** + * This interactor provides direct access to [KeyguardTransitionRepository] internals and exposes + * functions to directly modify the transition state. + */ +@SysUISingleton +class InternalKeyguardTransitionInteractor +@Inject +constructor( + private val repository: KeyguardTransitionRepository, +) { + + /** + * The [TransitionInfo] of the most recent call to + * [KeyguardTransitionRepository.startTransition]. + * + * This should only be used by keyguard transition internals (From*TransitionInteractor and + * related classes). Other consumers of keyguard state in System UI should use + * [startedKeyguardState], [currentKeyguardState], and related flows. + * + * Keyguard internals use this to determine the most up-to-date KeyguardState that we've + * requested a transition to, even if the animator running the transition on the main thread has + * not yet emitted the STARTED TransitionStep. + * + * For example: if we're finished in GONE and press the power button twice very quickly, we may + * request a transition to AOD, but then receive the second power button press prior to the + * STARTED -> AOD transition step emitting. We still need the FromAodTransitionInteractor to + * request a transition from AOD -> LOCKSCREEN in response to the power press, even though the + * main thread animator hasn't emitted STARTED > AOD yet (which means [startedKeyguardState] is + * still GONE, which is not relevant to FromAodTransitionInteractor). In this case, the + * interactor can use this current transition info to determine that a STARTED -> AOD step + * *will* be emitted, and therefore that it can safely request an AOD -> LOCKSCREEN transition + * which will subsequently cancel GONE -> AOD. + */ + internal val currentTransitionInfoInternal: StateFlow = + repository.currentTransitionInfoInternal + + suspend fun startTransition(info: TransitionInfo) = repository.startTransition(info) + + fun updateTransition( + transitionId: UUID, + @FloatRange(from = 0.0, to = 1.0) value: Float, + state: TransitionState + ) = repository.updateTransition(transitionId, value, state) +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractor.kt index 8d683f0d4375..66efde1c8358 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractor.kt @@ -49,6 +49,7 @@ constructor( val repository: KeyguardRepository, val biometricSettingsRepository: BiometricSettingsRepository, transitionInteractor: KeyguardTransitionInteractor, + internalTransitionInteractor: InternalKeyguardTransitionInteractor, ) { /** @@ -74,7 +75,7 @@ constructor( // Whenever the keyguard is disabled... .filter { enabled -> !enabled } .sampleCombine( - transitionInteractor.currentTransitionInfoInternal, + internalTransitionInteractor.currentTransitionInfoInternal, biometricSettingsRepository.isCurrentUserInLockdown ) .map { (_, transitionInfo, inLockdown) -> @@ -93,7 +94,7 @@ constructor( .filter { enabled -> !enabled } .sampleCombine( biometricSettingsRepository.isCurrentUserInLockdown, - transitionInteractor.currentTransitionInfoInternal, + internalTransitionInteractor.currentTransitionInfoInternal, ) .collect { (_, inLockdown, currentTransitionInfo) -> if (currentTransitionInfo.to != KeyguardState.GONE && !inLockdown) { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractor.kt index f3856710b1ed..41ccea735f5f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractor.kt @@ -53,6 +53,7 @@ constructor( private val repository: KeyguardOcclusionRepository, private val powerInteractor: PowerInteractor, private val transitionInteractor: KeyguardTransitionInteractor, + private val internalTransitionInteractor: InternalKeyguardTransitionInteractor, keyguardInteractor: KeyguardInteractor, deviceUnlockedInteractor: Lazy, ) { @@ -78,7 +79,7 @@ constructor( // *_BOUNCER -> LOCKSCREEN. return powerInteractor.detailedWakefulness.value.powerButtonLaunchGestureTriggered && KeyguardState.deviceIsAsleepInState( - transitionInteractor.currentTransitionInfoInternal.value.to + internalTransitionInteractor.currentTransitionInfoInternal.value.to ) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt index 5ad7762bb512..b3c9591f5668 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt @@ -40,6 +40,7 @@ constructor( val deviceEntryInteractor: DeviceEntryInteractor, val deviceProvisioningInteractor: DeviceProvisioningInteractor, val keyguardTransitionInteractor: KeyguardTransitionInteractor, + val internalTransitionInteractor: InternalKeyguardTransitionInteractor, val repository: KeyguardTransitionRepository, ) : CoreStartable { @@ -64,7 +65,7 @@ constructor( } if ( - keyguardTransitionInteractor.currentTransitionInfoInternal.value.from != + internalTransitionInteractor.currentTransitionInfoInternal.value.from != KeyguardState.OFF ) { Log.e( diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt index 76c6ffbb52f7..f9bfaff80090 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt @@ -17,7 +17,6 @@ package com.android.systemui.keyguard.domain.interactor -import android.annotation.FloatRange import android.annotation.SuppressLint import android.util.Log import com.android.compose.animation.scene.SceneKey @@ -33,14 +32,12 @@ import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER import com.android.systemui.keyguard.shared.model.KeyguardState.UNDEFINED -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.util.kotlin.pairwise -import java.util.UUID import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -384,31 +381,6 @@ constructor( .distinctUntilChanged() .stateIn(scope, SharingStarted.Eagerly, KeyguardState.OFF) - /** - * The [TransitionInfo] of the most recent call to - * [KeyguardTransitionRepository.startTransition]. - * - * This should only be used by keyguard transition internals (From*TransitionInteractor and - * related classes). Other consumers of keyguard state in System UI should use - * [startedKeyguardState], [currentKeyguardState], and related flows. - * - * Keyguard internals use this to determine the most up-to-date KeyguardState that we've - * requested a transition to, even if the animator running the transition on the main thread has - * not yet emitted the STARTED TransitionStep. - * - * For example: if we're finished in GONE and press the power button twice very quickly, we may - * request a transition to AOD, but then receive the second power button press prior to the - * STARTED -> AOD transition step emitting. We still need the FromAodTransitionInteractor to - * request a transition from AOD -> LOCKSCREEN in response to the power press, even though the - * main thread animator hasn't emitted STARTED > AOD yet (which means [startedKeyguardState] is - * still GONE, which is not relevant to FromAodTransitionInteractor). In this case, the - * interactor can use this current transition info to determine that a STARTED -> AOD step - * *will* be emitted, and therefore that it can safely request an AOD -> LOCKSCREEN transition - * which will subsequently cancel GONE -> AOD. - */ - internal val currentTransitionInfoInternal: StateFlow = - repository.currentTransitionInfoInternal - val isInTransition = combine( isInTransitionWhere({ true }, { true }), @@ -429,7 +401,7 @@ constructor( // TODO(b/336576536): Check if adaptation for scene framework is needed if (SceneContainerFlag.isEnabled) return Log.d(TAG, "#startDismissKeyguardTransition(reason=$reason)") - when (val startedState = currentTransitionInfoInternal.value.to) { + when (val startedState = repository.currentTransitionInfoInternal.value.to) { LOCKSCREEN -> fromLockscreenTransitionInteractor.get().dismissKeyguard() PRIMARY_BOUNCER -> fromPrimaryBouncerTransitionInteractor.get().dismissPrimaryBouncer() ALTERNATE_BOUNCER -> @@ -529,14 +501,6 @@ constructor( return finishedKeyguardState.replayCache.last() } - suspend fun startTransition(info: TransitionInfo) = repository.startTransition(info) - - fun updateTransition( - transitionId: UUID, - @FloatRange(from = 0.0, to = 1.0) value: Float, - state: TransitionState - ) = repository.updateTransition(transitionId, value, state) - companion object { private val TAG = KeyguardTransitionInteractor::class.simpleName } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt index e14820714c9b..973e8989b82a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt @@ -57,6 +57,8 @@ sealed class TransitionInteractor( ) { val name = this::class.simpleName ?: "UnknownTransitionInteractor" abstract val transitionRepository: KeyguardTransitionRepository + abstract val internalTransitionInteractor: InternalKeyguardTransitionInteractor + abstract fun start() /* Use background dispatcher for all [KeyguardTransitionInteractor] flows. Necessary because @@ -79,14 +81,14 @@ sealed class TransitionInteractor( // a bugreport. ownerReason: String = "", ): UUID? { - if (fromState != transitionInteractor.currentTransitionInfoInternal.value.to) { + if (fromState != internalTransitionInteractor.currentTransitionInfoInternal.value.to) { Log.e( name, "Ignoring startTransition: This interactor asked to transition from " + "$fromState -> $toState, but we last transitioned to " + - "${transitionInteractor.currentTransitionInfoInternal.value.to}, not " + - "$fromState. This should never happen - check currentTransitionInfoInternal " + - "or use filterRelevantKeyguardState before starting transitions." + "${internalTransitionInteractor.currentTransitionInfoInternal.value.to}, not" + + " $fromState. This should never happen - check currentTransitionInfoInternal" + + " or use filterRelevantKeyguardState before starting transitions." ) if (fromState == transitionInteractor.finishedKeyguardState.replayCache.last()) { @@ -238,12 +240,11 @@ sealed class TransitionInteractor( * Whether we're in the KeyguardState relevant to this From*TransitionInteractor (which we know * from [fromState]). * - * This uses [KeyguardTransitionInteractor.currentTransitionInfoInternal], which is more up to - * date than [startedKeyguardState] as it does not wait for the emission of the first STARTED - * step. + * This uses [currentTransitionInfoInternal], which is more up to date than + * [startedKeyguardState] as it does not wait for the emission of the first STARTED step. */ fun inOrTransitioningToRelevantKeyguardState(): Boolean { - return transitionInteractor.currentTransitionInfoInternal.value.to == fromState + return internalTransitionInteractor.currentTransitionInfoInternal.value.to == fromState } /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt index 9b3ba7d8feb0..324811443e9d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt @@ -23,6 +23,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.LockscreenSceneTransitionRepository import com.android.systemui.keyguard.data.repository.LockscreenSceneTransitionRepository.Companion.DEFAULT_STATE +import com.android.systemui.keyguard.domain.interactor.InternalKeyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState.UNDEFINED @@ -67,7 +68,8 @@ import kotlinx.coroutines.launch class LockscreenSceneTransitionInteractor @Inject constructor( - val transitionInteractor: KeyguardTransitionInteractor, + private val transitionInteractor: KeyguardTransitionInteractor, + private val internalTransitionInteractor: InternalKeyguardTransitionInteractor, @Application private val applicationScope: CoroutineScope, private val sceneInteractor: SceneInteractor, private val repository: LockscreenSceneTransitionRepository, @@ -123,7 +125,7 @@ constructor( } private fun finishCurrentTransition() { - transitionInteractor.updateTransition(currentTransitionId!!, 1f, FINISHED) + internalTransitionInteractor.updateTransition(currentTransitionId!!, 1f, FINISHED) resetTransitionData() } @@ -131,13 +133,13 @@ constructor( val newTransition = TransitionInfo( ownerName = this::class.java.simpleName, - from = transitionInteractor.currentTransitionInfoInternal.value.to, + from = internalTransitionInteractor.currentTransitionInfoInternal.value.to, to = state, animator = null, modeOnCanceled = TransitionModeOnCanceled.REVERSE ) - currentTransitionId = transitionInteractor.startTransition(newTransition) - transitionInteractor.updateTransition(currentTransitionId!!, 1f, FINISHED) + currentTransitionId = internalTransitionInteractor.startTransition(newTransition) + internalTransitionInteractor.updateTransition(currentTransitionId!!, 1f, FINISHED) resetTransitionData() } @@ -150,7 +152,8 @@ constructor( private suspend fun handleTransition(transition: ObservableTransitionState.Transition) { if (transition.fromScene == Scenes.Lockscreen) { if (currentTransitionId != null) { - val currentToState = transitionInteractor.currentTransitionInfoInternal.value.to + val currentToState = + internalTransitionInteractor.currentTransitionInfoInternal.value.to if (currentToState == UNDEFINED) { transitionKtfTo(transitionInteractor.getStartedFromState()) } @@ -201,7 +204,7 @@ constructor( } private suspend fun startTransitionFromLockscreen() { - val currentState = transitionInteractor.currentTransitionInfoInternal.value.to + val currentState = internalTransitionInteractor.currentTransitionInfoInternal.value.to val newTransition = TransitionInfo( ownerName = this::class.java.simpleName, @@ -217,12 +220,12 @@ constructor( if (currentTransitionId != null) { resetTransitionData() } - currentTransitionId = transitionInteractor.startTransition(transitionInfo) + currentTransitionId = internalTransitionInteractor.startTransition(transitionInfo) } private fun updateProgress(progress: Float) { if (currentTransitionId == null) return - transitionInteractor.updateTransition( + internalTransitionInteractor.updateTransition( currentTransitionId!!, progress.coerceIn(0f, 1f), RUNNING diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorKosmos.kt index 78a419f92495..ce317d43e988 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorKosmos.kt @@ -32,6 +32,7 @@ val Kosmos.fromAlternateBouncerTransitionInteractor by FromAlternateBouncerTransitionInteractor( transitionRepository = keyguardTransitionRepository, transitionInteractor = keyguardTransitionInteractor, + internalTransitionInteractor = internalKeyguardTransitionInteractor, scope = applicationCoroutineScope, bgDispatcher = testDispatcher, mainDispatcher = testDispatcher, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorKosmos.kt index 42af25ed51a7..ae138c8f930b 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorKosmos.kt @@ -29,6 +29,7 @@ val Kosmos.fromAodTransitionInteractor by FromAodTransitionInteractor( transitionRepository = fakeKeyguardTransitionRepository, transitionInteractor = keyguardTransitionInteractor, + internalTransitionInteractor = internalKeyguardTransitionInteractor, scope = applicationCoroutineScope, bgDispatcher = testDispatcher, mainDispatcher = testDispatcher, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorKosmos.kt index edf77a007efd..e7e007fd79fa 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorKosmos.kt @@ -30,6 +30,7 @@ var Kosmos.fromDozingTransitionInteractor by FromDozingTransitionInteractor( transitionRepository = keyguardTransitionRepository, transitionInteractor = keyguardTransitionInteractor, + internalTransitionInteractor = internalKeyguardTransitionInteractor, scope = applicationCoroutineScope, bgDispatcher = testDispatcher, mainDispatcher = testDispatcher, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractorKosmos.kt index f7a9d59eac26..7ebef10b12c6 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractorKosmos.kt @@ -28,6 +28,7 @@ var Kosmos.fromDreamingLockscreenHostedTransitionInteractor by FromDreamingLockscreenHostedTransitionInteractor( transitionRepository = keyguardTransitionRepository, transitionInteractor = keyguardTransitionInteractor, + internalTransitionInteractor = internalKeyguardTransitionInteractor, scope = applicationCoroutineScope, bgDispatcher = testDispatcher, mainDispatcher = testDispatcher, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt index 135644cfac3e..a9be06d6387f 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt @@ -28,6 +28,7 @@ var Kosmos.fromDreamingTransitionInteractor by FromDreamingTransitionInteractor( transitionRepository = keyguardTransitionRepository, transitionInteractor = keyguardTransitionInteractor, + internalTransitionInteractor = internalKeyguardTransitionInteractor, scope = applicationCoroutineScope, bgDispatcher = testDispatcher, mainDispatcher = testDispatcher, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractorKosmos.kt index 1695327d75bc..67846589cb89 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractorKosmos.kt @@ -28,6 +28,7 @@ var Kosmos.fromGlanceableHubTransitionInteractor by FromGlanceableHubTransitionInteractor( transitionRepository = keyguardTransitionRepository, transitionInteractor = keyguardTransitionInteractor, + internalTransitionInteractor = internalKeyguardTransitionInteractor, scope = applicationCoroutineScope, bgDispatcher = testDispatcher, mainDispatcher = testDispatcher, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorKosmos.kt index 4039ee6ea904..317294f3c884 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorKosmos.kt @@ -31,6 +31,7 @@ val Kosmos.fromGoneTransitionInteractor by FromGoneTransitionInteractor( transitionRepository = fakeKeyguardTransitionRepository, transitionInteractor = keyguardTransitionInteractor, + internalTransitionInteractor = internalKeyguardTransitionInteractor, scope = applicationCoroutineScope, bgDispatcher = testDispatcher, mainDispatcher = testDispatcher, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt index 28bd43982eba..4131145857e0 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt @@ -29,6 +29,7 @@ var Kosmos.fromLockscreenTransitionInteractor by FromLockscreenTransitionInteractor( transitionRepository = keyguardTransitionRepository, transitionInteractor = keyguardTransitionInteractor, + internalTransitionInteractor = internalKeyguardTransitionInteractor, scope = applicationCoroutineScope, bgDispatcher = testDispatcher, mainDispatcher = testDispatcher, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorKosmos.kt index fc740a180dc4..c2169456eac5 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorKosmos.kt @@ -29,6 +29,7 @@ val Kosmos.fromOccludedTransitionInteractor by FromOccludedTransitionInteractor( transitionRepository = keyguardTransitionRepository, transitionInteractor = keyguardTransitionInteractor, + internalTransitionInteractor = internalKeyguardTransitionInteractor, scope = applicationCoroutineScope, bgDispatcher = testDispatcher, mainDispatcher = testDispatcher, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorKosmos.kt index d72b9c10d3d8..42ee15216590 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorKosmos.kt @@ -31,6 +31,7 @@ var Kosmos.fromPrimaryBouncerTransitionInteractor by FromPrimaryBouncerTransitionInteractor( transitionRepository = keyguardTransitionRepository, transitionInteractor = keyguardTransitionInteractor, + internalTransitionInteractor = internalKeyguardTransitionInteractor, scope = applicationCoroutineScope, bgDispatcher = testDispatcher, mainDispatcher = testDispatcher, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/InternalKeyguardTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/InternalKeyguardTransitionInteractorKosmos.kt new file mode 100644 index 000000000000..017a9ecd7f9c --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/InternalKeyguardTransitionInteractorKosmos.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.domain.interactor + +import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository +import com.android.systemui.kosmos.Kosmos + +val Kosmos.internalKeyguardTransitionInteractor by + Kosmos.Fixture { + InternalKeyguardTransitionInteractor( + repository = keyguardTransitionRepository, + ) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractorKosmos.kt index 0667a6b9536a..c6b5ed0b608f 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractorKosmos.kt @@ -28,5 +28,6 @@ val Kosmos.keyguardEnabledInteractor by keyguardRepository, biometricSettingsRepository, keyguardTransitionInteractor, + internalTransitionInteractor = internalKeyguardTransitionInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractorKosmos.kt index 7d8d33f7dd11..5836902ad54d 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractorKosmos.kt @@ -30,5 +30,6 @@ val Kosmos.keyguardTransitionBootInteractor: KeyguardTransitionBootInteractor by deviceProvisioningInteractor = deviceProvisioningInteractor, keyguardTransitionInteractor = keyguardTransitionInteractor, repository = keyguardTransitionRepository, + internalTransitionInteractor = internalKeyguardTransitionInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt index 3c1f7b1b2394..e50e04499168 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt @@ -17,6 +17,7 @@ package com.android.systemui.keyguard.domain.interactor.scenetransition import com.android.systemui.keyguard.data.repository.lockscreenSceneTransitionRepository +import com.android.systemui.keyguard.domain.interactor.internalKeyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope @@ -29,5 +30,6 @@ var Kosmos.lockscreenSceneTransitionInteractor by applicationScope = applicationCoroutineScope, sceneInteractor = sceneInteractor, repository = lockscreenSceneTransitionRepository, + internalTransitionInteractor = internalKeyguardTransitionInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/domain/interactor/KeyguardOcclusionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/domain/interactor/KeyguardOcclusionInteractorKosmos.kt index a90a9ffc8a33..65016c3eefb8 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/domain/interactor/KeyguardOcclusionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/domain/interactor/KeyguardOcclusionInteractorKosmos.kt @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.domain.interactor import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository import com.android.systemui.keyguard.domain.interactor.KeyguardOcclusionInteractor +import com.android.systemui.keyguard.domain.interactor.internalKeyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.kosmos.Kosmos @@ -34,5 +35,6 @@ val Kosmos.keyguardOcclusionInteractor by transitionInteractor = keyguardTransitionInteractor, keyguardInteractor = keyguardInteractor, deviceUnlockedInteractor = { deviceUnlockedInteractor }, + internalTransitionInteractor = internalKeyguardTransitionInteractor, ) } -- cgit v1.2.3-59-g8ed1b From 27a87000cfd86e5f20619ee4b32b50b01b3f1b36 Mon Sep 17 00:00:00 2001 From: Andreas Miko Date: Wed, 26 Jun 2024 16:07:27 +0200 Subject: [Scene container] Fix StatusBarKeyguardViewManagerInteractor Bug: 349784682 Flag: com.android.systemui.scene_container Test: refactor_only Change-Id: Ia948a0971e4ab9c1ff5948acbbfa759e4d74fee0 --- .../StatusBarKeyguardViewManagerInteractor.kt | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/domain/interactor/StatusBarKeyguardViewManagerInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/domain/interactor/StatusBarKeyguardViewManagerInteractor.kt index ca7308161e14..ef96f43ec17e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/domain/interactor/StatusBarKeyguardViewManagerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/domain/interactor/StatusBarKeyguardViewManagerInteractor.kt @@ -23,6 +23,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInterac import com.android.systemui.keyguard.domain.interactor.WindowManagerLockscreenVisibilityInteractor import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.util.kotlin.sample import javax.inject.Inject import kotlinx.coroutines.flow.Flow @@ -90,17 +91,22 @@ constructor( /** Occlusion state to apply whenever a keyguard transition is FINISHED. */ private val occlusionStateFromFinishedStep = - keyguardTransitionInteractor.finishedKeyguardTransitionStep - .sample(keyguardOcclusionInteractor.isShowWhenLockedActivityOnTop, ::Pair) - .map { (finishedStep, showWhenLockedOnTop) -> + combine( + keyguardTransitionInteractor.isFinishedIn( + Scenes.Gone, + stateWithoutSceneContainer = KeyguardState.GONE + ), + keyguardTransitionInteractor.isFinishedIn(KeyguardState.OCCLUDED), + keyguardOcclusionInteractor.isShowWhenLockedActivityOnTop, + ::Triple + ) + .map { (isOnGone, isOnOccluded, showWhenLockedOnTop) -> // If we're FINISHED in OCCLUDED, we want to render as occluded. We also need to // remain occluded if a SHOW_WHEN_LOCKED activity is on the top of the task stack, // and we're in any state other than GONE. This is necessary, for example, when we // transition from OCCLUDED to a bouncer state. Otherwise, we should not be // occluded. - val occluded = - finishedStep.to == KeyguardState.OCCLUDED || - (showWhenLockedOnTop && finishedStep.to != KeyguardState.GONE) + val occluded = isOnOccluded || (showWhenLockedOnTop && !isOnGone) OccludedState(occluded = occluded, animate = false) } -- cgit v1.2.3-59-g8ed1b