diff options
| author | 2025-02-28 17:42:38 +0000 | |
|---|---|---|
| committer | 2025-03-03 17:49:12 +0000 | |
| commit | 976713c20cec58164b24ac49dc03ceadc9d51844 (patch) | |
| tree | d5cb22eec807da4d01965458f4a76a63ec82faa5 | |
| parent | 6ac893b2949206d8c92b50127bdeff1b15536256 (diff) | |
Fix statusbar visibility wrt shade expansion in multiple displays
The statusbar was only considering the state of Scene container (or shade expansion), without caring about whether the shade window was on its own display.
This caused it to be hidden when the shade was expanded in another dispaly.
With this change, we're always showing the statusbar when the shade window is in another display.
Also note that the keyguard is always in the shade window, and once the device is locked it goes back to the default display.
Bug: 362719719
Bug: 397155459
Test: HomeStatusBarViewModelImplTest
Flag: com.android.systemui.shade_window_goes_around
Change-Id: I78323f206acc162f1150cf8c685ffdf87dccfc8b
6 files changed, 212 insertions, 61 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt index f91e3a612862..ed9b49073d22 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt @@ -62,7 +62,7 @@ class FakeHomeStatusBarViewModel( override val mediaProjectionStopDialogDueToCallEndedState = MutableStateFlow(MediaProjectionStopDialogModel.Hidden) - override val isHomeStatusBarAllowedByScene = MutableStateFlow(false) + override val isHomeStatusBarAllowed = MutableStateFlow(false) override val canShowOngoingActivityChips: Flow<Boolean> = MutableStateFlow(false) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt index 7e8ee1b156df..2603d6f7f106 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt @@ -30,6 +30,7 @@ import android.view.Display.DEFAULT_DISPLAY import android.view.View import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest +import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.display.data.repository.displayRepository import com.android.systemui.display.data.repository.fake @@ -57,6 +58,7 @@ import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.screenrecord.data.model.ScreenRecordModel import com.android.systemui.screenrecord.data.repository.screenRecordRepository +import com.android.systemui.shade.data.repository.fakeShadeDisplaysRepository import com.android.systemui.shade.shadeTestUtil import com.android.systemui.statusbar.chips.mediaprojection.domain.interactor.MediaProjectionChipInteractorTest.Companion.NORMAL_PACKAGE import com.android.systemui.statusbar.chips.mediaprojection.domain.interactor.MediaProjectionChipInteractorTest.Companion.setUpPackageManagerForMediaProjection @@ -95,7 +97,6 @@ import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.test.runCurrent import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -500,9 +501,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { } @Test - fun isHomeStatusBarAllowedByScene_sceneLockscreen_notOccluded_false() = + @EnableSceneContainer + fun isHomeStatusBarAllowed_sceneLockscreen_notOccluded_false() = kosmos.runTest { - val latest by collectLastValue(underTest.isHomeStatusBarAllowedByScene) + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) kosmos.sceneContainerRepository.snapToScene(Scenes.Lockscreen) kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(false, taskInfo = null) @@ -511,9 +513,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { } @Test - fun isHomeStatusBarAllowedByScene_sceneLockscreen_occluded_true() = + @EnableSceneContainer + fun isHomeStatusBarAllowed_sceneLockscreen_occluded_true() = kosmos.runTest { - val latest by collectLastValue(underTest.isHomeStatusBarAllowedByScene) + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) kosmos.sceneContainerRepository.snapToScene(Scenes.Lockscreen) kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(true, taskInfo = null) @@ -522,9 +525,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { } @Test - fun isHomeStatusBarAllowedByScene_overlayBouncer_false() = + @EnableSceneContainer + fun isHomeStatusBarAllowed_overlayBouncer_false() = kosmos.runTest { - val latest by collectLastValue(underTest.isHomeStatusBarAllowedByScene) + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) kosmos.sceneContainerRepository.snapToScene(Scenes.Lockscreen) kosmos.sceneContainerRepository.showOverlay(Overlays.Bouncer) @@ -533,9 +537,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { } @Test - fun isHomeStatusBarAllowedByScene_sceneCommunal_false() = + @EnableSceneContainer + fun isHomeStatusBarAllowed_sceneCommunal_false() = kosmos.runTest { - val latest by collectLastValue(underTest.isHomeStatusBarAllowedByScene) + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) kosmos.sceneContainerRepository.snapToScene(Scenes.Communal) @@ -543,9 +548,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { } @Test - fun isHomeStatusBarAllowedByScene_sceneShade_false() = + @EnableSceneContainer + fun isHomeStatusBarAllowed_sceneShade_false() = kosmos.runTest { - val latest by collectLastValue(underTest.isHomeStatusBarAllowedByScene) + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) kosmos.sceneContainerRepository.snapToScene(Scenes.Shade) @@ -553,9 +559,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { } @Test - fun isHomeStatusBarAllowedByScene_sceneGone_true() = + @EnableSceneContainer + fun isHomeStatusBarAllowed_sceneGone_true() = kosmos.runTest { - val latest by collectLastValue(underTest.isHomeStatusBarAllowedByScene) + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) kosmos.sceneContainerRepository.snapToScene(Scenes.Gone) @@ -563,9 +570,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { } @Test - fun isHomeStatusBarAllowedByScene_sceneGoneWithNotificationsShadeOverlay_false() = + @EnableSceneContainer + fun isHomeStatusBarAllowed_sceneGoneWithNotificationsShadeOverlay_false() = kosmos.runTest { - val latest by collectLastValue(underTest.isHomeStatusBarAllowedByScene) + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) kosmos.sceneContainerRepository.snapToScene(Scenes.Gone) kosmos.sceneContainerRepository.showOverlay(Overlays.NotificationsShade) @@ -575,14 +583,104 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { } @Test - fun isHomeStatusBarAllowedByScene_sceneGoneWithQuickSettingsShadeOverlay_false() = + @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND) + @EnableSceneContainer + fun isHomeStatusBarAllowed_QsVisibleButInExternalDisplay_defaultStatusBarVisible() = + kosmos.runTest { + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) + + kosmos.sceneContainerRepository.snapToScene(Scenes.Gone) + kosmos.sceneContainerRepository.showOverlay(Overlays.QuickSettingsShade) + kosmos.fakeShadeDisplaysRepository.setDisplayId(EXTERNAL_DISPLAY) + runCurrent() + + assertThat(latest).isTrue() + } + + @Test + @DisableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND) + @EnableSceneContainer + fun isHomeStatusBarAllowed_QsVisibleButInExternalDisplay_withFlagOff_defaultStatusBarInvisible() = + kosmos.runTest { + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) + + kosmos.sceneContainerRepository.snapToScene(Scenes.Gone) + kosmos.sceneContainerRepository.showOverlay(Overlays.QuickSettingsShade) + kosmos.fakeShadeDisplaysRepository.setDisplayId(EXTERNAL_DISPLAY) + runCurrent() + + // Shade position is ignored. + assertThat(latest).isFalse() + } + + @Test + @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND) + @EnableSceneContainer + fun isHomeStatusBarAllowed_qsVisibleInThisDisplay_thisStatusBarInvisible() = + kosmos.runTest { + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) + + kosmos.sceneContainerRepository.snapToScene(Scenes.Gone) + kosmos.sceneContainerRepository.showOverlay(Overlays.QuickSettingsShade) + kosmos.fakeShadeDisplaysRepository.setDisplayId(DEFAULT_DISPLAY) + runCurrent() + + assertThat(latest).isFalse() + } + + @Test + @EnableSceneContainer + fun isHomeStatusBarAllowed_qsExpandedOnDefaultDisplay_statusBarInAnotherDisplay_visible() = kosmos.runTest { - val latest by collectLastValue(underTest.isHomeStatusBarAllowedByScene) + val underTest = homeStatusBarViewModelFactory(EXTERNAL_DISPLAY) + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) kosmos.sceneContainerRepository.snapToScene(Scenes.Gone) kosmos.sceneContainerRepository.showOverlay(Overlays.QuickSettingsShade) runCurrent() + assertThat(latest).isTrue() + } + + @Test + @EnableSceneContainer + fun isHomeStatusBarAllowed_onDefaultDisplayLockscreen_invisible() = + kosmos.runTest { + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) + + kosmos.sceneContainerRepository.snapToScene(Scenes.Lockscreen) + runCurrent() + + assertThat(latest).isFalse() + } + + @Test + @EnableSceneContainer + @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND) + fun isHomeStatusBarAllowed_onExternalDispalyWithLocksceren_invisible() = + kosmos.runTest { + val underTest = homeStatusBarViewModelFactory(EXTERNAL_DISPLAY) + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) + + kosmos.sceneContainerRepository.snapToScene(Scenes.Lockscreen) + runCurrent() + + assertThat(latest).isFalse() + } + + @Test + @DisableSceneContainer + fun isHomeStatusBarAllowed_legacy_onDefaultDisplayLockscreen_invisible() = + kosmos.runTest { + val latest by collectLastValue(underTest.isHomeStatusBarAllowed) + + kosmos.fakeKeyguardTransitionRepository.transitionTo( + KeyguardState.GONE, + KeyguardState.LOCKSCREEN, + ) + + runCurrent() + assertThat(latest).isFalse() } @@ -1289,4 +1387,8 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { testScope = testScope, ) } + + private companion object { + const val EXTERNAL_DISPLAY = 1 + } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt index 1fc0a407d435..1a0f3f40c4bf 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt @@ -52,7 +52,6 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.withContext import kotlinx.coroutines.withTimeoutOrNull - /** Handles Shade window display change when [ShadeDisplaysRepository.displayId] changes. */ @SysUISingleton class ShadeDisplaysInteractor @@ -75,6 +74,9 @@ constructor( private val hasActiveNotifications: Boolean get() = activeNotificationsInteractor.areAnyNotificationsPresentValue + /** Current display id of the shade window. */ + val displayId: StateFlow<Int> = shadePositionRepository.displayId + override fun start() { ShadeWindowGoesAround.isUnexpectedlyInLegacyMode() listenForWindowContextConfigChanges() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt index d7348892356d..82802b338e04 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt @@ -249,7 +249,7 @@ constructor( if (SceneContainerFlag.isEnabled) { listener?.let { listener -> launch { - viewModel.isHomeStatusBarAllowedByScene.collect { + viewModel.isHomeStatusBarAllowed.collect { listener.onIsHomeStatusBarAllowedBySceneChanged(it) } } @@ -495,7 +495,7 @@ interface StatusBarVisibilityChangeListener { /** * Called when the scene state has changed such that the home status bar is newly allowed or no - * longer allowed. See [HomeStatusBarViewModel.isHomeStatusBarAllowedByScene]. + * longer allowed. See [HomeStatusBarViewModel.isHomeStatusBarAllowed]. */ fun onIsHomeStatusBarAllowedBySceneChanged(isHomeStatusBarAllowedByScene: Boolean) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt index 807e90567eb7..13f8f4d3f026 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel import android.annotation.ColorInt import android.graphics.Rect +import android.view.Display import android.view.View import androidx.compose.runtime.getValue import com.android.app.tracing.coroutines.launchTraced as launch @@ -41,7 +42,9 @@ import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.shade.domain.interactor.ShadeDisplaysInteractor import com.android.systemui.shade.domain.interactor.ShadeInteractor +import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround import com.android.systemui.statusbar.chips.mediaprojection.domain.model.MediaProjectionStopDialogModel import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips import com.android.systemui.statusbar.chips.sharetoapp.ui.viewmodel.ShareToAppChipViewModel @@ -72,6 +75,7 @@ import com.android.systemui.statusbar.pipeline.shared.ui.model.VisibilityModel import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import javax.inject.Provider import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.awaitCancellation @@ -141,13 +145,12 @@ interface HomeStatusBarViewModel : Activatable { val popupChips: List<PopupChipModel.Shown> /** - * True if the current scene can show the home status bar (aka this status bar), and false if - * the current scene should never show the home status bar. + * True if the status bar should be visible. * * TODO(b/364360986): Once the is<SomeChildView>Visible flows are fully enabled, we shouldn't * need this flow anymore. */ - val isHomeStatusBarAllowedByScene: StateFlow<Boolean> + val isHomeStatusBarAllowed: StateFlow<Boolean> /** True if the home status bar is showing, and there is no HUN happening */ val canShowOngoingActivityChips: Flow<Boolean> @@ -221,6 +224,7 @@ constructor( statusBarContentInsetsViewModelStore: StatusBarContentInsetsViewModelStore, @Background bgScope: CoroutineScope, @Background bgDispatcher: CoroutineDispatcher, + shadeDisplaysInteractor: Provider<ShadeDisplaysInteractor>, ) : HomeStatusBarViewModel, ExclusiveActivatable() { private val hydrator = Hydrator(traceName = "HomeStatusBarViewModel.hydrator") @@ -259,12 +263,44 @@ constructor( override val popupChips get() = statusBarPopupChips.shownPopupChips - override val isHomeStatusBarAllowedByScene: StateFlow<Boolean> = + /** + * Whether the display of this statusbar has the shade window (that is hosting shade container + * and lockscreen, among other things). + */ + private val isShadeWindowOnThisDisplay = + if (ShadeWindowGoesAround.isEnabled) { + shadeDisplaysInteractor.get().displayId.map { shadeDisplayId -> + thisDisplayId == shadeDisplayId + } + } else { + // Shade doesn't move anywhere, it is always on the default display. + flowOf(thisDisplayId == Display.DEFAULT_DISPLAY) + } + + private val isShadeVisibleOnAnyDisplay = + if (SceneContainerFlag.isEnabled) { + sceneInteractor.currentOverlays.map { currentOverlays -> + (Overlays.NotificationsShade in currentOverlays || + Overlays.QuickSettingsShade in currentOverlays) + } + } else { + shadeInteractor.isAnyFullyExpanded + } + + private val isShadeVisibleOnThisDisplay: Flow<Boolean> = + combine(isShadeWindowOnThisDisplay, isShadeVisibleOnAnyDisplay) { + hasShade, + isShadeVisibleOnAnyDisplay -> + hasShade && isShadeVisibleOnAnyDisplay + } + + private val isHomeStatusBarAllowedByScene: Flow<Boolean> = combine( sceneInteractor.currentScene, - sceneInteractor.currentOverlays, + isShadeVisibleOnThisDisplay, sceneContainerOcclusionInteractor.invisibleDueToOcclusion, - ) { currentScene, currentOverlays, isOccluded -> + ) { currentScene, isShadeVisible, isOccluded -> + // All scenes have their own status bars, so we should only show the home status bar // if we're not in a scene. There are two exceptions: // 1) The shade (notifications or quick settings) is shown, because it has its own @@ -272,9 +308,7 @@ constructor( // 2) If the scene is occluded, then the occluding app needs to show the status bar. // (Fullscreen apps actually won't show the status bar but that's handled with the // rest of our fullscreen app logic, which lives elsewhere.) - (currentScene == Scenes.Gone && - Overlays.NotificationsShade !in currentOverlays && - Overlays.QuickSettingsShade !in currentOverlays) || isOccluded + (currentScene == Scenes.Gone && !isShadeVisible) || isOccluded } .distinctUntilChanged() .logDiffsForTable( @@ -282,7 +316,6 @@ constructor( columnName = COL_ALLOWED_BY_SCENE, initialValue = false, ) - .stateIn(bgScope, SharingStarted.WhileSubscribed(), initialValue = false) override val areNotificationsLightsOut: Flow<Boolean> = if (NotificationsLiveDataStoreRefactor.isUnexpectedlyInLegacyMode()) { @@ -331,21 +364,29 @@ constructor( * if we shouldn't be showing any part of the home status bar. */ private val isHomeScreenStatusBarAllowedLegacy: Flow<Boolean> = - combine( - keyguardTransitionInteractor.currentKeyguardState, - shadeInteractor.isAnyFullyExpanded, - ) { currentKeyguardState, isShadeExpanded -> - (currentKeyguardState == GONE || currentKeyguardState == OCCLUDED) && !isShadeExpanded + combine(keyguardTransitionInteractor.currentKeyguardState, isShadeVisibleOnThisDisplay) { + currentKeyguardState, + isShadeVisibleOnThisDisplay -> + (currentKeyguardState == GONE || currentKeyguardState == OCCLUDED) && + !isShadeVisibleOnThisDisplay // TODO(b/364360986): Add edge cases, like secure camera launch. } - private val isHomeStatusBarAllowed: Flow<Boolean> = + // "Compat" to cover both legacy and Scene container case in one flow. + private val isHomeStatusBarAllowedCompat = if (SceneContainerFlag.isEnabled) { isHomeStatusBarAllowedByScene } else { isHomeScreenStatusBarAllowedLegacy } + override val isHomeStatusBarAllowed = + isHomeStatusBarAllowedCompat.stateIn( + bgScope, + SharingStarted.WhileSubscribed(), + initialValue = false, + ) + private val shouldHomeStatusBarBeVisible = combine( isHomeStatusBarAllowed, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt index a97c651ba426..5c4deaadffd5 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt @@ -25,6 +25,7 @@ import com.android.systemui.kosmos.testDispatcher import com.android.systemui.log.table.tableLogBufferFactory import com.android.systemui.scene.domain.interactor.sceneContainerOcclusionInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor +import com.android.systemui.shade.domain.interactor.shadeDisplaysInteractor import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.statusbar.chips.sharetoapp.ui.viewmodel.shareToAppChipViewModel import com.android.systemui.statusbar.chips.ui.viewmodel.ongoingActivityChipsViewModel @@ -40,29 +41,34 @@ import com.android.systemui.statusbar.pipeline.shared.domain.interactor.homeStat import com.android.systemui.statusbar.pipeline.shared.domain.interactor.homeStatusBarInteractor var Kosmos.homeStatusBarViewModel: HomeStatusBarViewModel by + Kosmos.Fixture { homeStatusBarViewModelFactory.invoke(testableContext.displayId) } +var Kosmos.homeStatusBarViewModelFactory: (Int) -> HomeStatusBarViewModel by Kosmos.Fixture { - HomeStatusBarViewModelImpl( - testableContext.displayId, - batteryViewModelFactory, - tableLogBufferFactory, - homeStatusBarInteractor, - homeStatusBarIconBlockListInteractor, - lightsOutInteractor, - activeNotificationsInteractor, - darkIconInteractor, - headsUpNotificationInteractor, - keyguardTransitionInteractor, - keyguardInteractor, - statusBarOperatorNameViewModel, - sceneInteractor, - sceneContainerOcclusionInteractor, - shadeInteractor, - shareToAppChipViewModel, - ongoingActivityChipsViewModel, - statusBarPopupChipsViewModelFactory, - systemStatusEventAnimationInteractor, - multiDisplayStatusBarContentInsetsViewModelStore, - backgroundScope, - testDispatcher, - ) + { displayId -> + HomeStatusBarViewModelImpl( + displayId, + batteryViewModelFactory, + tableLogBufferFactory, + homeStatusBarInteractor, + homeStatusBarIconBlockListInteractor, + lightsOutInteractor, + activeNotificationsInteractor, + darkIconInteractor, + headsUpNotificationInteractor, + keyguardTransitionInteractor, + keyguardInteractor, + statusBarOperatorNameViewModel, + sceneInteractor, + sceneContainerOcclusionInteractor, + shadeInteractor, + shareToAppChipViewModel, + ongoingActivityChipsViewModel, + statusBarPopupChipsViewModelFactory, + systemStatusEventAnimationInteractor, + multiDisplayStatusBarContentInsetsViewModelStore, + backgroundScope, + testDispatcher, + { shadeDisplaysInteractor }, + ) + } } |