diff options
| author | 2023-08-15 11:18:09 +0000 | |
|---|---|---|
| committer | 2023-08-15 11:18:09 +0000 | |
| commit | 69dfec147e093041afc358d9a34c8b1c9ee3f968 (patch) | |
| tree | ac7bfe08ba1d6ad277539d5137ecd37c3ed8c837 | |
| parent | 6db8edf199fe1913b8dfb7a3e927cd1489130d19 (diff) | |
| parent | ddf298dda40277d5dc0b339459ab2b5e968b15f1 (diff) | |
Merge "HDMI: Do not change Active Source status on all <Routing Change> messages" into main
4 files changed, 55 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java index 77213bf256a6..b78f8a7d8ee7 100644 --- a/services/core/java/com/android/server/hdmi/Constants.java +++ b/services/core/java/com/android/server/hdmi/Constants.java @@ -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({ diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index dc416b24f3f3..824c8dbb144d 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -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()"); diff --git a/services/core/java/com/android/server/hdmi/SystemAudioAction.java b/services/core/java/com/android/server/hdmi/SystemAudioAction.java index e7a3db75c9d0..e96963b9ae3f 100644 --- a/services/core/java/com/android/server/hdmi/SystemAudioAction.java +++ b/services/core/java/com/android/server/hdmi/SystemAudioAction.java @@ -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() { 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 40c762c28194..dec89d90cea5 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java @@ -383,6 +383,47 @@ public class HdmiCecLocalDevicePlaybackTest { } @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( HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, |