Merge "HDMI: Check if sink has CEC enabled after hotplug" into main
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index e0e825d..c8c66238 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 @@
// 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 99fa30c..1d3dacc 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 @@
.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 @@
}
@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");