Loading packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManager.kt +12 −7 Original line number Diff line number Diff line Loading @@ -242,7 +242,6 @@ constructor( fun start() = bgExecutor.execute { if (!started) { // Fetch in case a suggestion already exists before registering for suggestions localMediaManager.registerCallback(this) if (!Flags.removeUnnecessaryRouteScanning()) { localMediaManager.startScan() Loading @@ -251,13 +250,19 @@ constructor( playbackType = controller?.playbackInfo?.playbackType ?: PLAYBACK_TYPE_UNKNOWN playbackVolumeControlId = controller?.playbackInfo?.volumeControlId controller?.registerCallback(this) if (enableSuggestedDeviceUi() && !isResumption) { suggestedDeviceManager.addListener(this) if (enableSuggestedDeviceUi()) { updateCurrent(notifyListeners = false) if (isResumption) { // Set the onSuggestionSpaceVisible callback only. updateSuggestion(state = null, notifyListeners = false) } else { suggestedDeviceManager.addListener(this) // Fetch in case a suggestion already exists before requesting a new one updateSuggestion( suggestedDeviceManager.getSuggestedDevice(), state = suggestedDeviceManager.getSuggestedDevice(), notifyListeners = false, ) } fgExecutor.execute { processMediaDeviceAndSuggestionData( key, Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt +11 −0 Original line number Diff line number Diff line Loading @@ -1185,6 +1185,9 @@ internal object MediaPlayerData { return } if (enableSuggestedDeviceUi()) { replaceVisiblePlayerKey(oldKey, newKey) } mediaData.remove(oldKey)?.let { // MediaPlayer should not be visible // no need to set isDismissed flag. Loading @@ -1197,6 +1200,14 @@ internal object MediaPlayerData { } } /** Changes the key in visibleMediaPlayers while preserving the order */ private fun replaceVisiblePlayerKey(oldKey: String, newKey: String) { val newVisibleMediaPlayers = visibleMediaPlayers.mapKeys { (key, _) -> if (key == oldKey) newKey else key } visibleMediaPlayers.clear() visibleMediaPlayers.putAll(newVisibleMediaPlayers) } fun getMediaControlPanel(visibleIndex: Int): MediaControlPanel? { return mediaPlayers[visiblePlayerKeys().elementAt(visibleIndex)] } Loading packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManagerTest.kt +17 −5 Original line number Diff line number Diff line Loading @@ -394,11 +394,23 @@ public class MediaDeviceManagerTest(flags: FlagsParameterization) : SysuiTestCas fakeBgExecutor.runAllReady() fakeFgExecutor.runAllReady() verify(listener, never()) .onMediaDeviceAndSuggestionDataChanged(eq(KEY), anyOrNull(), any(), any()) val data = captureDeviceData(KEY) assertThat(data.enabled).isTrue() assertThat(data.name).isEqualTo(DEVICE_NAME) val mediaDeviceCaptor = argumentCaptor<MediaDeviceData>() val suggestionCaptor = argumentCaptor<SuggestionData>() verify(listener) .onMediaDeviceAndSuggestionDataChanged( eq(KEY), eq(null), mediaDeviceCaptor.capture(), suggestionCaptor.capture(), ) val deviceData = mediaDeviceCaptor.firstValue assertThat(deviceData.enabled).isTrue() assertThat(deviceData.name).isEqualTo(DEVICE_NAME) assertThat(deviceData.icon).isEqualTo(icon) val suggestionData = suggestionCaptor.firstValue assertThat(suggestionData.suggestedMediaDeviceData).isNull() // The onSuggestionSpaceVisible should be set. assertThat(suggestionData.onSuggestionSpaceVisible).isNotNull() } @Test Loading packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerTest.kt +69 −0 Original line number Diff line number Diff line Loading @@ -392,6 +392,75 @@ class MediaCarouselControllerTest : SysuiTestCase() { ) } @EnableFlags(Flags.FLAG_ENABLE_SUGGESTED_DEVICE_UI) @Test fun testChangingPlayerKeys_visibleMediaPlayersUpdated() { verify(mediaDataManager).addListener(capture(listener)) val key1 = "key1" val key2 = "key2" val key3 = "key3" val newKey = "newKey" MediaPlayerData.addMediaPlayer( key1, DATA.copy( active = true, isPlaying = true, playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false, notificationKey = key1, ), panel, clock, ) MediaPlayerData.addMediaPlayer( key2, DATA.copy( active = true, isPlaying = false, playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = true, notificationKey = key2, ), panel, clock, ) MediaPlayerData.addMediaPlayer( key3, DATA.copy( active = true, isPlaying = false, playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = true, notificationKey = key1, ), panel, clock, ) assertEquals(listOf(key1, key2, key3), MediaPlayerData.visiblePlayerKeys().map { it.key }) // Replacing key2 with newKey. listener.value.onMediaDataLoaded( key = newKey, oldKey = key2, data = DATA.copy( active = true, isPlaying = false, playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false, ), ) runAllReady() // newKey has the same position as key2 used to have. assertEquals(listOf(key1, newKey, key3), MediaPlayerData.visiblePlayerKeys().map { it.key }) } @Test fun testSwipeDismiss_logged() { mediaCarouselController.mediaCarouselScrollHandler.dismissCallback.invoke() Loading Loading
packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManager.kt +12 −7 Original line number Diff line number Diff line Loading @@ -242,7 +242,6 @@ constructor( fun start() = bgExecutor.execute { if (!started) { // Fetch in case a suggestion already exists before registering for suggestions localMediaManager.registerCallback(this) if (!Flags.removeUnnecessaryRouteScanning()) { localMediaManager.startScan() Loading @@ -251,13 +250,19 @@ constructor( playbackType = controller?.playbackInfo?.playbackType ?: PLAYBACK_TYPE_UNKNOWN playbackVolumeControlId = controller?.playbackInfo?.volumeControlId controller?.registerCallback(this) if (enableSuggestedDeviceUi() && !isResumption) { suggestedDeviceManager.addListener(this) if (enableSuggestedDeviceUi()) { updateCurrent(notifyListeners = false) if (isResumption) { // Set the onSuggestionSpaceVisible callback only. updateSuggestion(state = null, notifyListeners = false) } else { suggestedDeviceManager.addListener(this) // Fetch in case a suggestion already exists before requesting a new one updateSuggestion( suggestedDeviceManager.getSuggestedDevice(), state = suggestedDeviceManager.getSuggestedDevice(), notifyListeners = false, ) } fgExecutor.execute { processMediaDeviceAndSuggestionData( key, Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt +11 −0 Original line number Diff line number Diff line Loading @@ -1185,6 +1185,9 @@ internal object MediaPlayerData { return } if (enableSuggestedDeviceUi()) { replaceVisiblePlayerKey(oldKey, newKey) } mediaData.remove(oldKey)?.let { // MediaPlayer should not be visible // no need to set isDismissed flag. Loading @@ -1197,6 +1200,14 @@ internal object MediaPlayerData { } } /** Changes the key in visibleMediaPlayers while preserving the order */ private fun replaceVisiblePlayerKey(oldKey: String, newKey: String) { val newVisibleMediaPlayers = visibleMediaPlayers.mapKeys { (key, _) -> if (key == oldKey) newKey else key } visibleMediaPlayers.clear() visibleMediaPlayers.putAll(newVisibleMediaPlayers) } fun getMediaControlPanel(visibleIndex: Int): MediaControlPanel? { return mediaPlayers[visiblePlayerKeys().elementAt(visibleIndex)] } Loading
packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDeviceManagerTest.kt +17 −5 Original line number Diff line number Diff line Loading @@ -394,11 +394,23 @@ public class MediaDeviceManagerTest(flags: FlagsParameterization) : SysuiTestCas fakeBgExecutor.runAllReady() fakeFgExecutor.runAllReady() verify(listener, never()) .onMediaDeviceAndSuggestionDataChanged(eq(KEY), anyOrNull(), any(), any()) val data = captureDeviceData(KEY) assertThat(data.enabled).isTrue() assertThat(data.name).isEqualTo(DEVICE_NAME) val mediaDeviceCaptor = argumentCaptor<MediaDeviceData>() val suggestionCaptor = argumentCaptor<SuggestionData>() verify(listener) .onMediaDeviceAndSuggestionDataChanged( eq(KEY), eq(null), mediaDeviceCaptor.capture(), suggestionCaptor.capture(), ) val deviceData = mediaDeviceCaptor.firstValue assertThat(deviceData.enabled).isTrue() assertThat(deviceData.name).isEqualTo(DEVICE_NAME) assertThat(deviceData.icon).isEqualTo(icon) val suggestionData = suggestionCaptor.firstValue assertThat(suggestionData.suggestedMediaDeviceData).isNull() // The onSuggestionSpaceVisible should be set. assertThat(suggestionData.onSuggestionSpaceVisible).isNotNull() } @Test Loading
packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerTest.kt +69 −0 Original line number Diff line number Diff line Loading @@ -392,6 +392,75 @@ class MediaCarouselControllerTest : SysuiTestCase() { ) } @EnableFlags(Flags.FLAG_ENABLE_SUGGESTED_DEVICE_UI) @Test fun testChangingPlayerKeys_visibleMediaPlayersUpdated() { verify(mediaDataManager).addListener(capture(listener)) val key1 = "key1" val key2 = "key2" val key3 = "key3" val newKey = "newKey" MediaPlayerData.addMediaPlayer( key1, DATA.copy( active = true, isPlaying = true, playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false, notificationKey = key1, ), panel, clock, ) MediaPlayerData.addMediaPlayer( key2, DATA.copy( active = true, isPlaying = false, playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = true, notificationKey = key2, ), panel, clock, ) MediaPlayerData.addMediaPlayer( key3, DATA.copy( active = true, isPlaying = false, playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = true, notificationKey = key1, ), panel, clock, ) assertEquals(listOf(key1, key2, key3), MediaPlayerData.visiblePlayerKeys().map { it.key }) // Replacing key2 with newKey. listener.value.onMediaDataLoaded( key = newKey, oldKey = key2, data = DATA.copy( active = true, isPlaying = false, playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false, ), ) runAllReady() // newKey has the same position as key2 used to have. assertEquals(listOf(key1, newKey, key3), MediaPlayerData.visiblePlayerKeys().map { it.key }) } @Test fun testSwipeDismiss_logged() { mediaCarouselController.mediaCarouselScrollHandler.dismissCallback.invoke() Loading