diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index 75b52f95d5bb1..299525207a601 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -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: diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 0ae1994bd3682..e6b0e4e98f981 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -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 mediaControllers = mediaSessionManager.getActiveSessions(null); + for (MediaController mediaController : mediaControllers) { + mediaController.getTransportControls().pause(); + } + } + void setActiveSource(int logicalAddress, int physicalAddress, String caller) { synchronized (mLock) { mActiveSource.logicalAddress = logicalAddress; diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java index e6b56ca3418f5..9f0d9829df014 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java @@ -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(