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

Commit 2c28c8f7 authored by Yan Han's avatar Yan Han
Browse files

Pause media sessions on playback device when losing active source

Test: atest HdmiCecLocalDevicePlaybackTest
manually on ADT-3 with YouTube and Play Movies

Bug: 156366840
Change-Id: I00aa80e71aca25e496ca5546ee811a1872284a0b
parent 64454600
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -239,6 +239,7 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
    @ServiceThreadOnly
    protected void onActiveSourceLost() {
        assertRunOnServiceThread();
        mService.pauseActiveMediaSessions();
        switch (mService.getHdmiCecConfig().getStringValue(
                    HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST)) {
            case HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW:
+12 −0
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@ import android.hardware.hdmi.IHdmiVendorCommandListener;
import android.hardware.tv.cec.V1_0.OptionKey;
import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.media.AudioManager;
import android.media.session.MediaController;
import android.media.session.MediaSessionManager;
import android.media.tv.TvInputManager;
import android.media.tv.TvInputManager.TvInputCallback;
import android.net.Uri;
@@ -3294,6 +3296,16 @@ public class HdmiControlService extends SystemService {
        }
    }

    @VisibleForTesting
    void pauseActiveMediaSessions() {
        MediaSessionManager mediaSessionManager = getContext()
                .getSystemService(MediaSessionManager.class);
        List<MediaController> mediaControllers = mediaSessionManager.getActiveSessions(null);
        for (MediaController mediaController : mediaControllers) {
            mediaController.getTransportControls().pause();
        }
    }

    void setActiveSource(int logicalAddress, int physicalAddress, String caller) {
        synchronized (mLock) {
            mActiveSource.logicalAddress = logicalAddress;
+194 −0
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ public class HdmiCecLocalDevicePlaybackTest {
    private int mPlaybackLogicalAddress;
    private boolean mWokenUp;
    private boolean mStandby;
    private boolean mActiveMediaSessionsPaused;

    @Mock
    private IPowerManager mIPowerManagerMock;
@@ -96,6 +97,11 @@ public class HdmiCecLocalDevicePlaybackTest {
                        mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
                    }

                    @Override
                    void pauseActiveMediaSessions() {
                        mActiveMediaSessionsPaused = true;
                    }

                    @Override
                    boolean isStandbyMessageReceived() {
                        return mStandby;
@@ -391,6 +397,54 @@ public class HdmiCecLocalDevicePlaybackTest {
        assertThat(mStandby).isFalse();
    }

    @Test
    public void handleRoutingChange_otherDevice_ActiveSource_mediaSessionsPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
                0x5000);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isTrue();
    }

    @Test
    public void handleRoutingChange_otherDevice_InactiveSource_mediaSessionsNotPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
                0x5000);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isFalse();
    }

    @Test
    public void handleRoutingChange_sameDevice_ActiveSource_mediaSessionsNotPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
                mPlaybackPhysicalAddress);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isFalse();
    }

    @Test
    public void handleRoutingChange_sameDevice_InactiveSource_mediaSessionsNotPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
                mPlaybackPhysicalAddress);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isFalse();
    }

    @Test
    public void handleRoutingInformation_otherDevice_None() {
        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
@@ -495,6 +549,52 @@ public class HdmiCecLocalDevicePlaybackTest {
        assertThat(mStandby).isFalse();
    }

    @Test
    public void handleRoutingInformation_otherDevice_ActiveSource_mediaSessionsPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isTrue();
    }

    @Test
    public void handleRoutingInformation_otherDevice_InactiveSource_mediaSessionsNotPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isFalse();
    }

    @Test
    public void handleRoutingInformation_sameDevice_ActiveSource_mediaSessionsNotPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, mPlaybackPhysicalAddress);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isFalse();
    }

    @Test
    public void handleRoutingInformation_sameDevice_InactiveSource_mediaSessionsNotPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, mPlaybackPhysicalAddress);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isFalse();
    }

    @Test
    public void handleSetStreamPath() {
        HdmiCecMessage message =
@@ -830,6 +930,52 @@ public class HdmiCecLocalDevicePlaybackTest {
        assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
    }

    @Test
    public void handleActiveSource_otherDevice_ActiveSource_mediaSessionsPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isTrue();
    }

    @Test
    public void handleActiveSource_otherDevice_InactiveSource_mediaSessionsNotPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isFalse();
    }

    @Test
    public void handleActiveSource_sameDevice_ActiveSource_mediaSessionsNotPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
                mPlaybackPhysicalAddress);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isFalse();
    }

    @Test
    public void handleActiveSource_sameDevice_InactiveSource_mediaSessionsNotPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
                mPlaybackPhysicalAddress);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isFalse();
    }

    @Test
    public void losingActiveSource_standbyNow_verifyStandbyMessageIsSentOnNextStandby() {
        // As described in b/161097846.
@@ -1157,6 +1303,54 @@ public class HdmiCecLocalDevicePlaybackTest {
        assertThat(mStandby).isFalse();
    }

    @Test
    public void handleSetStreamPath_otherDevice_ActiveSource_mediaSessionsPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isTrue();
    }

    @Test
    public void handleSetStreamPath_otherDevice_InactiveSource_mediaSessionsNotPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isFalse();
    }

    @Test
    public void handleSetStreamPath_sameDevice_ActiveSource_mediaSessionsNotPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, mPlaybackPhysicalAddress);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isFalse();
    }

    @Test
    public void handleSetStreamPath_sameDevice_InactiveSource_mediaSessionsNotPaused() {
        mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                "HdmiCecLocalDevicePlaybackTest");
        mActiveMediaSessionsPaused = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, mPlaybackPhysicalAddress);
        mHdmiCecLocalDevicePlayback.dispatchMessage(message);
        mTestLooper.dispatchAll();
        assertThat(mActiveMediaSessionsPaused).isFalse();
    }

    @Test
    public void oneTouchPlay_SendStandbyOnSleepToTv() {
        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(