Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a7293cb authored by Hugh Chen's avatar Hugh Chen
Browse files

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
parent 0e7d09fc
Loading
Loading
Loading
Loading
+9 −1
Original line number Original line Diff line number Diff line
@@ -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;
                }
                }
            }
            }
+27 −0
Original line number Original line Diff line number Diff line
@@ -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,