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.java14
2 files changed, 34 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
index b00ae9c6ee8a..e06a05e31152 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
@@ -148,7 +148,6 @@ public class HdmiCecMessageValidator {
addValidationInfo(Constants.MESSAGE_SET_MENU_LANGUAGE,
new AsciiValidator(3), DEST_BROADCAST);
- // TODO: Handle messages for the Deck Control.
addValidationInfo(
Constants.MESSAGE_DECK_CONTROL, new OneByteRangeValidator(0x01, 0x04), DEST_DIRECT);
addValidationInfo(
@@ -157,6 +156,7 @@ public class HdmiCecMessageValidator {
Constants.MESSAGE_GIVE_DECK_STATUS,
new OneByteRangeValidator(0x01, 0x03),
DEST_DIRECT);
+ addValidationInfo(Constants.MESSAGE_PLAY, new PlayModeValidator(), DEST_DIRECT);
// TODO: Handle messages for the Tuner Control.
@@ -871,4 +871,23 @@ public class HdmiCecMessageValidator {
return toErrorCode(isValidTimerStatusData(params, 0));
}
}
+
+ /**
+ * Check if the given play mode parameter is valid. A valid parameter should lie within the
+ * range description defined in CEC 1.4 Specification : Operand Descriptions (Section 17)
+ */
+ private class PlayModeValidator implements ParameterValidator {
+ @Override
+ public int isValid(byte[] params) {
+ if (params.length < 1) {
+ return ERROR_PARAMETER_SHORT;
+ }
+ return toErrorCode(isWithinRange(params[0], 0x05, 0x07)
+ || isWithinRange(params[0], 0x09, 0x0B)
+ || isWithinRange(params[0], 0x15, 0x17)
+ || isWithinRange(params[0], 0x19, 0x1B)
+ || isWithinRange(params[0], 0x24, 0x25)
+ || (params[0] == 0x20));
+ }
+ }
}
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 350ab2402470..6cc8db9957cd 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
@@ -388,6 +388,20 @@ public class HdmiCecMessageValidatorTest {
assertMessageValidity("40:1A:04").isEqualTo(ERROR_PARAMETER);
}
+ @Test
+ public void isValid_play() {
+ assertMessageValidity("40:41:16:E3").isEqualTo(OK);
+ assertMessageValidity("40:41:20").isEqualTo(OK);
+
+ assertMessageValidity("4F:41:16").isEqualTo(ERROR_DESTINATION);
+ assertMessageValidity("F0:41:20").isEqualTo(ERROR_SOURCE);
+ assertMessageValidity("40:41").isEqualTo(ERROR_PARAMETER_SHORT);
+ assertMessageValidity("40:41:04").isEqualTo(ERROR_PARAMETER);
+ assertMessageValidity("40:41:18").isEqualTo(ERROR_PARAMETER);
+ assertMessageValidity("40:41:23").isEqualTo(ERROR_PARAMETER);
+ assertMessageValidity("40:41:26").isEqualTo(ERROR_PARAMETER);
+ }
+
private IntegerSubject assertMessageValidity(String message) {
return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message)));
}