diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index a7e78be0578b9..dd4530731e06d 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -4855,11 +4855,13 @@ public class HdmiControlService extends SystemService { @ServiceThreadOnly void handleEarcStateChange(int status, int portId) { assertRunOnServiceThread(); + int oldEarcStatus = getEarcStatus(); if (!getPortInfo(portId).isEarcSupported()) { Slog.w(TAG, "Tried to update eARC status on a port that doesn't support eARC."); + getAtomWriter().earcStatusChanged(isEarcSupported(), isEarcEnabled(), oldEarcStatus, + status, HdmiStatsEnums.LOG_REASON_EARC_STATUS_CHANGED_UNSUPPORTED_PORT); return; } - int oldEarcStatus = getEarcStatus(); if (mEarcLocalDevice != null) { mEarcLocalDevice.handleEarcStateChange(status); getAtomWriter().earcStatusChanged(isEarcSupported(), isEarcEnabled(), @@ -4872,6 +4874,10 @@ public class HdmiControlService extends SystemService { startArcAction(true, null); getAtomWriter().earcStatusChanged(isEarcSupported(), isEarcEnabled(), oldEarcStatus, status, HdmiStatsEnums.LOG_REASON_EARC_STATUS_CHANGED); + } else { + getAtomWriter().earcStatusChanged(isEarcSupported(), isEarcEnabled(), + oldEarcStatus, status, + HdmiStatsEnums.LOG_REASON_EARC_STATUS_CHANGED_WRONG_STATE); } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecAtomLoggingTvTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecAtomLoggingTvTest.java index 24057578e62bc..30ce9616d9b58 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecAtomLoggingTvTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecAtomLoggingTvTest.java @@ -19,7 +19,9 @@ import static com.android.server.hdmi.Constants.HDMI_EARC_STATUS_EARC_PENDING; import static com.android.server.hdmi.Constants.HDMI_EARC_STATUS_UNKNOWN; import static com.android.server.hdmi.HdmiControlService.WAKE_UP_SCREEN_ON; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; @@ -206,4 +208,45 @@ public class HdmiCecAtomLoggingTvTest { .earcStatusChanged(false, false, HDMI_EARC_STATUS_UNKNOWN, HDMI_EARC_STATUS_UNKNOWN, HdmiStatsEnums.LOG_REASON_WAKE); } + + @Test + public void testEarcStatusChanged_handleEarcStateChange_unSupportedPort_writesAtom() { + // Initialize HDMI port with eARC not supported. + HdmiPortInfo[] hdmiPortInfos = new HdmiPortInfo[1]; + hdmiPortInfos[0] = + new HdmiPortInfo.Builder(EARC_PORT_ID, HdmiPortInfo.PORT_OUTPUT, 0x0000) + .setCecSupported(true) + .setMhlSupported(false) + .setArcSupported(false) + .setEarcSupported(false) + .build(); + mNativeWrapper.setPortInfo(hdmiPortInfos); + mNativeWrapper.setPortConnectionStatus(EARC_PORT_ID, true); + mHdmiControlServiceSpy.initService(); + mTestLooper.dispatchAll(); + + mHdmiControlServiceSpy.setEarcEnabled(HdmiControlManager.EARC_FEATURE_ENABLED); + mTestLooper.dispatchAll(); + Mockito.clearInvocations(mHdmiCecAtomWriterSpy); + + mHdmiControlServiceSpy.handleEarcStateChange(HDMI_EARC_STATUS_EARC_PENDING, EARC_PORT_ID); + verify(mHdmiCecAtomWriterSpy, times(1)) + .earcStatusChanged(eq(false), eq(true), anyInt(), + eq(HDMI_EARC_STATUS_EARC_PENDING), + eq(HdmiStatsEnums.LOG_REASON_EARC_STATUS_CHANGED_UNSUPPORTED_PORT)); + } + + @Test + public void testEarcStatusChanged_handleEarcStateChange_wrongState_writesAtom() { + mHdmiControlServiceSpy.setEarcEnabled(HdmiControlManager.EARC_FEATURE_DISABLED); + mTestLooper.dispatchAll(); + Mockito.clearInvocations(mHdmiCecAtomWriterSpy); + + // mEarcLocalDevice should be empty since eARC is disabled. + mHdmiControlServiceSpy.handleEarcStateChange(HDMI_EARC_STATUS_EARC_PENDING, EARC_PORT_ID); + verify(mHdmiCecAtomWriterSpy, times(1)) + .earcStatusChanged(eq(true), eq(false), anyInt(), + eq(HDMI_EARC_STATUS_EARC_PENDING), + eq(HdmiStatsEnums.LOG_REASON_EARC_STATUS_CHANGED_WRONG_STATE)); + } }