Merge changes I49a33e91,I7f45d955 am: 71d0536932
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1475898 Change-Id: Icb98ea429016f47a89ba96a26c0b5e9a850fe72c
This commit is contained in:
@@ -123,6 +123,14 @@ public class HdmiCecMessageValidator {
|
|||||||
new RecordStatusInfoValidator(), DEST_DIRECT);
|
new RecordStatusInfoValidator(), DEST_DIRECT);
|
||||||
|
|
||||||
// TODO: Handle messages for the Timer Programming.
|
// TODO: Handle messages for the Timer Programming.
|
||||||
|
addValidationInfo(
|
||||||
|
Constants.MESSAGE_CLEAR_ANALOG_TIMER, new AnalogueTimerValidator(), DEST_DIRECT);
|
||||||
|
addValidationInfo(
|
||||||
|
Constants.MESSAGE_CLEAR_EXTERNAL_TIMER, new ExternalTimerValidator(), DEST_DIRECT);
|
||||||
|
addValidationInfo(
|
||||||
|
Constants.MESSAGE_SET_ANALOG_TIMER, new AnalogueTimerValidator(), DEST_DIRECT);
|
||||||
|
addValidationInfo(
|
||||||
|
Constants.MESSAGE_SET_EXTERNAL_TIMER, new ExternalTimerValidator(), DEST_DIRECT);
|
||||||
|
|
||||||
// Messages for the System Information.
|
// Messages for the System Information.
|
||||||
FixedLengthValidator oneByteValidator = new FixedLengthValidator(1);
|
FixedLengthValidator oneByteValidator = new FixedLengthValidator(1);
|
||||||
@@ -415,6 +423,76 @@ public class HdmiCecMessageValidator {
|
|||||||
return (Integer.bitCount(value) <= 1);
|
return (Integer.bitCount(value) <= 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given value is a valid analogue broadcast type. A valid value is one which falls
|
||||||
|
* within the range description defined in CEC 1.4 Specification : Operand Descriptions (Section
|
||||||
|
* 17)
|
||||||
|
*
|
||||||
|
* @param value analogue broadcast type
|
||||||
|
* @return true if the analogue broadcast type is valid
|
||||||
|
*/
|
||||||
|
private boolean isValidAnalogueBroadcastType(int value) {
|
||||||
|
return isWithinRange(value, 0x00, 0x02);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given value is a valid analogue frequency. A valid value is one which falls
|
||||||
|
* within the range description defined in CEC 1.4 Specification : Operand Descriptions (Section
|
||||||
|
* 17)
|
||||||
|
*
|
||||||
|
* @param value analogue frequency
|
||||||
|
* @return true if the analogue frequency is valid
|
||||||
|
*/
|
||||||
|
private boolean isValidAnalogueFrequency(int value) {
|
||||||
|
value = value & 0xFFFF;
|
||||||
|
return (value != 0x000 && value != 0xFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given value is a valid broadcast system. A valid value is one which falls within
|
||||||
|
* the range description defined in CEC 1.4 Specification : Operand Descriptions (Section 17)
|
||||||
|
*
|
||||||
|
* @param value broadcast system
|
||||||
|
* @return true if the broadcast system is valid
|
||||||
|
*/
|
||||||
|
private boolean isValidBroadcastSystem(int value) {
|
||||||
|
return isWithinRange(value, 0, 31);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given value is a valid External Plug. A valid value is one which falls within
|
||||||
|
* the range description defined in CEC 1.4 Specification : Operand Descriptions (Section 17)
|
||||||
|
*
|
||||||
|
* @param value External Plug
|
||||||
|
* @return true if the External Plug is valid
|
||||||
|
*/
|
||||||
|
private boolean isValidExternalPlug(int value) {
|
||||||
|
return isWithinRange(value, 1, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given value is a valid External Source. A valid value is one which falls within
|
||||||
|
* the range description defined in CEC 1.4 Specification : Operand Descriptions (Section 17)
|
||||||
|
*
|
||||||
|
* @param value External Source Specifier
|
||||||
|
* @return true if the External Source is valid
|
||||||
|
*/
|
||||||
|
private boolean isValidExternalSource(byte[] params, int offset) {
|
||||||
|
int externalSourceSpecifier = params[offset];
|
||||||
|
offset = offset + 1;
|
||||||
|
if (externalSourceSpecifier == 0x04) {
|
||||||
|
// External Plug
|
||||||
|
return isValidExternalPlug(params[offset]);
|
||||||
|
} else if (externalSourceSpecifier == 0x05) {
|
||||||
|
// External Physical Address
|
||||||
|
// Validate it contains 2 bytes Physical Address
|
||||||
|
if (params.length - offset >= 2) {
|
||||||
|
return isValidPhysicalAddress(params, offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private class PhysicalAddressValidator implements ParameterValidator {
|
private class PhysicalAddressValidator implements ParameterValidator {
|
||||||
@Override
|
@Override
|
||||||
public int isValid(byte[] params) {
|
public int isValid(byte[] params) {
|
||||||
@@ -544,4 +622,53 @@ public class HdmiCecMessageValidator {
|
|||||||
return toErrorCode(isWithinRange(params[0], mMinValue, mMaxValue));
|
return toErrorCode(isWithinRange(params[0], mMinValue, mMaxValue));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given Analogue Timer message parameters are valid. Valid parameters should
|
||||||
|
* adhere to message description of Analogue Timer defined in CEC 1.4 Specification : Message
|
||||||
|
* Descriptions for Timer Programming Feature (CEC Table 12)
|
||||||
|
*/
|
||||||
|
private class AnalogueTimerValidator implements ParameterValidator {
|
||||||
|
@Override
|
||||||
|
public int isValid(byte[] params) {
|
||||||
|
if (params.length < 11) {
|
||||||
|
return ERROR_PARAMETER_SHORT;
|
||||||
|
}
|
||||||
|
return toErrorCode(
|
||||||
|
isValidDayOfMonth(params[0]) // Day of Month
|
||||||
|
&& isValidMonthOfYear(params[1]) // Month of Year
|
||||||
|
&& isValidHour(params[2]) // Start Time - Hour
|
||||||
|
&& isValidMinute(params[3]) // Start Time - Minute
|
||||||
|
&& isValidDurationHours(params[4]) // Duration - Duration Hours
|
||||||
|
&& isValidMinute(params[5]) // Duration - Minute
|
||||||
|
&& isValidRecordingSequence(params[6]) // Recording Sequence
|
||||||
|
&& isValidAnalogueBroadcastType(params[7]) // Analogue Broadcast Type
|
||||||
|
&& isValidAnalogueFrequency(
|
||||||
|
HdmiUtils.twoBytesToInt(params, 8)) // Analogue Frequency
|
||||||
|
&& isValidBroadcastSystem(params[10])); // Broadcast System
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given External Timer message parameters are valid. Valid parameters should
|
||||||
|
* adhere to message description of External Timer defined in CEC 1.4 Specification : Message
|
||||||
|
* Descriptions for Timer Programming Feature (CEC Table 12)
|
||||||
|
*/
|
||||||
|
private class ExternalTimerValidator implements ParameterValidator {
|
||||||
|
@Override
|
||||||
|
public int isValid(byte[] params) {
|
||||||
|
if (params.length < 9) {
|
||||||
|
return ERROR_PARAMETER_SHORT;
|
||||||
|
}
|
||||||
|
return toErrorCode(
|
||||||
|
isValidDayOfMonth(params[0]) // Day of Month
|
||||||
|
&& isValidMonthOfYear(params[1]) // Month of Year
|
||||||
|
&& isValidHour(params[2]) // Start Time - Hour
|
||||||
|
&& isValidMinute(params[3]) // Start Time - Minute
|
||||||
|
&& isValidDurationHours(params[4]) // Duration - Duration Hours
|
||||||
|
&& isValidMinute(params[5]) // Duration - Minute
|
||||||
|
&& isValidRecordingSequence(params[6]) // Recording Sequence
|
||||||
|
&& isValidExternalSource(params, 7)); // External Source
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -182,6 +182,70 @@ public class HdmiCecMessageValidatorTest {
|
|||||||
assertMessageValidity("40:0A:30").isEqualTo(ERROR_PARAMETER);
|
assertMessageValidity("40:0A:30").isEqualTo(ERROR_PARAMETER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isValid_setAnalogueTimer_clearAnalogueTimer() {
|
||||||
|
assertMessageValidity("04:33:0C:08:10:1E:04:30:08:00:13:AD:06").isEqualTo(OK);
|
||||||
|
assertMessageValidity("04:34:04:0C:16:0F:08:37:00:02:EA:60:03:34").isEqualTo(OK);
|
||||||
|
|
||||||
|
assertMessageValidity("0F:33:0C:08:10:1E:04:30:08:00:13:AD:06")
|
||||||
|
.isEqualTo(ERROR_DESTINATION);
|
||||||
|
assertMessageValidity("F0:34:04:0C:16:0F:08:37:00:02:EA:60:03").isEqualTo(ERROR_SOURCE);
|
||||||
|
assertMessageValidity("04:33:0C:08:10:1E:04:30:08:13:AD:06")
|
||||||
|
.isEqualTo(ERROR_PARAMETER_SHORT);
|
||||||
|
// Out of range Day of Month
|
||||||
|
assertMessageValidity("04:34:20:0C:16:0F:08:37:00:02:EA:60:03").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Out of range Month of Year
|
||||||
|
assertMessageValidity("04:33:0C:00:10:1E:04:30:08:00:13:AD:06").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Out of range Start Time - Hour
|
||||||
|
assertMessageValidity("04:34:04:0C:18:0F:08:37:00:02:EA:60:03").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Out of range Start Time - Minute
|
||||||
|
assertMessageValidity("04:33:0C:08:10:50:04:30:08:00:13:AD:06").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Out of range Duration - Duration Hours
|
||||||
|
assertMessageValidity("04:34:04:0C:16:0F:64:37:00:02:EA:60:03").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Out of range Duration - Minute
|
||||||
|
assertMessageValidity("04:33:0C:08:10:1E:04:64:08:00:13:AD:06").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Invalid Recording Sequence
|
||||||
|
assertMessageValidity("04:34:04:0C:16:0F:08:37:88:02:EA:60:03").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Invalid Recording Sequence
|
||||||
|
assertMessageValidity("04:33:0C:08:10:1E:04:30:A2:00:13:AD:06").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Out of range Analogue Broadcast Type
|
||||||
|
assertMessageValidity("04:34:04:0C:16:0F:08:37:00:03:EA:60:03").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Out of range Analogue Frequency
|
||||||
|
assertMessageValidity("04:33:0C:08:10:1E:04:30:08:00:FF:FF:06").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Out of range Broadcast System
|
||||||
|
assertMessageValidity("04:34:04:0C:16:0F:08:37:00:02:EA:60:20").isEqualTo(ERROR_PARAMETER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isValid_setExternalTimer_clearExternalTimer() {
|
||||||
|
assertMessageValidity("40:A1:0C:08:15:05:04:1E:02:04:20").isEqualTo(OK);
|
||||||
|
assertMessageValidity("40:A2:14:09:12:28:4B:19:10:05:10:00").isEqualTo(OK);
|
||||||
|
|
||||||
|
assertMessageValidity("4F:A1:0C:08:15:05:04:1E:02:04:20").isEqualTo(ERROR_DESTINATION);
|
||||||
|
assertMessageValidity("F4:A2:14:09:12:28:4B:19:10:05:10:00").isEqualTo(ERROR_SOURCE);
|
||||||
|
assertMessageValidity("40:A1:0C:08:15:05:04:1E:02:04").isEqualTo(ERROR_PARAMETER_SHORT);
|
||||||
|
// Out of range Day of Month
|
||||||
|
assertMessageValidity("40:A2:28:09:12:28:4B:19:10:05:10:00").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Out of range Month of Year
|
||||||
|
assertMessageValidity("40:A1:0C:0F:15:05:04:1E:02:04:20").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Out of range Start Time - Hour
|
||||||
|
assertMessageValidity("40:A2:14:09:1A:28:4B:19:10:05:10:00").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Out of range Start Time - Minute
|
||||||
|
assertMessageValidity("40:A1:0C:08:15:48:04:1E:02:04:20").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Out of range Duration - Duration Hours
|
||||||
|
assertMessageValidity("40:A2:14:09:12:28:66:19:10:05:10:00").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Out of range Duration - Minute
|
||||||
|
assertMessageValidity("40:A1:0C:08:15:05:04:3F:02:04:20").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Invalid Recording Sequence
|
||||||
|
assertMessageValidity("40:A2:14:09:12:28:4B:19:84:05:10:00").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Invalid Recording Sequence
|
||||||
|
assertMessageValidity("40:A1:0C:08:15:05:04:1E:14:04:20").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Invalid external source specifier
|
||||||
|
assertMessageValidity("40:A2:14:09:12:28:4B:19:10:08:10:00").isEqualTo(ERROR_PARAMETER);
|
||||||
|
// Invalid External PLug
|
||||||
|
assertMessageValidity("04:A1:0C:08:15:05:04:1E:02:04:00").isEqualTo(ERROR_PARAMETER);
|
||||||
|
}
|
||||||
|
|
||||||
private IntegerSubject assertMessageValidity(String message) {
|
private IntegerSubject assertMessageValidity(String message) {
|
||||||
return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message)));
|
return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message)));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user