Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a68e4349 authored by Sherry Zhou's avatar Sherry Zhou
Browse files

Fix shape effects not react to media player

Bug: 408263635
Flag: com.android.systemui.shared.extended_wallpaper_effects
Test: atest SharedNotificationContainerViewModelTest

Change-Id: I56c6f384407dc5bfd91e747384a422d50e7b7e52
parent e01e46dc
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -1511,6 +1513,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 {
+41 −3
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -181,6 +185,7 @@ constructor(
    private val largeScreenHeaderHelperLazy: Lazy<LargeScreenHeaderHelper>,
    unfoldTransitionInteractor: UnfoldTransitionInteractor,
    val activeNotificationsInteractor: ActiveNotificationsInteractor,
    private val mediaDataManager: MediaDataManager,
) : FlowDumperImpl(dumpManager) {

    /**
@@ -789,6 +794,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() }
@@ -879,10 +916,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) ->
+3 −0
Original line number Diff line number Diff line
@@ -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
@@ -118,5 +120,6 @@ val Kosmos.sharedNotificationContainerViewModel by Fixture {
        glanceableHubToAodTransitionViewModel = glanceableHubToAodTransitionViewModel,
        aodToGlanceableHubTransitionViewModel = aodToGlanceableHubTransitionViewModel,
        activeNotificationsInteractor = activeNotificationsInteractor,
        mediaDataManager = legacyMediaDataManagerImpl,
    )
}