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

Commit 42ebc349 authored by Paul Colta's avatar Paul Colta
Browse files

HDMI: Cancel RequestActiveSourceAction when deviceSelect is called

RequestActiveSourceAction should be cancelled when
HdmiCecLocalDeviceTv#deviceSelect is called. It makes sense that TV
won't broadcast <Active Source> when it changes to another source
and avoids confusing devices.

Test: atest HdmiCecLocalDeviceTvTest
Bug: 315141766
Change-Id: Ia0b68942007e4642254c8399055bc5ee3f4357ee
parent 4de6bb88
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -257,6 +257,7 @@ public final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
        if (isAlreadyActiveSource(targetDevice, targetAddress, callback)) {
            return;
        }
        removeAction(RequestActiveSourceAction.class);
        if (targetAddress == Constants.ADDR_INTERNAL) {
            handleSelectInternalSource();
            // Switching to internal source is always successful even when CEC control is disabled.
+35 −1
Original line number Diff line number Diff line
@@ -1726,6 +1726,40 @@ public class HdmiCecLocalDeviceTvTest {
        assertThat(mNativeWrapper.getResultMessages()).contains(activeSourceFromTv);
    }

    @Test
    public void onAddressAllocated_startRequestActiveSourceAction_cancelOnDeviceSelect() {
        HdmiCecMessage requestActiveSource =
                HdmiCecMessageBuilder.buildRequestActiveSource(ADDR_TV);
        HdmiCecMessage activeSourceFromTv =
                HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
        mHdmiControlService.getHdmiCecNetwork().clearLocalDevices();
        mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
        HdmiDeviceInfo playbackDevice = HdmiDeviceInfo.cecDeviceBuilder()
                .setLogicalAddress(ADDR_PLAYBACK_1)
                .setPhysicalAddress(0x1000)
                .setPortId(PORT_1)
                .setDeviceType(HdmiDeviceInfo.DEVICE_PLAYBACK)
                .setVendorId(0x1234)
                .setDisplayName("Playback 1")
                .setDevicePowerStatus(HdmiControlManager.POWER_STATUS_ON)
                .setCecVersion(HdmiControlManager.HDMI_CEC_VERSION_1_4_B)
                .build();
        mHdmiControlService.getHdmiCecNetwork().addCecDevice(playbackDevice);
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).contains(requestActiveSource);
        mNativeWrapper.clearResultMessages();
        mHdmiCecLocalDeviceTv.deviceSelect(playbackDevice.getId(), null);
        mTestLooper.dispatchAll();

        mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS * 2);
        mTestLooper.dispatchAll();

        // RequestActiveSourceAction should be cancelled and TV will not broadcast <Active Source>.
        assertThat(mNativeWrapper.getResultMessages()).doesNotContain(activeSourceFromTv);
    }


    @Test
    public void newDeviceConnectedIfOnlyOneGiveOsdNameSent() {
        mHdmiControlService.getHdmiCecNetwork().clearDeviceList();