Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/featurepods/media/domain/interactor/MediaControlChipInteractorTest.kt +4 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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> Loading Loading @@ -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) } Loading @@ -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) } Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/featurepods/media/ui/viewmodel/MediaControlChipViewModelTest.kt +2 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) } Loading packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/domain/interactor/MediaControlChipInteractor.kt +17 −12 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() } /** Loading Loading @@ -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, Loading packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/shared/model/MediaControlChipModel.kt +21 −7 Original line number Diff line number Diff line Loading @@ -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 } packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/ui/viewmodel/MediaControlChipViewModel.kt +12 −6 Original line number Diff line number Diff line Loading @@ -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) } Loading @@ -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 Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/featurepods/media/domain/interactor/MediaControlChipInteractorTest.kt +4 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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> Loading Loading @@ -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) } Loading @@ -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) } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/featurepods/media/ui/viewmodel/MediaControlChipViewModelTest.kt +2 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) } Loading
packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/domain/interactor/MediaControlChipInteractor.kt +17 −12 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() } /** Loading Loading @@ -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, Loading
packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/shared/model/MediaControlChipModel.kt +21 −7 Original line number Diff line number Diff line Loading @@ -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 }
packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/ui/viewmodel/MediaControlChipViewModel.kt +12 −6 Original line number Diff line number Diff line Loading @@ -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) } Loading @@ -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