Merge "HDMI: Avoid NPE on Hotplug In" into main
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
index b3aa351..70993ca 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
@@ -201,7 +201,8 @@
if (WAKE_ON_HOTPLUG && connected) {
mService.wakeUp();
}
- if (mService.getPortInfo(portId).getType() == HdmiPortInfo.PORT_OUTPUT) {
+ HdmiPortInfo portInfo = mService.getPortInfo(portId);
+ if (portInfo != null && portInfo.getType() == HdmiPortInfo.PORT_OUTPUT) {
mCecMessageCache.flushAll();
if (!connected) {
if (isSystemAudioActivated()) {
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java
index 7e8a2cc..29303aa 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java
@@ -92,7 +92,8 @@
@ServiceThreadOnly
void onHotplug(int portId, boolean connected) {
assertRunOnServiceThread();
- if (mService.getPortInfo(portId).getType() == HdmiPortInfo.PORT_OUTPUT) {
+ HdmiPortInfo portInfo = mService.getPortInfo(portId);
+ if (portInfo != null && portInfo.getType() == HdmiPortInfo.PORT_OUTPUT) {
mCecMessageCache.flushAll();
}
// We'll not invalidate the active source on the hotplug event to pass CETC 11.2.2-2 ~ 3.
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index b3926fd..9253706 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -1783,8 +1783,9 @@
// initPortInfo at hotplug event.
mHdmiCecNetwork.initPortInfo();
+ HdmiPortInfo portInfo = getPortInfo(portId);
if (connected && !isTvDevice()
- && getPortInfo(portId).getType() == HdmiPortInfo.PORT_OUTPUT) {
+ && portInfo != null && portInfo.getType() == HdmiPortInfo.PORT_OUTPUT) {
ArrayList<HdmiCecLocalDevice> localDevices = new ArrayList<>();
for (int type : getCecLocalDeviceTypes()) {
HdmiCecLocalDevice localDevice = mHdmiCecNetwork.getLocalDevice(type);
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 708ee35..99fa30c 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java
@@ -1706,6 +1706,15 @@
verify(mHdmiControlServiceSpy, times(1)).startArcAction(eq(false), any());
}
+ @Test
+ public void onHotplugIn_invalidPortId_noAddressAllocation() {
+ mHdmiControlServiceSpy.onHotplug(-1, true);
+ mTestLooper.dispatchAll();
+
+ verify(mHdmiControlServiceSpy, times(0))
+ .allocateLogicalAddress(any(), eq(INITIATED_BY_HOTPLUG));
+ }
+
protected static class MockPlaybackDevice extends HdmiCecLocalDevicePlayback {
private boolean mCanGoToStandby;