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

Commit 1c8bef02 authored by Michael Mikhail's avatar Michael Mikhail Committed by Android (Google) Code Review
Browse files

Merge "[Flexiglass] Use media in compose repository for popup chip" into main

parents 3be795c0 2d418fbf
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -25,11 +25,11 @@ import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.media.controls.data.repository.mediaFilterRepository
import com.android.systemui.media.controls.domain.pipeline.MediaDataManager
import com.android.systemui.media.controls.shared.model.MediaAction
import com.android.systemui.media.controls.shared.model.MediaButton
import com.android.systemui.media.controls.shared.model.MediaData
import com.android.systemui.media.remedia.data.repository.mediaRepository
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
@@ -47,7 +47,7 @@ import platform.test.runner.parameterized.Parameters
@SmallTest
class MediaControlChipInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {
    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
    private val mediaFilterRepository = kosmos.mediaFilterRepository
    private val mediaRepository = kosmos.mediaRepository
    private val Kosmos.underTest by Kosmos.Fixture { kosmos.mediaControlChipInteractor }
    @Captor lateinit var listener: ArgumentCaptor<MediaDataManager.Listener>

@@ -189,8 +189,7 @@ class MediaControlChipInteractorTest(flags: FlagsParameterization) : SysuiTestCa

    private fun updateMedia(mediaData: MediaData) {
        if (SceneContainerFlag.isEnabled) {
            val instanceId = mediaData.instanceId
            mediaFilterRepository.addCurrentUserMediaEntry(mediaData)
            mediaRepository.addCurrentUserMediaEntry(mediaData)
        } else {
            kosmos.underTest.updateMediaControlChipModelLegacy(mediaData)
        }
@@ -199,7 +198,7 @@ class MediaControlChipInteractorTest(flags: FlagsParameterization) : SysuiTestCa
    private fun removeMedia(mediaData: MediaData) {
        if (SceneContainerFlag.isEnabled) {
            val instanceId = mediaData.instanceId
            mediaFilterRepository.removeCurrentUserMediaEntry(instanceId, mediaData)
            mediaRepository.removeCurrentUserMediaEntry(instanceId, mediaData)
        } else {
            kosmos.underTest.updateMediaControlChipModelLegacy(null)
        }
+2 −2
Original line number Diff line number Diff line
@@ -25,9 +25,9 @@ import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.media.controls.data.repository.mediaFilterRepository
import com.android.systemui.media.controls.domain.pipeline.MediaDataManager
import com.android.systemui.media.controls.shared.model.MediaData
import com.android.systemui.media.remedia.data.repository.mediaRepository
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.statusbar.featurepods.media.domain.interactor.mediaControlChipInteractor
import com.android.systemui.statusbar.featurepods.popups.ui.model.PopupChipModel
@@ -105,7 +105,7 @@ class MediaControlChipViewModelTest(flags: FlagsParameterization) : SysuiTestCas

    private fun updateMedia(mediaData: MediaData) {
        if (SceneContainerFlag.isEnabled) {
            kosmos.mediaFilterRepository.addCurrentUserMediaEntry(mediaData)
            kosmos.mediaRepository.addCurrentUserMediaEntry(mediaData)
        } else {
            mediaControlChipInteractor.updateMediaControlChipModelLegacy(mediaData)
        }
+17 −12
Original line number Diff line number Diff line
@@ -16,10 +16,12 @@

package com.android.systemui.statusbar.featurepods.media.domain.interactor

import androidx.compose.runtime.snapshotFlow
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.media.controls.data.repository.MediaFilterRepository
import com.android.systemui.media.controls.shared.model.MediaData
import com.android.systemui.media.remedia.data.model.MediaDataModel
import com.android.systemui.media.remedia.data.repository.MediaRepositoryImpl
import com.android.systemui.res.R
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.statusbar.featurepods.media.shared.model.MediaControlChipModel
@@ -46,18 +48,12 @@ class MediaControlChipInteractor
@Inject
constructor(
    @Background private val backgroundScope: CoroutineScope,
    mediaFilterRepository: MediaFilterRepository,
    private val mediaRepository: MediaRepositoryImpl,
) {
    private val isEnabled = MutableStateFlow(false)

    private val mediaControlChipModelForScene: Flow<MediaControlChipModel?> =
        combine(mediaFilterRepository.currentMedia, mediaFilterRepository.currentUserEntries) {
            mediaList,
            userEntries ->
            mediaList
                .mapNotNull { userEntries[it.mediaLoadedModel.instanceId] }
                .firstOrNull { it.active }
                ?.toMediaControlChipModel()
    private val mediaControlChipModelForScene: Flow<MediaControlChipModel?> = snapshotFlow {
        mediaRepository.currentMedia.firstOrNull { it.isActive }?.toMediaControlChipModel()
    }

    /**
@@ -100,8 +96,17 @@ constructor(
    }
}

private fun MediaDataModel.toMediaControlChipModel(): MediaControlChipModel {
    return MediaControlChipModel.Compose(
        appIcon = this.appIcon,
        appName = this.appName,
        songName = this.title,
        playOrPause = this.playbackStateActions?.getActionById(R.id.actionPlayPause),
    )
}

private fun MediaData.toMediaControlChipModel(): MediaControlChipModel {
    return MediaControlChipModel(
    return MediaControlChipModel.Legacy(
        appIcon = this.appIcon,
        appName = this.app,
        songName = this.song,
+21 −7
Original line number Diff line number Diff line
@@ -16,13 +16,27 @@

package com.android.systemui.statusbar.featurepods.media.shared.model

import android.graphics.drawable.Icon
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.media.controls.shared.model.MediaAction

/** Model used to display a media control chip in the status bar. */
data class MediaControlChipModel(
    val appIcon: Icon?,
    val appName: String?,
    val songName: CharSequence?,
    val playOrPause: MediaAction?,
)
sealed interface MediaControlChipModel {

    val appName: String?
    val songName: CharSequence?
    val playOrPause: MediaAction?

    data class Legacy(
        val appIcon: android.graphics.drawable.Icon?,
        override val appName: String?,
        override val songName: CharSequence?,
        override val playOrPause: MediaAction?,
    ) : MediaControlChipModel

    data class Compose(
        val appIcon: Icon,
        override val appName: String?,
        override val songName: CharSequence?,
        override val playOrPause: MediaAction?,
    ) : MediaControlChipModel
}
+12 −6
Original line number Diff line number Diff line
@@ -72,6 +72,8 @@ constructor(
        val contentDescription = model.appName?.let { ContentDescription.Loaded(description = it) }

        val defaultIcon =
            when (model) {
                is MediaControlChipModel.Legacy -> {
                    model.appIcon?.loadDrawable(applicationContext)?.let {
                        Icon.Loaded(drawable = it, contentDescription = contentDescription)
                    }
@@ -79,6 +81,10 @@ constructor(
                            res = com.android.internal.R.drawable.ic_audio_media,
                            contentDescription = contentDescription,
                        )
                }
                is MediaControlChipModel.Compose -> model.appIcon
            }

        return PopupChipModel.Shown(
            chipId = PopupChipId.MediaControl,
            icons = listOf(ChipIcon(icon = defaultIcon)),
Loading