diff options
| author | 2024-09-27 18:07:20 +0000 | |
|---|---|---|
| committer | 2024-09-27 18:10:42 +0000 | |
| commit | a50eb586a26d3fb72fa02c089fc537ea0d072b57 (patch) | |
| tree | 14383f7d9e9ca6831ba8595195df56ae958848c7 | |
| parent | b543412b3a8766abc073e1d34e6c8e8eace9042a (diff) | |
Support OCCLUDED<->ALTERNATE_BOUNCER with animations
And support shade expanded LOCKSCREEN->OCCLUDED
They were not previously mapped, which would flash the clock
over OCCLUDED states.
Fixes: 369954100
Test: atest LockscreenToOccludedTransitionViewModelTest
Flag: com.android.systemui.migrate_clocks_to_blueprint
Change-Id: I3f615c9adeaba4bc361c3a9d609bd0cfcd456dc4
8 files changed, 151 insertions, 27 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt index e6ea64f8ee71..d0da2e9671c0 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt @@ -89,9 +89,12 @@ class LockscreenToOccludedTransitionViewModelTest(flags: FlagsParameterization) } @Test - fun lockscreenFadeOut() = + fun lockscreenFadeOut_shadeNotExpanded() = testScope.runTest { val values by collectValues(underTest.lockscreenAlpha) + shadeExpanded(false) + runCurrent() + repository.sendTransitionSteps( steps = listOf( @@ -104,10 +107,34 @@ class LockscreenToOccludedTransitionViewModelTest(flags: FlagsParameterization) ), testScope = testScope, ) - // Only 5 values should be present, since the dream overlay runs for a small fraction - // of the overall animation time assertThat(values.size).isEqualTo(5) - values.forEach { assertThat(it).isIn(Range.closed(0f, 1f)) } + assertThat(values[0]).isEqualTo(1f) + assertThat(values[1]).isEqualTo(1f) + assertThat(values[2]).isIn(Range.open(0f, 1f)) + assertThat(values[3]).isIn(Range.open(0f, 1f)) + assertThat(values[4]).isEqualTo(0f) + } + + @Test + fun lockscreenFadeOut_shadeExpanded() = + testScope.runTest { + val values by collectValues(underTest.lockscreenAlpha) + shadeExpanded(true) + runCurrent() + + repository.sendTransitionSteps( + steps = + listOf( + step(0f, TransitionState.STARTED), // Should start running here... + step(0f), + step(.1f), + step(.4f), + step(.7f), // ...up to here + step(1f), + ), + testScope = testScope, + ) + values.forEach { assertThat(it).isEqualTo(0f) } } @Test @@ -115,7 +142,7 @@ class LockscreenToOccludedTransitionViewModelTest(flags: FlagsParameterization) testScope.runTest { configurationRepository.setDimensionPixelSize( R.dimen.lockscreen_to_occluded_transition_lockscreen_translation_y, - 100 + 100, ) val values by collectValues(underTest.lockscreenTranslationY) repository.sendTransitionSteps( @@ -138,7 +165,7 @@ class LockscreenToOccludedTransitionViewModelTest(flags: FlagsParameterization) testScope.runTest { configurationRepository.setDimensionPixelSize( R.dimen.lockscreen_to_occluded_transition_lockscreen_translation_y, - 100 + 100, ) val values by collectValues(underTest.lockscreenTranslationY) repository.sendTransitionSteps( @@ -171,7 +198,7 @@ class LockscreenToOccludedTransitionViewModelTest(flags: FlagsParameterization) listOf( step(0f, TransitionState.STARTED), step(.5f), - step(1f, TransitionState.FINISHED) + step(1f, TransitionState.FINISHED), ), testScope = testScope, ) @@ -228,7 +255,7 @@ class LockscreenToOccludedTransitionViewModelTest(flags: FlagsParameterization) to = KeyguardState.OCCLUDED, value = value, transitionState = state, - ownerName = "LockscreenToOccludedTransitionViewModelTest" + ownerName = "LockscreenToOccludedTransitionViewModelTest", ) } 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 0343786bb1fb..840bc0fb5f99 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 @@ -106,7 +106,7 @@ constructor( startTransitionToLockscreenOrHub( isIdleOnCommunal, showCommunalFromOccluded, - dreamFromOccluded + dreamFromOccluded, ) } } @@ -127,7 +127,7 @@ constructor( startTransitionToLockscreenOrHub( isIdleOnCommunal, showCommunalFromOccluded, - dreamFromOccluded + dreamFromOccluded, ) } } @@ -147,7 +147,7 @@ constructor( communalSceneInteractor.changeScene( newScene = CommunalScenes.Communal, loggingReason = "occluded to hub", - transitionKey = CommunalTransitionKeys.SimpleFade + transitionKey = CommunalTransitionKeys.SimpleFade, ) } else { startTransitionTo(KeyguardState.GLANCEABLE_HUB) @@ -210,8 +210,9 @@ constructor( duration = when (toState) { - KeyguardState.LOCKSCREEN -> TO_LOCKSCREEN_DURATION + KeyguardState.ALTERNATE_BOUNCER -> TO_ALTERNATE_BOUNCER_DURATION KeyguardState.GLANCEABLE_HUB -> TO_GLANCEABLE_HUB_DURATION + KeyguardState.LOCKSCREEN -> TO_LOCKSCREEN_DURATION else -> DEFAULT_DURATION }.inWholeMilliseconds } @@ -220,9 +221,10 @@ constructor( companion object { const val TAG = "FromOccludedTransitionInteractor" private val DEFAULT_DURATION = 500.milliseconds - val TO_LOCKSCREEN_DURATION = 933.milliseconds - val TO_GLANCEABLE_HUB_DURATION = 250.milliseconds + val TO_ALTERNATE_BOUNCER_DURATION = DEFAULT_DURATION val TO_AOD_DURATION = DEFAULT_DURATION val TO_DOZING_DURATION = DEFAULT_DURATION + val TO_GLANCEABLE_HUB_DURATION = 250.milliseconds + val TO_LOCKSCREEN_DURATION = 933.milliseconds } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToOccludedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToOccludedTransitionViewModel.kt index 3f2ef29c9570..c49e7833e349 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToOccludedTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToOccludedTransitionViewModel.kt @@ -28,22 +28,22 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow /** - * Breaks down ALTERNATE_BOUNCER->GONE transition into discrete steps for corresponding views to + * Breaks down ALTERNATE_BOUNCER->OCCLUDED transition into discrete steps for corresponding views to * consume. */ @OptIn(ExperimentalCoroutinesApi::class) @SysUISingleton class AlternateBouncerToOccludedTransitionViewModel @Inject -constructor( - animationFlow: KeyguardTransitionAnimationFlow, -) : DeviceEntryIconTransition { +constructor(animationFlow: KeyguardTransitionAnimationFlow) : DeviceEntryIconTransition { private val transitionAnimation = animationFlow.setup( duration = TO_OCCLUDED_DURATION, edge = Edge.create(from = ALTERNATE_BOUNCER, to = OCCLUDED), ) + val lockscreenAlpha: Flow<Float> = transitionAnimation.immediatelyTransitionTo(0f) + override val deviceEntryParentViewAlpha: Flow<Float> = transitionAnimation.immediatelyTransitionTo(0f) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt index 1d66314063b3..3705c2c19110 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt @@ -88,6 +88,8 @@ constructor( AlternateBouncerToGoneTransitionViewModel, private val alternateBouncerToLockscreenTransitionViewModel: AlternateBouncerToLockscreenTransitionViewModel, + private val alternateBouncerToOccludedTransitionViewModel: + AlternateBouncerToOccludedTransitionViewModel, private val aodToGoneTransitionViewModel: AodToGoneTransitionViewModel, private val aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel, private val aodToOccludedTransitionViewModel: AodToOccludedTransitionViewModel, @@ -112,6 +114,8 @@ constructor( private val lockscreenToOccludedTransitionViewModel: LockscreenToOccludedTransitionViewModel, private val lockscreenToPrimaryBouncerTransitionViewModel: LockscreenToPrimaryBouncerTransitionViewModel, + private val occludedToAlternateBouncerTransitionViewModel: + OccludedToAlternateBouncerTransitionViewModel, private val occludedToAodTransitionViewModel: OccludedToAodTransitionViewModel, private val occludedToDozingTransitionViewModel: OccludedToDozingTransitionViewModel, private val occludedToLockscreenTransitionViewModel: OccludedToLockscreenTransitionViewModel, @@ -232,6 +236,7 @@ constructor( alternateBouncerToAodTransitionViewModel.lockscreenAlpha(viewState), alternateBouncerToGoneTransitionViewModel.lockscreenAlpha(viewState), alternateBouncerToLockscreenTransitionViewModel.lockscreenAlpha(viewState), + alternateBouncerToOccludedTransitionViewModel.lockscreenAlpha, aodToGoneTransitionViewModel.lockscreenAlpha(viewState), aodToLockscreenTransitionViewModel.lockscreenAlpha(viewState), aodToOccludedTransitionViewModel.lockscreenAlpha(viewState), @@ -254,6 +259,7 @@ constructor( lockscreenToGoneTransitionViewModel.lockscreenAlpha(viewState), lockscreenToOccludedTransitionViewModel.lockscreenAlpha, lockscreenToPrimaryBouncerTransitionViewModel.lockscreenAlpha, + occludedToAlternateBouncerTransitionViewModel.lockscreenAlpha, occludedToAodTransitionViewModel.lockscreenAlpha, occludedToDozingTransitionViewModel.lockscreenAlpha, occludedToLockscreenTransitionViewModel.lockscreenAlpha, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt index 8d9ccef95f0d..88e8968501dd 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt @@ -52,18 +52,26 @@ constructor( /** Lockscreen views alpha */ val lockscreenAlpha: Flow<Float> = - transitionAnimation.sharedFlow( - duration = 250.milliseconds, - onStep = { 1f - it }, - name = "LOCKSCREEN->OCCLUDED: lockscreenAlpha", + shadeDependentFlows.transitionFlow( + flowWhenShadeIsNotExpanded = + transitionAnimation.sharedFlow( + duration = 250.milliseconds, + onStep = { 1f - it }, + name = "LOCKSCREEN->OCCLUDED: lockscreenAlpha", + ), + flowWhenShadeIsExpanded = transitionAnimation.immediatelyTransitionTo(0f), ) val shortcutsAlpha: Flow<Float> = - transitionAnimation.sharedFlow( - duration = 250.milliseconds, - onStep = { 1 - it }, - onFinish = { 0f }, - onCancel = { 1f }, + shadeDependentFlows.transitionFlow( + flowWhenShadeIsNotExpanded = + transitionAnimation.sharedFlow( + duration = 250.milliseconds, + onStep = { 1f - it }, + onFinish = { 0f }, + onCancel = { 1f }, + ), + flowWhenShadeIsExpanded = transitionAnimation.immediatelyTransitionTo(0f), ) /** Lockscreen views y-translation */ diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModel.kt new file mode 100644 index 000000000000..5bfcccbaccaa --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModel.kt @@ -0,0 +1,49 @@ +/* + * 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.ui.viewmodel + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.keyguard.domain.interactor.FromOccludedTransitionInteractor.Companion.TO_ALTERNATE_BOUNCER_DURATION +import com.android.systemui.keyguard.shared.model.Edge +import com.android.systemui.keyguard.shared.model.KeyguardState.ALTERNATE_BOUNCER +import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED +import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow +import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition +import javax.inject.Inject +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow + +/** + * Breaks down OCCLUDED->ALTERNATE_BOUNCER transition into discrete steps for corresponding views to + * consume. + */ +@OptIn(ExperimentalCoroutinesApi::class) +@SysUISingleton +class OccludedToAlternateBouncerTransitionViewModel +@Inject +constructor(animationFlow: KeyguardTransitionAnimationFlow) : DeviceEntryIconTransition { + private val transitionAnimation = + animationFlow.setup( + duration = TO_ALTERNATE_BOUNCER_DURATION, + edge = Edge.create(from = OCCLUDED, to = ALTERNATE_BOUNCER), + ) + + val lockscreenAlpha: Flow<Float> = transitionAnimation.immediatelyTransitionTo(0f) + + override val deviceEntryParentViewAlpha: Flow<Float> = + transitionAnimation.immediatelyTransitionTo(0f) +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt index afded9641e47..3c87106bf5aa 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt @@ -47,6 +47,8 @@ val Kosmos.keyguardRootViewModel by Fixture { alternateBouncerToGoneTransitionViewModel = alternateBouncerToGoneTransitionViewModel, alternateBouncerToLockscreenTransitionViewModel = alternateBouncerToLockscreenTransitionViewModel, + alternateBouncerToOccludedTransitionViewModel = + alternateBouncerToOccludedTransitionViewModel, aodToGoneTransitionViewModel = aodToGoneTransitionViewModel, aodToLockscreenTransitionViewModel = aodToLockscreenTransitionViewModel, aodToOccludedTransitionViewModel = aodToOccludedTransitionViewModel, @@ -69,6 +71,8 @@ val Kosmos.keyguardRootViewModel by Fixture { lockscreenToOccludedTransitionViewModel = lockscreenToOccludedTransitionViewModel, lockscreenToPrimaryBouncerTransitionViewModel = lockscreenToPrimaryBouncerTransitionViewModel, + occludedToAlternateBouncerTransitionViewModel = + occludedToAlternateBouncerTransitionViewModel, occludedToAodTransitionViewModel = occludedToAodTransitionViewModel, occludedToDozingTransitionViewModel = occludedToDozingTransitionViewModel, occludedToLockscreenTransitionViewModel = occludedToLockscreenTransitionViewModel, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModelKosmos.kt new file mode 100644 index 000000000000..2acd1b40af3e --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAlternateBouncerTransitionViewModelKosmos.kt @@ -0,0 +1,28 @@ +/* + * 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. + */ + +@file:OptIn(ExperimentalCoroutinesApi::class) + +package com.android.systemui.keyguard.ui.viewmodel + +import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.Kosmos.Fixture +import kotlinx.coroutines.ExperimentalCoroutinesApi + +val Kosmos.occludedToAlternateBouncerTransitionViewModel by Fixture { + OccludedToAlternateBouncerTransitionViewModel(animationFlow = keyguardTransitionAnimationFlow) +} |