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

Commit 60e010d8 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Flexiglass] Recreate media when media configuration changes" into main

parents fb8adfb7 693ffd5c
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -99,14 +99,14 @@ class MediaControlViewModelTest : SysuiTestCase() {
            assertThat(playerModel).isNotNull()
            assertThat(playerModel?.titleName).isEqualTo(TITLE)
            assertThat(playerModel?.artistName).isEqualTo(ARTIST)
            assertThat(underTest.isNewPlayer(playerModel!!)).isTrue()
            assertThat(underTest.setPlayer(playerModel!!)).isTrue()

            mediaDataFilter.onMediaDataLoaded(KEY, KEY, mediaData)

            assertThat(playerModel).isNotNull()
            assertThat(playerModel?.titleName).isEqualTo(TITLE)
            assertThat(playerModel?.artistName).isEqualTo(ARTIST)
            assertThat(underTest.isNewPlayer(playerModel!!)).isFalse()
            assertThat(underTest.setPlayer(playerModel!!)).isFalse()
        }

    @Test
@@ -120,7 +120,7 @@ class MediaControlViewModelTest : SysuiTestCase() {
            assertThat(playerModel).isNotNull()
            assertThat(playerModel?.titleName).isEqualTo(TITLE)
            assertThat(playerModel?.artistName).isEqualTo(ARTIST)
            assertThat(underTest.isNewPlayer(playerModel!!)).isTrue()
            assertThat(underTest.setPlayer(playerModel!!)).isTrue()

            mediaData = initMediaData(ARTIST_2, TITLE_2)

@@ -129,7 +129,7 @@ class MediaControlViewModelTest : SysuiTestCase() {
            assertThat(playerModel).isNotNull()
            assertThat(playerModel?.titleName).isEqualTo(TITLE_2)
            assertThat(playerModel?.artistName).isEqualTo(ARTIST_2)
            assertThat(underTest.isNewPlayer(playerModel!!)).isTrue()
            assertThat(underTest.setPlayer(playerModel!!)).isTrue()
        }

    private fun initMediaData(artist: String, title: String): MediaData {
+9 −41
Original line number Diff line number Diff line
@@ -30,14 +30,10 @@ import com.android.systemui.media.controls.util.MediaSmartspaceLogger
import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_DISMISS_EVENT
import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_SEEN_EVENT
import com.android.systemui.media.controls.util.SmallHash
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.time.SystemClock
import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import java.util.Locale
import java.util.TreeMap
import javax.inject.Inject
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -49,37 +45,9 @@ class MediaFilterRepository
constructor(
    @Application private val applicationContext: Context,
    private val systemClock: SystemClock,
    private val configurationController: ConfigurationController,
    private val smartspaceLogger: MediaSmartspaceLogger,
) {

    val onAnyMediaConfigurationChange: Flow<Unit> = conflatedCallbackFlow {
        val callback =
            object : ConfigurationController.ConfigurationListener {
                override fun onDensityOrFontScaleChanged() {
                    trySend(Unit)
                }

                override fun onThemeChanged() {
                    trySend(Unit)
                }

                override fun onUiModeChanged() {
                    trySend(Unit)
                }

                override fun onLocaleListChanged() {
                    if (locale != applicationContext.resources.configuration.locales.get(0)) {
                        locale = applicationContext.resources.configuration.locales.get(0)
                        trySend(Unit)
                    }
                }
            }
        configurationController.addCallback(callback)
        trySend(Unit)
        awaitClose { configurationController.removeCallback(callback) }
    }

    /** Instance id of media control that recommendations card reactivated. */
    private val _reactivatedId: MutableStateFlow<InstanceId?> = MutableStateFlow(null)
    val reactivatedId: StateFlow<InstanceId?> = _reactivatedId.asStateFlow()
@@ -190,7 +158,7 @@ constructor(

    fun addMediaDataLoadingState(
        mediaDataLoadingModel: MediaDataLoadingModel,
        isUpdate: Boolean = true
        isUpdate: Boolean = true,
    ) {
        val sortedMap = TreeMap<MediaSortKeyModel, MediaCommonModel>(comparator)
        sortedMap.putAll(
@@ -395,7 +363,7 @@ constructor(
                    logSmarspaceRecommendationCardUserEvent(
                        SMARTSPACE_CARD_SEEN_EVENT,
                        surface,
                        visibleIndex
                        visibleIndex,
                    )
                }
            }
@@ -409,7 +377,7 @@ constructor(
        interactedSubCardRank: Int = 0,
        interactedSubCardCardinality: Int = 0,
        instanceId: InstanceId? = null,
        isRec: Boolean = false
        isRec: Boolean = false,
    ) {
        _currentMedia.value.forEachIndexed { index, mediaCommonModel ->
            when (mediaCommonModel) {
@@ -423,7 +391,7 @@ constructor(
                                surface,
                                mediaCommonModel.mediaLoadedModel.isSsReactivated,
                                interactedSubCardRank,
                                interactedSubCardCardinality
                                interactedSubCardCardinality,
                            )
                        }
                        return
@@ -437,7 +405,7 @@ constructor(
                                surface,
                                index,
                                interactedSubCardRank,
                                interactedSubCardCardinality
                                interactedSubCardCardinality,
                            )
                        }
                        return
@@ -459,14 +427,14 @@ constructor(
                            SMARTSPACE_CARD_DISMISS_EVENT,
                            surface,
                            mediaCommonModel.mediaLoadedModel.isSsReactivated,
                            isSwipeToDismiss = true
                            isSwipeToDismiss = true,
                        )
                    is MediaCommonModel.MediaRecommendations ->
                        logSmarspaceRecommendationCardUserEvent(
                            SMARTSPACE_CARD_DISMISS_EVENT,
                            surface,
                            index,
                            isSwipeToDismiss = true
                            isSwipeToDismiss = true,
                        )
                }
            }
@@ -513,7 +481,7 @@ constructor(
        isReactivated: Boolean,
        interactedSubCardRank: Int = 0,
        interactedSubCardCardinality: Int = 0,
        isSwipeToDismiss: Boolean = false
        isSwipeToDismiss: Boolean = false,
    ) {
        _selectedUserEntries.value[instanceId]?.let {
            smartspaceLogger.logSmartspaceCardUIEvent(
@@ -537,7 +505,7 @@ constructor(
        index: Int,
        interactedSubCardRank: Int = 0,
        interactedSubCardCardinality: Int = 0,
        isSwipeToDismiss: Boolean = false
        isSwipeToDismiss: Boolean = false,
    ) {
        smartspaceLogger.logSmartspaceCardUIEvent(
            eventId,
+0 −2
Original line number Diff line number Diff line
@@ -68,8 +68,6 @@ constructor(
            .map { entries -> entries[instanceId]?.let { toMediaControlModel(it) } }
            .distinctUntilChanged()

    val onAnyMediaConfigurationChange: Flow<Unit> = repository.onAnyMediaConfigurationChange

    fun removeMediaControl(
        token: MediaSession.Token?,
        instanceId: InstanceId,
+5 −7
Original line number Diff line number Diff line
@@ -66,14 +66,12 @@ constructor(
            .distinctUntilChanged()
            .stateIn(applicationScope, SharingStarted.WhileSubscribed(), false)

    val onAnyMediaConfigurationChange: Flow<Unit> = repository.onAnyMediaConfigurationChange

    fun removeMediaRecommendations(
        key: String,
        dismissIntent: Intent?,
        delayMs: Long,
        eventId: Int,
        location: Int
        location: Int,
    ) {
        logSmartspaceCardUserEvent(eventId, location)
        mediaDataProcessor.dismissSmartspaceRecommendation(key, delayMs)
@@ -101,7 +99,7 @@ constructor(
        eventId: Int,
        location: Int,
        interactedSubCardRank: Int,
        interactedSubCardCardinality: Int
        interactedSubCardCardinality: Int,
    ) {
        if (interactedSubCardRank == -1) {
            logSmartspaceCardUserEvent(eventId, MediaSmartspaceLogger.getSurface(location))
@@ -111,7 +109,7 @@ constructor(
                MediaSmartspaceLogger.getSurface(location),
                interactedSubCardRank = interactedSubCardRank,
                interactedSubCardCardinality = interactedSubCardCardinality,
                isRec = true
                isRec = true,
            )
        }
        if (shouldActivityOpenInForeground(intent)) {
@@ -121,7 +119,7 @@ constructor(
                0 /* delay */,
                expandable.activityTransitionController(
                    InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER
                )
                ),
            )
        } else {
            // Otherwise, open the activity in background directly.
@@ -133,7 +131,7 @@ constructor(
        repository.logSmartspaceCardUserEvent(
            eventId,
            MediaSmartspaceLogger.getSurface(location),
            isRec = true
            isRec = true,
        )
    }

+2 −2
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.widget.ImageButton
import androidx.constraintlayout.widget.ConstraintSet
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.settingslib.widget.AdaptiveIcon
import com.android.systemui.animation.Expandable
import com.android.systemui.common.shared.model.Icon
@@ -64,7 +65,6 @@ import com.android.systemui.surfaceeffects.ripple.RippleAnimationConfig
import com.android.systemui.surfaceeffects.ripple.RippleShader
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.collectLatest
import com.android.app.tracing.coroutines.launchTraced as launch
import kotlinx.coroutines.withContext

private const val TAG = "MediaControlViewBinder"
@@ -85,7 +85,7 @@ object MediaControlViewBinder {
                launch {
                    viewModel.player.collectLatest { player ->
                        player?.let {
                            if (viewModel.isNewPlayer(it)) {
                            if (viewModel.setPlayer(it)) {
                                bindMediaCard(
                                    viewHolder,
                                    viewController,
Loading