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(