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

Commit 51811114 authored by Paul Colța's avatar Paul Colța Committed by Gerrit Code Review
Browse files

Merge "Send <Request ARC Termination> when Standby"

parents 8f8b0cf0 ddc4753a
Loading
Loading
Loading
Loading
+14 −2
Original line number Original line Diff line number Diff line
@@ -837,7 +837,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
    void enableAudioReturnChannel(boolean enabled) {
    void enableAudioReturnChannel(boolean enabled) {
        assertRunOnServiceThread();
        assertRunOnServiceThread();
        HdmiDeviceInfo avr = getAvrDeviceInfo();
        HdmiDeviceInfo avr = getAvrDeviceInfo();
        if (avr != null) {
        if (avr != null && avr.getPortId() != Constants.INVALID_PORT_ID) {
            mService.enableAudioReturnChannel(avr.getPortId(), enabled);
            mService.enableAudioReturnChannel(avr.getPortId(), enabled);
        }
        }
    }
    }
@@ -1335,6 +1335,16 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
        }
        }
    }
    }


    @ServiceThreadOnly
    private void forceDisableArcOnAllPins() {
        List<HdmiPortInfo> ports = mService.getPortInfo();
        for (HdmiPortInfo port : ports) {
            if (isArcFeatureEnabled(port.getId())) {
                mService.enableAudioReturnChannel(port.getId(), false);
            }
        }
    }

    @ServiceThreadOnly
    @ServiceThreadOnly
    private void disableArcIfExist() {
    private void disableArcIfExist() {
        assertRunOnServiceThread();
        assertRunOnServiceThread();
@@ -1342,13 +1352,15 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
        if (avr == null) {
        if (avr == null) {
            return;
            return;
        }
        }
        disableArc();


        // Seq #44.
        // Seq #44.
        removeAllRunningArcAction();
        removeAllRunningArcAction();
        if (!hasAction(RequestArcTerminationAction.class) && isArcEstablished()) {
        if (!hasAction(RequestArcTerminationAction.class) && isArcEstablished()) {
            addAndStartAction(new RequestArcTerminationAction(this, avr.getLogicalAddress()));
            addAndStartAction(new RequestArcTerminationAction(this, avr.getLogicalAddress()));
        }
        }

        // Disable ARC Pin earlier, prevent the case where AVR doesn't send <Terminate ARC> in time
        forceDisableArcOnAllPins();
    }
    }


    @ServiceThreadOnly
    @ServiceThreadOnly
+49 −0
Original line number Original line Diff line number Diff line
@@ -842,4 +842,53 @@ public class HdmiCecLocalDeviceTvTest {
        verify(mAudioManager, never()).setStreamVolume(eq(AudioManager.STREAM_MUSIC), anyInt(),
        verify(mAudioManager, never()).setStreamVolume(eq(AudioManager.STREAM_MUSIC), anyInt(),
                anyInt());
                anyInt());
    }
    }

    @Test
    public void tvSendRequestArcTerminationOnSleep() {
        // Emulate Audio device on port 0x2000 (supports ARC)

        mNativeWrapper.setPortConnectionStatus(2, true);
        HdmiCecMessage hdmiCecMessage = HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
                ADDR_AUDIO_SYSTEM, 0x2000, HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
        mNativeWrapper.onCecMessage(hdmiCecMessage);
        mTestLooper.dispatchAll();

        mHdmiCecLocalDeviceTv.startArcAction(true);
        mTestLooper.dispatchAll();
        HdmiCecMessage requestArcInitiation = HdmiCecMessageBuilder.buildRequestArcInitiation(
                ADDR_TV,
                ADDR_AUDIO_SYSTEM);
        HdmiCecMessage requestArcTermination = HdmiCecMessageBuilder.buildRequestArcTermination(
                ADDR_TV,
                ADDR_AUDIO_SYSTEM);
        HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc(
                ADDR_AUDIO_SYSTEM,
                ADDR_TV);
        HdmiCecMessage reportArcInitiated = HdmiCecMessageBuilder.buildReportArcInitiated(
                ADDR_TV,
                ADDR_AUDIO_SYSTEM);

        assertThat(mNativeWrapper.getResultMessages()).contains(requestArcInitiation);
        assertThat(mNativeWrapper.getResultMessages()).doesNotContain(requestArcTermination);

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

        // Finish querying SADs
        assertThat(mNativeWrapper.getResultMessages()).contains(SAD_QUERY);
        mNativeWrapper.clearResultMessages();
        mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS);
        mTestLooper.dispatchAll();
        assertThat(mNativeWrapper.getResultMessages()).contains(SAD_QUERY);
        mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS);
        mTestLooper.dispatchAll();

        // ARC should be established after RequestSadAction is finished
        assertThat(mNativeWrapper.getResultMessages()).contains(reportArcInitiated);

        mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
        mTestLooper.dispatchAll();
        assertThat(mNativeWrapper.getResultMessages()).contains(requestArcTermination);
    }

}
}