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
This commit is contained in:
Paul Colta
2023-07-14 11:39:43 +00:00
parent 4f31ec722a
commit 590e678262
2 changed files with 50 additions and 1 deletions

View File

@@ -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);
}
}

View File

@@ -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));
}
}