diff options
7 files changed, 190 insertions, 190 deletions
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 d39e77da2f55..f6381c655649 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 @@ -18,6 +18,7 @@ package com.android.systemui.media.controls.data.repository import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest +import com.android.internal.logging.InstanceId import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.testScope @@ -44,16 +45,17 @@ class MediaFilterRepositoryTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(underTest.selectedUserEntries) - val userMedia = MediaData().copy(active = true) + val instanceId = InstanceId.fakeInstanceId(123) + val userMedia = MediaData().copy(active = true, instanceId = instanceId) - underTest.addSelectedUserMediaEntry(KEY, userMedia) + underTest.addSelectedUserMediaEntry(userMedia) - assertThat(selectedUserEntries?.get(KEY)).isEqualTo(userMedia) + assertThat(selectedUserEntries?.get(instanceId)).isEqualTo(userMedia) - underTest.addSelectedUserMediaEntry(KEY, userMedia.copy(active = false)) + underTest.addSelectedUserMediaEntry(userMedia.copy(active = false)) - assertThat(selectedUserEntries?.get(KEY)).isNotEqualTo(userMedia) - assertThat(selectedUserEntries?.get(KEY)?.active).isFalse() + assertThat(selectedUserEntries?.get(instanceId)).isNotEqualTo(userMedia) + assertThat(selectedUserEntries?.get(instanceId)?.active).isFalse() } @Test @@ -61,13 +63,14 @@ class MediaFilterRepositoryTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(underTest.selectedUserEntries) - val userMedia = MediaData() + val instanceId = InstanceId.fakeInstanceId(123) + val userMedia = MediaData().copy(instanceId = instanceId) - underTest.addSelectedUserMediaEntry(KEY, userMedia) + underTest.addSelectedUserMediaEntry(userMedia) - assertThat(selectedUserEntries?.get(KEY)).isEqualTo(userMedia) + assertThat(selectedUserEntries?.get(instanceId)).isEqualTo(userMedia) - assertThat(underTest.removeSelectedUserMediaEntry(KEY, userMedia)).isTrue() + assertThat(underTest.removeSelectedUserMediaEntry(instanceId, userMedia)).isTrue() } @Test @@ -75,13 +78,14 @@ class MediaFilterRepositoryTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(underTest.selectedUserEntries) - val userMedia = MediaData() + val instanceId = InstanceId.fakeInstanceId(123) + val userMedia = MediaData().copy(instanceId = instanceId) - underTest.addSelectedUserMediaEntry(KEY, userMedia) + underTest.addSelectedUserMediaEntry(userMedia) - assertThat(selectedUserEntries?.get(KEY)).isEqualTo(userMedia) + assertThat(selectedUserEntries?.get(instanceId)).isEqualTo(userMedia) - assertThat(underTest.removeSelectedUserMediaEntry(KEY)).isEqualTo(userMedia) + assertThat(underTest.removeSelectedUserMediaEntry(instanceId)).isEqualTo(userMedia) } @Test 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 6e67000b1ab3..2d1115534de9 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 @@ -56,13 +56,13 @@ class MediaCarouselInteractorTest : SysuiTestCase() { val userMedia = MediaData().copy(active = true) - mediaFilterRepository.addSelectedUserMediaEntry(KEY, userMedia) + mediaFilterRepository.addSelectedUserMediaEntry(userMedia) assertThat(hasActiveMediaOrRecommendation).isTrue() assertThat(hasActiveMedia).isTrue() assertThat(hasAnyMedia).isTrue() - mediaFilterRepository.addSelectedUserMediaEntry(KEY, userMedia.copy(active = false)) + mediaFilterRepository.addSelectedUserMediaEntry(userMedia.copy(active = false)) assertThat(hasActiveMediaOrRecommendation).isFalse() assertThat(hasActiveMedia).isFalse() @@ -78,14 +78,16 @@ class MediaCarouselInteractorTest : SysuiTestCase() { val hasAnyMedia by collectLastValue(underTest.hasAnyMedia) val userMedia = MediaData().copy(active = false) + val instanceId = userMedia.instanceId - mediaFilterRepository.addSelectedUserMediaEntry(KEY, userMedia) + mediaFilterRepository.addSelectedUserMediaEntry(userMedia) assertThat(hasActiveMediaOrRecommendation).isFalse() assertThat(hasActiveMedia).isFalse() assertThat(hasAnyMedia).isTrue() - assertThat(mediaFilterRepository.removeSelectedUserMediaEntry(KEY, userMedia)).isTrue() + assertThat(mediaFilterRepository.removeSelectedUserMediaEntry(instanceId, userMedia)) + .isTrue() assertThat(hasActiveMediaOrRecommendation).isFalse() assertThat(hasActiveMedia).isFalse() @@ -114,7 +116,7 @@ class MediaCarouselInteractorTest : SysuiTestCase() { assertThat(hasActiveMediaOrRecommendation).isTrue() assertThat(hasAnyMediaOrRecommendation).isTrue() - mediaFilterRepository.addSelectedUserMediaEntry(KEY, userMedia) + mediaFilterRepository.addSelectedUserMediaEntry(userMedia) assertThat(hasActiveMediaOrRecommendation).isTrue() assertThat(hasAnyMediaOrRecommendation).isTrue() @@ -193,7 +195,6 @@ class MediaCarouselInteractorTest : SysuiTestCase() { testScope.runTest { assertThat(underTest.hasActiveMediaOrRecommendation.value).isFalse() } companion object { - private const val KEY = "KEY" private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID" } } 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 b94a4af65649..df34169c9a50 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 @@ -16,6 +16,7 @@ package com.android.systemui.media.controls.data.repository +import com.android.internal.logging.InstanceId import com.android.systemui.dagger.SysUISingleton import com.android.systemui.media.controls.shared.model.MediaData import com.android.systemui.media.controls.shared.model.SmartspaceMediaData @@ -28,17 +29,18 @@ import kotlinx.coroutines.flow.asStateFlow @SysUISingleton class MediaFilterRepository @Inject constructor() { - /** Key of media control that recommendations card reactivated. */ - private val _reactivatedKey: MutableStateFlow<String?> = MutableStateFlow(null) - val reactivatedKey: StateFlow<String?> = _reactivatedKey.asStateFlow() + /** Instance id of media control that recommendations card reactivated. */ + private val _reactivatedId: MutableStateFlow<InstanceId?> = MutableStateFlow(null) + val reactivatedId: StateFlow<InstanceId?> = _reactivatedId.asStateFlow() private val _smartspaceMediaData: MutableStateFlow<SmartspaceMediaData> = MutableStateFlow(SmartspaceMediaData()) val smartspaceMediaData: StateFlow<SmartspaceMediaData> = _smartspaceMediaData.asStateFlow() - private val _selectedUserEntries: MutableStateFlow<Map<String, MediaData>> = + private val _selectedUserEntries: MutableStateFlow<Map<InstanceId, MediaData>> = MutableStateFlow(LinkedHashMap()) - val selectedUserEntries: StateFlow<Map<String, MediaData>> = _selectedUserEntries.asStateFlow() + val selectedUserEntries: StateFlow<Map<InstanceId, MediaData>> = + _selectedUserEntries.asStateFlow() private val _allUserEntries: MutableStateFlow<Map<String, MediaData>> = MutableStateFlow(LinkedHashMap()) @@ -62,9 +64,9 @@ class MediaFilterRepository @Inject constructor() { return mediaData } - fun addSelectedUserMediaEntry(key: String, data: MediaData) { - val entries = LinkedHashMap<String, MediaData>(_selectedUserEntries.value) - entries[key] = data + fun addSelectedUserMediaEntry(data: MediaData) { + val entries = LinkedHashMap<InstanceId, MediaData>(_selectedUserEntries.value) + entries[data.instanceId] = data _selectedUserEntries.value = entries } @@ -73,8 +75,8 @@ class MediaFilterRepository @Inject constructor() { * * @return media data if an entry is actually removed, `null` otherwise. */ - fun removeSelectedUserMediaEntry(key: String): MediaData? { - val entries = LinkedHashMap<String, MediaData>(_selectedUserEntries.value) + fun removeSelectedUserMediaEntry(key: InstanceId): MediaData? { + val entries = LinkedHashMap<InstanceId, MediaData>(_selectedUserEntries.value) val mediaData = entries.remove(key) _selectedUserEntries.value = entries return mediaData @@ -85,8 +87,8 @@ class MediaFilterRepository @Inject constructor() { * * @return true if media data is removed, false otherwise. */ - fun removeSelectedUserMediaEntry(key: String, data: MediaData): Boolean { - val entries = LinkedHashMap<String, MediaData>(_selectedUserEntries.value) + fun removeSelectedUserMediaEntry(key: InstanceId, data: MediaData): Boolean { + val entries = LinkedHashMap<InstanceId, MediaData>(_selectedUserEntries.value) val succeed = entries.remove(key, data) if (!succeed) { return false @@ -105,7 +107,7 @@ class MediaFilterRepository @Inject constructor() { } /** Updates media control key that recommendations card reactivated. */ - fun setReactivatedKey(key: String?) { - _reactivatedKey.value = key + fun setReactivatedId(instanceId: InstanceId?) { + _reactivatedId.value = instanceId } } diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt index a65db35030ea..d40069c4b3da 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt @@ -22,6 +22,7 @@ import android.os.SystemProperties import android.util.Log import com.android.internal.annotations.KeepForWeakReference import com.android.internal.annotations.VisibleForTesting +import com.android.internal.logging.InstanceId import com.android.systemui.broadcast.BroadcastSender import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.media.controls.data.repository.MediaFilterRepository @@ -66,8 +67,8 @@ constructor( private val mediaFlags: MediaFlags, private val mediaFilterRepository: MediaFilterRepository, ) : MediaDataManager.Listener { - private val _listeners: MutableSet<MediaDataManager.Listener> = mutableSetOf() - val listeners: Set<MediaDataManager.Listener> + private val _listeners: MutableSet<Listener> = mutableSetOf() + val listeners: Set<Listener> get() = _listeners.toSet() lateinit var mediaDataManager: MediaDataManager @@ -108,13 +109,10 @@ constructor( return } - if (oldKey != null && oldKey != key) { - mediaFilterRepository.removeSelectedUserMediaEntry(oldKey) - } - mediaFilterRepository.addSelectedUserMediaEntry(key, data) + mediaFilterRepository.addSelectedUserMediaEntry(data) // Notify listeners - listeners.forEach { it.onMediaDataLoaded(key, oldKey, data) } + listeners.forEach { it.onMediaDataLoaded(data.instanceId) } } override fun onSmartspaceMediaDataLoaded( @@ -160,11 +158,11 @@ constructor( // It could happen there are existing active media resume cards, then we don't need to // reactivate. if (shouldReactivate) { - val lastActiveKey = sorted.lastKey() // most recently active + val lastActiveId = sorted.lastKey() // most recently active id // Notify listeners to consider this media active - Log.d(TAG, "reactivating $lastActiveKey instead of smartspace") - mediaFilterRepository.setReactivatedKey(lastActiveKey) - val mediaData = sorted[lastActiveKey]!!.copy(active = true) + Log.d(TAG, "reactivating $lastActiveId instead of smartspace") + mediaFilterRepository.setReactivatedId(lastActiveId) + val mediaData = sorted[lastActiveId]!!.copy(active = true) logger.logRecommendationActivated( mediaData.appUid, mediaData.packageName, @@ -172,9 +170,7 @@ constructor( ) listeners.forEach { it.onMediaDataLoaded( - lastActiveKey, - lastActiveKey, - mediaData, + lastActiveId, receivedSmartspaceCardLatency = (systemClock.currentTimeMillis() - data.headphoneConnectionTimeMillis) .toInt(), @@ -196,27 +192,28 @@ constructor( smartspaceMediaData.packageName, smartspaceMediaData.instanceId ) - listeners.forEach { it.onSmartspaceMediaDataLoaded(key, data, shouldPrioritizeMutable) } + listeners.forEach { it.onSmartspaceMediaDataLoaded(key, shouldPrioritizeMutable) } } override fun onMediaDataRemoved(key: String) { - mediaFilterRepository.removeMediaEntry(key) - mediaFilterRepository.removeSelectedUserMediaEntry(key)?.let { - // Only notify listeners if something actually changed - listeners.forEach { it.onMediaDataRemoved(key) } + mediaFilterRepository.removeMediaEntry(key)?.let { mediaData -> + val instanceId = mediaData.instanceId + mediaFilterRepository.removeSelectedUserMediaEntry(instanceId)?.let { + // Only notify listeners if something actually changed + listeners.forEach { it.onMediaDataRemoved(instanceId) } + } } } override fun onSmartspaceMediaDataRemoved(key: String, immediately: Boolean) { // First check if we had reactivated media instead of forwarding smartspace - mediaFilterRepository.reactivatedKey.value?.let { - val lastActiveKey = it - mediaFilterRepository.setReactivatedKey(null) - Log.d(TAG, "expiring reactivated key $lastActiveKey") + mediaFilterRepository.reactivatedId.value?.let { lastActiveId -> + mediaFilterRepository.setReactivatedId(null) + Log.d(TAG, "expiring reactivated key $lastActiveId") // Notify listeners to update with actual active value - mediaFilterRepository.selectedUserEntries.value[lastActiveKey]?.let { mediaData -> + mediaFilterRepository.selectedUserEntries.value[lastActiveId]?.let { listeners.forEach { listener -> - listener.onMediaDataLoaded(lastActiveKey, lastActiveKey, mediaData, immediately) + listener.onMediaDataLoaded(lastActiveId, immediately) } } } @@ -240,8 +237,8 @@ constructor( if (!lockscreenUserManager.isProfileAvailable(data.userId)) { // Only remove media when the profile is unavailable. if (DEBUG) Log.d(TAG, "Removing $key after profile change") - mediaFilterRepository.removeSelectedUserMediaEntry(key, data) - listeners.forEach { listener -> listener.onMediaDataRemoved(key) } + mediaFilterRepository.removeSelectedUserMediaEntry(data.instanceId, data) + listeners.forEach { listener -> listener.onMediaDataRemoved(data.instanceId) } } } } @@ -254,16 +251,16 @@ constructor( // Clear the list first, to make sure callbacks from listeners if we have any entries // are up to date mediaFilterRepository.clearSelectedUserMedia() - keyCopy.forEach { - if (DEBUG) Log.d(TAG, "Removing $it after user change") - listenersCopy.forEach { listener -> listener.onMediaDataRemoved(it) } + keyCopy.forEach { instanceId -> + if (DEBUG) Log.d(TAG, "Removing $instanceId after user change") + listenersCopy.forEach { listener -> listener.onMediaDataRemoved(instanceId) } } mediaFilterRepository.allUserEntries.value.forEach { (key, data) -> if (lockscreenUserManager.isCurrentProfile(data.userId)) { if (DEBUG) Log.d(TAG, "Re-adding $key after user change") - mediaFilterRepository.addSelectedUserMediaEntry(key, data) - listenersCopy.forEach { listener -> listener.onMediaDataLoaded(key, null, data) } + mediaFilterRepository.addSelectedUserMediaEntry(data) + listenersCopy.forEach { listener -> listener.onMediaDataLoaded(data.instanceId) } } } } @@ -271,10 +268,12 @@ constructor( /** Invoked when the user has dismissed the media carousel */ fun onSwipeToDismiss() { if (DEBUG) Log.d(TAG, "Media carousel swiped away") - val mediaKeys = mediaFilterRepository.selectedUserEntries.value.keys.toSet() - mediaKeys.forEach { - // Force updates to listeners, needed for re-activated card - mediaDataManager.setInactive(it, timedOut = true, forceUpdate = true) + val mediaEntries = mediaFilterRepository.allUserEntries.value.entries + mediaEntries.forEach { (key, data) -> + if (mediaFilterRepository.selectedUserEntries.value.containsKey(data.instanceId)) { + // Force updates to listeners, needed for re-activated card + mediaDataManager.setInactive(key, timedOut = true, forceUpdate = true) + } } val smartspaceMediaData = mediaFilterRepository.smartspaceMediaData.value if (smartspaceMediaData.isActive) { @@ -312,10 +311,10 @@ constructor( } /** Add a listener for filtered [MediaData] changes */ - fun addListener(listener: MediaDataManager.Listener) = _listeners.add(listener) + fun addListener(listener: Listener) = _listeners.add(listener) /** Remove a listener that was registered with addListener */ - fun removeListener(listener: MediaDataManager.Listener) = _listeners.remove(listener) + fun removeListener(listener: Listener) = _listeners.remove(listener) /** * Return the time since last active for the most-recent media. @@ -325,15 +324,57 @@ constructor( * the present. MAX_VALUE will be returned if there is no media. */ private fun timeSinceActiveForMostRecentMedia( - sortedEntries: SortedMap<String, MediaData> + sortedEntries: SortedMap<InstanceId, MediaData> ): Long { if (sortedEntries.isEmpty()) { return Long.MAX_VALUE } val now = systemClock.elapsedRealtime() - val lastActiveKey = sortedEntries.lastKey() // most recently active - return sortedEntries[lastActiveKey]?.let { now - it.lastActive } ?: Long.MAX_VALUE + val lastActiveInstanceId = sortedEntries.lastKey() // most recently active + return sortedEntries[lastActiveInstanceId]?.let { now - it.lastActive } ?: Long.MAX_VALUE + } + + interface Listener { + /** + * Called whenever there's new MediaData Loaded for the consumption in views. + * + * @param immediately indicates should apply the UI changes immediately, otherwise wait + * until the next refresh-round before UI becomes visible. True by default to take in + * place immediately. + * @param receivedSmartspaceCardLatency is the latency between headphone connects and sysUI + * displays Smartspace media targets. Will be 0 if the data is not activated by Smartspace + * signal. + * @param isSsReactivated indicates resume media card is reactivated by Smartspace + * recommendation signal + */ + fun onMediaDataLoaded( + instanceId: InstanceId, + immediately: Boolean = true, + receivedSmartspaceCardLatency: Int = 0, + isSsReactivated: Boolean = false, + ) + + /** + * Called whenever there's new Smartspace media data loaded. + * + * @param shouldPrioritize indicates the sorting priority of the Smartspace card. If true, + * it will be prioritized as the first card. Otherwise, it will show up as the last card + * as default. + */ + fun onSmartspaceMediaDataLoaded(key: String, shouldPrioritize: Boolean = false) + + /** Called whenever a previously existing Media notification was removed. */ + fun onMediaDataRemoved(instanceId: InstanceId) + + /** + * Called whenever a previously existing Smartspace media data was removed. + * + * @param immediately indicates should apply the UI changes immediately, otherwise wait + * until the next refresh-round before UI becomes visible. True by default to take in + * place immediately. + */ + fun onSmartspaceMediaDataRemoved(key: String, immediately: Boolean = true) } companion object { diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataManager.kt index 2b1070cfeedf..2331aa2170ef 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataManager.kt @@ -27,10 +27,10 @@ import com.android.systemui.media.controls.shared.model.SmartspaceMediaData interface MediaDataManager { /** Add a listener for changes in this class */ - fun addListener(listener: Listener) + fun addListener(listener: Listener) {} /** Remove a listener for changes in this class */ - fun removeListener(listener: Listener) + fun removeListener(listener: Listener) {} /** * Called whenever the player has been paused or stopped for a while, or swiped from QQS. This 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 4a92b71f1155..7dbca0ae4cda 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 @@ -70,7 +70,7 @@ constructor( combine( mediaFilterRepository.selectedUserEntries, mediaFilterRepository.smartspaceMediaData, - mediaFilterRepository.reactivatedKey + mediaFilterRepository.reactivatedId ) { entries, smartspaceMediaData, reactivatedKey -> entries.any { it.value.active } || (smartspaceMediaData.isActive && @@ -142,14 +142,6 @@ constructor( mediaDataFilter.mediaDataManager = this } - override fun addListener(listener: MediaDataManager.Listener) { - mediaDataFilter.addListener(listener) - } - - override fun removeListener(listener: MediaDataManager.Listener) { - mediaDataFilter.removeListener(listener) - } - override fun setInactive(key: String, timedOut: Boolean, forceUpdate: Boolean) { mediaDataProcessor.setInactive(key, timedOut, forceUpdate) } 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 564bdc3f5880..b70cc30eb3e1 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 @@ -64,6 +64,7 @@ private const val USER_GUEST = 10 private const val PRIVATE_PROFILE = 12 private const val PACKAGE = "PKG" private val INSTANCE_ID = InstanceId.fakeInstanceId(123)!! +private val INSTANCE_ID_GUEST = InstanceId.fakeInstanceId(321)!! private const val APP_UID = 99 private const val SMARTSPACE_KEY = "SMARTSPACE_KEY" private const val SMARTSPACE_PACKAGE = "SMARTSPACE_PKG" @@ -75,7 +76,7 @@ private val SMARTSPACE_INSTANCE_ID = InstanceId.fakeInstanceId(456)!! @TestableLooper.RunWithLooper class MediaDataFilterImplTest : SysuiTestCase() { - @Mock private lateinit var listener: MediaDataManager.Listener + @Mock private lateinit var listener: MediaDataFilterImpl.Listener @Mock private lateinit var userTracker: UserTracker @Mock private lateinit var broadcastSender: BroadcastSender @Mock private lateinit var mediaDataManager: MediaDataManager @@ -128,8 +129,8 @@ class MediaDataFilterImplTest : SysuiTestCase() { instanceId = INSTANCE_ID, appUid = APP_UID ) - dataGuest = dataMain.copy(userId = USER_GUEST) - dataPrivateProfile = dataMain.copy(userId = PRIVATE_PROFILE) + dataGuest = dataMain.copy(userId = USER_GUEST, instanceId = INSTANCE_ID_GUEST) + dataPrivateProfile = dataMain.copy(userId = PRIVATE_PROFILE, instanceId = INSTANCE_ID_GUEST) whenever(smartspaceData.targetId).thenReturn(SMARTSPACE_KEY) whenever(smartspaceData.isActive).thenReturn(true) @@ -166,8 +167,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { mediaDataFilter.onMediaDataLoaded(KEY, null, dataMain) // THEN we should tell the listener - verify(listener) - .onMediaDataLoaded(eq(KEY), eq(null), eq(dataMain), eq(true), eq(0), eq(false)) + verify(listener).onMediaDataLoaded(eq(dataMain.instanceId), eq(true), eq(0), eq(false)) } @Test @@ -176,8 +176,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { mediaDataFilter.onMediaDataLoaded(KEY, null, dataGuest) // THEN we should NOT tell the listener - verify(listener, never()) - .onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean()) + verify(listener, never()).onMediaDataLoaded(any(), anyBoolean(), anyInt(), anyBoolean()) } @Test @@ -187,7 +186,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { mediaDataFilter.onMediaDataRemoved(KEY) // THEN we should tell the listener - verify(listener).onMediaDataRemoved(eq(KEY)) + verify(listener).onMediaDataRemoved(eq(dataMain.instanceId)) } @Test @@ -197,7 +196,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { mediaDataFilter.onMediaDataRemoved(KEY) // THEN we should NOT tell the listener - verify(listener, never()).onMediaDataRemoved(eq(KEY)) + verify(listener, never()).onMediaDataRemoved(eq(dataGuest.instanceId)) } @Test @@ -209,7 +208,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { setUser(USER_GUEST) // THEN we should remove the main user's media - verify(listener).onMediaDataRemoved(eq(KEY)) + verify(listener).onMediaDataRemoved(eq(dataMain.instanceId)) } @Test @@ -223,12 +222,11 @@ class MediaDataFilterImplTest : SysuiTestCase() { setUser(USER_GUEST) // THEN we should add back the guest user media - verify(listener) - .onMediaDataLoaded(eq(KEY_ALT), eq(null), eq(dataGuest), eq(true), eq(0), eq(false)) + verify(listener).onMediaDataLoaded(eq(dataGuest.instanceId), eq(true), eq(0), eq(false)) // but not the main user's verify(listener, never()) - .onMediaDataLoaded(eq(KEY), any(), eq(dataMain), anyBoolean(), anyInt(), anyBoolean()) + .onMediaDataLoaded(eq(dataMain.instanceId), anyBoolean(), anyInt(), anyBoolean()) } @Test @@ -242,7 +240,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { setPrivateProfileUnavailable() // THEN we should add the private profile media - verify(listener).onMediaDataRemoved(eq(KEY_ALT)) + verify(listener).onMediaDataRemoved(eq(dataPrivateProfile.instanceId)) } @Test @@ -311,7 +309,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) val data = dataMain.copy(active = false) mediaDataFilter.onMediaDataLoaded(KEY, oldKey = null, data = data) @@ -330,7 +328,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) val data = dataMain.copy(active = true) mediaDataFilter.onMediaDataLoaded(KEY, oldKey = null, data = data) @@ -349,7 +347,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) whenever(smartspaceData.isActive).thenReturn(false) mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) @@ -368,7 +366,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) whenever(smartspaceData.isValid()).thenReturn(false) mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) @@ -387,7 +385,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) whenever(smartspaceData.isActive).thenReturn(true) whenever(smartspaceData.isValid()).thenReturn(true) mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) @@ -421,7 +419,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) assertThat( hasActiveMediaOrRecommendation( selectedUserEntries, @@ -470,12 +468,11 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) - verify(listener) - .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(true)) + verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(true)) assertThat( hasActiveMediaOrRecommendation( selectedUserEntries, @@ -494,15 +491,14 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) whenever(smartspaceData.isActive).thenReturn(false) mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) - verify(listener, never()) - .onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean()) - verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean()) + verify(listener, never()).onMediaDataLoaded(any(), anyBoolean(), anyInt(), anyBoolean()) + verify(listener, never()).onSmartspaceMediaDataLoaded(any(), anyBoolean()) assertThat( hasActiveMediaOrRecommendation( selectedUserEntries, @@ -521,14 +517,13 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) val dataOld = dataMain.copy(active = false, lastActive = clock.elapsedRealtime()) mediaDataFilter.onMediaDataLoaded(KEY, null, dataOld) clock.advanceTime(MediaDataFilterImpl.SMARTSPACE_MAX_AGE + 100) mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) - verify(listener) - .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(true)) + verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(true)) assertThat( hasActiveMediaOrRecommendation( selectedUserEntries, @@ -547,7 +542,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) whenever(smartspaceData.isActive).thenReturn(false) val dataOld = dataMain.copy(active = false, lastActive = clock.elapsedRealtime()) @@ -555,7 +550,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { clock.advanceTime(MediaDataFilterImpl.SMARTSPACE_MAX_AGE + 100) mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) - verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean()) + verify(listener, never()).onSmartspaceMediaDataLoaded(any(), anyBoolean()) assertThat( hasActiveMediaOrRecommendation( selectedUserEntries, @@ -574,7 +569,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) whenever(smartspaceData.isActive).thenReturn(false) @@ -582,15 +577,15 @@ class MediaDataFilterImplTest : SysuiTestCase() { val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime()) mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent) verify(listener) - .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false)) + .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false)) + reset(listener) // AND we get a smartspace signal mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) // THEN we should tell listeners to treat the media as not active instead - verify(listener, never()) - .onMediaDataLoaded(eq(KEY), eq(KEY), any(), anyBoolean(), anyInt(), anyBoolean()) - verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean()) + verify(listener, never()).onMediaDataLoaded(any(), anyBoolean(), anyInt(), anyBoolean()) + verify(listener, never()).onSmartspaceMediaDataLoaded(any(), anyBoolean()) assertThat( hasActiveMediaOrRecommendation( selectedUserEntries, @@ -609,14 +604,14 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) whenever(smartspaceData.isValid()).thenReturn(false) // WHEN we have media that was recently played, but not currently active val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime()) mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent) verify(listener) - .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false)) + .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false)) // AND we get a smartspace signal runCurrent() @@ -625,14 +620,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { // THEN we should tell listeners to treat the media as active instead val dataCurrentAndActive = dataCurrent.copy(active = true) verify(listener) - .onMediaDataLoaded( - eq(KEY), - eq(KEY), - eq(dataCurrentAndActive), - eq(true), - eq(100), - eq(true) - ) + .onMediaDataLoaded(eq(dataCurrentAndActive.instanceId), eq(true), eq(100), eq(true)) assertThat( hasActiveMediaOrRecommendation( selectedUserEntries, @@ -642,7 +630,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { ) .isTrue() // Smartspace update shouldn't be propagated for the empty rec list. - verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean()) + verify(listener, never()).onSmartspaceMediaDataLoaded(any(), anyBoolean()) verify(logger, never()).logRecommendationAdded(any(), any()) verify(logger).logRecommendationActivated(eq(APP_UID), eq(PACKAGE), eq(INSTANCE_ID)) } @@ -652,12 +640,12 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) // WHEN we have media that was recently played, but not currently active val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime()) mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent) verify(listener) - .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false)) + .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false)) // AND we get a smartspace signal runCurrent() @@ -666,14 +654,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { // THEN we should tell listeners to treat the media as active instead val dataCurrentAndActive = dataCurrent.copy(active = true) verify(listener) - .onMediaDataLoaded( - eq(KEY), - eq(KEY), - eq(dataCurrentAndActive), - eq(true), - eq(100), - eq(true) - ) + .onMediaDataLoaded(eq(dataCurrentAndActive.instanceId), eq(true), eq(100), eq(true)) assertThat( hasActiveMediaOrRecommendation( selectedUserEntries, @@ -683,8 +664,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { ) .isTrue() // Smartspace update should also be propagated but not prioritized. - verify(listener) - .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false)) + verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false)) verify(logger).logRecommendationAdded(SMARTSPACE_PACKAGE, SMARTSPACE_INSTANCE_ID) verify(logger).logRecommendationActivated(eq(APP_UID), eq(PACKAGE), eq(INSTANCE_ID)) } @@ -694,7 +674,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY) @@ -716,25 +696,18 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime()) mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent) verify(listener) - .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false)) + .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false)) runCurrent() mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) val dataCurrentAndActive = dataCurrent.copy(active = true) verify(listener) - .onMediaDataLoaded( - eq(KEY), - eq(KEY), - eq(dataCurrentAndActive), - eq(true), - eq(100), - eq(true) - ) + .onMediaDataLoaded(eq(dataCurrentAndActive.instanceId), eq(true), eq(100), eq(true)) mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY) @@ -755,14 +728,13 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) whenever(mediaFlags.isPersistentSsCardEnabled()).thenReturn(true) whenever(smartspaceData.isActive).thenReturn(false) mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) - verify(listener) - .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false)) + verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false)) assertThat( hasActiveMediaOrRecommendation( selectedUserEntries, @@ -780,7 +752,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) whenever(mediaFlags.isPersistentSsCardEnabled()).thenReturn(true) whenever(smartspaceData.isActive).thenReturn(false) @@ -789,16 +761,15 @@ class MediaDataFilterImplTest : SysuiTestCase() { val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime()) mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent) verify(listener) - .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false)) + .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false)) + reset(listener) // And an inactive recommendation is loaded mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) // Smartspace is loaded but the media stays inactive - verify(listener) - .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false)) - verify(listener, never()) - .onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean()) + verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false)) + verify(listener, never()).onMediaDataLoaded(any(), anyBoolean(), anyInt(), anyBoolean()) assertThat( hasActiveMediaOrRecommendation( selectedUserEntries, @@ -835,12 +806,12 @@ class MediaDataFilterImplTest : SysuiTestCase() { testScope.runTest { val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries) val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData) - val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey) + val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId) // WHEN we have media that was recently played, but not currently active val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime()) mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent) verify(listener) - .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false)) + .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false)) // AND we get a smartspace signal with extra to trigger resume runCurrent() @@ -851,14 +822,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { // THEN we should tell listeners to treat the media as active instead val dataCurrentAndActive = dataCurrent.copy(active = true) verify(listener) - .onMediaDataLoaded( - eq(KEY), - eq(KEY), - eq(dataCurrentAndActive), - eq(true), - eq(100), - eq(true) - ) + .onMediaDataLoaded(eq(dataCurrentAndActive.instanceId), eq(true), eq(100), eq(true)) assertThat( hasActiveMediaOrRecommendation( selectedUserEntries, @@ -868,8 +832,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { ) .isTrue() // And send the smartspace data, but not prioritized - verify(listener) - .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false)) + verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false)) } @Test @@ -877,8 +840,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { // WHEN we have media that was recently played, but not currently active val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime()) mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent) - verify(listener) - .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false)) + verify(listener).onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false)) // AND we get a smartspace signal with extra to not trigger resume val extras = Bundle().apply { putBoolean(EXTRA_KEY_TRIGGER_RESUME, false) } @@ -886,32 +848,30 @@ class MediaDataFilterImplTest : SysuiTestCase() { mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) // THEN listeners are not updated to show media - verify(listener, never()) - .onMediaDataLoaded(eq(KEY), eq(KEY), any(), eq(true), eq(100), eq(true)) + verify(listener, never()).onMediaDataLoaded(any(), eq(true), eq(100), eq(true)) // But the smartspace update is still propagated - verify(listener) - .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false)) + verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false)) } private fun hasActiveMediaOrRecommendation( - entries: Map<String, MediaData>?, + entries: Map<InstanceId, MediaData>?, smartspaceMediaData: SmartspaceMediaData?, - reactivatedKey: String? + reactivatedId: InstanceId? ): Boolean { if (entries == null || smartspaceMediaData == null) { return false } return entries.any { it.value.active } || (smartspaceMediaData.isActive && - (smartspaceMediaData.isValid() || reactivatedKey != null)) + (smartspaceMediaData.isValid() || reactivatedId != null)) } - private fun hasActiveMedia(entries: Map<String, MediaData>?): Boolean { + private fun hasActiveMedia(entries: Map<InstanceId, MediaData>?): Boolean { return entries?.any { it.value.active } ?: false } private fun hasAnyMediaOrRecommendation( - entries: Map<String, MediaData>?, + entries: Map<InstanceId, MediaData>?, smartspaceMediaData: SmartspaceMediaData? ): Boolean { if (entries == null || smartspaceMediaData == null) { @@ -925,7 +885,7 @@ class MediaDataFilterImplTest : SysuiTestCase() { }) } - private fun hasAnyMedia(entries: Map<String, MediaData>?): Boolean { + private fun hasAnyMedia(entries: Map<InstanceId, MediaData>?): Boolean { return entries?.isNotEmpty() ?: false } } |