diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java index 46913227ff7e2..be0f26b7ff50c 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java @@ -163,6 +163,10 @@ public class HdmiCecMessageValidator { Constants.MESSAGE_SELECT_ANALOG_SERVICE, new SelectAnalogueServiceValidator(), DEST_DIRECT); + addValidationInfo( + Constants.MESSAGE_SELECT_DIGITAL_SERVICE, + new SelectDigitalServiceValidator(), + DEST_DIRECT); // Messages for the Vendor Specific Commands. VariableLengthValidator maxLengthValidator = new VariableLengthValidator(0, 14); @@ -911,4 +915,19 @@ public class HdmiCecMessageValidator { && isValidBroadcastSystem(params[3])); } } + + /** + * Check if the given select digital service parameter is valid. A valid parameter should lie + * within the range description defined in CEC 1.4 Specification : Operand Descriptions + * (Section 17) + */ + private class SelectDigitalServiceValidator implements ParameterValidator { + @Override + public int isValid(byte[] params) { + if (params.length < 4) { + return ERROR_PARAMETER_SHORT; + } + return toErrorCode(isValidDigitalServiceIdentification(params, 0)); + } + } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java index e69fa15741548..ec7105872a5f1 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java @@ -425,6 +425,32 @@ public class HdmiCecMessageValidatorTest { assertMessageValidity("40:92:02:EA:60:20").isEqualTo(ERROR_PARAMETER); } + @Test + public void isValid_selectDigitalService() { + assertMessageValidity("40:93:00:11:CE:90:0F:00:78").isEqualTo(OK); + assertMessageValidity("40:93:10:13:0B:34:38").isEqualTo(OK); + assertMessageValidity("40:93:9A:06:F9:D3:E6").isEqualTo(OK); + assertMessageValidity("40:93:91:09:F4:40:C8").isEqualTo(OK); + + assertMessageValidity("4F:93:00:11:CE:90:0F:00:78").isEqualTo(ERROR_DESTINATION); + assertMessageValidity("F0:93:10:13:0B:34:38").isEqualTo(ERROR_SOURCE); + assertMessageValidity("40:93:9A:06:F9").isEqualTo(ERROR_PARAMETER_SHORT); + // Invalid Digital Broadcast System + assertMessageValidity("40:93:14:11:CE:90:0F:00:78").isEqualTo(ERROR_PARAMETER); + // Invalid Digital Broadcast System + assertMessageValidity("40:93:A0:07:95:F1").isEqualTo(ERROR_PARAMETER); + // Insufficient data for ARIB Broadcast system + assertMessageValidity("40:93:00:11:CE:90:0F:00").isEqualTo(ERROR_PARAMETER); + // Insufficient data for ATSC Broadcast system + assertMessageValidity("40:93:10:13:0B:34").isEqualTo(ERROR_PARAMETER); + // Insufficient data for DVB Broadcast system + assertMessageValidity("40:93:18:BE:77:00:7D:01").isEqualTo(ERROR_PARAMETER); + // Invalid channel number format + assertMessageValidity("40:93:9A:10:F9:D3").isEqualTo(ERROR_PARAMETER); + // Insufficient data for 2 part channel number + assertMessageValidity("40:93:91:09:F4:40").isEqualTo(ERROR_PARAMETER); + } + private IntegerSubject assertMessageValidity(String message) { return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message))); }