diff options
10 files changed, 76 insertions, 66 deletions
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt index d1099883c5e5..54a98ddaa01a 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt @@ -69,7 +69,7 @@ object QuickSettings { private fun SceneScope.stateForQuickSettingsContent( isSplitShade: Boolean, - squishiness: Float = QuickSettings.SharedValues.SquishinessValues.Default + squishiness: () -> Float = { QuickSettings.SharedValues.SquishinessValues.Default } ): QSSceneAdapter.State { return when (val transitionState = layoutState.transitionState) { is TransitionState.Idle -> { @@ -125,9 +125,9 @@ fun SceneScope.QuickSettings( heightProvider: () -> Int, isSplitShade: Boolean, modifier: Modifier = Modifier, - squishiness: Float = QuickSettings.SharedValues.SquishinessValues.Default, + squishiness: () -> Float = { QuickSettings.SharedValues.SquishinessValues.Default }, ) { - val contentState = stateForQuickSettingsContent(isSplitShade, squishiness) + val contentState = { stateForQuickSettingsContent(isSplitShade, squishiness) } val transitionState = layoutState.transitionState val isClosing = transitionState is TransitionState.Transition && @@ -161,7 +161,7 @@ fun SceneScope.QuickSettings( @Composable private fun QuickSettingsContent( qsSceneAdapter: QSSceneAdapter, - state: QSSceneAdapter.State, + state: () -> QSSceneAdapter.State, modifier: Modifier = Modifier, ) { val qsView by qsSceneAdapter.qsView.collectAsStateWithLifecycle(null) @@ -185,10 +185,10 @@ private fun QuickSettingsContent( AndroidView( modifier = Modifier.fillMaxWidth(), factory = { _ -> - qsSceneAdapter.setState(state) + qsSceneAdapter.setState(state()) view }, - update = { qsSceneAdapter.setState(state) } + update = { qsSceneAdapter.setState(state()) } ) } } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt index a0278a616857..9d689fc25b23 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt @@ -279,7 +279,7 @@ private fun SceneScope.SingleShade( viewModel.qsSceneAdapter, { viewModel.qsSceneAdapter.qqsHeight }, isSplitShade = false, - squishiness = tileSquishiness, + squishiness = { tileSquishiness }, ) } @@ -468,7 +468,7 @@ private fun SceneScope.SplitShade( heightProvider = { viewModel.qsSceneAdapter.qsHeight }, isSplitShade = true, modifier = Modifier.fillMaxWidth(), - squishiness = tileSquishiness, + squishiness = { tileSquishiness }, ) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt index c660ff3a7297..afe7b8f8d50b 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt @@ -257,7 +257,7 @@ class QSSceneAdapterImplTest : SysuiTestCase() { runCurrent() clearInvocations(qsImpl!!) - underTest.setState(QSSceneAdapter.State.UnsquishingQQS(squishiness)) + underTest.setState(QSSceneAdapter.State.UnsquishingQQS { squishiness }) with(qsImpl!!) { verify(this).setQsVisible(true) verify(this) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterTest.kt index ebd65fdcd538..63ce67c5eb28 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterTest.kt @@ -32,7 +32,7 @@ class QSSceneAdapterTest : SysuiTestCase() { @Test fun expanding_squishiness1() { - assertThat(QSSceneAdapter.State.Expanding(0.3f).squishiness).isEqualTo(1f) + assertThat(QSSceneAdapter.State.Expanding(0.3f).squishiness()).isEqualTo(1f) } @Test @@ -51,14 +51,14 @@ class QSSceneAdapterTest : SysuiTestCase() { @Test fun unsquishingQQS_expansionSameAsQQS() { val squishiness = 0.6f - assertThat(QSSceneAdapter.State.UnsquishingQQS(squishiness).expansion) + assertThat(QSSceneAdapter.State.UnsquishingQQS { squishiness }.expansion) .isEqualTo(QSSceneAdapter.State.QQS.expansion) } @Test fun unsquishingQS_expansionSameAsQS() { val squishiness = 0.6f - assertThat(QSSceneAdapter.State.UnsquishingQS(squishiness).expansion) + assertThat(QSSceneAdapter.State.UnsquishingQS { squishiness }.expansion) .isEqualTo(QSSceneAdapter.State.QS.expansion) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 674c128a580e..f9adc473b119 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -84,20 +84,25 @@ import com.android.systemui.keyguard.ui.viewmodel.KeyguardSurfaceBehindViewModel import com.android.systemui.keyguard.ui.viewmodel.WindowManagerLockscreenVisibilityViewModel; import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.power.shared.model.ScreenPowerState; +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.settings.DisplayTracker; import com.android.wm.shell.shared.CounterRotator; import com.android.wm.shell.shared.ShellTransitions; import com.android.wm.shell.shared.TransitionUtil; import com.android.wm.shell.transition.Transitions; +import dagger.Lazy; + +import kotlinx.coroutines.CoroutineScope; + import java.util.ArrayList; import java.util.Map; import java.util.WeakHashMap; import javax.inject.Inject; -import kotlinx.coroutines.CoroutineScope; - public class KeyguardService extends Service { static final String TAG = "KeyguardService"; static final String PERMISSION = android.Manifest.permission.CONTROL_KEYGUARD; @@ -109,6 +114,7 @@ public class KeyguardService extends Service { private final ShellTransitions mShellTransitions; private final DisplayTracker mDisplayTracker; private final PowerInteractor mPowerInteractor; + private final Lazy<SceneInteractor> mSceneInteractorLazy; private static RemoteAnimationTarget[] wrap(TransitionInfo info, boolean wallpapers, SurfaceControl.Transaction t, ArrayMap<SurfaceControl, SurfaceControl> leashMap, @@ -316,7 +322,8 @@ public class KeyguardService extends Service { @Application CoroutineScope scope, FeatureFlags featureFlags, PowerInteractor powerInteractor, - WindowManagerOcclusionManager windowManagerOcclusionManager) { + WindowManagerOcclusionManager windowManagerOcclusionManager, + Lazy<SceneInteractor> sceneInteractorLazy) { super(); mKeyguardViewMediator = keyguardViewMediator; mKeyguardLifecyclesDispatcher = keyguardLifecyclesDispatcher; @@ -325,6 +332,7 @@ public class KeyguardService extends Service { mDisplayTracker = displayTracker; mFlags = featureFlags; mPowerInteractor = powerInteractor; + mSceneInteractorLazy = sceneInteractorLazy; if (KeyguardWmStateRefactor.isEnabled()) { WindowManagerLockscreenVisibilityViewBinder.bind( @@ -601,6 +609,10 @@ public class KeyguardService extends Service { trace("showDismissibleKeyguard"); checkPermission(); mKeyguardViewMediator.showDismissibleKeyguard(); + if (SceneContainerFlag.isEnabled()) { + mSceneInteractorLazy.get().changeScene( + Scenes.Lockscreen, "KeyguardService.showDismissibleKeyguard"); + } } @Override // Binder interface 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 1e2db7c36432..350527a85e18 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 @@ -14,20 +14,21 @@ * limitations under the License. */ +@file:OptIn(ExperimentalCoroutinesApi::class) + package com.android.systemui.keyguard.domain.interactor -import com.android.compose.animation.scene.ObservableTransitionState import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor import com.android.systemui.keyguard.shared.model.BiometricUnlockMode -import com.android.systemui.keyguard.shared.model.Edge import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState 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.statusbar.notification.domain.interactor.NotificationLaunchAnimationInteractor -import com.android.systemui.util.kotlin.pairwise import com.android.systemui.util.kotlin.sample +import dagger.Lazy import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow @@ -48,7 +49,8 @@ constructor( fromBouncerInteractor: FromPrimaryBouncerTransitionInteractor, fromAlternateBouncerInteractor: FromAlternateBouncerTransitionInteractor, notificationLaunchAnimationInteractor: NotificationLaunchAnimationInteractor, - sceneInteractor: SceneInteractor, + sceneInteractor: Lazy<SceneInteractor>, + deviceEntryInteractor: Lazy<DeviceEntryInteractor>, ) { private val defaultSurfaceBehindVisibility = transitionInteractor.finishedKeyguardState.map(::isSurfaceVisible) @@ -112,7 +114,7 @@ constructor( val usingKeyguardGoingAwayAnimation: Flow<Boolean> = if (SceneContainerFlag.isEnabled) { combine( - sceneInteractor.transitionState, + sceneInteractor.get().transitionState, surfaceBehindInteractor.isAnimatingSurface, notificationLaunchAnimationInteractor.isLaunchAnimationRunning, ) { transition, isAnimatingSurface, isLaunchAnimationRunning -> @@ -156,19 +158,7 @@ constructor( */ val lockscreenVisibility: Flow<Boolean> = if (SceneContainerFlag.isEnabled) { - sceneInteractor.transitionState - .pairwise(ObservableTransitionState.Idle(Scenes.Lockscreen)) - .map { (prevTransitionState, transitionState) -> - val isReturningToGoneAfterCancellation = - prevTransitionState.isTransitioning(from = Scenes.Gone) && - transitionState.isTransitioning(to = Scenes.Gone) - val isNotOnGone = - !transitionState.isTransitioning(from = Scenes.Gone) && - !transitionState.isIdle(Scenes.Gone) - - isNotOnGone && !isReturningToGoneAfterCancellation - } - .distinctUntilChanged() + deviceEntryInteractor.get().isDeviceEntered.map { !it } } else { transitionInteractor.currentKeyguardState .sample(transitionInteractor.startedStepWithPrecedingStep, ::Pair) diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt index 63acbb0d730d..fb872d538e6c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt @@ -127,28 +127,28 @@ interface QSSceneAdapter { val isVisible: Boolean val expansion: Float - val squishiness: Float + val squishiness: () -> Float data object CLOSED : State { override val isVisible = false override val expansion = 0f - override val squishiness = 1f + override val squishiness = { 1f } } /** State for expanding between QQS and QS */ data class Expanding(override val expansion: Float) : State { override val isVisible = true - override val squishiness = 1f + override val squishiness = { 1f } } /** State for appearing QQS from Lockscreen or Gone */ - data class UnsquishingQQS(override val squishiness: Float) : State { + data class UnsquishingQQS(override val squishiness: () -> Float) : State { override val isVisible = true override val expansion = 0f } /** State for appearing QS from Lockscreen or Gone, used in Split shade */ - data class UnsquishingQS(override val squishiness: Float) : State { + data class UnsquishingQS(override val squishiness: () -> Float) : State { override val isVisible = true override val expansion = 1f } @@ -370,7 +370,7 @@ constructor( setQsVisible(state.isVisible) setExpanded(state.isVisible && state.expansion > 0f) setListening(state.isVisible) - setQsExpansion(state.expansion, 1f, 0f, state.squishiness) + setQsExpansion(state.expansion, 1f, 0f, state.squishiness()) } override fun dump(pw: PrintWriter, args: Array<out String>) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index fa88be5b638b..d9f88c494649 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -695,11 +695,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb public void show(Bundle options) { Trace.beginSection("StatusBarKeyguardViewManager#show"); mNotificationShadeWindowController.setKeyguardShowing(true); - if (SceneContainerFlag.isEnabled()) { - // TODO(b/336581871): add sceneState? - mSceneInteractorLazy.get().changeScene( - Scenes.Lockscreen, "StatusBarKeyguardViewManager.show"); - } mKeyguardStateController.notifyKeyguardState(true, mKeyguardStateController.isOccluded()); reset(true /* hideBouncerWhenShowing */); SysUiStatsLog.write(SysUiStatsLog.KEYGUARD_STATE_CHANGED, diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractorTest.kt index a77169e74de5..2b8a644162c7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractorTest.kt @@ -20,8 +20,11 @@ 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.authentication.data.repository.FakeAuthenticationRepository +import com.android.systemui.authentication.domain.interactor.authenticationInteractor import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectValues +import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor import com.android.systemui.flags.DisableSceneContainer import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository @@ -30,6 +33,7 @@ import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.kosmos.testScope import com.android.systemui.scene.data.repository.sceneContainerRepository +import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.testKosmos import com.android.systemui.util.mockito.mock @@ -38,6 +42,7 @@ import com.google.common.truth.Truth.assertThat import junit.framework.Assert.assertEquals import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before @@ -727,42 +732,48 @@ class WindowManagerLockscreenVisibilityInteractorTest : SysuiTestCase() { @Test @EnableSceneContainer - fun sceneContainer_lockscreenVisibility_visibleWhenNotGone() = + fun lockscreenVisibility() = testScope.runTest { - val lockscreenVisibility by collectLastValue(underTest.value.lockscreenVisibility) + val isDeviceUnlocked by + collectLastValue( + kosmos.deviceUnlockedInteractor.deviceUnlockStatus.map { it.isUnlocked } + ) + assertThat(isDeviceUnlocked).isFalse() - sceneTransitions.value = lsToGone - assertThat(lockscreenVisibility).isTrue() + val currentScene by collectLastValue(kosmos.sceneInteractor.currentScene) + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) - sceneTransitions.value = ObservableTransitionState.Idle(Scenes.Gone) - assertThat(lockscreenVisibility).isFalse() - - sceneTransitions.value = goneToLs - assertThat(lockscreenVisibility).isFalse() + val lockscreenVisibility by collectLastValue(underTest.value.lockscreenVisibility) + assertThat(lockscreenVisibility).isTrue() - sceneTransitions.value = ObservableTransitionState.Idle(Scenes.Lockscreen) + kosmos.sceneInteractor.changeScene(Scenes.Bouncer, "") + assertThat(currentScene).isEqualTo(Scenes.Bouncer) assertThat(lockscreenVisibility).isTrue() - } - @Test - @EnableSceneContainer - fun sceneContainer_lockscreenVisibility_notVisibleWhenReturningToGone() = - testScope.runTest { - val lockscreenVisibility by collectLastValue(underTest.value.lockscreenVisibility) + kosmos.authenticationInteractor.authenticate(FakeAuthenticationRepository.DEFAULT_PIN) + assertThat(isDeviceUnlocked).isTrue() + kosmos.sceneInteractor.changeScene(Scenes.Gone, "") + assertThat(currentScene).isEqualTo(Scenes.Gone) + assertThat(lockscreenVisibility).isFalse() - sceneTransitions.value = goneToLs + kosmos.sceneInteractor.changeScene(Scenes.Shade, "") + assertThat(currentScene).isEqualTo(Scenes.Shade) assertThat(lockscreenVisibility).isFalse() - sceneTransitions.value = lsToGone + kosmos.sceneInteractor.changeScene(Scenes.QuickSettings, "") + assertThat(currentScene).isEqualTo(Scenes.QuickSettings) assertThat(lockscreenVisibility).isFalse() - sceneTransitions.value = ObservableTransitionState.Idle(Scenes.Gone) + kosmos.sceneInteractor.changeScene(Scenes.Shade, "") + assertThat(currentScene).isEqualTo(Scenes.Shade) assertThat(lockscreenVisibility).isFalse() - sceneTransitions.value = goneToLs + kosmos.sceneInteractor.changeScene(Scenes.Gone, "") + assertThat(currentScene).isEqualTo(Scenes.Gone) assertThat(lockscreenVisibility).isFalse() - sceneTransitions.value = ObservableTransitionState.Idle(Scenes.Lockscreen) + kosmos.sceneInteractor.changeScene(Scenes.Lockscreen, "") + assertThat(currentScene).isEqualTo(Scenes.Lockscreen) assertThat(lockscreenVisibility).isTrue() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractorKosmos.kt index b38acc8a46dc..bd9c0be6b0b7 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractorKosmos.kt @@ -16,6 +16,7 @@ package com.android.systemui.keyguard.domain.interactor +import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.statusbar.notification.domain.interactor.notificationLaunchAnimationInteractor @@ -30,6 +31,7 @@ val Kosmos.windowManagerLockscreenVisibilityInteractor by fromBouncerInteractor = fromPrimaryBouncerTransitionInteractor, fromAlternateBouncerInteractor = fromAlternateBouncerTransitionInteractor, notificationLaunchAnimationInteractor = notificationLaunchAnimationInteractor, - sceneInteractor = sceneInteractor, + sceneInteractor = { sceneInteractor }, + deviceEntryInteractor = { deviceEntryInteractor }, ) } |