From f8d4f59594ef7ada23bb71c3a05db6eb3f46bb78 Mon Sep 17 00:00:00 2001 From: Paul Colta Date: Wed, 7 Feb 2024 08:06:17 +0000 Subject: HDMI: Check if sink has CEC enabled after hotplug Bug: 323557013 Test: atest HdmiControlServiceTest Change-Id: I4bd2b117e8a15f70086a7171ac05cfa397a7bee7 --- .../android/server/hdmi/HdmiControlService.java | 6 +++ .../server/hdmi/HdmiControlServiceTest.java | 63 +++++++++++++++++++++- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index e0e825d9147a..c8c662387d16 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -1366,6 +1366,12 @@ public class HdmiControlService extends SystemService { // we don't call onInitializeCecComplete() // since we reallocate the logical address only. onInitializeCecComplete(initiatedBy); + } else if (initiatedBy == INITIATED_BY_HOTPLUG + && mDisplayStatusCallback == null) { + // Force to update display status for hotplug event. + synchronized (mLock) { + announceHdmiControlStatusChange(mHdmiControlEnabled); + } } // We remove local devices here, instead of before the start of // address allocation, to prevent multiple local devices of the 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 99fa30c588db..1d3daccd0d90 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java @@ -169,14 +169,14 @@ public class HdmiControlServiceTest { .setEarcSupported(true) .build(); mHdmiPortInfo[3] = - new HdmiPortInfo.Builder(4, HdmiPortInfo.PORT_INPUT, 0x3000) + new HdmiPortInfo.Builder(4, HdmiPortInfo.PORT_OUTPUT, 0x3000) .setCecSupported(true) .setMhlSupported(false) .setArcSupported(false) .setEarcSupported(false) .build(); mHdmiPortInfo[4] = - new HdmiPortInfo.Builder(4, HdmiPortInfo.PORT_OUTPUT, 0x3000) + new HdmiPortInfo.Builder(5, HdmiPortInfo.PORT_OUTPUT, 0x3000) .setCecSupported(true) .setMhlSupported(false) .setArcSupported(false) @@ -840,6 +840,65 @@ public class HdmiControlServiceTest { assertThat(hdmiControlStatusCallback.mCecAvailable).isTrue(); } + @Test + public void onHotPlugIn_CecDisabledOnTv_CecNotAvailable() { + HdmiControlStatusCallback hdmiControlStatusCallback = new HdmiControlStatusCallback(); + mHdmiControlServiceSpy.addHdmiControlStatusChangeListener(hdmiControlStatusCallback); + mTestLooper.dispatchAll(); + + mHdmiControlServiceSpy.setPowerStatus(HdmiControlManager.POWER_STATUS_ON); + mHdmiControlServiceSpy.playback().removeAction(DevicePowerStatusAction.class); + mNativeWrapper.clearResultMessages(); + mTestLooper.dispatchAll(); + + mHdmiControlServiceSpy.onHotplug(4, true); + mTestLooper.dispatchAll(); + + HdmiCecMessage giveDevicePowerStatus = + HdmiCecMessageBuilder.buildGiveDevicePowerStatus( + mHdmiControlServiceSpy.playback().getDeviceInfo().getLogicalAddress(), + Constants.ADDR_TV); + assertThat(mNativeWrapper.getResultMessages()).contains(giveDevicePowerStatus); + // Wait for DevicePowerStatusAction to finish. + mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS); + mTestLooper.dispatchAll(); + mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS); + mTestLooper.dispatchAll(); + + assertThat(hdmiControlStatusCallback.mCecEnabled).isTrue(); + assertThat(hdmiControlStatusCallback.mCecAvailable).isFalse(); + } + + @Test + public void onHotPlugIn_CecEnabledOnTv_CecAvailable() { + HdmiControlStatusCallback hdmiControlStatusCallback = new HdmiControlStatusCallback(); + mHdmiControlServiceSpy.addHdmiControlStatusChangeListener(hdmiControlStatusCallback); + mTestLooper.dispatchAll(); + + mHdmiControlServiceSpy.setPowerStatus(HdmiControlManager.POWER_STATUS_ON); + mHdmiControlServiceSpy.playback().removeAction(DevicePowerStatusAction.class); + mNativeWrapper.clearResultMessages(); + mTestLooper.dispatchAll(); + + mHdmiControlServiceSpy.onHotplug(4, true); + mTestLooper.dispatchAll(); + + HdmiCecMessage giveDevicePowerStatus = + HdmiCecMessageBuilder.buildGiveDevicePowerStatus( + mHdmiControlServiceSpy.playback().getDeviceInfo().getLogicalAddress(), + Constants.ADDR_TV); + HdmiCecMessage reportPowerStatus = + HdmiCecMessageBuilder.buildReportPowerStatus( + Constants.ADDR_TV, + mHdmiControlServiceSpy.playback().getDeviceInfo().getLogicalAddress(), + HdmiControlManager.POWER_STATUS_ON); + assertThat(mNativeWrapper.getResultMessages()).contains(giveDevicePowerStatus); + mNativeWrapper.onCecMessage(reportPowerStatus); + mTestLooper.dispatchAll(); + + assertThat(hdmiControlStatusCallback.mCecEnabled).isTrue(); + assertThat(hdmiControlStatusCallback.mCecAvailable).isTrue(); + } @Test public void handleCecCommand_errorParameter_returnsAbortInvalidOperand() { // Validity ERROR_PARAMETER. Taken from HdmiCecMessageValidatorTest#isValid_menuStatus -- cgit v1.2.3-59-g8ed1b