diff options
| author | 2021-02-09 17:27:19 +0100 | |
|---|---|---|
| committer | 2021-02-10 14:15:37 +0100 | |
| commit | 2c28c8f70df4918be21c3bfcaf9baa9154ebdb2d (patch) | |
| tree | 9dde39438da4e878d46809b496d8a79d56130b33 | |
| parent | 64454600c6f4ffad968e44b8c4fbd6e4d6a1bbc8 (diff) | |
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
3 files changed, 207 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index 75b52f95d5bb..299525207a60 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 0ae1994bd368..e6b0e4e98f98 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<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; 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 e6b56ca3418f..9f0d9829df01 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; @@ -97,6 +98,11 @@ public class HdmiCecLocalDevicePlaybackTest { } @Override + void pauseActiveMediaSessions() { + mActiveMediaSessionsPaused = true; + } + + @Override boolean isStandbyMessageReceived() { return mStandby; } @@ -392,6 +398,54 @@ public class HdmiCecLocalDevicePlaybackTest { } @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( HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, @@ -496,6 +550,52 @@ public class HdmiCecLocalDevicePlaybackTest { } @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 = HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x2100); @@ -831,6 +931,52 @@ public class HdmiCecLocalDevicePlaybackTest { } @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. mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue( @@ -1158,6 +1304,54 @@ public class HdmiCecLocalDevicePlaybackTest { } @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( HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE, |