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
This commit is contained in:
@@ -25,6 +25,9 @@ import androidx.annotation.Nullable;
|
|||||||
|
|
||||||
import com.android.settings.sound.MediaOutputPreferenceController;
|
import com.android.settings.sound.MediaOutputPreferenceController;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities that can be shared between {@link MediaOutputIndicatorWorker} and
|
* Utilities that can be shared between {@link MediaOutputIndicatorWorker} and
|
||||||
* {@link MediaOutputPreferenceController}.
|
* {@link MediaOutputPreferenceController}.
|
||||||
@@ -43,6 +46,7 @@ public class MediaOutputUtils {
|
|||||||
MediaSessionManager mediaSessionManager) {
|
MediaSessionManager mediaSessionManager) {
|
||||||
|
|
||||||
MediaController localController = null;
|
MediaController localController = null;
|
||||||
|
final List<String> remoteMediaSessionLists = new ArrayList<>();
|
||||||
for (MediaController controller : mediaSessionManager.getActiveSessions(null)) {
|
for (MediaController controller : mediaSessionManager.getActiveSessions(null)) {
|
||||||
final MediaController.PlaybackInfo pi = controller.getPlaybackInfo();
|
final MediaController.PlaybackInfo pi = controller.getPlaybackInfo();
|
||||||
if (pi == null) {
|
if (pi == null) {
|
||||||
@@ -69,10 +73,14 @@ public class MediaOutputUtils {
|
|||||||
controller.getPackageName())) {
|
controller.getPackageName())) {
|
||||||
localController = null;
|
localController = null;
|
||||||
}
|
}
|
||||||
|
if (!remoteMediaSessionLists.contains(controller.getPackageName())) {
|
||||||
|
remoteMediaSessionLists.add(controller.getPackageName());
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (pi.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL) {
|
if (pi.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL) {
|
||||||
if (localController == null) {
|
if (localController == null
|
||||||
|
&& !remoteMediaSessionLists.contains(controller.getPackageName())) {
|
||||||
localController = controller;
|
localController = controller;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -115,6 +115,33 @@ public class MediaOutputUtilsTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getActiveLocalMediaController_bothHaveRemoteMediaAndLocalMedia_returnNull() {
|
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(
|
final MediaController.PlaybackInfo playbackInfo = new MediaController.PlaybackInfo(
|
||||||
MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE,
|
MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE,
|
||||||
VolumeProvider.VOLUME_CONTROL_ABSOLUTE,
|
VolumeProvider.VOLUME_CONTROL_ABSOLUTE,
|
||||||
|
Reference in New Issue
Block a user