diff options
| author | 2023-11-30 23:04:22 +0000 | |
|---|---|---|
| committer | 2023-12-04 12:34:15 +0000 | |
| commit | 30c11d69bb8defd8538af3c2c4daa3fb3c1884c5 (patch) | |
| tree | 4ef3e048f146fd06a0f5cbd0bb101a781951332c | |
| parent | 69fa8eb54413e847f2916d15feb96b55a2776c56 (diff) | |
Migrate OCCLUDED<->LOCKSCREEN alpha/translation
It is currently in NotificationPanelViewController and needs to be
migrated to use the new keyguard root view. Move that logic to the
corresponding transition view models.
Also add ConfigurationInteractor and refactor code to use this instead
of ConfigurationRepository.
Also remove unused KeyguardVisibility data class and methods.
Test: atest OccludedToLockscreenTransitionViewModelTest
LockscreenToOccludedTransitionViewModelTest
ConfigurationInteractorTest
Bug: 288081969
Flag: ACONFIG com.android.systemui.keyguard_shade_migration_nssl DEVELOPMENT
Change-Id: I87f02c4ba823ce366573ea5ba7fdf6114b14a53f
28 files changed, 304 insertions, 206 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt index 706f94e412ac..11939c1120d9 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt @@ -23,6 +23,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.coroutines.collectLastValue import com.android.systemui.keyguard.data.repository.FakeCommandQueue import com.android.systemui.keyguard.shared.model.CameraLaunchSourceModel @@ -53,7 +54,6 @@ class KeyguardInteractorTest : SysuiTestCase() { private val sceneInteractor = testUtils.sceneInteractor() private val commandQueue = FakeCommandQueue() private val bouncerRepository = FakeKeyguardBouncerRepository() - private val configurationRepository = FakeConfigurationRepository() private val shadeRepository = FakeShadeRepository() private val transitionState: MutableStateFlow<ObservableTransitionState> = MutableStateFlow(ObservableTransitionState.Idle(SceneKey.Gone)) @@ -65,7 +65,7 @@ class KeyguardInteractorTest : SysuiTestCase() { powerInteractor = PowerInteractorFactory.create().powerInteractor, sceneContainerFlags = testUtils.sceneContainerFlags, bouncerRepository = bouncerRepository, - configurationRepository = configurationRepository, + configurationInteractor = ConfigurationInteractor(FakeConfigurationRepository()), shadeRepository = shadeRepository, sceneInteractorProvider = { sceneInteractor }, ) 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 3536d5c77c93..fafe74e88583 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 @@ -23,6 +23,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectValues +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.flags.Flags import com.android.systemui.flags.featureFlagsClassic import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository @@ -46,7 +47,6 @@ import org.junit.runner.RunWith @SmallTest @RunWith(AndroidJUnit4::class) class LockscreenToOccludedTransitionViewModelTest : SysuiTestCase() { - private val kosmos = testKosmos().apply { featureFlagsClassic.apply { set(Flags.FULL_SCREEN_USER_SWITCHER, false) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt index d0772270ed5e..02f01bf8015b 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt @@ -20,6 +20,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository @@ -28,9 +29,11 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInterac import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep +import com.android.systemui.util.mockito.whenever import com.google.common.collect.Range import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.test.TestScope @@ -39,6 +42,9 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.anyInt +import org.mockito.MockitoAnnotations @ExperimentalCoroutinesApi @SmallTest @@ -48,12 +54,16 @@ class OccludedToLockscreenTransitionViewModelTest : SysuiTestCase() { private lateinit var repository: FakeKeyguardTransitionRepository private lateinit var fingerprintPropertyRepository: FakeFingerprintPropertyRepository private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository + @Mock private lateinit var configurationInteractor: ConfigurationInteractor + private val dimenFlow = MutableStateFlow(0) @Before fun setUp() { + MockitoAnnotations.initMocks(this) repository = FakeKeyguardTransitionRepository() fingerprintPropertyRepository = FakeFingerprintPropertyRepository() biometricSettingsRepository = FakeBiometricSettingsRepository() + whenever(configurationInteractor.dimensionPixelSize(anyInt())).thenReturn(dimenFlow) underTest = OccludedToLockscreenTransitionViewModel( interactor = @@ -68,6 +78,7 @@ class OccludedToLockscreenTransitionViewModelTest : SysuiTestCase() { fingerprintAuthRepository = FakeDeviceEntryFingerprintAuthRepository(), biometricSettingsRepository = biometricSettingsRepository, ), + configurationInteractor, ) } @@ -98,11 +109,10 @@ class OccludedToLockscreenTransitionViewModelTest : SysuiTestCase() { @Test fun lockscreenTranslationY() = runTest(UnconfinedTestDispatcher()) { + dimenFlow.value = 100 val values = mutableListOf<Float>() - val pixels = 100 - val job = - underTest.lockscreenTranslationY(pixels).onEach { values.add(it) }.launchIn(this) + val job = underTest.lockscreenTranslationY.onEach { values.add(it) }.launchIn(this) repository.sendTransitionStep(step(0f, TransitionState.STARTED)) repository.sendTransitionStep(step(0f)) @@ -119,11 +129,10 @@ class OccludedToLockscreenTransitionViewModelTest : SysuiTestCase() { @Test fun lockscreenTranslationYResettedAfterJobCancelled() = runTest(UnconfinedTestDispatcher()) { + dimenFlow.value = 100 val values = mutableListOf<Float>() - val pixels = 100 - val job = - underTest.lockscreenTranslationY(pixels).onEach { values.add(it) }.launchIn(this) + val job = underTest.lockscreenTranslationY.onEach { values.add(it) }.launchIn(this) repository.sendTransitionStep(step(0.5f, TransitionState.CANCELED)) assertThat(values.last()).isEqualTo(0f) diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractor.kt b/packages/SystemUI/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractor.kt new file mode 100644 index 000000000000..3648f3b2c3b9 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractor.kt @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2023 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.common.ui.domain.interactor + +import com.android.systemui.common.ui.data.repository.ConfigurationRepository +import com.android.systemui.dagger.SysUISingleton +import javax.inject.Inject +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.onStart + +/** Business logic related to configuration changes. */ +@SysUISingleton +class ConfigurationInteractor @Inject constructor(private val repository: ConfigurationRepository) { + /** Given [resourceId], emit the dimension pixel size on config change */ + fun dimensionPixelSize(resourceId: Int): Flow<Int> { + return onAnyConfigurationChange.mapLatest { repository.getDimensionPixelSize(resourceId) } + } + + /** Given a set of [resourceId]s, emit Map<ResourceId, DimensionPixelSize> on config change */ + fun dimensionPixelSize(resourceIds: Set<Int>): Flow<Map<Int, Int>> { + return onAnyConfigurationChange.mapLatest { + resourceIds.associateWith { repository.getDimensionPixelSize(it) } + } + } + + /** Emit an event on any config change */ + val onAnyConfigurationChange: Flow<Unit> = + repository.onAnyConfigurationChange.onStart { emit(Unit) } +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt index 791ac07db5cf..2d6c0e1c13b2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt @@ -37,7 +37,6 @@ import com.android.systemui.keyguard.shared.model.DismissAction import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.DozeTransitionModel import com.android.systemui.keyguard.shared.model.KeyguardDone -import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState import com.android.systemui.keyguard.shared.model.StatusBarState import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.policy.KeyguardStateController @@ -178,9 +177,6 @@ interface KeyguardRepository { /** Whether quick settings or quick-quick settings is visible. */ val isQuickSettingsVisible: Flow<Boolean> - /** Represents the current state of the KeyguardRootView visibility */ - val keyguardRootViewVisibility: Flow<KeyguardRootViewVisibilityState> - /** Receive an event for doze time tick */ val dozeTimeTick: Flow<Long> @@ -211,12 +207,6 @@ interface KeyguardRepository { /** Sets the current amount of alpha that should be used for rendering the keyguard. */ fun setKeyguardAlpha(alpha: Float) - fun setKeyguardVisibility( - statusBarState: Int, - goingToFullShade: Boolean, - occlusionTransitionRunning: Boolean - ) - /** * Sets the relative offset of the lock-screen clock from its natural position on the screen. */ @@ -621,17 +611,6 @@ constructor( private val _isActiveDreamLockscreenHosted = MutableStateFlow(false) override val isActiveDreamLockscreenHosted = _isActiveDreamLockscreenHosted.asStateFlow() - private val _keyguardRootViewVisibility = - MutableStateFlow( - KeyguardRootViewVisibilityState( - com.android.systemui.statusbar.StatusBarState.SHADE, - goingToFullShade = false, - occlusionTransitionRunning = false, - ) - ) - override val keyguardRootViewVisibility: Flow<KeyguardRootViewVisibilityState> = - _keyguardRootViewVisibility.asStateFlow() - override fun setAnimateDozingTransitions(animate: Boolean) { _animateBottomAreaDozingTransitions.value = animate } @@ -644,19 +623,6 @@ constructor( _keyguardAlpha.value = alpha } - override fun setKeyguardVisibility( - statusBarState: Int, - goingToFullShade: Boolean, - occlusionTransitionRunning: Boolean - ) { - _keyguardRootViewVisibility.value = - KeyguardRootViewVisibilityState( - statusBarState, - goingToFullShade, - occlusionTransitionRunning - ) - } - override fun setClockPosition(x: Int, y: Int) { _clockPosition.value = Position(x, y) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt index c0e8e2b60f33..b8c392591494 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt @@ -28,7 +28,7 @@ import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLoggin import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.common.shared.model.NotificationContainerBounds import com.android.systemui.common.shared.model.Position -import com.android.systemui.common.ui.data.repository.ConfigurationRepository +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.data.repository.KeyguardRepository import com.android.systemui.keyguard.shared.model.BiometricUnlockModel @@ -76,7 +76,7 @@ constructor( powerInteractor: PowerInteractor, sceneContainerFlags: SceneContainerFlags, bouncerRepository: KeyguardBouncerRepository, - configurationRepository: ConfigurationRepository, + configurationInteractor: ConfigurationInteractor, shadeRepository: ShadeRepository, sceneInteractorProvider: Provider<SceneInteractor>, ) { @@ -212,35 +212,29 @@ constructor( /** The approximate location on the screen of the face unlock sensor, if one is available. */ val faceSensorLocation: Flow<Point?> = repository.faceSensorLocation - /** Notifies when a new configuration is set */ - val configurationChange: Flow<Unit> = - configurationRepository.onAnyConfigurationChange.onStart { emit(Unit) } - /** The position of the keyguard clock. */ val clockPosition: Flow<Position> = repository.clockPosition val keyguardAlpha: Flow<Float> = repository.keyguardAlpha val keyguardTranslationY: Flow<Float> = - configurationChange.flatMapLatest { - val translationDistance = - configurationRepository.getDimensionPixelSize( - R.dimen.keyguard_translate_distance_on_swipe_up - ) - shadeRepository.shadeModel.map { - if (it.expansionAmount == 0f) { - // Reset the translation value - 0f - } else { - // On swipe up, translate the keyguard to reveal the bouncer - MathUtils.lerp( - translationDistance, - 0, - Interpolators.FAST_OUT_LINEAR_IN.getInterpolation(it.expansionAmount) - ) + configurationInteractor + .dimensionPixelSize(R.dimen.keyguard_translate_distance_on_swipe_up) + .flatMapLatest { translationDistance -> + shadeRepository.shadeModel.map { + if (it.expansionAmount == 0f) { + // Reset the translation value + 0f + } else { + // On swipe up, translate the keyguard to reveal the bouncer + MathUtils.lerp( + translationDistance, + 0, + Interpolators.FAST_OUT_LINEAR_IN.getInterpolation(it.expansionAmount) + ) + } } } - } val clockShouldBeCentered: Flow<Boolean> = repository.clockShouldBeCentered @@ -294,18 +288,6 @@ constructor( repository.setQuickSettingsVisible(isVisible) } - fun setKeyguardRootVisibility( - statusBarState: Int, - goingToFullShade: Boolean, - isOcclusionTransitionRunning: Boolean - ) { - repository.setKeyguardVisibility( - statusBarState, - goingToFullShade, - isOcclusionTransitionRunning - ) - } - fun setClockPosition(x: Int, y: Int) { repository.setClockPosition(x, y) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardRootViewVisibilityState.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardRootViewVisibilityState.kt deleted file mode 100644 index 9a57aefba329..000000000000 --- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardRootViewVisibilityState.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2023 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.shared.model - -/** - * Provides a stateful representation of the visibility of the KeyguardRootView - * - * @param statusBarState State of the status bar represented by [StatusBarState] - * @param goingToFullShade Whether status bar is going to full shade - * @param occlusionTransitionRunning Whether the occlusion transition is running in this instant - */ -data class KeyguardRootViewVisibilityState( - val statusBarState: Int, - val goingToFullShade: Boolean, - val occlusionTransitionRunning: Boolean, -) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt index 51e1f60acd64..0addbd8e18b2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt @@ -89,7 +89,7 @@ object KeyguardRootViewBinder { vibratorHelper: VibratorHelper?, ): DisposableHandle { var onLayoutChangeListener: OnLayoutChange? = null - val childViews = mutableMapOf<Int, View?>() + val childViews = mutableMapOf<Int, View>() val statusViewId = R.id.keyguard_status_view val burnInLayerId = R.id.burn_in_layer val aodNotificationIconContainerId = R.id.aod_notification_icon_container @@ -114,7 +114,12 @@ object KeyguardRootViewBinder { } if (keyguardBottomAreaRefactor()) { - launch { viewModel.alpha.collect { alpha -> view.alpha = alpha } } + launch { + viewModel.alpha.collect { alpha -> + view.alpha = alpha + childViews[statusViewId]?.alpha = alpha + } + } } if (KeyguardShadeMigrationNssl.isEnabled) { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModel.kt index 2327c028970b..6458edaecd9e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModel.kt @@ -17,6 +17,7 @@ package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.Flags.keyguardBottomAreaRefactor +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.doze.util.BurnInHelperWrapper import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor @@ -35,10 +36,11 @@ constructor( keyguardBottomAreaViewModel: KeyguardBottomAreaViewModel, private val burnInHelperWrapper: BurnInHelperWrapper, private val shortcutsCombinedViewModel: KeyguardQuickAffordancesCombinedViewModel, + configurationInteractor: ConfigurationInteractor, ) { /** Notifies when a new configuration is set */ - val configurationChange: Flow<Unit> = keyguardInteractor.configurationChange + val configurationChange: Flow<Unit> = configurationInteractor.onAnyConfigurationChange /** An observable for the alpha level for the entire bottom area. */ val alpha: Flow<Float> = keyguardBottomAreaViewModel.alpha @@ -47,17 +49,18 @@ constructor( val isIndicationAreaPadded: Flow<Boolean> = if (keyguardBottomAreaRefactor()) { combine(shortcutsCombinedViewModel.startButton, shortcutsCombinedViewModel.endButton) { - startButtonModel, - endButtonModel -> - startButtonModel.isVisible || endButtonModel.isVisible - } + startButtonModel, + endButtonModel -> + startButtonModel.isVisible || endButtonModel.isVisible + } .distinctUntilChanged() } else { - combine(keyguardBottomAreaViewModel.startButton, keyguardBottomAreaViewModel.endButton) { - startButtonModel, - endButtonModel -> - startButtonModel.isVisible || endButtonModel.isVisible - } + combine( + keyguardBottomAreaViewModel.startButton, + keyguardBottomAreaViewModel.endButton + ) { startButtonModel, endButtonModel -> + startButtonModel.isVisible || endButtonModel.isVisible + } .distinctUntilChanged() } /** An observable for the x-offset by which the indication area should be translated. */ 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 af1705369dbb..4c3fc03cc48e 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 @@ -17,13 +17,13 @@ package com.android.systemui.keyguard.ui.viewmodel -import android.content.Context import android.util.MathUtils import android.view.View.VISIBLE import com.android.app.animation.Interpolators import com.android.keyguard.KeyguardClockSwitch.LARGE import com.android.systemui.Flags.newAodTransition import com.android.systemui.common.shared.model.NotificationContainerBounds +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor import com.android.systemui.flags.FeatureFlagsClassic @@ -34,6 +34,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInterac import com.android.systemui.keyguard.shared.model.BurnInModel import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState.AOD +import com.android.systemui.keyguard.shared.model.KeyguardState.GONE import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN import com.android.systemui.plugins.ClockController import com.android.systemui.res.R @@ -64,7 +65,7 @@ import kotlinx.coroutines.flow.onStart class KeyguardRootViewModel @Inject constructor( - private val context: Context, + configurationInteractor: ConfigurationInteractor, private val deviceEntryInteractor: DeviceEntryInteractor, private val dozeParameters: DozeParameters, private val keyguardInteractor: KeyguardInteractor, @@ -74,6 +75,7 @@ constructor( private val keyguardClockViewModel: KeyguardClockViewModel, private val goneToAodTransitionViewModel: GoneToAodTransitionViewModel, private val aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel, + private val occludedToLockscreenTransitionViewModel: OccludedToLockscreenTransitionViewModel, screenOffAnimationController: ScreenOffAnimationController, // TODO(b/310989341): remove after changing migrate_clocks_to_blueprint to aconfig private val featureFlags: FeatureFlagsClassic, @@ -97,14 +99,18 @@ constructor( .filter { it == AOD || it == LOCKSCREEN } .map { VISIBLE } - val goneToAodTransition = keyguardTransitionInteractor.goneToAodTransition + val goneToAodTransition = keyguardTransitionInteractor.transition(from = GONE, to = AOD) /** the shared notification container bounds *on the lockscreen* */ val notificationBounds: StateFlow<NotificationContainerBounds> = keyguardInteractor.notificationContainerBounds /** An observable for the alpha level for the entire keyguard root view. */ - val alpha: Flow<Float> = keyguardInteractor.keyguardAlpha.distinctUntilChanged() + val alpha: Flow<Float> = + merge( + keyguardInteractor.keyguardAlpha.distinctUntilChanged(), + occludedToLockscreenTransitionViewModel.lockscreenAlpha, + ) private fun burnIn(): Flow<BurnInModel> { val dozingAmount: Flow<Float> = @@ -150,20 +156,26 @@ constructor( val burnInLayerAlpha: Flow<Float> = goneToAodTransitionViewModel.enterFromTopAnimationAlpha val translationY: Flow<Float> = - keyguardInteractor.configurationChange.flatMapLatest { _ -> - val enterFromTopAmount = - context.resources.getDimensionPixelSize( - R.dimen.keyguard_enter_from_top_translation_y - ) + configurationInteractor + .dimensionPixelSize(R.dimen.keyguard_enter_from_top_translation_y) + .flatMapLatest { enterFromTopAmount -> combine( keyguardInteractor.keyguardTranslationY.onStart { emit(0f) }, burnIn().map { it.translationY.toFloat() }.onStart { emit(0f) }, - goneToAodTransitionViewModel.enterFromTopTranslationY(enterFromTopAmount).onStart { - emit(0f) - }, - ) { keyguardTransitionY, burnInTranslationY, goneToAodTransitionTranslationY -> - // All 3 values need to be combined for a smooth translation - keyguardTransitionY + burnInTranslationY + goneToAodTransitionTranslationY + goneToAodTransitionViewModel + .enterFromTopTranslationY(enterFromTopAmount) + .onStart { emit(0f) }, + occludedToLockscreenTransitionViewModel.lockscreenTranslationY, + ) { + keyguardTransitionY, + burnInTranslationY, + goneToAodTransitionTranslationY, + occludedToLockscreenTransitionTranslationY -> + // All values need to be combined for a smooth translation + keyguardTransitionY + + burnInTranslationY + + goneToAodTransitionTranslationY + + occludedToLockscreenTransitionTranslationY } } 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 a6136f95d0f6..e1b0102b0d32 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 @@ -17,14 +17,17 @@ package com.android.systemui.keyguard.ui.viewmodel import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.FromLockscreenTransitionInteractor.Companion.TO_OCCLUDED_DURATION import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition +import com.android.systemui.res.R import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flatMapLatest /** * Breaks down LOCKSCREEN->OCCLUDED transition into discrete steps for corresponding views to @@ -36,7 +39,9 @@ class LockscreenToOccludedTransitionViewModel constructor( interactor: KeyguardTransitionInteractor, shadeDependentFlows: ShadeDependentFlows, + configurationInteractor: ConfigurationInteractor, ) : DeviceEntryIconTransition { + private val transitionAnimation = KeyguardTransitionAnimationFlow( transitionDuration = TO_OCCLUDED_DURATION, @@ -59,16 +64,19 @@ constructor( ) /** Lockscreen views y-translation */ - fun lockscreenTranslationY(translatePx: Int): Flow<Float> { - return transitionAnimation.createFlow( - duration = TO_OCCLUDED_DURATION, - onStep = { value -> value * translatePx }, - // Reset on cancel or finish - onFinish = { 0f }, - onCancel = { 0f }, - interpolator = EMPHASIZED_ACCELERATE, - ) - } + val lockscreenTranslationY: Flow<Float> = + configurationInteractor + .dimensionPixelSize(R.dimen.lockscreen_to_occluded_transition_lockscreen_translation_y) + .flatMapLatest { translatePx -> + transitionAnimation.createFlow( + duration = TO_OCCLUDED_DURATION, + onStep = { value -> value * translatePx }, + // Reset on cancel or finish + onFinish = { 0f }, + onCancel = { 0f }, + interpolator = EMPHASIZED_ACCELERATE, + ) + } override val deviceEntryParentViewAlpha: Flow<Float> = shadeDependentFlows.transitionFlow( diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt index 58be0934beca..9b2eaef92e9d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt @@ -17,12 +17,14 @@ package com.android.systemui.keyguard.ui.viewmodel import com.android.app.animation.Interpolators.EMPHASIZED_DECELERATE +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor import com.android.systemui.keyguard.domain.interactor.FromOccludedTransitionInteractor.Companion.TO_LOCKSCREEN_DURATION import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition +import com.android.systemui.res.R import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -40,8 +42,10 @@ class OccludedToLockscreenTransitionViewModel @Inject constructor( interactor: KeyguardTransitionInteractor, - deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor + deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor, + configurationInteractor: ConfigurationInteractor, ) : DeviceEntryIconTransition { + private val transitionAnimation = KeyguardTransitionAnimationFlow( transitionDuration = TO_LOCKSCREEN_DURATION, @@ -49,14 +53,17 @@ constructor( ) /** Lockscreen views y-translation */ - fun lockscreenTranslationY(translatePx: Int): Flow<Float> { - return transitionAnimation.createFlow( - duration = TO_LOCKSCREEN_DURATION, - onStep = { value -> -translatePx + value * translatePx }, - interpolator = EMPHASIZED_DECELERATE, - onCancel = { 0f }, - ) - } + val lockscreenTranslationY: Flow<Float> = + configurationInteractor + .dimensionPixelSize(R.dimen.occluded_to_lockscreen_transition_lockscreen_translation_y) + .flatMapLatest { translatePx -> + transitionAnimation.createFlow( + duration = TO_LOCKSCREEN_DURATION, + onStep = { value -> -translatePx + value * translatePx }, + interpolator = EMPHASIZED_DECELERATE, + onCancel = { 0f }, + ) + } val shortcutsAlpha: Flow<Float> = transitionAnimation.createFlow( diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 66d70e6ee2a2..8e98d89207f9 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -617,10 +617,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private boolean mIsOcclusionTransitionRunning = false; private boolean mIsGoneToDreamingLockscreenHostedTransitionRunning; private int mDreamingToLockscreenTransitionTranslationY; - private int mOccludedToLockscreenTransitionTranslationY; private int mLockscreenToDreamingTransitionTranslationY; private int mGoneToDreamingTransitionTranslationY; - private int mLockscreenToOccludedTransitionTranslationY; private SplitShadeStateController mSplitShadeStateController; private final Runnable mFlingCollapseRunnable = () -> fling(0, false /* expand */, mNextCollapseSpeedUpFactor, false /* expandBecauseOfFalsing */); @@ -1161,11 +1159,13 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump // Occluded->Lockscreen collectFlow(mView, mKeyguardTransitionInteractor.getOccludedToLockscreenTransition(), mOccludedToLockscreenTransition, mMainDispatcher); - collectFlow(mView, mOccludedToLockscreenTransitionViewModel.getLockscreenAlpha(), + if (!KeyguardShadeMigrationNssl.isEnabled()) { + collectFlow(mView, mOccludedToLockscreenTransitionViewModel.getLockscreenAlpha(), setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher); - collectFlow(mView, mOccludedToLockscreenTransitionViewModel.lockscreenTranslationY( - mOccludedToLockscreenTransitionTranslationY), - setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher); + collectFlow(mView, + mOccludedToLockscreenTransitionViewModel.getLockscreenTranslationY(), + setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher); + } // Lockscreen->Dreaming collectFlow(mView, mKeyguardTransitionInteractor.getLockscreenToDreamingTransition(), @@ -1191,8 +1191,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mLockscreenToOccludedTransition, mMainDispatcher); collectFlow(mView, mLockscreenToOccludedTransitionViewModel.getLockscreenAlpha(), setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher); - collectFlow(mView, mLockscreenToOccludedTransitionViewModel.lockscreenTranslationY( - mLockscreenToOccludedTransitionTranslationY), + collectFlow(mView, mLockscreenToOccludedTransitionViewModel.getLockscreenTranslationY(), setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher); // Primary bouncer->Gone (ensures lockscreen content is not visible on successful auth) @@ -1224,14 +1223,10 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump R.dimen.split_shade_scrim_transition_distance); mDreamingToLockscreenTransitionTranslationY = mResources.getDimensionPixelSize( R.dimen.dreaming_to_lockscreen_transition_lockscreen_translation_y); - mOccludedToLockscreenTransitionTranslationY = mResources.getDimensionPixelSize( - R.dimen.occluded_to_lockscreen_transition_lockscreen_translation_y); mLockscreenToDreamingTransitionTranslationY = mResources.getDimensionPixelSize( R.dimen.lockscreen_to_dreaming_transition_lockscreen_translation_y); mGoneToDreamingTransitionTranslationY = mResources.getDimensionPixelSize( R.dimen.gone_to_dreaming_transition_lockscreen_translation_y); - mLockscreenToOccludedTransitionTranslationY = mResources.getDimensionPixelSize( - R.dimen.lockscreen_to_occluded_transition_lockscreen_translation_y); // TODO (b/265193930): remove this and make QsController listen to NotificationPanelViews mQsController.loadDimens(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt index 5e60b5f4c707..7b2caea3fd9c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt @@ -82,6 +82,8 @@ object SharedNotificationContainerBinder { } launch { viewModel.translationY.collect { controller.setTranslationY(it) } } + + launch { viewModel.alpha.collect { controller.setMaxAlphaForExpansion(it) } } } } 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 1febaf99b7b2..da847c020600 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 @@ -24,6 +24,7 @@ import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.keyguard.ui.viewmodel.OccludedToLockscreenTransitionViewModel import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor import com.android.systemui.util.kotlin.sample @@ -38,6 +39,7 @@ import kotlinx.coroutines.flow.combineTransform import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn @@ -50,6 +52,7 @@ constructor( keyguardInteractor: KeyguardInteractor, keyguardTransitionInteractor: KeyguardTransitionInteractor, private val shadeInteractor: ShadeInteractor, + occludedToLockscreenTransitionViewModel: OccludedToLockscreenTransitionViewModel, ) { private val statesForConstrainedNotifications = setOf( @@ -144,14 +147,20 @@ constructor( initialValue = NotificationContainerBounds(0f, 0f), ) + val alpha: Flow<Float> = occludedToLockscreenTransitionViewModel.lockscreenAlpha + /** * Under certain scenarios, such as swiping up on the lockscreen, the container will need to be * translated as the keyguard fades out. */ val translationY: Flow<Float> = - combine(isOnLockscreen, keyguardInteractor.keyguardTranslationY) { + combine( isOnLockscreen, - translationY -> + merge( + keyguardInteractor.keyguardTranslationY, + occludedToLockscreenTransitionViewModel.lockscreenTranslationY, + ) + ) { isOnLockscreen, translationY -> if (isOnLockscreen) { translationY } else { diff --git a/packages/SystemUI/tests/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractorTest.kt new file mode 100644 index 000000000000..c5c02080fb80 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractorTest.kt @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2023 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.common.ui.domain.interactor + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository +import com.android.systemui.coroutines.collectLastValue +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.MockitoAnnotations + +@ExperimentalCoroutinesApi +@SmallTest +@RunWith(AndroidJUnit4::class) +class ConfigurationInteractorTest : SysuiTestCase() { + private lateinit var testScope: TestScope + private lateinit var underTest: ConfigurationInteractor + private lateinit var configurationRepository: FakeConfigurationRepository + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + configurationRepository = FakeConfigurationRepository() + testScope = TestScope() + underTest = ConfigurationInteractor(configurationRepository) + } + + @Test + fun dimensionPixelSize() = + testScope.runTest { + val resourceId = 1001 + val pixelSize = 501 + configurationRepository.setDimensionPixelSize(resourceId, pixelSize) + + val dimensionPixelSize by collectLastValue(underTest.dimensionPixelSize(resourceId)) + + configurationRepository.onAnyConfigurationChange() + + assertThat(dimensionPixelSize).isEqualTo(pixelSize) + } + + @Test + fun dimensionPixelSizes() = + testScope.runTest { + val resourceId1 = 1001 + val pixelSize1 = 501 + val resourceId2 = 1002 + val pixelSize2 = 502 + configurationRepository.setDimensionPixelSize(resourceId1, pixelSize1) + configurationRepository.setDimensionPixelSize(resourceId2, pixelSize2) + + val dimensionPixelSizes by + collectLastValue(underTest.dimensionPixelSize(setOf(resourceId1, resourceId2))) + + configurationRepository.onAnyConfigurationChange() + + assertThat(dimensionPixelSizes!![resourceId1]).isEqualTo(pixelSize1) + assertThat(dimensionPixelSizes!![resourceId2]).isEqualTo(pixelSize2) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModelTest.kt index 88a4aa509c37..6735e1a6207b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModelTest.kt @@ -18,6 +18,8 @@ package com.android.systemui.keyguard.ui.viewmodel import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.coroutines.collectLastValue import com.android.systemui.doze.util.BurnInHelperWrapper import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository @@ -83,6 +85,7 @@ class KeyguardIndicationAreaViewModelTest : SysuiTestCase() { keyguardBottomAreaViewModel = bottomAreaViewModel, burnInHelperWrapper = burnInHelperWrapper, shortcutsCombinedViewModel = shortcutsCombinedViewModel, + configurationInteractor = ConfigurationInteractor(FakeConfigurationRepository()), ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt index bc60364f27cb..ad3e02d96528 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt @@ -30,6 +30,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.TestMocksModule import com.android.systemui.collectLastValue import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.coroutines.collectLastValue import com.android.systemui.dagger.SysUISingleton import com.android.systemui.deviceentry.data.repository.FakeDeviceEntryRepository @@ -93,11 +94,16 @@ class KeyguardRootViewModelTest : SysuiTestCase() { @Mock private lateinit var goneToAodTransitionViewModel: GoneToAodTransitionViewModel @Mock private lateinit var aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel + @Mock + private lateinit var occludedToLockscreenTransitionViewModel: + OccludedToLockscreenTransitionViewModel @Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var clockController: ClockController private val burnInFlow = MutableStateFlow(BurnInModel()) private val goneToAodTransitionViewModelVisibility = MutableStateFlow(0) private val enterFromTopAnimationAlpha = MutableStateFlow(0f) + private val occludedToLockscreenTranslationY = MutableStateFlow(0f) + private val occludedToLockscreenAlpha = MutableStateFlow(0f) private val goneToAodTransitionStep = MutableSharedFlow<TransitionStep>(replay = 1) private val dozeAmountTransitionStep = MutableSharedFlow<TransitionStep>(replay = 1) private val clockSize = MutableStateFlow(LARGE) @@ -133,9 +139,14 @@ class KeyguardRootViewModelTest : SysuiTestCase() { whenever(keyguardTransitionInteractor.startedKeyguardState).thenReturn(startedKeyguardState) whenever(keyguardClockViewModel.clockSize).thenReturn(clockSize) + whenever(occludedToLockscreenTransitionViewModel.lockscreenTranslationY) + .thenReturn(occludedToLockscreenTranslationY) + whenever(occludedToLockscreenTransitionViewModel.lockscreenAlpha) + .thenReturn(occludedToLockscreenAlpha) + underTest = KeyguardRootViewModel( - context, + ConfigurationInteractor(configurationRepository), deviceEntryInteractor = mock { whenever(isBypassEnabled).thenReturn(MutableStateFlow(false)) }, dozeParameters = mock(), @@ -150,6 +161,7 @@ class KeyguardRootViewModelTest : SysuiTestCase() { keyguardClockViewModel, goneToAodTransitionViewModel, aodToLockscreenTransitionViewModel, + occludedToLockscreenTransitionViewModel, screenOffAnimationController = mock(), // TODO(b/310989341): remove after change to aconfig featureFlags @@ -161,8 +173,8 @@ class KeyguardRootViewModelTest : SysuiTestCase() { fun alpha() = testScope.runTest { val value = collectLastValue(underTest.alpha) + assertThat(value()).isEqualTo(0f) - assertThat(value()).isEqualTo(1f) repository.setKeyguardAlpha(0.1f) assertThat(value()).isEqualTo(0.1f) repository.setKeyguardAlpha(0.5f) @@ -171,6 +183,8 @@ class KeyguardRootViewModelTest : SysuiTestCase() { assertThat(value()).isEqualTo(0.2f) repository.setKeyguardAlpha(0f) assertThat(value()).isEqualTo(0f) + occludedToLockscreenAlpha.value = 0.8f + assertThat(value()).isEqualTo(0.8f) } @Test 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 97378c3cc5a9..b0b29e500fe4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -529,7 +529,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { .thenReturn(emptyFlow()); when(mOccludedToLockscreenTransitionViewModel.getLockscreenAlpha()) .thenReturn(emptyFlow()); - when(mOccludedToLockscreenTransitionViewModel.lockscreenTranslationY(anyInt())) + when(mOccludedToLockscreenTransitionViewModel.getLockscreenTranslationY()) .thenReturn(emptyFlow()); // Lockscreen->Dreaming @@ -567,7 +567,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { .thenReturn(emptyFlow()); when(mLockscreenToOccludedTransitionViewModel.getLockscreenAlpha()) .thenReturn(emptyFlow()); - when(mLockscreenToOccludedTransitionViewModel.lockscreenTranslationY(anyInt())) + when(mLockscreenToOccludedTransitionViewModel.getLockscreenTranslationY()) .thenReturn(emptyFlow()); // Primary Bouncer->Gone diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java index 39b306b781f9..39739e7bb93d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java @@ -53,6 +53,7 @@ import com.android.systemui.biometrics.AuthController; import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository; +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FakeFeatureFlagsClassic; import com.android.systemui.keyguard.KeyguardViewMediator; @@ -190,7 +191,7 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase { powerInteractor, sceneContainerFlags, new FakeKeyguardBouncerRepository(), - configurationRepository, + new ConfigurationInteractor(configurationRepository), shadeRepository, () -> sceneInteractor); diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java index 62c0ebeb8c07..e723d7d0367b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java @@ -40,6 +40,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository; import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository; +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FakeFeatureFlagsClassic; import com.android.systemui.flags.FeatureFlags; @@ -228,7 +229,7 @@ public class QuickSettingsControllerBaseTest extends SysuiTestCase { powerInteractor, sceneContainerFlags, new FakeKeyguardBouncerRepository(), - configurationRepository, + new ConfigurationInteractor(configurationRepository), mShadeRepository, () -> sceneInteractor); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt index 7546dfa1cbf9..dff91ddf559f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt @@ -26,6 +26,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository import com.android.systemui.classifier.FalsingCollectorFake import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.flags.FakeFeatureFlagsClassic import com.android.systemui.keyguard.data.repository.FakeCommandQueue import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository @@ -121,7 +122,7 @@ class StatusBarStateControllerImplTest : SysuiTestCase() { powerInteractor, sceneContainerFlags, FakeKeyguardBouncerRepository(), - configurationRepository, + ConfigurationInteractor(configurationRepository), shadeRepository, utils::sceneInteractor ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java index 62a2bc54af20..5102b4f7a817 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java @@ -55,6 +55,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.battery.BatteryMeterViewController; import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository; import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository; +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor; import com.android.systemui.flags.FakeFeatureFlagsClassic; import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository; @@ -167,7 +168,7 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { PowerInteractorFactory.create().getPowerInteractor(), mSceneTestUtils.getSceneContainerFlags(), new FakeKeyguardBouncerRepository(), - new FakeConfigurationRepository(), + new ConfigurationInteractor(new FakeConfigurationRepository()), new FakeShadeRepository(), () -> mSceneTestUtils.sceneInteractor()); mViewModel = diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt index 59bf9f30a828..9419d638b1c7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt @@ -20,6 +20,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.coroutines.collectLastValue import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor @@ -56,7 +57,7 @@ class KeyguardStatusBarViewModelTest : SysuiTestCase() { PowerInteractorFactory.create().powerInteractor, sceneTestUtils.sceneContainerFlags, FakeKeyguardBouncerRepository(), - FakeConfigurationRepository(), + ConfigurationInteractor(FakeConfigurationRepository()), FakeShadeRepository(), ) { sceneTestUtils.sceneInteractor() diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index 52c25f7b2b71..8585d46fa8a5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -96,6 +96,7 @@ import com.android.systemui.biometrics.AuthController; import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository; +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FakeFeatureFlags; import com.android.systemui.flags.FakeFeatureFlagsClassic; @@ -415,7 +416,7 @@ public class BubblesTest extends SysuiTestCase { powerInteractor, sceneContainerFlags, new FakeKeyguardBouncerRepository(), - configurationRepository, + new ConfigurationInteractor(configurationRepository), shadeRepository, () -> sceneInteractor); diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt index 75fe37eddd70..81a7bec52bb5 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt @@ -25,7 +25,6 @@ import com.android.systemui.keyguard.shared.model.BiometricUnlockSource import com.android.systemui.keyguard.shared.model.DismissAction import com.android.systemui.keyguard.shared.model.DozeTransitionModel import com.android.systemui.keyguard.shared.model.KeyguardDone -import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState import com.android.systemui.keyguard.shared.model.StatusBarState import dagger.Binds import dagger.Module @@ -120,17 +119,6 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { private val _keyguardAlpha = MutableStateFlow(1f) override val keyguardAlpha: StateFlow<Float> = _keyguardAlpha - private val _keyguardRootViewVisibility = - MutableStateFlow( - KeyguardRootViewVisibilityState( - 0, - goingToFullShade = false, - occlusionTransitionRunning = false - ) - ) - override val keyguardRootViewVisibility: Flow<KeyguardRootViewVisibilityState> = - _keyguardRootViewVisibility.asStateFlow() - override fun setQuickSettingsVisible(isVisible: Boolean) { _isQuickSettingsVisible.value = isVisible } @@ -247,19 +235,6 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { override fun setKeyguardAlpha(alpha: Float) { _keyguardAlpha.value = alpha } - - override fun setKeyguardVisibility( - statusBarState: Int, - goingToFullShade: Boolean, - occlusionTransitionRunning: Boolean - ) { - _keyguardRootViewVisibility.value = - KeyguardRootViewVisibilityState( - statusBarState, - goingToFullShade, - occlusionTransitionRunning - ) - } } @Module diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt index c575bb3fe25d..0bba36b172c0 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt @@ -19,6 +19,7 @@ package com.android.systemui.keyguard.domain.interactor import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.keyguard.data.repository.FakeCommandQueue import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository @@ -63,7 +64,7 @@ object KeyguardInteractorFactory { commandQueue = commandQueue, sceneContainerFlags = sceneContainerFlags, bouncerRepository = bouncerRepository, - configurationRepository = configurationRepository, + configurationInteractor = ConfigurationInteractor(configurationRepository), shadeRepository = shadeRepository, sceneInteractorProvider = { sceneInteractor }, powerInteractor = powerInteractor, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt index 3c96051a718f..d78bcb93b256 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt @@ -47,6 +47,7 @@ import com.android.systemui.classifier.FalsingCollectorFake import com.android.systemui.classifier.domain.interactor.FalsingInteractor import com.android.systemui.common.shared.model.Text import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.communal.data.repository.FakeCommunalRepository import com.android.systemui.communal.domain.interactor.CommunalInteractor import com.android.systemui.communal.domain.interactor.CommunalInteractorFactory @@ -133,6 +134,9 @@ class SceneTestUtils( val configurationRepository: FakeConfigurationRepository by lazy { FakeConfigurationRepository() } + val configurationInteractor: ConfigurationInteractor by lazy { + ConfigurationInteractor(configurationRepository) + } private val emergencyServicesRepository: EmergencyServicesRepository by lazy { EmergencyServicesRepository( applicationScope = applicationScope(), @@ -246,7 +250,7 @@ class SceneTestUtils( commandQueue = FakeCommandQueue(), sceneContainerFlags = sceneContainerFlags, bouncerRepository = FakeKeyguardBouncerRepository(), - configurationRepository = configurationRepository, + configurationInteractor = configurationInteractor, shadeRepository = FakeShadeRepository(), sceneInteractorProvider = { sceneInteractor() }, powerInteractor = PowerInteractorFactory.create().powerInteractor, |