Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt +29 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ import com.android.systemui.keyguard.ui.viewmodel.keyguardRootViewModel import com.android.systemui.kosmos.collectLastValue import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.testScope import com.android.systemui.media.controls.domain.pipeline.legacyMediaDataManagerImpl import com.android.systemui.res.R import com.android.systemui.scene.data.repository.Idle import com.android.systemui.scene.data.repository.Transition Loading @@ -80,6 +81,7 @@ import com.android.systemui.window.ui.viewmodel.fakeBouncerTransitions import com.google.common.collect.Range import com.google.common.truth.Truth.assertThat import kotlin.test.assertIs import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.TestScope Loading Loading @@ -1536,6 +1538,33 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S assertThat(stackAbsoluteBottom).isEqualTo(150F) } @OptIn(ExperimentalCoroutinesApi::class) @Test @DisableSceneContainer fun notificationAbsoluteBottom_onlyMediaInNotifications() = testScope.runTest { val notificationCount = 0 val calculateSpace = { _: Float, _: Boolean -> notificationCount } val mediaHeight = 100F val calculateHeight = { _: Int -> mediaHeight } whenever(kosmos.legacyMediaDataManagerImpl.hasActiveMedia()).thenReturn(true) val stackAbsoluteBottom by collectLastValue( underTest.getNotificationStackAbsoluteBottomOnLockscreen( calculateSpace, calculateHeight, ) ) showLockscreen() shadeTestUtil.setSplitShade(false) kosmos.activeNotificationListRepository.setActiveNotifs(notificationCount) keyguardInteractor.setNotificationContainerBounds( NotificationContainerBounds(top = 100F, bottom = 100F) ) advanceTimeBy(50L) assertThat(stackAbsoluteBottom).isEqualTo(200F) } @Test fun blurRadius_emitsValues_fromPrimaryBouncerTransitions() = testScope.runTest { Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt +41 −3 Original line number Diff line number Diff line Loading @@ -74,6 +74,8 @@ import com.android.systemui.keyguard.ui.viewmodel.OffToLockscreenTransitionViewM import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToLockscreenTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.ViewStateAccessor import com.android.systemui.media.controls.domain.pipeline.MediaDataManager import com.android.systemui.media.controls.shared.model.MediaData import com.android.systemui.res.R import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Overlays Loading @@ -96,10 +98,12 @@ import com.android.systemui.util.kotlin.BooleanFlowOperators.not import com.android.systemui.util.kotlin.FlowDumperImpl import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine import com.android.systemui.util.kotlin.sample import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow import dagger.Lazy import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted Loading Loading @@ -181,6 +185,7 @@ constructor( private val largeScreenHeaderHelperLazy: Lazy<LargeScreenHeaderHelper>, unfoldTransitionInteractor: UnfoldTransitionInteractor, val activeNotificationsInteractor: ActiveNotificationsInteractor, private val mediaDataManager: MediaDataManager, ) : FlowDumperImpl(dumpManager) { /** Loading Loading @@ -797,6 +802,38 @@ constructor( ) .dumpWhileCollecting("translationX") val hasActiveMedia: Flow<Boolean> get() { SceneContainerFlag.assertInLegacyMode() return conflatedCallbackFlow { val listener = object : MediaDataManager.Listener { override fun onMediaDataLoaded( key: String, oldKey: String?, data: MediaData, immediately: Boolean, ) { trySend(mediaDataManager.hasActiveMedia()) } override fun onMediaDataRemoved(key: String, userInitiated: Boolean) { trySend(mediaDataManager.hasActiveMedia()) } override fun onCurrentActiveMediaChanged(key: String?, data: MediaData?) { trySend(mediaDataManager.hasActiveMedia()) } } mediaDataManager.addListener(listener) trySend(mediaDataManager.hasActiveMedia()) awaitClose { mediaDataManager.removeListener(listener) } } } private val availableHeight: Flow<Float> = if (SceneContainerFlag.isEnabled) { notificationStackAppearanceInteractor.constrainedAvailableSpace.map { it.toFloat() } Loading Loading @@ -887,10 +924,11 @@ constructor( return combine( activeNotificationsInteractor.areAnyNotificationsPresent, isOnLockscreen, ::Pair, hasActiveMedia, ::Triple, ) .flatMapLatest { (hasNotifications, isOnLockscreen) -> if (hasNotifications && isOnLockscreen) { .flatMapLatest { (hasNotifications, isOnLockscreen, hasActiveMedia) -> if ((hasNotifications || hasActiveMedia) && isOnLockscreen) { combine( getLockscreenDisplayConfig(calculateMaxNotifications).map { (_, maxNotifications) -> Loading packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt +3 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,8 @@ import com.android.systemui.keyguard.ui.viewmodel.primaryBouncerToLockscreenTran import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.media.controls.domain.pipeline.legacyMediaDataManagerImpl import com.android.systemui.media.controls.domain.pipeline.mediaDataManager import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.shade.domain.interactor.shadeModeInteractor import com.android.systemui.shade.largeScreenHeaderHelper Loading Loading @@ -118,5 +120,6 @@ val Kosmos.sharedNotificationContainerViewModel by Fixture { glanceableHubToAodTransitionViewModel = glanceableHubToAodTransitionViewModel, aodToGlanceableHubTransitionViewModel = aodToGlanceableHubTransitionViewModel, activeNotificationsInteractor = activeNotificationsInteractor, mediaDataManager = legacyMediaDataManagerImpl, ) } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt +29 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ import com.android.systemui.keyguard.ui.viewmodel.keyguardRootViewModel import com.android.systemui.kosmos.collectLastValue import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.testScope import com.android.systemui.media.controls.domain.pipeline.legacyMediaDataManagerImpl import com.android.systemui.res.R import com.android.systemui.scene.data.repository.Idle import com.android.systemui.scene.data.repository.Transition Loading @@ -80,6 +81,7 @@ import com.android.systemui.window.ui.viewmodel.fakeBouncerTransitions import com.google.common.collect.Range import com.google.common.truth.Truth.assertThat import kotlin.test.assertIs import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.TestScope Loading Loading @@ -1536,6 +1538,33 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S assertThat(stackAbsoluteBottom).isEqualTo(150F) } @OptIn(ExperimentalCoroutinesApi::class) @Test @DisableSceneContainer fun notificationAbsoluteBottom_onlyMediaInNotifications() = testScope.runTest { val notificationCount = 0 val calculateSpace = { _: Float, _: Boolean -> notificationCount } val mediaHeight = 100F val calculateHeight = { _: Int -> mediaHeight } whenever(kosmos.legacyMediaDataManagerImpl.hasActiveMedia()).thenReturn(true) val stackAbsoluteBottom by collectLastValue( underTest.getNotificationStackAbsoluteBottomOnLockscreen( calculateSpace, calculateHeight, ) ) showLockscreen() shadeTestUtil.setSplitShade(false) kosmos.activeNotificationListRepository.setActiveNotifs(notificationCount) keyguardInteractor.setNotificationContainerBounds( NotificationContainerBounds(top = 100F, bottom = 100F) ) advanceTimeBy(50L) assertThat(stackAbsoluteBottom).isEqualTo(200F) } @Test fun blurRadius_emitsValues_fromPrimaryBouncerTransitions() = testScope.runTest { Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt +41 −3 Original line number Diff line number Diff line Loading @@ -74,6 +74,8 @@ import com.android.systemui.keyguard.ui.viewmodel.OffToLockscreenTransitionViewM import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToLockscreenTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.ViewStateAccessor import com.android.systemui.media.controls.domain.pipeline.MediaDataManager import com.android.systemui.media.controls.shared.model.MediaData import com.android.systemui.res.R import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Overlays Loading @@ -96,10 +98,12 @@ import com.android.systemui.util.kotlin.BooleanFlowOperators.not import com.android.systemui.util.kotlin.FlowDumperImpl import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine import com.android.systemui.util.kotlin.sample import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow import dagger.Lazy import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted Loading Loading @@ -181,6 +185,7 @@ constructor( private val largeScreenHeaderHelperLazy: Lazy<LargeScreenHeaderHelper>, unfoldTransitionInteractor: UnfoldTransitionInteractor, val activeNotificationsInteractor: ActiveNotificationsInteractor, private val mediaDataManager: MediaDataManager, ) : FlowDumperImpl(dumpManager) { /** Loading Loading @@ -797,6 +802,38 @@ constructor( ) .dumpWhileCollecting("translationX") val hasActiveMedia: Flow<Boolean> get() { SceneContainerFlag.assertInLegacyMode() return conflatedCallbackFlow { val listener = object : MediaDataManager.Listener { override fun onMediaDataLoaded( key: String, oldKey: String?, data: MediaData, immediately: Boolean, ) { trySend(mediaDataManager.hasActiveMedia()) } override fun onMediaDataRemoved(key: String, userInitiated: Boolean) { trySend(mediaDataManager.hasActiveMedia()) } override fun onCurrentActiveMediaChanged(key: String?, data: MediaData?) { trySend(mediaDataManager.hasActiveMedia()) } } mediaDataManager.addListener(listener) trySend(mediaDataManager.hasActiveMedia()) awaitClose { mediaDataManager.removeListener(listener) } } } private val availableHeight: Flow<Float> = if (SceneContainerFlag.isEnabled) { notificationStackAppearanceInteractor.constrainedAvailableSpace.map { it.toFloat() } Loading Loading @@ -887,10 +924,11 @@ constructor( return combine( activeNotificationsInteractor.areAnyNotificationsPresent, isOnLockscreen, ::Pair, hasActiveMedia, ::Triple, ) .flatMapLatest { (hasNotifications, isOnLockscreen) -> if (hasNotifications && isOnLockscreen) { .flatMapLatest { (hasNotifications, isOnLockscreen, hasActiveMedia) -> if ((hasNotifications || hasActiveMedia) && isOnLockscreen) { combine( getLockscreenDisplayConfig(calculateMaxNotifications).map { (_, maxNotifications) -> Loading
packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt +3 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,8 @@ import com.android.systemui.keyguard.ui.viewmodel.primaryBouncerToLockscreenTran import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.media.controls.domain.pipeline.legacyMediaDataManagerImpl import com.android.systemui.media.controls.domain.pipeline.mediaDataManager import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.shade.domain.interactor.shadeModeInteractor import com.android.systemui.shade.largeScreenHeaderHelper Loading Loading @@ -118,5 +120,6 @@ val Kosmos.sharedNotificationContainerViewModel by Fixture { glanceableHubToAodTransitionViewModel = glanceableHubToAodTransitionViewModel, aodToGlanceableHubTransitionViewModel = aodToGlanceableHubTransitionViewModel, activeNotificationsInteractor = activeNotificationsInteractor, mediaDataManager = legacyMediaDataManagerImpl, ) }