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 Original line Diff line number Diff line
@@ -22,6 +22,7 @@ import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.hdmi.IHdmiControlCallback;
import android.hardware.hdmi.IHdmiControlCallback;
import android.hardware.input.InputManager;
import android.hardware.input.InputManager;
import android.hardware.tv.cec.V1_0.Result;
import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.media.AudioManager;
import android.media.AudioManager;
import android.os.Handler;
import android.os.Handler;
@@ -285,7 +286,7 @@ abstract class HdmiCecLocalDevice {
            case Constants.MESSAGE_GIVE_OSD_NAME:
            case Constants.MESSAGE_GIVE_OSD_NAME:
                return handleGiveOsdName(message);
                return handleGiveOsdName(message);
            case Constants.MESSAGE_GIVE_DEVICE_VENDOR_ID:
            case Constants.MESSAGE_GIVE_DEVICE_VENDOR_ID:
                return handleGiveDeviceVendorId(null);
                return handleGiveDeviceVendorId(message);
            case Constants.MESSAGE_CEC_VERSION:
            case Constants.MESSAGE_CEC_VERSION:
                return handleCecVersion();
                return handleCecVersion();
            case Constants.MESSAGE_GET_CEC_VERSION:
            case Constants.MESSAGE_GET_CEC_VERSION:
@@ -393,12 +394,16 @@ abstract class HdmiCecLocalDevice {


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


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


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


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


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

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


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


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