diff options
13 files changed, 580 insertions, 303 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorTest.kt new file mode 100644 index 000000000000..33a17e8c56dd --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorTest.kt @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.domain.interactor + +import android.platform.test.annotations.DisableFlags +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.keyguard.KeyguardClockSwitch.LARGE +import com.android.keyguard.KeyguardClockSwitch.SMALL +import com.android.systemui.Flags as AConfigFlags +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.flags.EnableSceneContainer +import com.android.systemui.flags.Flags +import com.android.systemui.flags.fakeFeatureFlagsClassic +import com.android.systemui.keyguard.data.repository.fakeKeyguardClockRepository +import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository +import com.android.systemui.keyguard.data.repository.keyguardClockRepository +import com.android.systemui.keyguard.data.repository.keyguardRepository +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.kosmos.Kosmos +import com.android.systemui.kosmos.testScope +import com.android.systemui.media.controls.data.repository.mediaFilterRepository +import com.android.systemui.media.controls.shared.model.MediaData +import com.android.systemui.shade.data.repository.shadeRepository +import com.android.systemui.shade.shared.model.ShadeMode +import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository +import com.android.systemui.statusbar.notification.data.repository.setActiveNotifs +import com.android.systemui.statusbar.notification.stack.data.repository.headsUpNotificationRepository +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +class KeyguardClockInteractorTest : SysuiTestCase() { + private lateinit var kosmos: Kosmos + private lateinit var underTest: KeyguardClockInteractor + private lateinit var testScope: TestScope + + @Before + fun setup() { + kosmos = testKosmos() + testScope = kosmos.testScope + underTest = kosmos.keyguardClockInteractor + } + + @Test + @DisableFlags(AConfigFlags.FLAG_SCENE_CONTAINER) + fun clockSize_sceneContainerFlagOff_basedOnRepository() = + testScope.runTest { + val value by collectLastValue(underTest.clockSize) + kosmos.keyguardClockRepository.setClockSize(LARGE) + assertThat(value).isEqualTo(LARGE) + + kosmos.keyguardClockRepository.setClockSize(SMALL) + assertThat(value).isEqualTo(SMALL) + } + + @Test + @DisableFlags(AConfigFlags.FLAG_SCENE_CONTAINER) + fun clockShouldBeCentered_sceneContainerFlagOff_basedOnRepository() = + testScope.runTest { + val value by collectLastValue(underTest.clockShouldBeCentered) + kosmos.keyguardInteractor.setClockShouldBeCentered(true) + assertThat(value).isEqualTo(true) + + kosmos.keyguardInteractor.setClockShouldBeCentered(false) + assertThat(value).isEqualTo(false) + } + + @Test + @EnableSceneContainer + fun clockSize_forceSmallClock_SMALL() = + testScope.runTest { + val value by collectLastValue(underTest.clockSize) + kosmos.fakeKeyguardClockRepository.setShouldForceSmallClock(true) + kosmos.fakeFeatureFlagsClassic.set(Flags.LOCKSCREEN_ENABLE_LANDSCAPE, true) + transitionTo(KeyguardState.AOD, KeyguardState.LOCKSCREEN) + assertThat(value).isEqualTo(SMALL) + } + + @Test + @EnableSceneContainer + fun clockSize_SceneContainerFlagOn_shadeModeSingle_hasNotifs_SMALL() = + testScope.runTest { + val value by collectLastValue(underTest.clockSize) + kosmos.shadeRepository.setShadeMode(ShadeMode.Single) + kosmos.activeNotificationListRepository.setActiveNotifs(1) + assertThat(value).isEqualTo(SMALL) + } + + @Test + @EnableSceneContainer + fun clockSize_SceneContainerFlagOn_shadeModeSingle_hasMedia_SMALL() = + testScope.runTest { + val value by collectLastValue(underTest.clockSize) + kosmos.shadeRepository.setShadeMode(ShadeMode.Single) + val userMedia = MediaData().copy(active = true) + kosmos.mediaFilterRepository.addSelectedUserMediaEntry(userMedia) + assertThat(value).isEqualTo(SMALL) + } + + @Test + @EnableSceneContainer + fun clockSize_SceneContainerFlagOn_shadeModeSplit_isMediaVisible_SMALL() = + testScope.runTest { + val value by collectLastValue(underTest.clockSize) + val userMedia = MediaData().copy(active = true) + kosmos.shadeRepository.setShadeMode(ShadeMode.Split) + kosmos.mediaFilterRepository.addSelectedUserMediaEntry(userMedia) + kosmos.keyguardRepository.setIsDozing(false) + assertThat(value).isEqualTo(SMALL) + } + + @Test + @EnableSceneContainer + fun clockSize_SceneContainerFlagOn_shadeModeSplit_noMedia_LARGE() = + testScope.runTest { + val value by collectLastValue(underTest.clockSize) + kosmos.shadeRepository.setShadeMode(ShadeMode.Split) + kosmos.keyguardRepository.setIsDozing(false) + assertThat(value).isEqualTo(LARGE) + } + + @Test + @EnableSceneContainer + fun clockSize_SceneContainerFlagOn_shadeModeSplit_isDozing_LARGE() = + testScope.runTest { + val value by collectLastValue(underTest.clockSize) + val userMedia = MediaData().copy(active = true) + kosmos.shadeRepository.setShadeMode(ShadeMode.Split) + kosmos.mediaFilterRepository.addSelectedUserMediaEntry(userMedia) + kosmos.keyguardRepository.setIsDozing(true) + assertThat(value).isEqualTo(LARGE) + } + + @Test + @EnableSceneContainer + fun clockShouldBeCentered_sceneContainerFlagOn_notSplitMode_true() = + testScope.runTest { + val value by collectLastValue(underTest.clockShouldBeCentered) + kosmos.shadeRepository.setShadeMode(ShadeMode.Single) + assertThat(value).isEqualTo(true) + } + + @Test + @EnableSceneContainer + fun clockShouldBeCentered_sceneContainerFlagOn_splitMode_noActiveNotifications_true() = + testScope.runTest { + val value by collectLastValue(underTest.clockShouldBeCentered) + kosmos.shadeRepository.setShadeMode(ShadeMode.Split) + kosmos.activeNotificationListRepository.setActiveNotifs(0) + assertThat(value).isEqualTo(true) + } + + @Test + @EnableSceneContainer + fun clockShouldBeCentered_sceneContainerFlagOn_splitMode_isActiveDreamLockscreenHosted_true() = + testScope.runTest { + val value by collectLastValue(underTest.clockShouldBeCentered) + kosmos.shadeRepository.setShadeMode(ShadeMode.Split) + kosmos.activeNotificationListRepository.setActiveNotifs(1) + kosmos.keyguardRepository.setIsActiveDreamLockscreenHosted(true) + assertThat(value).isEqualTo(true) + } + + @Test + @EnableSceneContainer + fun clockShouldBeCentered_sceneContainerFlagOn_splitMode_hasPulsingNotifications_false() = + testScope.runTest { + val value by collectLastValue(underTest.clockShouldBeCentered) + kosmos.shadeRepository.setShadeMode(ShadeMode.Split) + kosmos.activeNotificationListRepository.setActiveNotifs(1) + kosmos.headsUpNotificationRepository.headsUpAnimatingAway.value = true + kosmos.keyguardRepository.setIsDozing(true) + assertThat(value).isEqualTo(false) + } + + @Test + @EnableSceneContainer + fun clockShouldBeCentered_sceneContainerFlagOn_splitMode_onAod_true() = + testScope.runTest { + val value by collectLastValue(underTest.clockShouldBeCentered) + kosmos.shadeRepository.setShadeMode(ShadeMode.Split) + kosmos.activeNotificationListRepository.setActiveNotifs(1) + transitionTo(KeyguardState.LOCKSCREEN, KeyguardState.AOD) + assertThat(value).isEqualTo(true) + } + + @Test + @EnableSceneContainer + fun clockShouldBeCentered_sceneContainerFlagOn_splitMode_offAod_false() = + testScope.runTest { + val value by collectLastValue(underTest.clockShouldBeCentered) + kosmos.shadeRepository.setShadeMode(ShadeMode.Split) + kosmos.activeNotificationListRepository.setActiveNotifs(1) + transitionTo(KeyguardState.AOD, KeyguardState.LOCKSCREEN) + assertThat(value).isEqualTo(false) + } + + private suspend fun transitionTo(from: KeyguardState, to: KeyguardState) { + kosmos.fakeKeyguardTransitionRepository.sendTransitionStep( + TransitionStep(from, to, 0f, TransitionState.STARTED) + ) + kosmos.fakeKeyguardTransitionRepository.sendTransitionStep( + TransitionStep(from, to, 0.5f, TransitionState.RUNNING) + ) + kosmos.fakeKeyguardTransitionRepository.sendTransitionStep( + TransitionStep(from, to, 1f, TransitionState.FINISHED) + ) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt index 3f4d3a8544d0..6c29bce616bc 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt @@ -16,6 +16,7 @@ package com.android.systemui.keyguard.data.repository +import android.content.Context import android.os.UserHandle import android.provider.Settings import com.android.keyguard.ClockEventController @@ -24,9 +25,12 @@ import com.android.keyguard.KeyguardClockSwitch.LARGE import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.flags.FeatureFlagsClassic +import com.android.systemui.flags.Flags import com.android.systemui.keyguard.shared.model.SettingsClockSize import com.android.systemui.plugins.clocks.ClockController import com.android.systemui.plugins.clocks.ClockId +import com.android.systemui.res.R import com.android.systemui.shared.clocks.ClockRegistry import com.android.systemui.util.settings.SecureSettings import com.android.systemui.util.settings.SettingsProxyExt.observerFlow @@ -47,7 +51,11 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.withContext interface KeyguardClockRepository { - /** clock size determined by notificationPanelViewController, LARGE or SMALL */ + /** + * clock size determined by notificationPanelViewController, LARGE or SMALL + * + * @deprecated When scene container flag is on use clockSize from domain level. + */ val clockSize: StateFlow<Int> /** clock size selected in picker, DYNAMIC or SMALL */ @@ -61,6 +69,9 @@ interface KeyguardClockRepository { val previewClock: Flow<ClockController> val clockEventController: ClockEventController + + val shouldForceSmallClock: Boolean + fun setClockSize(@ClockSize size: Int) } @@ -73,6 +84,8 @@ constructor( override val clockEventController: ClockEventController, @Background private val backgroundDispatcher: CoroutineDispatcher, @Application private val applicationScope: CoroutineScope, + @Application private val applicationContext: Context, + private val featureFlags: FeatureFlagsClassic, ) : KeyguardClockRepository { /** Receive SMALL or LARGE clock should be displayed on keyguard. */ @@ -135,6 +148,12 @@ constructor( clockRegistry.createCurrentClock() } + override val shouldForceSmallClock: Boolean + get() = + featureFlags.isEnabled(Flags.LOCKSCREEN_ENABLE_LANDSCAPE) && + // True on small landscape screens + applicationContext.resources.getBoolean(R.bool.force_small_clock_on_lockscreen) + private fun getClockSize(): SettingsClockSize { return if ( secureSettings.getIntForUser( 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 1298fa5af033..462d8373a430 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 @@ -206,7 +206,11 @@ interface KeyguardRepository { ) val keyguardDoneAnimationsFinished: Flow<Unit> - /** Receive whether clock should be centered on lockscreen. */ + /** + * Receive whether clock should be centered on lockscreen. + * + * @deprecated When scene container flag is on use clockShouldBeCentered from domain level. + */ val clockShouldBeCentered: Flow<Boolean> /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt index d551c9b9a4de..f7f60a5a72a4 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt @@ -21,23 +21,48 @@ import android.util.Log import com.android.keyguard.ClockEventController import com.android.keyguard.KeyguardClockSwitch import com.android.keyguard.KeyguardClockSwitch.ClockSize +import com.android.keyguard.KeyguardClockSwitch.LARGE +import com.android.keyguard.KeyguardClockSwitch.SMALL import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardClockRepository +import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.SettingsClockSize +import com.android.systemui.media.controls.domain.pipeline.interactor.MediaCarouselInteractor import com.android.systemui.plugins.clocks.ClockController import com.android.systemui.plugins.clocks.ClockId +import com.android.systemui.scene.shared.flag.SceneContainerFlag +import com.android.systemui.shade.domain.interactor.ShadeInteractor +import com.android.systemui.shade.shared.model.ShadeMode +import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor +import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor +import com.android.systemui.util.kotlin.combine import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn private val TAG = KeyguardClockInteractor::class.simpleName -/** Manages and ecapsulates the clock components of the lockscreen root view. */ +/** Manages and encapsulates the clock components of the lockscreen root view. */ @SysUISingleton class KeyguardClockInteractor @Inject constructor( + mediaCarouselInteractor: MediaCarouselInteractor, + activeNotificationsInteractor: ActiveNotificationsInteractor, + shadeInteractor: ShadeInteractor, + keyguardInteractor: KeyguardInteractor, + keyguardTransitionInteractor: KeyguardTransitionInteractor, + headsUpNotificationInteractor: HeadsUpNotificationInteractor, + @Application private val applicationScope: CoroutineScope, private val keyguardClockRepository: KeyguardClockRepository, ) { + private val isOnAod: Flow<Boolean> = + keyguardTransitionInteractor.currentKeyguardState.map { it == KeyguardState.AOD } val selectedClockSize: StateFlow<SettingsClockSize> = keyguardClockRepository.selectedClockSize @@ -51,7 +76,64 @@ constructor( var clock: ClockController? by keyguardClockRepository.clockEventController::clock - val clockSize: StateFlow<Int> = keyguardClockRepository.clockSize + // TODO (b/333389512): Convert this into a more readable enum. + val clockSize: StateFlow<Int> = + if (SceneContainerFlag.isEnabled) { + combine( + shadeInteractor.shadeMode, + activeNotificationsInteractor.areAnyNotificationsPresent, + mediaCarouselInteractor.hasActiveMediaOrRecommendation, + keyguardInteractor.isDozing, + isOnAod, + ) { shadeMode, hasNotifs, hasMedia, isDozing, isOnAod -> + return@combine when { + keyguardClockRepository.shouldForceSmallClock && !isOnAod -> SMALL + shadeMode == ShadeMode.Single && (hasNotifs || hasMedia) -> SMALL + shadeMode == ShadeMode.Single -> LARGE + hasMedia && !isDozing -> SMALL + else -> LARGE + } + } + .stateIn( + scope = applicationScope, + started = SharingStarted.WhileSubscribed(), + initialValue = LARGE + ) + } else { + SceneContainerFlag.assertInLegacyMode() + keyguardClockRepository.clockSize + } + + val clockShouldBeCentered: Flow<Boolean> = + if (SceneContainerFlag.isEnabled) { + combine( + shadeInteractor.shadeMode, + activeNotificationsInteractor.areAnyNotificationsPresent, + keyguardInteractor.isActiveDreamLockscreenHosted, + isOnAod, + headsUpNotificationInteractor.isHeadsUpOrAnimatingAway, + keyguardInteractor.isDozing, + ) { + shadeMode, + areAnyNotificationsPresent, + isActiveDreamLockscreenHosted, + isOnAod, + isHeadsUp, + isDozing -> + when { + shadeMode != ShadeMode.Split -> true + !areAnyNotificationsPresent -> true + isActiveDreamLockscreenHosted -> true + // Pulsing notification appears on the right. Move clock left to avoid overlap. + isHeadsUp && isDozing -> false + else -> isOnAod + } + } + } else { + SceneContainerFlag.assertInLegacyMode() + keyguardInteractor.clockShouldBeCentered + } + fun setClockSize(@ClockSize size: Int) { keyguardClockRepository.setClockSize(size) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt index bbbe140a9b58..f6da033f1bd3 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt @@ -26,7 +26,6 @@ import com.android.systemui.customization.R as customizationR import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor -import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.shared.ComposeLockscreen import com.android.systemui.keyguard.shared.model.SettingsClockSize import com.android.systemui.res.R @@ -46,11 +45,10 @@ import kotlinx.coroutines.flow.stateIn class KeyguardClockViewModel @Inject constructor( - keyguardInteractor: KeyguardInteractor, - private val keyguardClockInteractor: KeyguardClockInteractor, + keyguardClockInteractor: KeyguardClockInteractor, @Application private val applicationScope: CoroutineScope, notifsKeyguardInteractor: NotificationsKeyguardInteractor, - @VisibleForTesting val shadeInteractor: ShadeInteractor, + @get:VisibleForTesting val shadeInteractor: ShadeInteractor, ) { var burnInLayer: Layer? = null val useLargeClock: Boolean @@ -99,7 +97,7 @@ constructor( ) val clockShouldBeCentered: StateFlow<Boolean> = - keyguardInteractor.clockShouldBeCentered.stateIn( + keyguardClockInteractor.clockShouldBeCentered.stateIn( scope = applicationScope, started = SharingStarted.WhileSubscribed(), initialValue = false diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt index d75cbec8c542..d52e911d31f9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt @@ -21,7 +21,10 @@ import androidx.test.filters.SmallTest import com.android.keyguard.ClockEventController import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.flags.FakeFeatureFlagsClassic +import com.android.systemui.flags.Flags import com.android.systemui.keyguard.shared.model.SettingsClockSize +import com.android.systemui.res.R import com.android.systemui.shared.clocks.ClockRegistry import com.android.systemui.util.settings.FakeSettings import com.google.common.truth.Truth @@ -49,6 +52,7 @@ class KeyguardClockRepositoryTest : SysuiTestCase() { private lateinit var fakeSettings: FakeSettings @Mock private lateinit var clockRegistry: ClockRegistry @Mock private lateinit var clockEventController: ClockEventController + private val fakeFeatureFlagsClassic = FakeFeatureFlagsClassic() @Before fun setup() { @@ -63,7 +67,9 @@ class KeyguardClockRepositoryTest : SysuiTestCase() { clockRegistry, clockEventController, dispatcher, - scope.backgroundScope + scope.backgroundScope, + context, + fakeFeatureFlagsClassic, ) } @@ -82,4 +88,12 @@ class KeyguardClockRepositoryTest : SysuiTestCase() { val value = collectLastValue(underTest.selectedClockSize) Truth.assertThat(value()).isEqualTo(SettingsClockSize.DYNAMIC) } + + @Test + fun testShouldForceSmallClock() = + scope.runTest { + overrideResource(R.bool.force_small_clock_on_lockscreen, true) + fakeFeatureFlagsClassic.set(Flags.LOCKSCREEN_ENABLE_LANDSCAPE, true) + Truth.assertThat(underTest.shouldForceSmallClock).isTrue() + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt index 7b5dd1fc6c7a..85a20e22818f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 The Android Open Source Project + * 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. @@ -12,191 +12,244 @@ * 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 android.provider.Settings.Secure.LOCKSCREEN_USE_DOUBLE_LINE_CLOCK +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags import androidx.test.filters.SmallTest -import com.android.keyguard.ClockEventController -import com.android.keyguard.KeyguardClockSwitch.LARGE -import com.android.keyguard.KeyguardClockSwitch.SMALL +import com.android.keyguard.KeyguardClockSwitch +import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue -import com.android.systemui.keyguard.data.repository.KeyguardClockRepository -import com.android.systemui.keyguard.data.repository.KeyguardClockRepositoryImpl -import com.android.systemui.keyguard.data.repository.KeyguardRepository -import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor -import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor -import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory -import com.android.systemui.keyguard.shared.ComposeLockscreen +import com.android.systemui.keyguard.data.repository.fakeKeyguardClockRepository +import com.android.systemui.keyguard.data.repository.keyguardClockRepository +import com.android.systemui.keyguard.data.repository.keyguardRepository +import com.android.systemui.keyguard.shared.model.SettingsClockSize +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.testScope import com.android.systemui.plugins.clocks.ClockController import com.android.systemui.plugins.clocks.ClockFaceConfig import com.android.systemui.plugins.clocks.ClockFaceController import com.android.systemui.res.R -import com.android.systemui.shade.domain.interactor.ShadeInteractor +import com.android.systemui.shade.data.repository.shadeRepository import com.android.systemui.shade.shared.model.ShadeMode -import com.android.systemui.shared.clocks.ClockRegistry -import com.android.systemui.statusbar.notification.domain.interactor.NotificationsKeyguardInteractor +import com.android.systemui.testKosmos import com.android.systemui.util.Utils import com.android.systemui.util.mockito.whenever -import com.android.systemui.util.settings.FakeSettings import com.google.common.truth.Truth.assertThat import kotlin.test.Test -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.test.StandardTestDispatcher -import kotlinx.coroutines.test.TestCoroutineScheduler import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.runner.RunWith import org.junit.runners.JUnit4 -import org.mockito.Mock -import org.mockito.MockitoAnnotations +import org.mockito.Mockito.mock @SmallTest @RunWith(JUnit4::class) class KeyguardClockViewModelTest : SysuiTestCase() { - private lateinit var scheduler: TestCoroutineScheduler - private lateinit var dispatcher: CoroutineDispatcher - private lateinit var scope: TestScope + private lateinit var kosmos: Kosmos private lateinit var underTest: KeyguardClockViewModel - private lateinit var keyguardInteractor: KeyguardInteractor - private lateinit var keyguardRepository: KeyguardRepository - private lateinit var keyguardClockInteractor: KeyguardClockInteractor - private lateinit var keyguardClockRepository: KeyguardClockRepository - private lateinit var fakeSettings: FakeSettings - private val shadeMode = MutableStateFlow<ShadeMode>(ShadeMode.Single) - @Mock private lateinit var clockRegistry: ClockRegistry - @Mock private lateinit var clock: ClockController - @Mock private lateinit var largeClock: ClockFaceController - @Mock private lateinit var clockFaceConfig: ClockFaceConfig - @Mock private lateinit var eventController: ClockEventController - @Mock private lateinit var notifsKeyguardInteractor: NotificationsKeyguardInteractor - @Mock private lateinit var areNotificationsFullyHidden: Flow<Boolean> - @Mock private lateinit var shadeInteractor: ShadeInteractor + private lateinit var testScope: TestScope + private lateinit var clockController: ClockController + private lateinit var config: ClockFaceConfig @Before fun setup() { - MockitoAnnotations.initMocks(this) - KeyguardInteractorFactory.create().let { - keyguardInteractor = it.keyguardInteractor - keyguardRepository = it.repository - } - fakeSettings = FakeSettings() - scheduler = TestCoroutineScheduler() - dispatcher = StandardTestDispatcher(scheduler) - scope = TestScope(dispatcher) - setupMockClock() - keyguardClockRepository = - KeyguardClockRepositoryImpl( - fakeSettings, - clockRegistry, - eventController, - dispatcher, - scope.backgroundScope - ) - keyguardClockInteractor = KeyguardClockInteractor(keyguardClockRepository) - whenever(notifsKeyguardInteractor.areNotificationsFullyHidden) - .thenReturn(areNotificationsFullyHidden) - whenever(shadeInteractor.shadeMode).thenReturn(shadeMode) - underTest = - KeyguardClockViewModel( - keyguardInteractor, - keyguardClockInteractor, - scope.backgroundScope, - notifsKeyguardInteractor, - shadeInteractor, - ) + kosmos = testKosmos() + testScope = kosmos.testScope + underTest = kosmos.keyguardClockViewModel + + clockController = mock(ClockController::class.java) + val largeClock = mock(ClockFaceController::class.java) + config = mock(ClockFaceConfig::class.java) + + whenever(clockController.largeClock).thenReturn(largeClock) + whenever(largeClock.config).thenReturn(config) } @Test - fun testClockSize_alwaysSmallClock() = - scope.runTest { - // When use double line clock is disabled, - // should always return small - fakeSettings.putInt(LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, 0) - keyguardClockRepository.setClockSize(LARGE) - val value = collectLastValue(underTest.clockSize) - assertThat(value()).isEqualTo(SMALL) + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) + fun currentClockLayout_splitShadeOn_clockCentered_largeClock() = + testScope.runTest { + with(kosmos) { + shadeRepository.setShadeMode(ShadeMode.Split) + keyguardRepository.setClockShouldBeCentered(true) + keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) + } + val currentClockLayout by collectLastValue(underTest.currentClockLayout) + assertThat(currentClockLayout).isEqualTo(KeyguardClockViewModel.ClockLayout.LARGE_CLOCK) + } + + @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) + fun currentClockLayout_splitShadeOn_clockNotCentered_largeClock_splitShadeLargeClock() = + testScope.runTest { + with(kosmos) { + shadeRepository.setShadeMode(ShadeMode.Split) + keyguardRepository.setClockShouldBeCentered(false) + keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) + } + val currentClockLayout by collectLastValue(underTest.currentClockLayout) + assertThat(currentClockLayout) + .isEqualTo(KeyguardClockViewModel.ClockLayout.SPLIT_SHADE_LARGE_CLOCK) } @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) + fun currentClockLayout_splitShadeOn_clockNotCentered_smallClock_splitShadeSmallClock() = + testScope.runTest { + with(kosmos) { + shadeRepository.setShadeMode(ShadeMode.Split) + keyguardRepository.setClockShouldBeCentered(false) + keyguardClockRepository.setClockSize(KeyguardClockSwitch.SMALL) + } + val currentClockLayout by collectLastValue(underTest.currentClockLayout) + assertThat(currentClockLayout) + .isEqualTo(KeyguardClockViewModel.ClockLayout.SPLIT_SHADE_SMALL_CLOCK) + } + + @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) + fun currentClockLayout_singleShade_smallClock_smallClock() = + testScope.runTest { + with(kosmos) { + shadeRepository.setShadeMode(ShadeMode.Single) + keyguardClockRepository.setClockSize(KeyguardClockSwitch.SMALL) + } + val currentClockLayout by collectLastValue(underTest.currentClockLayout) + assertThat(currentClockLayout).isEqualTo(KeyguardClockViewModel.ClockLayout.SMALL_CLOCK) + } + + @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) + fun currentClockLayout_singleShade_largeClock_largeClock() = + testScope.runTest { + with(kosmos) { + shadeRepository.setShadeMode(ShadeMode.Single) + keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) + } + val currentClockLayout by collectLastValue(underTest.currentClockLayout) + assertThat(currentClockLayout).isEqualTo(KeyguardClockViewModel.ClockLayout.LARGE_CLOCK) + } + + @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) + fun hasCustomPositionUpdatedAnimation_withConfigTrue_isTrue() = + testScope.runTest { + with(kosmos) { + keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) + whenever(config.hasCustomPositionUpdatedAnimation).thenReturn(true) + fakeKeyguardClockRepository.setCurrentClock(clockController) + } + + val hasCustomPositionUpdatedAnimation by + collectLastValue(underTest.hasCustomPositionUpdatedAnimation) + assertThat(hasCustomPositionUpdatedAnimation).isEqualTo(true) + } + + @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) + fun hasCustomPositionUpdatedAnimation_withConfigFalse_isFalse() = + testScope.runTest { + with(kosmos) { + keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) + + whenever(config.hasCustomPositionUpdatedAnimation).thenReturn(false) + fakeKeyguardClockRepository.setCurrentClock(clockController) + } + + val hasCustomPositionUpdatedAnimation by + collectLastValue(underTest.hasCustomPositionUpdatedAnimation) + assertThat(hasCustomPositionUpdatedAnimation).isEqualTo(false) + } + + @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) + fun testClockSize_alwaysSmallClockSize() = + testScope.runTest { + kosmos.fakeKeyguardClockRepository.setSelectedClockSize(SettingsClockSize.SMALL) + kosmos.keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) + + val value by collectLastValue(underTest.clockSize) + assertThat(value).isEqualTo(KeyguardClockSwitch.SMALL) + } + + @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) fun testClockSize_dynamicClockSize() = - scope.runTest { - fakeSettings.putInt(LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, 1) - keyguardClockRepository.setClockSize(SMALL) - var value = collectLastValue(underTest.clockSize) - assertThat(value()).isEqualTo(SMALL) - - keyguardClockRepository.setClockSize(LARGE) - value = collectLastValue(underTest.clockSize) - assertThat(value()).isEqualTo(LARGE) + testScope.runTest { + kosmos.keyguardClockRepository.setClockSize(KeyguardClockSwitch.SMALL) + kosmos.fakeKeyguardClockRepository.setSelectedClockSize(SettingsClockSize.DYNAMIC) + val value by collectLastValue(underTest.clockSize) + assertThat(value).isEqualTo(KeyguardClockSwitch.SMALL) + + kosmos.keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) + assertThat(value).isEqualTo(KeyguardClockSwitch.LARGE) } @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) fun isLargeClockVisible_whenLargeClockSize_isTrue() = - scope.runTest { - fakeSettings.putInt(LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, 1) - keyguardClockRepository.setClockSize(LARGE) - var value = collectLastValue(underTest.isLargeClockVisible) - assertThat(value()).isEqualTo(true) + testScope.runTest { + kosmos.keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) + val value by collectLastValue(underTest.isLargeClockVisible) + assertThat(value).isEqualTo(true) } @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) fun isLargeClockVisible_whenSmallClockSize_isFalse() = - scope.runTest { - fakeSettings.putInt(LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, 1) - keyguardClockRepository.setClockSize(SMALL) - var value = collectLastValue(underTest.isLargeClockVisible) - assertThat(value()).isEqualTo(false) + testScope.runTest { + kosmos.keyguardClockRepository.setClockSize(KeyguardClockSwitch.SMALL) + val value by collectLastValue(underTest.isLargeClockVisible) + assertThat(value).isEqualTo(false) } @Test - fun testSmallClockTop_splitshade() = - scope.runTest { - shadeMode.value = ShadeMode.Split - if (!ComposeLockscreen.isEnabled) { - assertThat(underTest.getSmallClockTopMargin(context)) - .isEqualTo( - context.resources.getDimensionPixelSize( - R.dimen.keyguard_split_shade_top_margin - ) - ) - } else { - assertThat(underTest.getSmallClockTopMargin(context)) - .isEqualTo( - context.resources.getDimensionPixelSize( - R.dimen.keyguard_split_shade_top_margin - ) - Utils.getStatusBarHeaderHeightKeyguard(context) - ) - } + @EnableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) + fun testSmallClockTop_splitShade_composeLockscreenOn() = + testScope.runTest { + kosmos.shadeRepository.setShadeMode(ShadeMode.Split) + assertThat(underTest.getSmallClockTopMargin(context)) + .isEqualTo( + context.resources.getDimensionPixelSize( + R.dimen.keyguard_split_shade_top_margin + ) - Utils.getStatusBarHeaderHeightKeyguard(context) + ) } @Test - fun testSmallClockTop_nonSplitshade() = - scope.runTest { - if (!ComposeLockscreen.isEnabled) { - assertThat(underTest.getSmallClockTopMargin(context)) - .isEqualTo( - context.resources.getDimensionPixelSize(R.dimen.keyguard_clock_top_margin) + - Utils.getStatusBarHeaderHeightKeyguard(context) - ) - } else { - assertThat(underTest.getSmallClockTopMargin(context)) - .isEqualTo( - context.resources.getDimensionPixelSize(R.dimen.keyguard_clock_top_margin) - ) - } + @DisableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) + fun testSmallClockTop_splitShade_composeLockscreenOff() = + testScope.runTest { + kosmos.shadeRepository.setShadeMode(ShadeMode.Split) + assertThat(underTest.getSmallClockTopMargin(context)) + .isEqualTo( + context.resources.getDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin) + ) } - private fun setupMockClock() { - whenever(clock.largeClock).thenReturn(largeClock) - whenever(largeClock.config).thenReturn(clockFaceConfig) - whenever(clockFaceConfig.hasCustomWeatherDataDisplay).thenReturn(false) - whenever(clockRegistry.createCurrentClock()).thenReturn(clock) - } + @Test + @EnableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) + fun testSmallClockTop_nonSplitShade_composeLockscreenOn() = + testScope.runTest { + assertThat(underTest.getSmallClockTopMargin(context)) + .isEqualTo( + context.resources.getDimensionPixelSize(R.dimen.keyguard_clock_top_margin) + ) + } + + @Test + @DisableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) + fun testSmallClockTop_nonSplitShade_composeLockscreenOff() = + testScope.runTest { + assertThat(underTest.getSmallClockTopMargin(context)) + .isEqualTo( + context.resources.getDimensionPixelSize(R.dimen.keyguard_clock_top_margin) + + Utils.getStatusBarHeaderHeightKeyguard(context) + ) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelWithKosmosTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelWithKosmosTest.kt deleted file mode 100644 index d12980a74a18..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelWithKosmosTest.kt +++ /dev/null @@ -1,152 +0,0 @@ -/* - * 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 androidx.test.filters.SmallTest -import com.android.keyguard.KeyguardClockSwitch -import com.android.systemui.SysuiTestCase -import com.android.systemui.coroutines.collectLastValue -import com.android.systemui.keyguard.data.repository.fakeKeyguardClockRepository -import com.android.systemui.keyguard.data.repository.keyguardClockRepository -import com.android.systemui.keyguard.data.repository.keyguardRepository -import com.android.systemui.kosmos.testScope -import com.android.systemui.plugins.clocks.ClockController -import com.android.systemui.plugins.clocks.ClockFaceConfig -import com.android.systemui.plugins.clocks.ClockFaceController -import com.android.systemui.shade.data.repository.shadeRepository -import com.android.systemui.shade.shared.model.ShadeMode -import com.android.systemui.testKosmos -import com.android.systemui.util.mockito.whenever -import com.google.common.truth.Truth.assertThat -import kotlin.test.Test -import kotlinx.coroutines.test.runTest -import org.junit.runner.RunWith -import org.junit.runners.JUnit4 -import org.mockito.Mockito.mock - -@SmallTest -@RunWith(JUnit4::class) -class KeyguardClockViewModelWithKosmosTest : SysuiTestCase() { - private val kosmos = testKosmos() - private val underTest = kosmos.keyguardClockViewModel - private val testScope = kosmos.testScope - - @Test - fun currentClockLayout_splitShadeOn_clockCentered_largeClock() = - testScope.runTest { - with(kosmos) { - shadeRepository.setShadeMode(ShadeMode.Split) - keyguardRepository.setClockShouldBeCentered(true) - keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) - } - val currentClockLayout by collectLastValue(underTest.currentClockLayout) - assertThat(currentClockLayout).isEqualTo(KeyguardClockViewModel.ClockLayout.LARGE_CLOCK) - } - - @Test - fun currentClockLayout_splitShadeOn_clockNotCentered_largeClock_splitShadeLargeClock() = - testScope.runTest { - with(kosmos) { - shadeRepository.setShadeMode(ShadeMode.Split) - keyguardRepository.setClockShouldBeCentered(false) - keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) - } - val currentClockLayout by collectLastValue(underTest.currentClockLayout) - assertThat(currentClockLayout) - .isEqualTo(KeyguardClockViewModel.ClockLayout.SPLIT_SHADE_LARGE_CLOCK) - } - - @Test - fun currentClockLayout_splitShadeOn_clockNotCentered_smallClock_splitShadeSmallClock() = - testScope.runTest { - with(kosmos) { - shadeRepository.setShadeMode(ShadeMode.Split) - keyguardRepository.setClockShouldBeCentered(false) - keyguardClockRepository.setClockSize(KeyguardClockSwitch.SMALL) - } - val currentClockLayout by collectLastValue(underTest.currentClockLayout) - assertThat(currentClockLayout) - .isEqualTo(KeyguardClockViewModel.ClockLayout.SPLIT_SHADE_SMALL_CLOCK) - } - - @Test - fun currentClockLayout_singleShade_smallClock_smallClock() = - testScope.runTest { - with(kosmos) { - shadeRepository.setShadeMode(ShadeMode.Single) - keyguardClockRepository.setClockSize(KeyguardClockSwitch.SMALL) - } - val currentClockLayout by collectLastValue(underTest.currentClockLayout) - assertThat(currentClockLayout).isEqualTo(KeyguardClockViewModel.ClockLayout.SMALL_CLOCK) - } - - @Test - fun currentClockLayout_singleShade_largeClock_largeClock() = - testScope.runTest { - with(kosmos) { - shadeRepository.setShadeMode(ShadeMode.Single) - keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) - } - val currentClockLayout by collectLastValue(underTest.currentClockLayout) - assertThat(currentClockLayout).isEqualTo(KeyguardClockViewModel.ClockLayout.LARGE_CLOCK) - } - - @Test - fun hasCustomPositionUpdatedAnimation_withConfigTrue_isTrue() = - testScope.runTest { - with(kosmos) { - keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) - fakeKeyguardClockRepository.setCurrentClock( - buildClockController(hasCustomPositionUpdatedAnimation = true) - ) - } - - val hasCustomPositionUpdatedAnimation by - collectLastValue(underTest.hasCustomPositionUpdatedAnimation) - assertThat(hasCustomPositionUpdatedAnimation).isEqualTo(true) - } - - @Test - fun hasCustomPositionUpdatedAnimation_withConfigFalse_isFalse() = - testScope.runTest { - with(kosmos) { - keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) - fakeKeyguardClockRepository.setCurrentClock( - buildClockController(hasCustomPositionUpdatedAnimation = false) - ) - } - - val hasCustomPositionUpdatedAnimation by - collectLastValue(underTest.hasCustomPositionUpdatedAnimation) - assertThat(hasCustomPositionUpdatedAnimation).isEqualTo(false) - } - - private fun buildClockController( - hasCustomPositionUpdatedAnimation: Boolean = false - ): ClockController { - val clockController = mock(ClockController::class.java) - val largeClock = mock(ClockFaceController::class.java) - val config = mock(ClockFaceConfig::class.java) - - whenever(clockController.largeClock).thenReturn(largeClock) - whenever(largeClock.config).thenReturn(config) - whenever(config.hasCustomPositionUpdatedAnimation) - .thenReturn(hasCustomPositionUpdatedAnimation) - - return clockController - } -} 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 dfe72cf11dcb..e7b29d826a0c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -398,7 +398,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mFakeKeyguardRepository = keyguardInteractorDeps.getRepository(); mKeyguardBottomAreaInteractor = new KeyguardBottomAreaInteractor(mFakeKeyguardRepository); mFakeKeyguardClockRepository = new FakeKeyguardClockRepository(); - mKeyguardClockInteractor = new KeyguardClockInteractor(mFakeKeyguardClockRepository); + mKeyguardClockInteractor = mKosmos.getKeyguardClockInteractor(); mKeyguardInteractor = keyguardInteractorDeps.getKeyguardInteractor(); mShadeRepository = new FakeShadeRepository(); mShadeAnimationInteractor = new ShadeAnimationInteractorLegacyImpl( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/FeatureFlagsClassicKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/FeatureFlagsClassicKosmos.kt index d6f2f77ca67a..45ea36464194 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/FeatureFlagsClassicKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/FeatureFlagsClassicKosmos.kt @@ -34,8 +34,9 @@ val Kosmos.fakeFeatureFlagsClassic by Kosmos.Fixture { FakeFeatureFlagsClassic().apply { set(Flags.FULL_SCREEN_USER_SWITCHER, false) - set(Flags.NSSL_DEBUG_LINES, false) set(Flags.LOCK_SCREEN_LONG_PRESS_ENABLED, false) + set(Flags.LOCKSCREEN_ENABLE_LANDSCAPE, false) + set(Flags.NSSL_DEBUG_LINES, false) } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt index eba5a11cecdb..4f2310f9972d 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt @@ -50,14 +50,25 @@ class FakeKeyguardClockRepository @Inject constructor() : KeyguardClockRepositor get() = _previewClock override val clockEventController: ClockEventController get() = mock() + override val shouldForceSmallClock: Boolean + get() = _shouldForceSmallClock + private var _shouldForceSmallClock: Boolean = false override fun setClockSize(@ClockSize size: Int) { _clockSize.value = size } + fun setSelectedClockSize(size: SettingsClockSize) { + selectedClockSize.value = size + } + fun setCurrentClock(clockController: ClockController) { _currentClock.value = clockController } + + fun setShouldForceSmallClock(shouldForceSmallClock: Boolean) { + _shouldForceSmallClock = shouldForceSmallClock + } } @Module diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt index 12165cdc5658..d52883eb38af 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt @@ -18,6 +18,22 @@ package com.android.systemui.keyguard.domain.interactor import com.android.systemui.keyguard.data.repository.keyguardClockRepository import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.media.controls.domain.pipeline.interactor.mediaCarouselInteractor +import com.android.systemui.shade.domain.interactor.shadeInteractor +import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor +import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor val Kosmos.keyguardClockInteractor by - Kosmos.Fixture { KeyguardClockInteractor(keyguardClockRepository) } + Kosmos.Fixture { + KeyguardClockInteractor( + keyguardClockRepository = keyguardClockRepository, + applicationScope = applicationCoroutineScope, + mediaCarouselInteractor = mediaCarouselInteractor, + activeNotificationsInteractor = activeNotificationsInteractor, + shadeInteractor = shadeInteractor, + keyguardInteractor = keyguardInteractor, + keyguardTransitionInteractor = keyguardTransitionInteractor, + headsUpNotificationInteractor = headsUpNotificationInteractor, + ) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt index 60dd48aeaf61..a048d3cfffca 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt @@ -17,7 +17,6 @@ package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor -import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.shade.domain.interactor.shadeInteractor @@ -26,7 +25,6 @@ import com.android.systemui.statusbar.notification.stack.domain.interactor.notif val Kosmos.keyguardClockViewModel by Kosmos.Fixture { KeyguardClockViewModel( - keyguardInteractor = keyguardInteractor, keyguardClockInteractor = keyguardClockInteractor, applicationScope = applicationCoroutineScope, notifsKeyguardInteractor = notificationsKeyguardInteractor, |