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

Commit 45c5ad3b authored by Marvin Ramin's avatar Marvin Ramin
Browse files

Fix issue with internal Active Source state tracking

Only set the internal Active Source device after the <Active Source>
message has been sent.

This prevents an issue where the internal state of a Source device
gets set with an incorrect logical address while address allocation is
still in progress.

This should in turn resolve issues with source devices not sending
Standby messages as they might believe they are not active source (due
to invalid LA).

Bug: 158441116
Test: atest HdmiCecLocalDevicePlaybackTest
Change-Id: Ibd78925a8bdc826341068c89e7f621f58dd41933
parent 132ef7e4
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -39,15 +39,19 @@ public class ActiveSourceAction extends HdmiCecFeatureAction {
    @Override
    boolean start() {
        mState = STATE_STARTED;
        sendCommand(HdmiCecMessageBuilder.buildActiveSource(getSourceAddress(),
                source().mService.getPhysicalAddress()));
        int logicalAddress = getSourceAddress();
        int physicalAddress = getSourcePath();

        sendCommand(HdmiCecMessageBuilder.buildActiveSource(logicalAddress, physicalAddress));

        if (source().getType() == HdmiDeviceInfo.DEVICE_PLAYBACK) {
            // Reports menu-status active to receive <User Control Pressed>.
            sendCommand(
                    HdmiCecMessageBuilder.buildReportMenuStatus(getSourceAddress(), mDestination,
                    HdmiCecMessageBuilder.buildReportMenuStatus(logicalAddress, mDestination,
                            Constants.MENU_STATE_ACTIVATED));
        }

        source().setActiveSource(logicalAddress, physicalAddress);
        mState = STATE_FINISHED;
        finish();
        return true;
+0 −4
Original line number Diff line number Diff line
@@ -3244,7 +3244,6 @@ public class HdmiControlService extends SystemService {
            playback.setIsActiveSource(true);
            playback.wakeUpIfActiveSource();
            playback.maySendActiveSource(source);
            setActiveSource(playback.mAddress, physicalAddress);
        }

        if (deviceType == HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM) {
@@ -3255,7 +3254,6 @@ public class HdmiControlService extends SystemService {
                audioSystem.setIsActiveSource(true);
                audioSystem.wakeUpIfActiveSource();
                audioSystem.maySendActiveSource(source);
                setActiveSource(audioSystem.mAddress, physicalAddress);
            }
        }
    }
@@ -3278,13 +3276,11 @@ public class HdmiControlService extends SystemService {
            if (audioSystem != null) {
                audioSystem.setIsActiveSource(false);
            }
            setActiveSource(playback.mAddress, physicalAddress);
        } else {
            if (audioSystem != null) {
                audioSystem.setIsActiveSource(true);
                audioSystem.wakeUpIfActiveSource();
                audioSystem.maySendActiveSource(sourceAddress);
                setActiveSource(audioSystem.mAddress, physicalAddress);
            }
        }
    }
+20 −0
Original line number Diff line number Diff line
@@ -143,6 +143,26 @@ public class ActiveSourceActionTest {
        assertThat(mNativeWrapper.getResultMessages()).contains(menuStatus);
    }

    @Test
    public void playbackDevice_updatesActiveSourceState() {
        HdmiCecLocalDevicePlayback playbackDevice = new HdmiCecLocalDevicePlayback(
                mHdmiControlService);
        playbackDevice.init();
        mLocalDevices.add(playbackDevice);
        mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
        mTestLooper.dispatchAll();

        HdmiCecFeatureAction action = new com.android.server.hdmi.ActiveSourceAction(
                playbackDevice, ADDR_TV);
        playbackDevice.addAndStartAction(action);
        mTestLooper.dispatchAll();

        assertThat(playbackDevice.getActiveSource().logicalAddress).isEqualTo(
                playbackDevice.mAddress);
        assertThat(playbackDevice.getActiveSource().physicalAddress).isEqualTo(mPhysicalAddress);
        assertThat(playbackDevice.mIsActiveSource).isTrue();
    }

    @Test
    public void audioDevice_sendsActiveSource_noMenuStatus() {
        HdmiCecLocalDeviceAudioSystem audioDevice = new HdmiCecLocalDeviceAudioSystem(
+15 −0
Original line number Diff line number Diff line
@@ -526,4 +526,19 @@ public class HdmiCecLocalDevicePlaybackTest {

        assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
    }

    @Test
    public void handleSetStreamPath_afterHotplug_hasCorrectActiveSource() {
        mHdmiControlService.onHotplug(1, false);
        mHdmiControlService.onHotplug(1, true);

        HdmiCecMessage setStreamPath = HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV,
                mPlaybackPhysicalAddress);
        mHdmiCecLocalDevicePlayback.dispatchMessage(setStreamPath);
        mTestLooper.dispatchAll();

        assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
                mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress());
        assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue();
    }
}