Merge "Handle losing Active Source to non-CEC device"

This commit is contained in:
Michal Olech
2020-08-07 14:30:48 +00:00
committed by Android (Google) Code Review
3 changed files with 186 additions and 15 deletions

View File

@@ -232,11 +232,12 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
mAutoTvOff = enabled;
}
@Override
@ServiceThreadOnly
@VisibleForTesting
void setIsActiveSource(boolean on) {
assertRunOnServiceThread();
mIsActiveSource = on;
super.setIsActiveSource(on);
if (on) {
getWakeLock().acquire();
} else {
@@ -274,19 +275,15 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
@Override
@ServiceThreadOnly
protected boolean handleActiveSource(HdmiCecMessage message) {
super.handleActiveSource(message);
if (mIsActiveSource) {
return true;
}
protected void onActiveSourceLost() {
assertRunOnServiceThread();
switch (mPowerStateChangeOnActiveSourceLost) {
case STANDBY_NOW:
mService.standby();
return true;
return;
case NONE:
return true;
return;
}
return true;
}
@ServiceThreadOnly
@@ -398,9 +395,12 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
}
@Override
@ServiceThreadOnly
protected void handleRoutingChangeAndInformation(int physicalAddress, HdmiCecMessage message) {
assertRunOnServiceThread();
if (physicalAddress != mService.getPhysicalAddress()) {
return; // Do nothing.
setActiveSource(physicalAddress);
return;
}
switch (mPlaybackDeviceActionOnRoutingControl) {
case WAKE_UP_AND_SEND_ACTIVE_SOURCE:

View File

@@ -113,6 +113,19 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
addAndStartAction(action);
}
@ServiceThreadOnly
protected void onActiveSourceLost() {
// Nothing to do.
}
@ServiceThreadOnly
protected void setActiveSource(int physicalAddress) {
assertRunOnServiceThread();
// Invalidate the internal active source record. This will also update mIsActiveSource.
ActiveSource activeSource = ActiveSource.of(Constants.ADDR_INVALID, physicalAddress);
setActiveSource(activeSource);
}
@ServiceThreadOnly
protected boolean handleActiveSource(HdmiCecMessage message) {
assertRunOnServiceThread();
@@ -148,6 +161,9 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
if (physicalAddress == mService.getPhysicalAddress() && mService.isPlaybackDevice()) {
setAndBroadcastActiveSource(message, physicalAddress);
}
if (physicalAddress != mService.getPhysicalAddress()) {
setActiveSource(physicalAddress);
}
switchInputOnReceivingNewActivePath(physicalAddress);
return true;
}
@@ -156,18 +172,21 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
@ServiceThreadOnly
protected boolean handleRoutingChange(HdmiCecMessage message) {
assertRunOnServiceThread();
int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams(), 2);
if (physicalAddress != mService.getPhysicalAddress()) {
setActiveSource(physicalAddress);
}
if (!isRoutingControlFeatureEnabled()) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
return true;
}
int newPath = HdmiUtils.twoBytesToInt(message.getParams(), 2);
// if the current device is a pure playback device
if (!mIsSwitchDevice
&& newPath == mService.getPhysicalAddress()
&& physicalAddress == mService.getPhysicalAddress()
&& mService.isPlaybackDevice()) {
setAndBroadcastActiveSource(message, newPath);
setAndBroadcastActiveSource(message, physicalAddress);
}
handleRoutingChangeAndInformation(newPath, message);
handleRoutingChangeAndInformation(physicalAddress, message);
return true;
}
@@ -175,11 +194,14 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
@ServiceThreadOnly
protected boolean handleRoutingInformation(HdmiCecMessage message) {
assertRunOnServiceThread();
int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
if (physicalAddress != mService.getPhysicalAddress()) {
setActiveSource(physicalAddress);
}
if (!isRoutingControlFeatureEnabled()) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
return true;
}
int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
// if the current device is a pure playback device
if (!mIsSwitchDevice
&& physicalAddress == mService.getPhysicalAddress()
@@ -222,7 +244,11 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
@ServiceThreadOnly
void setIsActiveSource(boolean on) {
assertRunOnServiceThread();
boolean wasActiveSource = mIsActiveSource;
mIsActiveSource = on;
if (wasActiveSource && !mIsActiveSource) {
onActiveSourceLost();
}
}
protected void wakeUpIfActiveSource() {

View File

@@ -262,6 +262,112 @@ public class HdmiCecLocalDevicePlaybackTest {
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
}
@Test
public void handleRoutingChange_otherDevice_None() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
mStandby = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
assertThat(mStandby).isFalse();
}
@Test
public void handleRoutingChange_otherDevice_StandbyNow() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
mStandby = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
assertThat(mStandby).isTrue();
}
@Test
public void handleRoutingChange_otherDevice_StandbyNow_InactiveSource() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
mHdmiCecLocalDevicePlayback.setIsActiveSource(false);
mStandby = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
assertThat(mStandby).isFalse();
}
@Test
public void handleRoutingChange_sameDevice_StandbyNow_ActiveSource() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
mStandby = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue();
assertThat(mStandby).isFalse();
}
@Test
public void handleRoutingInformation_otherDevice_None() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
mStandby = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
assertThat(mStandby).isFalse();
}
@Test
public void handleRoutingInformation_otherDevice_StandbyNow() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
mStandby = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
assertThat(mStandby).isTrue();
}
@Test
public void handleRoutingInformation_otherDevice_StandbyNow_InactiveSource() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
mHdmiCecLocalDevicePlayback.setIsActiveSource(false);
mStandby = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
assertThat(mStandby).isFalse();
}
@Test
public void handleRoutingInformation_sameDevice_StandbyNow_ActiveSource() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
mStandby = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue();
assertThat(mStandby).isFalse();
}
// Playback device does not handle routing control related feature right now
@Ignore("b/120845532")
@Test
@@ -629,4 +735,43 @@ public class HdmiCecLocalDevicePlaybackTest {
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress());
assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue();
}
@Test
public void handleSetStreamPath_otherDevice_None() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
mStandby = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
assertThat(mStandby).isFalse();
}
@Test
public void handleSetStreamPath_otherDevice_StandbyNow() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
mStandby = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
assertThat(mStandby).isTrue();
}
@Test
public void handleSetStreamPath_otherDevice_StandbyNow_InactiveSource() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
mHdmiCecLocalDevicePlayback.setIsActiveSource(false);
mStandby = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
assertThat(mStandby).isFalse();
}
}