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
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user