Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f0f01aec authored by Shraddha Basantwani's avatar Shraddha Basantwani
Browse files

CEC : Add validator for tuner device status message

Test: atest HdmiCecMessageValidatorTest
Bug: 170811408
Change-Id: Idf94ddb5d14e3cac2bda0dfbb54c63bd7bdca6db
parent 48695cb0
Loading
Loading
Loading
Loading
+48 −1
Original line number Diff line number Diff line
@@ -156,7 +156,6 @@ public class HdmiCecMessageValidator {
        addValidationInfo(Constants.MESSAGE_GIVE_DECK_STATUS, statusRequestValidator, DEST_DIRECT);
        addValidationInfo(Constants.MESSAGE_PLAY, new PlayModeValidator(), DEST_DIRECT);

        // TODO: Handle messages for the Tuner Control.
        addValidationInfo(
                Constants.MESSAGE_GIVE_TUNER_DEVICE_STATUS, statusRequestValidator, DEST_DIRECT);
        addValidationInfo(
@@ -167,6 +166,10 @@ public class HdmiCecMessageValidator {
                Constants.MESSAGE_SELECT_DIGITAL_SERVICE,
                new SelectDigitalServiceValidator(),
                DEST_DIRECT);
        addValidationInfo(
                Constants.MESSAGE_TUNER_DEVICE_STATUS,
                new TunerDeviceStatusValidator(),
                DEST_DIRECT);

        // Messages for the Vendor Specific Commands.
        VariableLengthValidator maxLengthValidator = new VariableLengthValidator(0, 14);
@@ -722,6 +725,35 @@ public class HdmiCecMessageValidator {
                || (isWithinRange(value, 0xC1, 0xC3)));
    }

    /*
     * Check if the given value is a valid Tuner Device info. A valid value is one which falls
     * within the range description defined in CEC 1.4 Specification : Operand Descriptions
     * (Section 17)
     *
     * @param params Tuner device info
     * @return true if the Tuner device info is valid
     */
    private boolean isValidTunerDeviceInfo(byte[] params) {
        int tunerDisplayInfo = params[0] & 0x7F;
        if (tunerDisplayInfo == 0x00) {
            // Displaying digital tuner
            if (params.length >= 5) {
                return isValidDigitalServiceIdentification(params, 1);
            }
        } else if (tunerDisplayInfo == 0x01) {
            // Not displaying Tuner
            return true;
        } else if (tunerDisplayInfo == 0x02) {
            // Displaying Analogue tuner
            if (params.length >= 5) {
                return (isValidAnalogueBroadcastType(params[1])
                        && isValidAnalogueFrequency(HdmiUtils.twoBytesToInt(params, 2))
                        && isValidBroadcastSystem(params[4]));
            }
        }
        return false;
    }

    private class PhysicalAddressValidator implements ParameterValidator {
        @Override
        public int isValid(byte[] params) {
@@ -1000,6 +1032,21 @@ public class HdmiCecMessageValidator {
        }
    }

    /**
     * Check if the given tuner device status parameter is valid. A valid parameter should lie
     * within the range description defined in CEC 1.4 Specification : Operand Descriptions (Section
     * 17)
     */
    private class TunerDeviceStatusValidator implements ParameterValidator {
        @Override
        public int isValid(byte[] params) {
            if (params.length < 1) {
                return ERROR_PARAMETER_SHORT;
            }
            return toErrorCode(isValidTunerDeviceInfo(params));
        }
    }

    /** Check if the given user control press parameter is valid. */
    private class UserControlPressedValidator implements ParameterValidator {
        @Override
+45 −0
Original line number Diff line number Diff line
@@ -451,6 +451,51 @@ public class HdmiCecMessageValidatorTest {
        assertMessageValidity("40:93:91:09:F4:40").isEqualTo(ERROR_PARAMETER);
    }

    @Test
    public void isValid_tunerDeviceStatus() {
        // Displaying digital tuner
        assertMessageValidity("40:07:00:00:11:CE:90:0F:00:78").isEqualTo(OK);
        assertMessageValidity("40:07:80:10:13:0B:34:38").isEqualTo(OK);
        assertMessageValidity("40:07:00:9A:06:F9:D3:E6").isEqualTo(OK);
        assertMessageValidity("40:07:00:91:09:F4:40:C8").isEqualTo(OK);
        // Not displaying tuner
        assertMessageValidity("40:07:01").isEqualTo(OK);
        assertMessageValidity("40:07:81:07:64:B9:02").isEqualTo(OK);
        // Displaying analogue tuner
        assertMessageValidity("40:07:02:00:13:0F:00:96").isEqualTo(OK);
        assertMessageValidity("40:07:82:02:EA:60:1F").isEqualTo(OK);

        assertMessageValidity("4F:07:00:00:11:CE:90:0F:00:78").isEqualTo(ERROR_DESTINATION);
        assertMessageValidity("F0:07:82:02:EA:60:1F").isEqualTo(ERROR_SOURCE);
        assertMessageValidity("40:07").isEqualTo(ERROR_PARAMETER_SHORT);

        // Invalid display info
        assertMessageValidity("40:07:09:A1:8C:17:51").isEqualTo(ERROR_PARAMETER);
        assertMessageValidity("40:07:A7:0C:29").isEqualTo(ERROR_PARAMETER);
        // Invalid Digital Broadcast System
        assertMessageValidity("40:07:00:14:11:CE:90:0F:00:78").isEqualTo(ERROR_PARAMETER);
        // Invalid Digital Broadcast System
        assertMessageValidity("40:07:80:A0:07:95:F1").isEqualTo(ERROR_PARAMETER);
        // Insufficient data for ARIB Broadcast system
        assertMessageValidity("40:07:00:00:11:CE:90:0F:00").isEqualTo(ERROR_PARAMETER);
        // Insufficient data for ATSC Broadcast system
        assertMessageValidity("40:07:80:10:13:0B:34").isEqualTo(ERROR_PARAMETER);
        // Insufficient data for DVB Broadcast system
        assertMessageValidity("40:07:00:18:BE:77:00:7D:01").isEqualTo(ERROR_PARAMETER);
        // Invalid channel number format
        assertMessageValidity("40:07:80:9A:10:F9:D3").isEqualTo(ERROR_PARAMETER);
        // Insufficient data for 1 part channel number
        assertMessageValidity("40:07:00:90:04:F7").isEqualTo(ERROR_PARAMETER);
        // Insufficient data for 2 part channel number
        assertMessageValidity("40:07:80:91:09:F4:40").isEqualTo(ERROR_PARAMETER);
        // Invalid Analogue Broadcast type
        assertMessageValidity("40:07:02:03:EA:60:1F").isEqualTo(ERROR_PARAMETER);
        // Invalid Analogue Frequency
        assertMessageValidity("40:07:82:00:FF:FF:00").isEqualTo(ERROR_PARAMETER);
        // Invalid Broadcast system
        assertMessageValidity("40:07:02:02:EA:60:20").isEqualTo(ERROR_PARAMETER);
    }

    @Test
    public void isValid_UserControlPressed() {
        assertMessageValidity("40:44:07").isEqualTo(OK);