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

Commit f25748e4 authored by Paul Colta's avatar Paul Colta
Browse files

HDMI: Do not start NewDeviceAction while DeviceDiscoveryAction is running

<Report Physical Address> processed by local device TV starts a
NewDeviceAction which can interfere with DeviceDiscoveryAction.

Flag: EXEMPT bugfix
Test: atest com.android.server.hdmi
Bug: 349007368
Change-Id: I1da6e45f852f3e8bab0b51003e7929a6904f80b9
parent ff099c24
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -597,6 +597,12 @@ public class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
    @Constants.HandleMessageResult
    protected int handleReportPhysicalAddress(HdmiCecMessage message) {
        super.handleReportPhysicalAddress(message);
        // Ignore <Report Physical Address> while DeviceDiscoveryAction is in progress to avoid
        // starting a NewDeviceAction which might interfere in creating the list of known devices.
        if (hasAction(DeviceDiscoveryAction.class)) {
            return Constants.HANDLED;
        }

        int path = HdmiUtils.twoBytesToInt(message.getParams());
        int address = message.getSource();
        int type = message.getParams()[2];
+29 −1
Original line number Diff line number Diff line
@@ -2068,7 +2068,6 @@ public class HdmiCecLocalDeviceTvTest {
        assertThat(mPowerManager.isInteractive()).isTrue();
    }


    @Test
    public void handleStandby_fromNonActiveSource_previousActiveSourceNotSet_Standby() {
        HdmiCecMessage standbyMessage = HdmiCecMessageBuilder.buildStandby(ADDR_PLAYBACK_1,
@@ -2091,6 +2090,35 @@ public class HdmiCecLocalDeviceTvTest {
                .isFalse();
    }

    @Test
    public void handleReportPhysicalAddress_DeviceDiscoveryActionInProgress_noNewDeviceAction() {
        mHdmiControlService.getHdmiCecNetwork().clearDeviceList();
        mNativeWrapper.setPollAddressResponse(ADDR_PLAYBACK_1, SendMessageResult.SUCCESS);
        mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
        mNativeWrapper.clearResultMessages();
        mTestLooper.dispatchAll();

        HdmiCecMessage reportPhysicalAddressFromPlayback1 =
                HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
                        ADDR_PLAYBACK_1, 0x1000, HdmiDeviceInfo.DEVICE_PLAYBACK);
        HdmiCecMessage reportPhysicalAddressFromPlayback2 =
                HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
                        ADDR_PLAYBACK_2, 0x2000, HdmiDeviceInfo.DEVICE_PLAYBACK);
        HdmiCecMessage giveOsdName = HdmiCecMessageBuilder.buildGiveOsdNameCommand(
                ADDR_TV, ADDR_PLAYBACK_2);
        // Skip state waiting for <Report Physical Address> for DeviceDiscoveryAction s.t. message
        // can be dispatched to local device TV.
        mNativeWrapper.onCecMessage(reportPhysicalAddressFromPlayback1);
        mNativeWrapper.clearResultMessages();
        mTestLooper.dispatchAll();

        mNativeWrapper.onCecMessage(reportPhysicalAddressFromPlayback2);
        mTestLooper.dispatchAll();

        // NewDeviceAction did not start and <Give OSD Name> was not sent.
        assertThat(mNativeWrapper.getResultMessages()).doesNotContain(giveOsdName);
    }

    protected static class MockTvDevice extends HdmiCecLocalDeviceTv {
        MockTvDevice(HdmiControlService service) {
            super(service);