diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index fa1fb48ce1245710c0e8db11b24f1b3859baeec5..d014f149e8318147ba245ff43e60ae5fe33b229e 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 fcbd89781de4bb6eab6b746f235374fecaf6c90a..1958cb01b5107f55d600a1b6105f5da22e627e0c 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 be584d7b45914a8449fb14b86debfb9583f4bf26..462f3e32ab3bb47113f95eb2559fe61725c9cc8f 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;