HDMICEC: Remove deferred OneTouchPlayAction

This fix a critical bug of playback devices sending an <Active Source> message when they are not the source selected by users, taking over TVs screen. This situation occurs when users are changing input sources quickly, triggering a playback device to wake up from the standby state, starting CEC initialization. When the initialization is complete, the device tries to start an OneTouchPlayAction, which will trigger the <Active Source> message to be broadcasted.

The change includes setting mAddressAllocated to true after the onInitializeCecComplete call as opposed to before. This way, a possible created OneTouchPlayAction is not started right away, but deferred. This action is cancelled when preprocessing the buffer messages.

Bug: 235434112
Test: make && atest HdmiCecLocalDevicePlaybackTest
Change-Id: Ic189ba5ab72b8e8b4f9d957f3367b453e82df8fd
This commit is contained in:
Paul Colta
2022-08-23 15:12:27 +00:00
parent 140ad1bc10
commit d4927bbaa2
2 changed files with 2 additions and 1 deletions

View File

@@ -544,6 +544,7 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
|| message.getOpcode() == Constants.MESSAGE_SET_STREAM_PATH
|| message.getOpcode() == Constants.MESSAGE_ACTIVE_SOURCE) {
removeAction(ActiveSourceAction.class);
removeAction(OneTouchPlayAction.class);
return;
}
}

View File

@@ -1051,13 +1051,13 @@ public class HdmiControlService extends SystemService {
// Address allocation completed for all devices. Notify each device.
if (allocatingDevices.size() == ++finished[0]) {
mAddressAllocated = true;
if (initiatedBy != INITIATED_BY_HOTPLUG) {
// In case of the hotplug we don't call
// onInitializeCecComplete()
// since we reallocate the logical address only.
onInitializeCecComplete(initiatedBy);
}
mAddressAllocated = true;
notifyAddressAllocated(allocatedDevices, initiatedBy);
// Reinvoke the saved display status callback once the local
// device is ready.