From 3a7293cbbfa4f8af8e816de64541828b540bcc3d 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 session in some use cases Before this CL, we didn't check whether the remote session existed in the list before. If priority of remote session is higher than 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 --- .../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,