From 590e678262b1051e34f01c356790983fab0a9c5b Mon Sep 17 00:00:00 2001 From: Paul Colta Date: Fri, 14 Jul 2023 11:39:43 +0000 Subject: [PATCH] HDMI: Update eARC atom logging with new log reasons Log atoms when eARC state is changed to an unexpected state or when the port does not support eARC. Include unit tests to cover this change. Bug: 290884570 Test: atest HdmiCecAtomLoggingTvTest Change-Id: I5a4f7d4247083668be82f9a3639b446d9f5881dc --- .../server/hdmi/HdmiControlService.java | 8 +++- .../server/hdmi/HdmiCecAtomLoggingTvTest.java | 43 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) 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)); + } }