From d1da284831ecfa5f86fa0410a65c0f25d9f983c1 Mon Sep 17 00:00:00 2001 From: Hugh Chen Date: Fri, 16 Oct 2020 16:08:48 +0800 Subject: [PATCH] Fix output switcher will show 2 media sessions in some use cases Before this CL, we didn't check whether the remote session existed in the list before. If the priority of a remote session is higher than a local session, it causes us to return the local session even if the list has a remote session. This CL uses a list to cache package names of remote sessions. If the local session has the same package name of the remote session then don't return the local session. Bug: 169052790 Test: make -j42 RunSettingsRoboTests Change-Id: I2726a3deb397f646e4c74a8c445dde6fafb694a8 Merged-In: I2726a3deb397f646e4c74a8c445dde6fafb694a8 (cherry picked from commit 3a7293cbbfa4f8af8e816de64541828b540bcc3d) --- .../settings/media/MediaOutputUtils.java | 10 ++++++- .../settings/media/MediaOutputUtilsTest.java | 27 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/media/MediaOutputUtils.java b/src/com/android/settings/media/MediaOutputUtils.java index b31d21f33c0..977c5178165 100644 --- a/src/com/android/settings/media/MediaOutputUtils.java +++ b/src/com/android/settings/media/MediaOutputUtils.java @@ -25,6 +25,9 @@ import androidx.annotation.Nullable; import com.android.settings.sound.MediaOutputPreferenceController; +import java.util.ArrayList; +import java.util.List; + /** * Utilities that can be shared between {@link MediaOutputIndicatorWorker} and * {@link MediaOutputPreferenceController}. @@ -43,6 +46,7 @@ public class MediaOutputUtils { MediaSessionManager mediaSessionManager) { MediaController localController = null; + final List remoteMediaSessionLists = new ArrayList<>(); for (MediaController controller : mediaSessionManager.getActiveSessions(null)) { final MediaController.PlaybackInfo pi = controller.getPlaybackInfo(); if (pi == null) { @@ -69,10 +73,14 @@ public class MediaOutputUtils { controller.getPackageName())) { localController = null; } + if (!remoteMediaSessionLists.contains(controller.getPackageName())) { + remoteMediaSessionLists.add(controller.getPackageName()); + } continue; } if (pi.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL) { - if (localController == null) { + if (localController == null + && !remoteMediaSessionLists.contains(controller.getPackageName())) { localController = controller; } } diff --git a/tests/robotests/src/com/android/settings/media/MediaOutputUtilsTest.java b/tests/robotests/src/com/android/settings/media/MediaOutputUtilsTest.java index 2daf207597d..dea6a2c81ab 100644 --- a/tests/robotests/src/com/android/settings/media/MediaOutputUtilsTest.java +++ b/tests/robotests/src/com/android/settings/media/MediaOutputUtilsTest.java @@ -115,6 +115,33 @@ public class MediaOutputUtilsTest { @Test public void getActiveLocalMediaController_bothHaveRemoteMediaAndLocalMedia_returnNull() { + mMediaControllers.clear(); + final MediaController.PlaybackInfo playbackInfo = new MediaController.PlaybackInfo( + MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE, + VolumeProvider.VOLUME_CONTROL_ABSOLUTE, + 100, + 10, + new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build(), + null); + final PlaybackState playbackState = new PlaybackState.Builder() + .setState(PlaybackState.STATE_PLAYING, 0, 1) + .build(); + final MediaController remoteMediaController = mock(MediaController.class); + + mMediaControllers.add(remoteMediaController); + mMediaControllers.add(mMediaController); + initPlayback(); + + when(mMediaController.getPlaybackInfo()).thenReturn(mPlaybackInfo); + when(mMediaController.getPlaybackState()).thenReturn(mPlaybackState); + when(remoteMediaController.getPlaybackInfo()).thenReturn(playbackInfo); + when(remoteMediaController.getPlaybackState()).thenReturn(playbackState); + + assertThat(MediaOutputUtils.getActiveLocalMediaController(mMediaSessionManager)).isNull(); + } + + @Test + public void getActiveLocalMediaController_bothHaveLocalMediaAndRemoteMedia_returnNull() { final MediaController.PlaybackInfo playbackInfo = new MediaController.PlaybackInfo( MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE, VolumeProvider.VOLUME_CONTROL_ABSOLUTE,