diff options
3 files changed, 54 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index fa1fb48ce124..d014f149e831 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -774,8 +774,14 @@ public class HdmiControlService extends SystemService { private void initializeCec(int initiatedBy) { mAddressAllocated = false; - mCecVersion = getHdmiCecConfig().getIntValue( + int settingsCecVersion = getHdmiCecConfig().getIntValue( HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION); + int supportedCecVersion = mCecController.getVersion(); + + // Limit the used CEC version to the highest supported version by HAL and selected + // version in settings (but at least v1.4b). + mCecVersion = Math.max(HdmiControlManager.HDMI_CEC_VERSION_1_4_B, + Math.min(settingsCecVersion, supportedCecVersion)); mCecController.setOption(OptionKey.SYSTEM_CEC_CONTROL, true); mCecController.setLanguage(mMenuLanguage); @@ -2184,6 +2190,7 @@ public class HdmiControlService extends SystemService { pw.println("mProhibitMode: " + mProhibitMode); pw.println("mPowerStatus: " + mPowerStatusController.getPowerStatus()); + pw.println("mCecVersion: " + mCecVersion); // System settings pw.println("System_settings:"); diff --git a/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java b/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java index fcbd89781de4..1958cb01b510 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java @@ -58,6 +58,7 @@ final class FakeNativeWrapper implements NativeWrapper { private int mMyPhysicalAddress = 0; private HdmiPortInfo[] mHdmiPortInfo = null; private HdmiCecController.HdmiCecCallback mCallback = null; + private int mCecVersion = HdmiControlManager.HDMI_CEC_VERSION_2_0; @Override public String nativeInit() { @@ -96,7 +97,7 @@ final class FakeNativeWrapper implements NativeWrapper { @Override public int nativeGetVersion() { - return HdmiControlManager.HDMI_CEC_VERSION_2_0; + return mCecVersion; } @Override @@ -132,6 +133,10 @@ final class FakeNativeWrapper implements NativeWrapper { mPortConnectionStatus.put(port, connected); } + public void setCecVersion(@HdmiControlManager.HdmiCecVersion int cecVersion) { + mCecVersion = cecVersion; + } + public void onCecMessage(HdmiCecMessage hdmiCecMessage) { if (mCallback == null) { return; diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java index be584d7b4591..462f3e32ab3b 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java @@ -49,6 +49,7 @@ import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -622,6 +623,45 @@ public class HdmiControlServiceTest { assertEquals(runnerUid, Binder.getCallingWorkSourceUid()); } + @Ignore("b/180499471") + @Test + public void initCecVersion_limitToMinimumSupportedVersion() { + mHdmiControlService.getHdmiCecConfig().setIntValue( + HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, + HdmiControlManager.HDMI_CEC_VERSION_2_0); + mNativeWrapper.setCecVersion(HdmiControlManager.HDMI_CEC_VERSION_1_4_B); + + mHdmiControlService.initService(); + assertThat(mHdmiControlService.getCecVersion()).isEqualTo( + HdmiControlManager.HDMI_CEC_VERSION_1_4_B); + } + + @Ignore("b/180499471") + @Test + public void initCecVersion_limitToAtLeast1_4() { + mHdmiControlService.getHdmiCecConfig().setIntValue( + HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, + HdmiControlManager.HDMI_CEC_VERSION_2_0); + mNativeWrapper.setCecVersion(0x0); + + mHdmiControlService.initService(); + assertThat(mHdmiControlService.getCecVersion()).isEqualTo( + HdmiControlManager.HDMI_CEC_VERSION_1_4_B); + } + + @Ignore("b/180499471") + @Test + public void initCecVersion_useHighestMatchingVersion() { + mHdmiControlService.getHdmiCecConfig().setIntValue( + HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, + HdmiControlManager.HDMI_CEC_VERSION_2_0); + mNativeWrapper.setCecVersion(HdmiControlManager.HDMI_CEC_VERSION_2_0); + + mHdmiControlService.initService(); + assertThat(mHdmiControlService.getCecVersion()).isEqualTo( + HdmiControlManager.HDMI_CEC_VERSION_2_0); + } + private static class VolumeControlFeatureCallback extends IHdmiCecVolumeControlFeatureListener.Stub { boolean mCallbackReceived = false; |
