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

Commit 5023f012 authored by Nathalie Le Clair's avatar Nathalie Le Clair
Browse files

Block new ARC connections during eARC connection

If eARC is disabled or not supported, ARC gets connected normally.

Test: atest
Bug: 262573690
Change-Id: I5c3d172f313c9457e3debe4d35ba6308f221b740
parent 8658ee82
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -912,6 +912,12 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
            }
            return;
        }
        if (enabled && mService.earcBlocksArcConnection()) {
            Slog.i(TAG,
                    "ARC connection blocked because eARC connection is established or being "
                            + "established.");
            return;
        }

        // Terminate opposite action and start action if not exist.
        if (enabled) {
@@ -1010,6 +1016,13 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
    protected int handleInitiateArc(HdmiCecMessage message) {
        assertRunOnServiceThread();

        if (mService.earcBlocksArcConnection()) {
            Slog.i(TAG,
                    "ARC connection blocked because eARC connection is established or being "
                            + "established.");
            return Constants.ABORT_NOT_IN_CORRECT_MODE;
        }

        if (!canStartArcUpdateAction(message.getSource(), true)) {
            HdmiDeviceInfo avrDeviceInfo = getAvrDeviceInfo();
            if (avrDeviceInfo == null) {
+10 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import static android.hardware.hdmi.HdmiControlManager.SOUNDBAR_MODE_ENABLED;
import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED;
import static com.android.server.hdmi.Constants.DISABLED;
import static com.android.server.hdmi.Constants.ENABLED;
import static com.android.server.hdmi.Constants.HDMI_EARC_STATUS_ARC_PENDING;
import static com.android.server.hdmi.Constants.OPTION_MHL_ENABLE;
import static com.android.server.hdmi.Constants.OPTION_MHL_INPUT_SWITCHING;
import static com.android.server.hdmi.Constants.OPTION_MHL_POWER_CHARGE;
@@ -4540,4 +4541,13 @@ public class HdmiControlService extends SystemService {
            mEarcLocalDevice.handleEarcCapabilitiesReported(rawCapabilities);
        }
    }

    protected boolean earcBlocksArcConnection() {
        if (mEarcLocalDevice == null) {
            return false;
        }
        synchronized (mLock) {
            return mEarcLocalDevice.mEarcStatus != HDMI_EARC_STATUS_ARC_PENDING;
        }
    }
}
+4 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.hdmi;

import static com.android.server.hdmi.Constants.HDMI_EARC_STATUS_ARC_PENDING;
import static com.android.server.hdmi.Constants.HDMI_EARC_STATUS_EARC_CONNECTED;
import static com.android.server.hdmi.Constants.HDMI_EARC_STATUS_EARC_PENDING;
import static com.android.server.hdmi.Constants.HDMI_EARC_STATUS_IDLE;

import android.hardware.hdmi.HdmiDeviceInfo;
@@ -69,6 +70,9 @@ public class HdmiEarcLocalDeviceTx extends HdmiEarcLocalDevice {
    HdmiEarcLocalDeviceTx(HdmiControlService service) {
        super(service, HdmiDeviceInfo.DEVICE_TV);

        synchronized (mLock) {
            mEarcStatus = HDMI_EARC_STATUS_EARC_PENDING;
        }
        mReportCapsHandler = new Handler(service.getServiceLooper());
        mReportCapsRunnable = new ReportCapsRunnable();
    }
+287 −29

File changed.

Preview size limit exceeded, changes collapsed.

+40 −0
Original line number Diff line number Diff line
@@ -1253,6 +1253,46 @@ public class HdmiControlServiceTest {
        verify(mHdmiControlServiceSpy, times(0)).setEarcEnabledInHal(true);
    }

    @Test
    public void earcIdle_blocksArcConnection() {
        mHdmiControlServiceSpy.mEarcSupported = true;
        mHdmiControlServiceSpy.clearEarcLocalDevice();
        HdmiEarcLocalDeviceTx localDeviceTx = new HdmiEarcLocalDeviceTx(mHdmiControlServiceSpy);
        localDeviceTx.handleEarcStateChange(Constants.HDMI_EARC_STATUS_IDLE);
        mHdmiControlServiceSpy.addEarcLocalDevice(localDeviceTx);
        assertThat(mHdmiControlServiceSpy.earcBlocksArcConnection()).isTrue();
    }

    @Test
    public void earcPending_blocksArcConnection() {
        mHdmiControlServiceSpy.mEarcSupported = true;
        mHdmiControlServiceSpy.clearEarcLocalDevice();
        HdmiEarcLocalDeviceTx localDeviceTx = new HdmiEarcLocalDeviceTx(mHdmiControlServiceSpy);
        localDeviceTx.handleEarcStateChange(Constants.HDMI_EARC_STATUS_EARC_PENDING);
        mHdmiControlServiceSpy.addEarcLocalDevice(localDeviceTx);
        assertThat(mHdmiControlServiceSpy.earcBlocksArcConnection()).isTrue();
    }

    @Test
    public void earcEnabled_blocksArcConnection() {
        mHdmiControlServiceSpy.mEarcSupported = true;
        mHdmiControlServiceSpy.clearEarcLocalDevice();
        HdmiEarcLocalDeviceTx localDeviceTx = new HdmiEarcLocalDeviceTx(mHdmiControlServiceSpy);
        localDeviceTx.handleEarcStateChange(Constants.HDMI_EARC_STATUS_EARC_CONNECTED);
        mHdmiControlServiceSpy.addEarcLocalDevice(localDeviceTx);
        assertThat(mHdmiControlServiceSpy.earcBlocksArcConnection()).isTrue();
    }

    @Test
    public void arcPending_doesNotBlockArcConnection() {
        mHdmiControlServiceSpy.mEarcSupported = true;
        mHdmiControlServiceSpy.clearEarcLocalDevice();
        HdmiEarcLocalDeviceTx localDeviceTx = new HdmiEarcLocalDeviceTx(mHdmiControlServiceSpy);
        localDeviceTx.handleEarcStateChange(Constants.HDMI_EARC_STATUS_ARC_PENDING);
        mHdmiControlServiceSpy.addEarcLocalDevice(localDeviceTx);
        assertThat(mHdmiControlServiceSpy.earcBlocksArcConnection()).isFalse();
    }

    protected static class MockPlaybackDevice extends HdmiCecLocalDevicePlayback {

        private boolean mCanGoToStandby;