diff --git a/services/core/java/com/android/server/hdmi/HdmiEarcLocalDeviceTx.java b/services/core/java/com/android/server/hdmi/HdmiEarcLocalDeviceTx.java index bdc30b9f16ad2..abb8439092acd 100644 --- a/services/core/java/com/android/server/hdmi/HdmiEarcLocalDeviceTx.java +++ b/services/core/java/com/android/server/hdmi/HdmiEarcLocalDeviceTx.java @@ -78,9 +78,11 @@ public class HdmiEarcLocalDeviceTx extends HdmiEarcLocalDevice { } protected void handleEarcStateChange(@Constants.EarcStatus int status) { + int oldEarcStatus; synchronized (mLock) { HdmiLogger.debug(TAG, "eARC state change [old:%b new %b]", mEarcStatus, status); + oldEarcStatus = mEarcStatus; mEarcStatus = status; } @@ -91,7 +93,13 @@ public class HdmiEarcLocalDeviceTx extends HdmiEarcLocalDevice { } else if (status == HDMI_EARC_STATUS_ARC_PENDING) { notifyEarcStatusToAudioService(false, new ArrayList<>()); mService.startArcAction(true, null); + } else if (status == HDMI_EARC_STATUS_EARC_PENDING + && oldEarcStatus == HDMI_EARC_STATUS_ARC_PENDING) { + mService.startArcAction(false, null); } else if (status == HDMI_EARC_STATUS_EARC_CONNECTED) { + if (oldEarcStatus == HDMI_EARC_STATUS_ARC_PENDING) { + mService.startArcAction(false, null); + } mReportCapsHandler.postDelayed(mReportCapsRunnable, REPORT_CAPS_MAX_DELAY_MS); } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java index 1c33fb984ca04..aa49a6222390f 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java @@ -1319,6 +1319,28 @@ public class HdmiControlServiceTest { verify(mHdmiControlServiceSpy, times(1)).startArcAction(eq(true), any()); } + @Test + public void earcStateWasArcPending_becomesEarcPending_terminateArc() { + mHdmiControlServiceSpy.clearEarcLocalDevice(); + HdmiEarcLocalDeviceTx localDeviceTx = new HdmiEarcLocalDeviceTx(mHdmiControlServiceSpy); + mHdmiControlServiceSpy.addEarcLocalDevice(localDeviceTx); + localDeviceTx.handleEarcStateChange(Constants.HDMI_EARC_STATUS_ARC_PENDING); + mTestLooper.dispatchAll(); + localDeviceTx.handleEarcStateChange(Constants.HDMI_EARC_STATUS_EARC_PENDING); + verify(mHdmiControlServiceSpy, times(1)).startArcAction(eq(false), any()); + } + + @Test + public void earcStateWasArcPending_becomesEarcEnabled_terminateArc() { + mHdmiControlServiceSpy.clearEarcLocalDevice(); + HdmiEarcLocalDeviceTx localDeviceTx = new HdmiEarcLocalDeviceTx(mHdmiControlServiceSpy); + mHdmiControlServiceSpy.addEarcLocalDevice(localDeviceTx); + localDeviceTx.handleEarcStateChange(Constants.HDMI_EARC_STATUS_ARC_PENDING); + mTestLooper.dispatchAll(); + localDeviceTx.handleEarcStateChange(Constants.HDMI_EARC_STATUS_EARC_CONNECTED); + verify(mHdmiControlServiceSpy, times(1)).startArcAction(eq(false), any()); + } + protected static class MockPlaybackDevice extends HdmiCecLocalDevicePlayback { private boolean mCanGoToStandby;