Loading services/core/java/com/android/server/hdmi/Constants.java +1 −1 Original line number Diff line number Diff line Loading @@ -357,7 +357,7 @@ final class Constants { static final int INVALID_PORT_ID = HdmiDeviceInfo.PORT_INVALID; static final int INVALID_PHYSICAL_ADDRESS = HdmiDeviceInfo.PATH_INVALID; static final int PATH_INTERNAL = HdmiDeviceInfo.PATH_INTERNAL; static final int TV_PHYSICAL_ADDRESS = HdmiDeviceInfo.PATH_INTERNAL; // The relationship from one path (physical address) to another. @IntDef({ Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +12 −0 Original line number Diff line number Diff line Loading @@ -518,6 +518,18 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { @ServiceThreadOnly protected void handleRoutingChangeAndInformation(int physicalAddress, HdmiCecMessage message) { assertRunOnServiceThread(); // If the device is active source and received a <Routing Change> or <Routing Information> // message to a physical address in the same active path do not change the Active Source // status. // E.g. TV [0.0.0.0] ------ Switch [2.0.0.0] ------ OTT [2.1.0.0] (Active Source) // TV sends <Routing Change>[2.0.0.0] -> OTT is still Active Source // TV sends <Routing Change>[0.0.0.0] -> OTT is not Active Source anymore. // TV sends <Routing Change>[3.0.0.0] -> OTT is not Active Source anymore. if (HdmiUtils.isInActiveRoutingPath(mService.getPhysicalAddress(), physicalAddress) && physicalAddress != Constants.TV_PHYSICAL_ADDRESS && isActiveSource()) { return; } if (physicalAddress != mService.getPhysicalAddress()) { setActiveSource(physicalAddress, "HdmiCecLocalDevicePlayback#handleRoutingChangeAndInformation()"); Loading services/core/java/com/android/server/hdmi/SystemAudioAction.java +1 −1 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ abstract class SystemAudioAction extends HdmiCecFeatureAction { } int param = tv().getActivePath(); return param != Constants.INVALID_PHYSICAL_ADDRESS ? param : Constants.PATH_INTERNAL; ? param : Constants.TV_PHYSICAL_ADDRESS; } private void handleSendSystemAudioModeRequestTimeout() { Loading services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +41 −0 Original line number Diff line number Diff line Loading @@ -382,6 +382,47 @@ public class HdmiCecLocalDevicePlaybackTest { assertThat(mPowerManager.isInteractive()).isFalse(); } @Test public void handleRoutingChange_toSwitchInActivePath_noStandby() { int newPlaybackPhysicalAddress = 0x2100; int switchPhysicalAddress = 0x2000; mNativeWrapper.setPhysicalAddress(newPlaybackPhysicalAddress); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue( HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW); mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, newPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mTestLooper.dispatchAll(); HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, newPlaybackPhysicalAddress, switchPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)) .isEqualTo(Constants.HANDLED); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mPowerManager.isInteractive()).isTrue(); } @Test public void handleRoutingChange_toTv_StandbyNow() { mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue( HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW); mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mTestLooper.dispatchAll(); HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, mPlaybackPhysicalAddress, Constants.TV_PHYSICAL_ADDRESS); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)) .isEqualTo(Constants.HANDLED); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mPowerManager.isInteractive()).isFalse(); } @Test public void handleRoutingChange_otherDevice_StandbyNow_InactiveSource() { mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue( Loading Loading
services/core/java/com/android/server/hdmi/Constants.java +1 −1 Original line number Diff line number Diff line Loading @@ -357,7 +357,7 @@ final class Constants { static final int INVALID_PORT_ID = HdmiDeviceInfo.PORT_INVALID; static final int INVALID_PHYSICAL_ADDRESS = HdmiDeviceInfo.PATH_INVALID; static final int PATH_INTERNAL = HdmiDeviceInfo.PATH_INTERNAL; static final int TV_PHYSICAL_ADDRESS = HdmiDeviceInfo.PATH_INTERNAL; // The relationship from one path (physical address) to another. @IntDef({ Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +12 −0 Original line number Diff line number Diff line Loading @@ -518,6 +518,18 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { @ServiceThreadOnly protected void handleRoutingChangeAndInformation(int physicalAddress, HdmiCecMessage message) { assertRunOnServiceThread(); // If the device is active source and received a <Routing Change> or <Routing Information> // message to a physical address in the same active path do not change the Active Source // status. // E.g. TV [0.0.0.0] ------ Switch [2.0.0.0] ------ OTT [2.1.0.0] (Active Source) // TV sends <Routing Change>[2.0.0.0] -> OTT is still Active Source // TV sends <Routing Change>[0.0.0.0] -> OTT is not Active Source anymore. // TV sends <Routing Change>[3.0.0.0] -> OTT is not Active Source anymore. if (HdmiUtils.isInActiveRoutingPath(mService.getPhysicalAddress(), physicalAddress) && physicalAddress != Constants.TV_PHYSICAL_ADDRESS && isActiveSource()) { return; } if (physicalAddress != mService.getPhysicalAddress()) { setActiveSource(physicalAddress, "HdmiCecLocalDevicePlayback#handleRoutingChangeAndInformation()"); Loading
services/core/java/com/android/server/hdmi/SystemAudioAction.java +1 −1 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ abstract class SystemAudioAction extends HdmiCecFeatureAction { } int param = tv().getActivePath(); return param != Constants.INVALID_PHYSICAL_ADDRESS ? param : Constants.PATH_INTERNAL; ? param : Constants.TV_PHYSICAL_ADDRESS; } private void handleSendSystemAudioModeRequestTimeout() { Loading
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +41 −0 Original line number Diff line number Diff line Loading @@ -382,6 +382,47 @@ public class HdmiCecLocalDevicePlaybackTest { assertThat(mPowerManager.isInteractive()).isFalse(); } @Test public void handleRoutingChange_toSwitchInActivePath_noStandby() { int newPlaybackPhysicalAddress = 0x2100; int switchPhysicalAddress = 0x2000; mNativeWrapper.setPhysicalAddress(newPlaybackPhysicalAddress); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue( HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW); mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, newPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mTestLooper.dispatchAll(); HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, newPlaybackPhysicalAddress, switchPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)) .isEqualTo(Constants.HANDLED); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mPowerManager.isInteractive()).isTrue(); } @Test public void handleRoutingChange_toTv_StandbyNow() { mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue( HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW); mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mTestLooper.dispatchAll(); HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, mPlaybackPhysicalAddress, Constants.TV_PHYSICAL_ADDRESS); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)) .isEqualTo(Constants.HANDLED); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mPowerManager.isInteractive()).isFalse(); } @Test public void handleRoutingChange_otherDevice_StandbyNow_InactiveSource() { mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue( Loading