summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java21
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java16
2 files changed, 37 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
index a3ae72e18961..46913227ff7e 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
@@ -159,6 +159,10 @@ public class HdmiCecMessageValidator {
// TODO: Handle messages for the Tuner Control.
addValidationInfo(
Constants.MESSAGE_GIVE_TUNER_DEVICE_STATUS, statusRequestValidator, DEST_DIRECT);
+ addValidationInfo(
+ Constants.MESSAGE_SELECT_ANALOG_SERVICE,
+ new SelectAnalogueServiceValidator(),
+ DEST_DIRECT);
// Messages for the Vendor Specific Commands.
VariableLengthValidator maxLengthValidator = new VariableLengthValidator(0, 14);
@@ -890,4 +894,21 @@ public class HdmiCecMessageValidator {
|| (params[0] == 0x20));
}
}
+
+ /**
+ * Check if the given select analogue 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 SelectAnalogueServiceValidator implements ParameterValidator {
+ @Override
+ public int isValid(byte[] params) {
+ if (params.length < 4) {
+ return ERROR_PARAMETER_SHORT;
+ }
+ return toErrorCode(isValidAnalogueBroadcastType(params[0])
+ && isValidAnalogueFrequency(HdmiUtils.twoBytesToInt(params, 1))
+ && isValidBroadcastSystem(params[3]));
+ }
+ }
}
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 5b31f8c18660..e69fa1574154 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
@@ -409,6 +409,22 @@ public class HdmiCecMessageValidatorTest {
assertMessageValidity("40:41:26").isEqualTo(ERROR_PARAMETER);
}
+ @Test
+ public void isValid_selectAnalogueService() {
+ assertMessageValidity("40:92:00:13:0F:00:96").isEqualTo(OK);
+ assertMessageValidity("40:92:02:EA:60:1F").isEqualTo(OK);
+
+ assertMessageValidity("4F:92:00:13:0F:00").isEqualTo(ERROR_DESTINATION);
+ assertMessageValidity("F0:92:02:EA:60:1F").isEqualTo(ERROR_SOURCE);
+ assertMessageValidity("40:92:00:13:0F").isEqualTo(ERROR_PARAMETER_SHORT);
+ // Invalid Analogue Broadcast type
+ assertMessageValidity("40:92:03:EA:60:1F").isEqualTo(ERROR_PARAMETER);
+ // Invalid Analogue Frequency
+ assertMessageValidity("40:92:00:FF:FF:00").isEqualTo(ERROR_PARAMETER);
+ // Invalid Broadcast system
+ assertMessageValidity("40:92:02:EA:60:20").isEqualTo(ERROR_PARAMETER);
+ }
+
private IntegerSubject assertMessageValidity(String message) {
return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message)));
}