HDMI: Avoid creating multiple DeviceDiscoveryActions for a local device
After an OTT device wakes-up, a hot-plug can be trigerred by the TV.
Both actions (wake-up & hot-plug) will trigger address allocations which
will end-up launching a `DeviceDiscoveryAction`. This has to be avoided
to not send more messages than necessary and to not have any issues with
the known list of connected devices.
Test: atest HdmiCecLocalDevicePlaybackTest
Bug: 314264570
Bug: 264611886
Change-Id: Ib0e7594d0fb21eaba5934edb8a2b1dc0dc24f6f6
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index 0671464..952af69 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -1117,6 +1117,7 @@
}
// Returns all actions matched with given class type.
+ @VisibleForTesting
@ServiceThreadOnly
<T extends HdmiCecFeatureAction> List<T> getActions(final Class<T> clazz) {
assertRunOnServiceThread();
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
index 824c8db..ba4d320 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
@@ -126,6 +126,10 @@
private void launchDeviceDiscovery() {
assertRunOnServiceThread();
clearDeviceInfoList();
+ if (hasAction(DeviceDiscoveryAction.class)) {
+ Slog.i(TAG, "Device Discovery Action is in progress. Restarting.");
+ removeAction(DeviceDiscoveryAction.class);
+ }
DeviceDiscoveryAction action = new DeviceDiscoveryAction(this,
new DeviceDiscoveryAction.DeviceDiscoveryCallback() {
@Override
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
index dec89d9..543fa57 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
@@ -1774,6 +1774,18 @@
}
@Test
+ public void wakeUp_hotPlugIn_invokesDeviceDiscoveryOnce() {
+ mNativeWrapper.setPollAddressResponse(Constants.ADDR_PLAYBACK_2, SendMessageResult.SUCCESS);
+ mHdmiControlService.onWakeUp(HdmiControlService.WAKE_UP_SCREEN_ON);
+ mTestLooper.dispatchAll();
+
+ mNativeWrapper.onHotplugEvent(1, true);
+ mTestLooper.dispatchAll();
+
+ assertThat(mHdmiCecLocalDevicePlayback.getActions(DeviceDiscoveryAction.class)).hasSize(1);
+ }
+
+ @Test
public void hotplugDetectionAction_addDevice() {
int otherPlaybackLogicalAddress = mPlaybackLogicalAddress == Constants.ADDR_PLAYBACK_2
? Constants.ADDR_PLAYBACK_1 : Constants.ADDR_PLAYBACK_2;