Merge "Fix reorder of UMO in carousel" into main
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaFilterRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaFilterRepositoryTest.kt
index 1e5f314..7a37a9e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaFilterRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaFilterRepositoryTest.kt
@@ -150,7 +150,7 @@
     @Test
     fun addMediaControlPlayingThenRemote() =
         testScope.runTest {
-            val sortedMedia by collectLastValue(underTest.sortedMedia)
+            val currentMedia by collectLastValue(underTest.currentMedia)
             val playingInstanceId = InstanceId.fakeInstanceId(123)
             val remoteInstanceId = InstanceId.fakeInstanceId(321)
             val playingData = createMediaData("app1", true, LOCAL, false, playingInstanceId)
@@ -161,8 +161,8 @@
             underTest.addSelectedUserMediaEntry(remoteData)
             underTest.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(remoteInstanceId))
 
-            assertThat(sortedMedia?.size).isEqualTo(2)
-            assertThat(sortedMedia?.values)
+            assertThat(currentMedia?.size).isEqualTo(2)
+            assertThat(currentMedia)
                 .containsExactly(
                     MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(playingInstanceId)),
                     MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(remoteInstanceId))
@@ -173,7 +173,7 @@
     @Test
     fun switchMediaControlsPlaying() =
         testScope.runTest {
-            val sortedMedia by collectLastValue(underTest.sortedMedia)
+            val currentMedia by collectLastValue(underTest.currentMedia)
             val playingInstanceId1 = InstanceId.fakeInstanceId(123)
             val playingInstanceId2 = InstanceId.fakeInstanceId(321)
             var playingData1 = createMediaData("app1", true, LOCAL, false, playingInstanceId1)
@@ -184,8 +184,8 @@
             underTest.addSelectedUserMediaEntry(playingData2)
             underTest.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(playingInstanceId2))
 
-            assertThat(sortedMedia?.size).isEqualTo(2)
-            assertThat(sortedMedia?.values)
+            assertThat(currentMedia?.size).isEqualTo(2)
+            assertThat(currentMedia)
                 .containsExactly(
                     MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(playingInstanceId1)),
                     MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(playingInstanceId2))
@@ -198,12 +198,28 @@
             underTest.addSelectedUserMediaEntry(playingData1)
             underTest.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(playingInstanceId1))
             underTest.addSelectedUserMediaEntry(playingData2)
-            underTest.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(playingInstanceId2))
+            underTest.addMediaDataLoadingState(
+                MediaDataLoadingModel.Loaded(playingInstanceId2, false)
+            )
 
-            assertThat(sortedMedia?.size).isEqualTo(2)
-            assertThat(sortedMedia?.values)
+            assertThat(currentMedia?.size).isEqualTo(2)
+            assertThat(currentMedia)
                 .containsExactly(
-                    MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(playingInstanceId2)),
+                    MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(playingInstanceId1)),
+                    MediaCommonModel.MediaControl(
+                        MediaDataLoadingModel.Loaded(playingInstanceId2, false)
+                    )
+                )
+                .inOrder()
+
+            underTest.setOrderedMedia()
+
+            assertThat(currentMedia?.size).isEqualTo(2)
+            assertThat(currentMedia)
+                .containsExactly(
+                    MediaCommonModel.MediaControl(
+                        MediaDataLoadingModel.Loaded(playingInstanceId2, false)
+                    ),
                     MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(playingInstanceId1))
                 )
                 .inOrder()
@@ -212,7 +228,7 @@
     @Test
     fun fullOrderTest() =
         testScope.runTest {
-            val sortedMedia by collectLastValue(underTest.sortedMedia)
+            val currentMedia by collectLastValue(underTest.currentMedia)
             val instanceId1 = InstanceId.fakeInstanceId(123)
             val instanceId2 = InstanceId.fakeInstanceId(456)
             val instanceId3 = InstanceId.fakeInstanceId(321)
@@ -252,8 +268,8 @@
                 SmartspaceMediaLoadingModel.Loaded(KEY_MEDIA_SMARTSPACE, true)
             )
 
-            assertThat(sortedMedia?.size).isEqualTo(6)
-            assertThat(sortedMedia?.values)
+            assertThat(currentMedia?.size).isEqualTo(6)
+            assertThat(currentMedia)
                 .containsExactly(
                     MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(instanceId1)),
                     MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(instanceId2)),
@@ -270,7 +286,7 @@
     @Test
     fun loadMediaFromRec() =
         testScope.runTest {
-            val isMediaFromRec by collectLastValue(underTest.isMediaFromRec)
+            val currentMedia by collectLastValue(underTest.currentMedia)
             val instanceId1 = InstanceId.fakeInstanceId(123)
             val instanceId2 = InstanceId.fakeInstanceId(456)
             val data =
@@ -278,22 +294,59 @@
                     active = true,
                     instanceId = instanceId1,
                     packageName = PACKAGE_NAME,
-                    isPlaying = true
+                    isPlaying = true,
+                    notificationKey = KEY,
                 )
-            val newData = MediaData(active = true, instanceId = instanceId2)
-
-            assertThat(isMediaFromRec).isFalse()
+            val newData =
+                MediaData(
+                    active = true,
+                    instanceId = instanceId2,
+                    isPlaying = true,
+                    notificationKey = KEY_2
+                )
+            val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
+            val mediaRecommendations =
+                SmartspaceMediaData(
+                    targetId = KEY_MEDIA_SMARTSPACE,
+                    isActive = true,
+                    packageName = PACKAGE_NAME,
+                    recommendations = MediaTestHelper.getValidRecommendationList(icon),
+                )
 
             underTest.setMediaFromRecPackageName(PACKAGE_NAME)
             underTest.addSelectedUserMediaEntry(data)
+            underTest.setRecommendation(mediaRecommendations)
+            underTest.setRecommendationsLoadingState(
+                SmartspaceMediaLoadingModel.Loaded(KEY_MEDIA_SMARTSPACE)
+            )
             underTest.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId1))
 
-            assertThat(isMediaFromRec).isTrue()
+            assertThat(currentMedia)
+                .containsExactly(
+                    MediaCommonModel.MediaControl(
+                        MediaDataLoadingModel.Loaded(instanceId1),
+                        isMediaFromRec = true
+                    ),
+                    MediaCommonModel.MediaRecommendations(
+                        SmartspaceMediaLoadingModel.Loaded(KEY_MEDIA_SMARTSPACE)
+                    )
+                )
+                .inOrder()
 
             underTest.addSelectedUserMediaEntry(newData)
+            underTest.addSelectedUserMediaEntry(data.copy(isPlaying = false))
             underTest.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId2))
+            underTest.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId1))
 
-            assertThat(isMediaFromRec).isFalse()
+            assertThat(currentMedia)
+                .containsExactly(
+                    MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(instanceId2)),
+                    MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(instanceId1)),
+                    MediaCommonModel.MediaRecommendations(
+                        SmartspaceMediaLoadingModel.Loaded(KEY_MEDIA_SMARTSPACE)
+                    )
+                )
+                .inOrder()
         }
 
     private fun createMediaData(
@@ -316,6 +369,7 @@
         private const val LOCAL = MediaData.PLAYBACK_LOCAL
         private const val REMOTE = MediaData.PLAYBACK_CAST_LOCAL
         private const val KEY = "KEY"
+        private const val KEY_2 = "KEY_2"
         private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
         private const val PACKAGE_NAME = "com.android.example"
     }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt
index e44affc7..39dbc7e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt
@@ -55,6 +55,14 @@
     private val mediaFilterRepository: MediaFilterRepository = kosmos.mediaFilterRepository
     private val mediaRecommendationsInteractor: MediaRecommendationsInteractor =
         kosmos.mediaRecommendationsInteractor
+    val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
+    private val mediaRecommendation =
+        SmartspaceMediaData(
+            targetId = KEY_MEDIA_SMARTSPACE,
+            isActive = true,
+            packageName = PACKAGE_NAME,
+            recommendations = MediaTestHelper.getValidRecommendationList(icon),
+        )
 
     private val underTest: MediaCarouselInteractor = kosmos.mediaCarouselInteractor
 
@@ -122,26 +130,19 @@
                 collectLastValue(underTest.hasActiveMediaOrRecommendation)
             val hasAnyMediaOrRecommendation by
                 collectLastValue(underTest.hasAnyMediaOrRecommendation)
-            val sortedMedia by collectLastValue(underTest.sortedMedia)
+            val currentMedia by collectLastValue(underTest.currentMedia)
             kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, false)
 
-            val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
-            val userMediaRecommendation =
-                SmartspaceMediaData(
-                    targetId = KEY_MEDIA_SMARTSPACE,
-                    isActive = true,
-                    recommendations = MediaTestHelper.getValidRecommendationList(icon),
-                )
             val userMedia = MediaData(active = false)
             val recsLoadingModel = SmartspaceMediaLoadingModel.Loaded(KEY_MEDIA_SMARTSPACE, true)
             val mediaLoadingModel = MediaDataLoadingModel.Loaded(userMedia.instanceId)
 
-            mediaFilterRepository.setRecommendation(userMediaRecommendation)
+            mediaFilterRepository.setRecommendation(mediaRecommendation)
             mediaFilterRepository.setRecommendationsLoadingState(recsLoadingModel)
 
             assertThat(hasActiveMediaOrRecommendation).isTrue()
             assertThat(hasAnyMediaOrRecommendation).isTrue()
-            assertThat(sortedMedia)
+            assertThat(currentMedia)
                 .containsExactly(MediaCommonModel.MediaRecommendations(recsLoadingModel))
 
             mediaFilterRepository.addSelectedUserMediaEntry(userMedia)
@@ -149,7 +150,7 @@
 
             assertThat(hasActiveMediaOrRecommendation).isTrue()
             assertThat(hasAnyMediaOrRecommendation).isTrue()
-            assertThat(sortedMedia)
+            assertThat(currentMedia)
                 .containsExactly(
                     MediaCommonModel.MediaRecommendations(recsLoadingModel),
                     MediaCommonModel.MediaControl(mediaLoadingModel, true)
@@ -166,14 +167,6 @@
                 collectLastValue(underTest.hasAnyMediaOrRecommendation)
             kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, false)
 
-            val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
-            val mediaRecommendation =
-                SmartspaceMediaData(
-                    targetId = KEY_MEDIA_SMARTSPACE,
-                    isActive = true,
-                    recommendations = MediaTestHelper.getValidRecommendationList(icon),
-                )
-
             mediaFilterRepository.setRecommendation(mediaRecommendation)
 
             assertThat(hasActiveMediaOrRecommendation).isTrue()
@@ -194,14 +187,6 @@
                 collectLastValue(underTest.hasAnyMediaOrRecommendation)
             kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, false)
 
-            val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
-            val mediaRecommendation =
-                SmartspaceMediaData(
-                    targetId = KEY_MEDIA_SMARTSPACE,
-                    isActive = true,
-                    recommendations = MediaTestHelper.getValidRecommendationList(icon),
-                )
-
             mediaFilterRepository.setRecommendation(mediaRecommendation)
 
             assertThat(hasActiveMediaOrRecommendation).isTrue()
@@ -234,26 +219,42 @@
     @Test
     fun loadMediaFromRec() =
         testScope.runTest {
-            val isMediaFromRec by collectLastValue(underTest.isMediaFromRec)
+            val currentMedia by collectLastValue(underTest.currentMedia)
             val instanceId = InstanceId.fakeInstanceId(123)
-            val data = MediaData(active = true, instanceId = instanceId, packageName = PACKAGE_NAME)
+            val data =
+                MediaData(
+                    active = true,
+                    instanceId = instanceId,
+                    packageName = PACKAGE_NAME,
+                    notificationKey = KEY
+                )
+            val smartspaceLoadingModel = SmartspaceMediaLoadingModel.Loaded(KEY_MEDIA_SMARTSPACE)
+            val mediaLoadingModel = MediaDataLoadingModel.Loaded(instanceId)
 
-            assertThat(isMediaFromRec).isFalse()
-
+            mediaFilterRepository.setRecommendation(mediaRecommendation)
+            mediaFilterRepository.setRecommendationsLoadingState(smartspaceLoadingModel)
             mediaRecommendationsInteractor.switchToMediaControl(PACKAGE_NAME)
             mediaFilterRepository.addSelectedUserMediaEntry(data)
-            mediaFilterRepository.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId))
+            mediaFilterRepository.addMediaDataLoadingState(mediaLoadingModel)
 
-            assertThat(isMediaFromRec).isFalse()
+            assertThat(currentMedia)
+                .containsExactly(MediaCommonModel.MediaRecommendations(smartspaceLoadingModel))
+                .inOrder()
 
             mediaFilterRepository.addSelectedUserMediaEntry(data.copy(isPlaying = true))
             mediaFilterRepository.addMediaDataLoadingState(MediaDataLoadingModel.Loaded(instanceId))
 
-            assertThat(isMediaFromRec).isTrue()
+            assertThat(currentMedia)
+                .containsExactly(
+                    MediaCommonModel.MediaControl(mediaLoadingModel, isMediaFromRec = true),
+                    MediaCommonModel.MediaRecommendations(smartspaceLoadingModel)
+                )
+                .inOrder()
         }
 
     companion object {
         private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
         private const val PACKAGE_NAME = "com.android.example"
+        private const val KEY = "key"
     }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModelTest.kt
index d1e475f..4226a9d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModelTest.kt
@@ -92,13 +92,29 @@
             val instanceId1 = InstanceId.fakeInstanceId(123)
             val instanceId2 = InstanceId.fakeInstanceId(456)
 
-            loadMediaControl(KEY, instanceId1)
-            loadMediaControl(KEY_2, instanceId2)
+            loadMediaControl(KEY, instanceId1, isPlaying = true)
+            loadMediaControl(KEY_2, instanceId2, isPlaying = true)
+            loadMediaControl(KEY, instanceId1, isPlaying = false)
 
-            val firstMediaControl = sortedMedia?.get(0) as MediaCommonViewModel.MediaControl
-            val secondMediaControl = sortedMedia?.get(1) as MediaCommonViewModel.MediaControl
-            assertThat(firstMediaControl.instanceId).isEqualTo(instanceId2)
-            assertThat(secondMediaControl.instanceId).isEqualTo(instanceId1)
+            var mediaControl2 = sortedMedia?.get(0) as MediaCommonViewModel.MediaControl
+            var mediaControl1 = sortedMedia?.get(1) as MediaCommonViewModel.MediaControl
+            assertThat(mediaControl2.instanceId).isEqualTo(instanceId2)
+            assertThat(mediaControl1.instanceId).isEqualTo(instanceId1)
+
+            loadMediaControl(KEY, instanceId1, isPlaying = true)
+            loadMediaControl(KEY_2, instanceId2, isPlaying = false)
+
+            mediaControl2 = sortedMedia?.get(0) as MediaCommonViewModel.MediaControl
+            mediaControl1 = sortedMedia?.get(1) as MediaCommonViewModel.MediaControl
+            assertThat(mediaControl2.instanceId).isEqualTo(instanceId2)
+            assertThat(mediaControl1.instanceId).isEqualTo(instanceId1)
+
+            underTest.onAttached()
+
+            mediaControl1 = sortedMedia?.get(0) as MediaCommonViewModel.MediaControl
+            mediaControl2 = sortedMedia?.get(1) as MediaCommonViewModel.MediaControl
+            assertThat(mediaControl1.instanceId).isEqualTo(instanceId1)
+            assertThat(mediaControl2.instanceId).isEqualTo(instanceId2)
         }
 
     @Test
@@ -147,6 +163,7 @@
             val mediaControl = sortedMedia?.get(0) as MediaCommonViewModel.MediaControl
             assertThat(sortedMedia).hasSize(2)
             assertThat(mediaControl.instanceId).isEqualTo(instanceId)
+            assertThat(mediaControl.isMediaFromRec).isTrue()
         }
 
     private fun loadMediaControl(key: String, instanceId: InstanceId, isPlaying: Boolean = true) {
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt b/packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt
index 9719c02..0c70f10 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt
@@ -107,14 +107,11 @@
             .thenByDescending { it.updateTime }
             .thenByDescending { it.notificationKey }
 
-    private val _sortedMedia: MutableStateFlow<TreeMap<MediaSortKeyModel, MediaCommonModel>> =
-        MutableStateFlow(TreeMap<MediaSortKeyModel, MediaCommonModel>(comparator))
-    val sortedMedia: StateFlow<Map<MediaSortKeyModel, MediaCommonModel>> =
-        _sortedMedia.asStateFlow()
+    private val _currentMedia: MutableStateFlow<List<MediaCommonModel>> =
+        MutableStateFlow(mutableListOf())
+    val currentMedia = _currentMedia.asStateFlow()
 
-    private val _isMediaFromRec: MutableStateFlow<Boolean> = MutableStateFlow(false)
-    val isMediaFromRec: StateFlow<Boolean> = _isMediaFromRec.asStateFlow()
-
+    private var sortedMedia = TreeMap<MediaSortKeyModel, MediaCommonModel>(comparator)
     private var mediaFromRecPackageName: String? = null
     private var locale: Locale = applicationContext.resources.configuration.locales.get(0)
 
@@ -186,7 +183,7 @@
     fun addMediaDataLoadingState(mediaDataLoadingModel: MediaDataLoadingModel) {
         val sortedMap = TreeMap<MediaSortKeyModel, MediaCommonModel>(comparator)
         sortedMap.putAll(
-            _sortedMedia.value.filter { (_, commonModel) ->
+            sortedMedia.filter { (_, commonModel) ->
                 commonModel !is MediaCommonModel.MediaControl ||
                     commonModel.mediaLoadedModel.instanceId != mediaDataLoadingModel.instanceId
             }
@@ -207,18 +204,52 @@
                 )
 
             if (mediaDataLoadingModel is MediaDataLoadingModel.Loaded) {
-                val isMediaFromRec = isMediaFromRec(it)
+                val newCommonModel =
+                    MediaCommonModel.MediaControl(
+                        mediaDataLoadingModel,
+                        canBeRemoved(it),
+                        isMediaFromRec(it)
+                    )
+                sortedMap[sortKey] = newCommonModel
 
-                _isMediaFromRec.value = isMediaFromRec
-                if (isMediaFromRec) {
-                    mediaFromRecPackageName = null
+                // On Addition or tapping on recommendations, we should show the new order of media.
+                if (mediaFromRecPackageName == it.packageName) {
+                    if (it.isPlaying == true) {
+                        mediaFromRecPackageName = null
+                        _currentMedia.value = sortedMap.values.toList()
+                    }
+                } else if (sortedMap.size > sortedMedia.size) {
+                    _currentMedia.value = sortedMap.values.toList()
+                } else if (sortedMap.size == sortedMedia.size) {
+                    // When loading an update for an existing media control.
+                    val currentList =
+                        mutableListOf<MediaCommonModel>().apply { addAll(_currentMedia.value) }
+                    currentList.forEachIndexed { index, mediaCommonModel ->
+                        if (
+                            mediaCommonModel is MediaCommonModel.MediaControl &&
+                                mediaCommonModel.mediaLoadedModel.instanceId ==
+                                    mediaDataLoadingModel.instanceId &&
+                                mediaCommonModel != newCommonModel
+                        ) {
+                            // Update media model if changed.
+                            currentList[index] = newCommonModel
+                        }
+                    }
+                    _currentMedia.value = currentList
                 }
-                sortedMap[sortKey] =
-                    MediaCommonModel.MediaControl(mediaDataLoadingModel, canBeRemoved(it))
             }
         }
 
-        _sortedMedia.value = sortedMap
+        sortedMedia = sortedMap
+
+        // On removal we want to keep the order being shown to user.
+        if (mediaDataLoadingModel is MediaDataLoadingModel.Removed) {
+            _currentMedia.value =
+                _currentMedia.value.filter { commonModel ->
+                    commonModel !is MediaCommonModel.MediaControl ||
+                        mediaDataLoadingModel.instanceId != commonModel.mediaLoadedModel.instanceId
+                }
+        }
     }
 
     fun setRecommendationsLoadingState(smartspaceMediaLoadingModel: SmartspaceMediaLoadingModel) {
@@ -229,7 +260,7 @@
             }
         val sortedMap = TreeMap<MediaSortKeyModel, MediaCommonModel>(comparator)
         sortedMap.putAll(
-            _sortedMedia.value.filter { (_, commonModel) ->
+            sortedMedia.filter { (_, commonModel) ->
                 commonModel !is MediaCommonModel.MediaRecommendations
             }
         )
@@ -240,11 +271,25 @@
                 isPlaying = false,
                 active = _smartspaceMediaData.value.isActive,
             )
-        if (smartspaceMediaLoadingModel is SmartspaceMediaLoadingModel.Loaded) {
-            sortedMap[sortKey] = MediaCommonModel.MediaRecommendations(smartspaceMediaLoadingModel)
+        when (smartspaceMediaLoadingModel) {
+            is SmartspaceMediaLoadingModel.Loaded ->
+                sortedMap[sortKey] =
+                    MediaCommonModel.MediaRecommendations(smartspaceMediaLoadingModel)
+            is SmartspaceMediaLoadingModel.Removed ->
+                _currentMedia.value =
+                    _currentMedia.value.filter { commonModel ->
+                        commonModel !is MediaCommonModel.MediaRecommendations
+                    }
         }
 
-        _sortedMedia.value = sortedMap
+        if (sortedMap.size > sortedMedia.size) {
+            _currentMedia.value = sortedMap.values.toList()
+        }
+        sortedMedia = sortedMap
+    }
+
+    fun setOrderedMedia() {
+        _currentMedia.value = sortedMedia.values.toList()
     }
 
     fun setMediaFromRecPackageName(packageName: String) {
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaCarouselInteractor.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaCarouselInteractor.kt
index 33c0b19..c888935 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaCarouselInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaCarouselInteractor.kt
@@ -63,7 +63,7 @@
     private val mediaDeviceManager: MediaDeviceManager,
     private val mediaDataCombineLatest: MediaDataCombineLatest,
     private val mediaDataFilter: MediaDataFilterImpl,
-    mediaFilterRepository: MediaFilterRepository,
+    private val mediaFilterRepository: MediaFilterRepository,
     private val mediaFlags: MediaFlags,
 ) : MediaDataManager, CoreStartable {
 
@@ -123,18 +123,8 @@
                 initialValue = false,
             )
 
-    /** The most recent sorted set for user media instances */
-    val sortedMedia: StateFlow<List<MediaCommonModel>> =
-        mediaFilterRepository.sortedMedia
-            .mapLatest { it.values.toList() }
-            .stateIn(
-                scope = applicationScope,
-                started = SharingStarted.WhileSubscribed(),
-                initialValue = emptyList(),
-            )
-
-    /** Whether the current change in media was done by clicking on a recommendation */
-    val isMediaFromRec: StateFlow<Boolean> = mediaFilterRepository.isMediaFromRec
+    /** The current list for user media instances */
+    val currentMedia: StateFlow<List<MediaCommonModel>> = mediaFilterRepository.currentMedia
 
     override fun start() {
         if (!mediaFlags.isMediaControlsRefactorEnabled()) {
@@ -251,6 +241,10 @@
 
     override fun isRecommendationActive() = mediaDataRepository.smartspaceMediaData.value.isActive
 
+    fun reorderMedia() {
+        mediaFilterRepository.setOrderedMedia()
+    }
+
     /** Add a listener for internal events. */
     private fun addInternalListener(listener: MediaDataManager.Listener) =
         mediaDataProcessor.addInternalListener(listener)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaCommonModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaCommonModel.kt
index 23860bb..56cc618 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaCommonModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaCommonModel.kt
@@ -21,6 +21,7 @@
     data class MediaControl(
         val mediaLoadedModel: MediaDataLoadingModel.Loaded,
         val canBeRemoved: Boolean = false,
+        val isMediaFromRec: Boolean = false,
     ) : MediaCommonModel()
 
     data class MediaRecommendations(val recsLoadingModel: SmartspaceMediaLoadingModel) :
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt
index 0478178..45b68ca 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt
@@ -359,6 +359,8 @@
         )
         keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback)
         mediaCarousel.repeatWhenAttached {
+            mediaCarouselViewModel.onAttached()
+            mediaCarouselScrollHandler.scrollToStart()
             repeatOnLifecycle(Lifecycle.State.STARTED) {
                 listenForAnyStateToGoneKeyguardTransition(this)
                 listenForAnyStateToLockscreenTransition(this)
@@ -734,6 +736,14 @@
         viewController.setListening(mediaCarouselScrollHandler.visibleToUser && currentlyExpanded)
         updateViewControllerToState(viewController, noAnimation = true)
         updatePageIndicator()
+        if (
+            commonViewModel is MediaCommonViewModel.MediaControl && commonViewModel.isMediaFromRec
+        ) {
+            mediaCarouselScrollHandler.scrollToPlayer(
+                mediaCarouselScrollHandler.visibleMediaIndex,
+                destIndex = 0
+            )
+        }
         mediaCarouselScrollHandler.onPlayersChanged()
         mediaFrame.requiresRemeasuring = true
         commonViewModel.onAdded(commonViewModel)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModel.kt
index 96a8239..fd5f445 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCarouselViewModel.kt
@@ -26,21 +26,15 @@
 import com.android.systemui.media.controls.shared.model.MediaCommonModel
 import com.android.systemui.media.controls.util.MediaFlags
 import com.android.systemui.media.controls.util.MediaUiEventLogger
-import com.android.systemui.statusbar.notification.collection.provider.OnReorderingAllowedListener
 import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider
 import com.android.systemui.util.Utils
-import com.android.systemui.util.kotlin.pairwiseBy
-import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
 import java.util.concurrent.Executor
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.channels.awaitClose
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.stateIn
 
 /** Models UI state and handles user inputs for media carousel */
@@ -60,45 +54,26 @@
     private val mediaFlags: MediaFlags,
 ) {
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     val mediaItems: StateFlow<List<MediaCommonViewModel>> =
-        conflatedCallbackFlow {
-                val listener = OnReorderingAllowedListener { trySend(Unit) }
-                visualStabilityProvider.addPersistentReorderingAllowedListener(listener)
-                trySend(Unit)
-                awaitClose { visualStabilityProvider.removeReorderingAllowedListener(listener) }
-            }
-            .flatMapLatest {
-                combine(interactor.isMediaFromRec, interactor.sortedMedia) {
-                    isRecsToMedia,
-                    sortedItems ->
-                    buildList {
-                        shouldReorder = isRecsToMedia
-                        val reorderAllowed = isReorderingAllowed()
-                        sortedItems.forEach { commonModel ->
-                            if (!reorderAllowed || !modelsPendingRemoval.contains(commonModel)) {
-                                when (commonModel) {
-                                    is MediaCommonModel.MediaControl ->
-                                        add(toViewModel(commonModel))
-                                    is MediaCommonModel.MediaRecommendations ->
-                                        add(toViewModel(commonModel))
-                                }
+        interactor.currentMedia
+            .map { sortedItems ->
+                buildList {
+                    sortedItems.forEach { commonModel ->
+                        // When view is started we should make sure to clean models that are pending
+                        // removal.
+                        // This action should only be triggered once.
+                        if (!isAttached || !modelsPendingRemoval.contains(commonModel)) {
+                            when (commonModel) {
+                                is MediaCommonModel.MediaControl -> add(toViewModel(commonModel))
+                                is MediaCommonModel.MediaRecommendations ->
+                                    add(toViewModel(commonModel))
                             }
                         }
-                        if (reorderAllowed) {
-                            modelsPendingRemoval.clear()
-                        }
                     }
-                }
-            }
-            .pairwiseBy { old, new ->
-                // This condition can only happen when view is attached. So the old emit is of the
-                // most recent list updated.
-                // If the old list is empty, it is okay to emit the new ordered list.
-                if (isReorderingAllowed() || shouldReorder || old.isEmpty()) {
-                    new
-                } else {
-                    old
+                    if (isAttached) {
+                        modelsPendingRemoval.clear()
+                    }
+                    isAttached = false
                 }
             }
             .stateIn(
@@ -114,13 +89,18 @@
 
     private var modelsPendingRemoval: MutableSet<MediaCommonModel> = mutableSetOf()
 
-    private var shouldReorder = true
+    private var isAttached = false
 
     fun onSwipeToDismiss() {
         logger.logSwipeDismiss()
         interactor.onSwipeToDismiss()
     }
 
+    fun onAttached() {
+        isAttached = true
+        interactor.reorderMedia()
+    }
+
     private fun toViewModel(
         commonModel: MediaCommonModel.MediaControl
     ): MediaCommonViewModel.MediaControl {
@@ -138,6 +118,7 @@
                         mediaControlByInstanceId.remove(instanceId)
                     },
                     onUpdated = { onMediaControlAddedOrUpdated(it, commonModel) },
+                    isMediaFromRec = commonModel.isMediaFromRec
                 )
                 .also { mediaControlByInstanceId[instanceId] = it }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCommonViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCommonViewModel.kt
index aeaa82e..a96d75c 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCommonViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaCommonViewModel.kt
@@ -32,6 +32,7 @@
         override val onAdded: (MediaCommonViewModel) -> Unit,
         override val onRemoved: (Boolean) -> Unit,
         override val onUpdated: (MediaCommonViewModel) -> Unit,
+        val isMediaFromRec: Boolean = false,
     ) : MediaCommonViewModel()
 
     data class MediaRecommendations(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt
index 857af66..77ad263 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt
@@ -168,7 +168,7 @@
     @Test
     fun onDataLoadedForCurrentUser_updatesLoadedStates() =
         testScope.runTest {
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             val mediaCommonModel =
                 MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(dataMain.instanceId))
 
@@ -176,13 +176,13 @@
 
             verify(listener)
                 .onMediaDataLoaded(eq(KEY), eq(null), eq(dataMain), eq(true), eq(0), eq(false))
-            assertThat(sortedMedia?.values).containsExactly(mediaCommonModel)
+            assertThat(currentMedia).containsExactly(mediaCommonModel)
         }
 
     @Test
     fun onDataLoadedForGuest_doesNotUpdateLoadedStates() =
         testScope.runTest {
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             val mediaCommonModel =
                 MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(dataMain.instanceId))
 
@@ -190,64 +190,63 @@
 
             verify(listener, never())
                 .onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean())
-            assertThat(sortedMedia?.values).doesNotContain(mediaCommonModel)
+            assertThat(currentMedia).doesNotContain(mediaCommonModel)
         }
 
     @Test
     fun onRemovedForCurrent_updatesLoadedStates() =
         testScope.runTest {
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             val mediaCommonModel =
                 MediaCommonModel.MediaControl(MediaDataLoadingModel.Loaded(dataMain.instanceId))
 
             // GIVEN a media was removed for main user
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataMain)
 
-            assertThat(sortedMedia?.values).containsExactly(mediaCommonModel)
+            assertThat(currentMedia).containsExactly(mediaCommonModel)
 
             mediaDataFilter.onMediaDataRemoved(KEY)
 
             verify(listener).onMediaDataRemoved(eq(KEY))
-            assertThat(sortedMedia?.values).doesNotContain(mediaCommonModel)
+            assertThat(currentMedia).doesNotContain(mediaCommonModel)
         }
 
     @Test
     fun onRemovedForGuest_doesNotUpdateLoadedStates() =
         testScope.runTest {
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
 
             // GIVEN a media was removed for guest user
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataGuest)
             mediaDataFilter.onMediaDataRemoved(KEY)
 
             verify(listener, never()).onMediaDataRemoved(eq(KEY))
-            assertThat(sortedMedia).isEmpty()
+            assertThat(currentMedia).isEmpty()
         }
 
     @Test
     fun onUserSwitched_removesOldUserControls() =
         testScope.runTest {
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             val mediaLoaded = MediaDataLoadingModel.Loaded(dataMain.instanceId)
 
             // GIVEN that we have a media loaded for main user
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataMain)
 
-            assertThat(sortedMedia?.values)
-                .containsExactly(MediaCommonModel.MediaControl(mediaLoaded))
+            assertThat(currentMedia).containsExactly(MediaCommonModel.MediaControl(mediaLoaded))
 
             // and we switch to guest user
             setUser(USER_GUEST)
 
             // THEN we should remove the main user's media
             verify(listener).onMediaDataRemoved(eq(KEY))
-            assertThat(sortedMedia).isEmpty()
+            assertThat(currentMedia).isEmpty()
         }
 
     @Test
     fun onUserSwitched_addsNewUserControls() =
         testScope.runTest {
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             val guestLoadedStatesModel = MediaDataLoadingModel.Loaded(dataGuest.instanceId)
             val mainLoadedStatesModel = MediaDataLoadingModel.Loaded(dataMain.instanceId)
 
@@ -272,16 +271,16 @@
                     anyInt(),
                     anyBoolean()
                 )
-            assertThat(sortedMedia?.values)
+            assertThat(currentMedia)
                 .containsExactly(MediaCommonModel.MediaControl(guestLoadedStatesModel))
-            assertThat(sortedMedia?.values)
+            assertThat(currentMedia)
                 .doesNotContain(MediaCommonModel.MediaControl(mainLoadedStatesModel))
         }
 
     @Test
     fun onProfileChanged_profileUnavailable_updateStates() =
         testScope.runTest {
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
 
             // GIVEN that we had some media for both profiles
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataMain)
@@ -293,7 +292,7 @@
             val mediaLoadedStatesModel = MediaDataLoadingModel.Loaded(dataMain.instanceId)
             // THEN we should remove the private profile media
             verify(listener).onMediaDataRemoved(eq(KEY_ALT))
-            assertThat(sortedMedia?.values)
+            assertThat(currentMedia)
                 .containsExactly(MediaCommonModel.MediaControl(mediaLoadedStatesModel))
         }
 
@@ -523,13 +522,13 @@
             val selectedUserEntries by collectLastValue(repository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(repository.smartspaceMediaData)
             val reactivatedKey by collectLastValue(repository.reactivatedId)
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             val recommendationsLoadingModel =
                 SmartspaceMediaLoadingModel.Loaded(SMARTSPACE_KEY, isPrioritized = true)
 
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
-            assertThat(sortedMedia?.values)
+            assertThat(currentMedia)
                 .containsExactly(MediaCommonModel.MediaRecommendations(recommendationsLoadingModel))
             assertThat(
                     hasActiveMediaOrRecommendation(
@@ -552,13 +551,13 @@
             val selectedUserEntries by collectLastValue(repository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(repository.smartspaceMediaData)
             val reactivatedKey by collectLastValue(repository.reactivatedId)
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
 
             whenever(smartspaceData.isActive).thenReturn(false)
 
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
-            assertThat(sortedMedia).isEmpty()
+            assertThat(currentMedia).isEmpty()
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -581,7 +580,7 @@
             val selectedUserEntries by collectLastValue(repository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(repository.smartspaceMediaData)
             val reactivatedKey by collectLastValue(repository.reactivatedId)
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             val recsCommonModel =
                 MediaCommonModel.MediaRecommendations(
                     SmartspaceMediaLoadingModel.Loaded(SMARTSPACE_KEY, isPrioritized = true)
@@ -596,7 +595,7 @@
             clock.advanceTime(MediaDataFilterImpl.SMARTSPACE_MAX_AGE + 100)
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
-            assertThat(sortedMedia?.values).containsExactly(recsCommonModel, controlCommonModel)
+            assertThat(currentMedia).containsExactly(recsCommonModel, controlCommonModel)
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -618,7 +617,7 @@
             val selectedUserEntries by collectLastValue(repository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(repository.smartspaceMediaData)
             val reactivatedKey by collectLastValue(repository.reactivatedId)
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             whenever(smartspaceData.isActive).thenReturn(false)
 
             val dataOld = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
@@ -626,7 +625,7 @@
             clock.advanceTime(MediaDataFilterImpl.SMARTSPACE_MAX_AGE + 100)
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
-            assertThat(sortedMedia?.values)
+            assertThat(currentMedia)
                 .doesNotContain(
                     MediaCommonModel.MediaRecommendations(
                         SmartspaceMediaLoadingModel.Loaded(SMARTSPACE_KEY)
@@ -652,7 +651,7 @@
             val selectedUserEntries by collectLastValue(repository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(repository.smartspaceMediaData)
             val reactivatedKey by collectLastValue(repository.reactivatedId)
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
 
             whenever(smartspaceData.isActive).thenReturn(false)
 
@@ -665,7 +664,7 @@
                 )
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
 
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel)
             verify(listener)
                 .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
 
@@ -673,7 +672,7 @@
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
             // THEN we should treat the media as not active instead
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel)
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -696,7 +695,7 @@
             val selectedUserEntries by collectLastValue(repository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(repository.smartspaceMediaData)
             val reactivatedKey by collectLastValue(repository.reactivatedId)
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             whenever(smartspaceData.isValid()).thenReturn(false)
 
             // WHEN we have media that was recently played, but not currently active
@@ -707,7 +706,7 @@
                     true
                 )
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel)
             verify(listener)
                 .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
 
@@ -717,7 +716,7 @@
 
             // THEN we should treat the media as active instead
             val dataCurrentAndActive = dataCurrent.copy(active = true)
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel)
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -747,7 +746,7 @@
             val selectedUserEntries by collectLastValue(repository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(repository.smartspaceMediaData)
             val reactivatedKey by collectLastValue(repository.reactivatedId)
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             // WHEN we have media that was recently played, but not currently active
             val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
             val controlCommonModel =
@@ -762,7 +761,7 @@
 
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
 
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel)
             verify(listener)
                 .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
 
@@ -790,7 +789,7 @@
                 )
                 .isTrue()
             // Smartspace update should also be propagated but not prioritized.
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel, recsCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel, recsCommonModel)
             verify(listener)
                 .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
             verify(logger).logRecommendationAdded(SMARTSPACE_PACKAGE, SMARTSPACE_INSTANCE_ID)
@@ -803,13 +802,13 @@
             val selectedUserEntries by collectLastValue(repository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(repository.smartspaceMediaData)
             val reactivatedKey by collectLastValue(repository.reactivatedId)
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
 
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
             mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
 
             verify(listener).onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
-            assertThat(sortedMedia?.values).isEmpty()
+            assertThat(currentMedia).isEmpty()
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -827,7 +826,7 @@
             val selectedUserEntries by collectLastValue(repository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(repository.smartspaceMediaData)
             val reactivatedKey by collectLastValue(repository.reactivatedId)
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             val controlCommonModel =
                 MediaCommonModel.MediaControl(
                     MediaDataLoadingModel.Loaded(dataMain.instanceId),
@@ -836,7 +835,7 @@
             val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
 
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel)
             verify(listener)
                 .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
 
@@ -857,7 +856,7 @@
             mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
 
             verify(listener).onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel)
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -875,7 +874,7 @@
             val selectedUserEntries by collectLastValue(repository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(repository.smartspaceMediaData)
             val reactivatedKey by collectLastValue(repository.reactivatedId)
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             val recsCommonModel =
                 MediaCommonModel.MediaRecommendations(
                     SmartspaceMediaLoadingModel.Loaded(SMARTSPACE_KEY)
@@ -887,7 +886,7 @@
 
             verify(listener)
                 .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
-            assertThat(sortedMedia?.values).containsExactly(recsCommonModel)
+            assertThat(currentMedia).containsExactly(recsCommonModel)
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -906,7 +905,7 @@
             val selectedUserEntries by collectLastValue(repository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(repository.smartspaceMediaData)
             val reactivatedKey by collectLastValue(repository.reactivatedId)
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             val recsCommonModel =
                 MediaCommonModel.MediaRecommendations(
                     SmartspaceMediaLoadingModel.Loaded(SMARTSPACE_KEY)
@@ -926,7 +925,7 @@
 
             verify(listener)
                 .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel)
 
             // And an inactive recommendation is loaded
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
@@ -936,7 +935,7 @@
                 .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
             verify(listener, never())
                 .onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean())
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel, recsCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel, recsCommonModel)
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -974,7 +973,7 @@
             val selectedUserEntries by collectLastValue(repository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(repository.smartspaceMediaData)
             val reactivatedKey by collectLastValue(repository.reactivatedId)
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             val recsCommonModel =
                 MediaCommonModel.MediaRecommendations(
                     SmartspaceMediaLoadingModel.Loaded(SMARTSPACE_KEY)
@@ -990,7 +989,7 @@
 
             verify(listener)
                 .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel)
 
             // AND we get a smartspace signal with extra to trigger resume
             runCurrent()
@@ -1009,7 +1008,7 @@
                     eq(100),
                     eq(true)
                 )
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel, recsCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel, recsCommonModel)
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -1026,7 +1025,7 @@
     @Test
     fun smartspaceLoaded_notShouldTriggerResume_doesNotTrigger() =
         testScope.runTest {
-            val sortedMedia by collectLastValue(repository.sortedMedia)
+            val currentMedia by collectLastValue(repository.currentMedia)
             val recsCommonModel =
                 MediaCommonModel.MediaRecommendations(
                     SmartspaceMediaLoadingModel.Loaded(SMARTSPACE_KEY)
@@ -1043,7 +1042,7 @@
 
             verify(listener)
                 .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel)
 
             // AND we get a smartspace signal with extra to not trigger resume
             val extras = Bundle().apply { putBoolean(EXTRA_KEY_TRIGGER_RESUME, false) }
@@ -1056,7 +1055,7 @@
             // But the smartspace update is still propagated
             verify(listener)
                 .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
-            assertThat(sortedMedia?.values).containsExactly(controlCommonModel, recsCommonModel)
+            assertThat(currentMedia).containsExactly(controlCommonModel, recsCommonModel)
         }
 
     private fun hasActiveMediaOrRecommendation(