diff options
| author | 2024-02-07 08:06:17 +0000 | |
|---|---|---|
| committer | 2024-02-07 13:48:26 +0000 | |
| commit | f8d4f59594ef7ada23bb71c3a05db6eb3f46bb78 (patch) | |
| tree | ca2c61c63f984b284a2571bac1b729241248d1b6 | |
| parent | 61b0f8fa78e7a374784f346d374c32201b586031 (diff) | |
HDMI: Check if sink has CEC enabled after hotplug
Bug: 323557013
Test: atest HdmiControlServiceTest
Change-Id: I4bd2b117e8a15f70086a7171ac05cfa397a7bee7
| -rw-r--r-- | services/core/java/com/android/server/hdmi/HdmiControlService.java | 6 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/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) @@ -841,6 +841,65 @@ public class HdmiControlServiceTest { } @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 HdmiCecMessage message = HdmiUtils.buildMessage("80:8D:03"); |