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

Commit bf16fd09 authored by Aravind Angadi's avatar Aravind Angadi Committed by Michal Olech
Browse files

CEC: Handle error coming during getVendorId from HAL.

When there is an error from HAL during getVendorId, instead of sending
default value, respond with the feature abort message.

Add unit tests for handleGiveDeviceVendorId.

Bug: 164901011
Test: atest HdmiCecLocalDeviceTest
Change-Id: I3c810734a2d85808b4e068c3d586c3be1e18fb59
parent 8d708674
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.hdmi.IHdmiControlCallback;
import android.hardware.input.InputManager;
import android.hardware.tv.cec.V1_0.Result;
import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.media.AudioManager;
import android.os.Handler;
@@ -285,7 +286,7 @@ abstract class HdmiCecLocalDevice {
            case Constants.MESSAGE_GIVE_OSD_NAME:
                return handleGiveOsdName(message);
            case Constants.MESSAGE_GIVE_DEVICE_VENDOR_ID:
                return handleGiveDeviceVendorId(null);
                return handleGiveDeviceVendorId(message);
            case Constants.MESSAGE_CEC_VERSION:
                return handleCecVersion();
            case Constants.MESSAGE_GET_CEC_VERSION:
@@ -393,12 +394,16 @@ abstract class HdmiCecLocalDevice {

    @ServiceThreadOnly
    @Constants.HandleMessageResult
    protected int handleGiveDeviceVendorId(@Nullable SendMessageCallback callback) {
    protected int handleGiveDeviceVendorId(HdmiCecMessage message) {
        assertRunOnServiceThread();
        int vendorId = mService.getVendorId();
        if (vendorId == Result.FAILURE_UNKNOWN) {
            mService.maySendFeatureAbortCommand(message, Constants.ABORT_UNABLE_TO_DETERMINE);
        } else {
            HdmiCecMessage cecMessage =
                    HdmiCecMessageBuilder.buildDeviceVendorIdCommand(mAddress, vendorId);
        mService.sendCecCommand(cecMessage, callback);
            mService.sendCecCommand(cecMessage);
        }
        return Constants.HANDLED;
    }

+7 −1
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ final class FakeNativeWrapper implements NativeWrapper {
    private final Map<Integer, Boolean> mPortConnectionStatus = new HashMap<>();
    private final HashMap<Integer, Integer> mMessageSendResult = new HashMap<>();
    private int mMyPhysicalAddress = 0;
    private int mVendorId = 0;
    private HdmiPortInfo[] mHdmiPortInfo = null;
    private HdmiCecController.HdmiCecCallback mCallback = null;
    private int mCecVersion = HdmiControlManager.HDMI_CEC_VERSION_2_0;
@@ -102,7 +103,7 @@ final class FakeNativeWrapper implements NativeWrapper {

    @Override
    public int nativeGetVendorId() {
        return 0;
        return mVendorId;
    }

    @Override
@@ -180,6 +181,11 @@ final class FakeNativeWrapper implements NativeWrapper {
        mMessageSendResult.put(opcode, result);
    }

    @VisibleForTesting
    protected void setVendorId(int vendorId) {
        mVendorId = vendorId;
    }

    @VisibleForTesting
    protected void setPhysicalAddress(int physicalAddress) {
        mMyPhysicalAddress = physicalAddress;
+32 −8
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import static org.mockito.Mockito.verify;
import android.content.Context;
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiPortInfo;
import android.hardware.tv.cec.V1_0.Result;
import android.media.AudioManager;
import android.os.test.TestLooper;
import android.platform.test.annotations.Presubmit;
@@ -205,6 +206,7 @@ public class HdmiCecLocalDeviceTest {
        mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
        mNativeWrapper.setPhysicalAddress(0x2000);
        mTestLooper.dispatchAll();
        mNativeWrapper.clearResultMessages();
    }

    @Test
@@ -243,15 +245,37 @@ public class HdmiCecLocalDeviceTest {

    @Test
    public void handleGiveDeviceVendorId_success() {
        mSrcAddr = ADDR_UNREGISTERED;
        mDesAddr = ADDR_BROADCAST;
        /** nativeGetVendorId returns 0 */
        param = new byte[] {(byte) ((0 >> 8) & 0xFF), (byte) (0 & 0xFF), (byte) (0 & 0xFF)};
        callbackResult = -1;
        /** Set vendor id to 0 */
        mNativeWrapper.setVendorId(0);
        HdmiCecMessage expectedMessage =
                HdmiCecMessageBuilder.buildDeviceVendorIdCommand(ADDR_TV, 0);
        @Constants.HandleMessageResult
        int handleResult =
                mHdmiLocalDevice.handleGiveDeviceVendorId(
                (int finalResult) -> callbackResult = finalResult);
                        HdmiCecMessageBuilder.buildGiveDeviceVendorIdCommand(
                                ADDR_PLAYBACK_1, ADDR_TV));
        mTestLooper.dispatchAll();
        assertEquals(0, callbackResult);
        assertEquals(Constants.HANDLED, handleResult);
        assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
    }

    @Test
    public void handleGiveDeviceVendorId_failure() {
        mNativeWrapper.setVendorId(Result.FAILURE_UNKNOWN);
        HdmiCecMessage expectedMessage =
                HdmiCecMessageBuilder.buildFeatureAbortCommand(
                        ADDR_TV,
                        ADDR_PLAYBACK_1,
                        Constants.MESSAGE_GIVE_DEVICE_VENDOR_ID,
                        Constants.ABORT_UNABLE_TO_DETERMINE);
        @Constants.HandleMessageResult
        int handleResult =
                mHdmiLocalDevice.handleGiveDeviceVendorId(
                        HdmiCecMessageBuilder.buildGiveDeviceVendorIdCommand(
                                ADDR_PLAYBACK_1, ADDR_TV));
        mTestLooper.dispatchAll();
        assertEquals(Constants.HANDLED, handleResult);
        assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
    }

    @Test