From 5ea0ca572ecb6633d035e2cea5427a600747e639 Mon Sep 17 00:00:00 2001 From: Shraddha Basantwani Date: Mon, 2 Nov 2020 15:10:20 +0530 Subject: [PATCH] CEC : Add validator for play message Test: atest HdmiCecMessageValidatorTest Bug: 170811408 Change-Id: Ie81c995b418dee5f9d3682c10b1071f56b661e7a --- .../server/hdmi/HdmiCecMessageValidator.java | 21 ++++++++++++++++++- .../hdmi/HdmiCecMessageValidatorTest.java | 14 +++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java index b00ae9c6ee8ad..e06a05e31152d 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 350ab24024704..6cc8db9957cdb 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))); }