Merge "Pause media sessions on playback device when losing active source" into sc-dev

This commit is contained in:
Yan Han
2021-02-10 15:43:42 +00:00
committed by Android (Google) Code Review
3 changed files with 207 additions and 0 deletions

View File

@@ -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:

View File

@@ -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;

View File

@@ -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(