Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4927bba authored by Paul Colta's avatar Paul Colta
Browse files

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
parent 140ad1bc
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
            }
        }
+1 −1
Original line number Diff line number Diff line
@@ -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.