diff options
| author | 2024-07-03 15:40:58 +0000 | |
|---|---|---|
| committer | 2024-07-03 15:40:58 +0000 | |
| commit | fa0bf38af7eafb71e4425101e4ff0085d8036cf6 (patch) | |
| tree | 17855e33a601aabeab96c5f10935914bc5112456 | |
| parent | ef2629a54361ebaad857293cd09609b975ed0333 (diff) | |
| parent | 27a87000cfd86e5f20619ee4b32b50b01b3f1b36 (diff) | |
Merge changes from topic "fix-kti" into main
* changes:
[Scene container] Fix StatusBarKeyguardViewManagerInteractor
Refactor internal functions to InternalKeyguardTransitionInteractor
Fix KeyguardTransitionInteractorTest
Consolidate isInTransitionWhere()
42 files changed, 258 insertions, 259 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..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>( - 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 { @@ -318,7 +283,7 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { @Test fun isInTransitionToAnyState() = testScope.runTest { - val inTransition by collectValues(underTest.isInTransitionToAnyState) + val inTransition by collectValues(underTest.isInTransition) assertEquals( listOf( @@ -374,9 +339,50 @@ 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( @@ -731,92 +737,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 { val results by @@ -1599,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) @@ -1615,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) @@ -1631,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) @@ -1648,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) @@ -1666,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) @@ -1683,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) 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/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<TransitionInfo> = + 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<DeviceUnlockedInteractor>, ) { @@ -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 2d389aa93d76..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 @@ -50,6 +47,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 +73,7 @@ constructor( private val fromAlternateBouncerTransitionInteractor: dagger.Lazy<FromAlternateBouncerTransitionInteractor>, private val fromDozingTransitionInteractor: dagger.Lazy<FromDozingTransitionInteractor>, - private val sceneInteractor: dagger.Lazy<SceneInteractor>, + private val sceneInteractor: SceneInteractor, ) { private val transitionMap = mutableMapOf<Edge.StateToState, MutableSharedFlow<TransitionStep>>() @@ -194,7 +192,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 +226,7 @@ constructor( stateWithoutSceneContainer: KeyguardState, ): Flow<Float> { return if (SceneContainerFlag.isEnabled) { - sceneInteractor.get().transitionProgress(scene) + sceneInteractor.transitionProgress(scene) } else { transitionValue(stateWithoutSceneContainer) } @@ -383,33 +381,14 @@ 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<TransitionInfo> = - 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 @@ -422,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 -> @@ -448,7 +427,7 @@ constructor( fun isInTransition(edge: Edge, edgeWithoutSceneContainer: Edge? = null): Flow<Boolean> { 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.") @@ -469,30 +448,6 @@ constructor( } /** - * 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<Boolean> { - 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<Boolean> { - 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 +455,15 @@ constructor( * [isInTransition]. */ fun isInTransitionWhere( - fromStatePredicate: (KeyguardState) -> Boolean, - toStatePredicate: (KeyguardState) -> Boolean, - ): Flow<Boolean> { - 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<Boolean> { 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 +475,7 @@ constructor( fun isFinishedIn(scene: SceneKey, stateWithoutSceneContainer: KeyguardState): Flow<Boolean> { return if (SceneContainerFlag.isEnabled) { - sceneInteractor - .get() - .transitionState + sceneInteractor.transitionState .map { it.isIdle(scene) || it.isTransitioning(from = scene) } .distinctUntilChanged() } else { @@ -560,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/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/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/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<Map<SceneKey, @JvmSuppressWildcards SceneResolver>>, - private val deviceUnlockedInteractor: DeviceUnlockedInteractor, - private val keyguardEnabledInteractor: KeyguardEnabledInteractor, + private val deviceUnlockedInteractor: Lazy<DeviceUnlockedInteractor>, + private val keyguardEnabledInteractor: Lazy<KeyguardEnabledInteractor>, ) { 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/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) } 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/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/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/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/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 }, ) } 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, ) } |