diff options
| -rw-r--r-- | services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java | 21 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java | 14 |
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))); } |