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

Commit ed2653d0 authored by Michal Olech's avatar Michal Olech Committed by Android (Google) Code Review
Browse files

Merge "Handle losing Active Source to non-CEC device"

parents 2b0a43e7 4574a8dc
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -232,11 +232,12 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
        mAutoTvOff = enabled;
    }

    @Override
    @ServiceThreadOnly
    @VisibleForTesting
    void setIsActiveSource(boolean on) {
        assertRunOnServiceThread();
        mIsActiveSource = on;
        super.setIsActiveSource(on);
        if (on) {
            getWakeLock().acquire();
        } else {
@@ -274,19 +275,15 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {

    @Override
    @ServiceThreadOnly
    protected boolean handleActiveSource(HdmiCecMessage message) {
        super.handleActiveSource(message);
        if (mIsActiveSource) {
            return true;
        }
    protected void onActiveSourceLost() {
        assertRunOnServiceThread();
        switch (mPowerStateChangeOnActiveSourceLost) {
            case STANDBY_NOW:
                mService.standby();
                return true;
                return;
            case NONE:
                return true;
                return;
        }
        return true;
    }

    @ServiceThreadOnly
@@ -398,9 +395,12 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
    }

    @Override
    @ServiceThreadOnly
    protected void handleRoutingChangeAndInformation(int physicalAddress, HdmiCecMessage message) {
        assertRunOnServiceThread();
        if (physicalAddress != mService.getPhysicalAddress()) {
            return; // Do nothing.
            setActiveSource(physicalAddress);
            return;
        }
        switch (mPlaybackDeviceActionOnRoutingControl) {
            case WAKE_UP_AND_SEND_ACTIVE_SOURCE:
+31 −5
Original line number Diff line number Diff line
@@ -113,6 +113,19 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
        addAndStartAction(action);
    }

    @ServiceThreadOnly
    protected void onActiveSourceLost() {
        // Nothing to do.
    }

    @ServiceThreadOnly
    protected void setActiveSource(int physicalAddress) {
        assertRunOnServiceThread();
        // Invalidate the internal active source record. This will also update mIsActiveSource.
        ActiveSource activeSource = ActiveSource.of(Constants.ADDR_INVALID, physicalAddress);
        setActiveSource(activeSource);
    }

    @ServiceThreadOnly
    protected boolean handleActiveSource(HdmiCecMessage message) {
        assertRunOnServiceThread();
@@ -148,6 +161,9 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
        if (physicalAddress == mService.getPhysicalAddress() && mService.isPlaybackDevice()) {
            setAndBroadcastActiveSource(message, physicalAddress);
        }
        if (physicalAddress != mService.getPhysicalAddress()) {
            setActiveSource(physicalAddress);
        }
        switchInputOnReceivingNewActivePath(physicalAddress);
        return true;
    }
@@ -156,18 +172,21 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
    @ServiceThreadOnly
    protected boolean handleRoutingChange(HdmiCecMessage message) {
        assertRunOnServiceThread();
        int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams(), 2);
        if (physicalAddress != mService.getPhysicalAddress()) {
            setActiveSource(physicalAddress);
        }
        if (!isRoutingControlFeatureEnabled()) {
            mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
            return true;
        }
        int newPath = HdmiUtils.twoBytesToInt(message.getParams(), 2);
        // if the current device is a pure playback device
        if (!mIsSwitchDevice
                && newPath == mService.getPhysicalAddress()
                && physicalAddress == mService.getPhysicalAddress()
                && mService.isPlaybackDevice()) {
            setAndBroadcastActiveSource(message, newPath);
            setAndBroadcastActiveSource(message, physicalAddress);
        }
        handleRoutingChangeAndInformation(newPath, message);
        handleRoutingChangeAndInformation(physicalAddress, message);
        return true;
    }

@@ -175,11 +194,14 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
    @ServiceThreadOnly
    protected boolean handleRoutingInformation(HdmiCecMessage message) {
        assertRunOnServiceThread();
        int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
        if (physicalAddress != mService.getPhysicalAddress()) {
            setActiveSource(physicalAddress);
        }
        if (!isRoutingControlFeatureEnabled()) {
            mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
            return true;
        }
        int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
        // if the current device is a pure playback device
        if (!mIsSwitchDevice
                && physicalAddress == mService.getPhysicalAddress()
@@ -222,7 +244,11 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
    @ServiceThreadOnly
    void setIsActiveSource(boolean on) {
        assertRunOnServiceThread();
        boolean wasActiveSource = mIsActiveSource;
        mIsActiveSource = on;
        if (wasActiveSource && !mIsActiveSource) {
            onActiveSourceLost();
        }
    }

    protected void wakeUpIfActiveSource() {
+145 −0
Original line number Diff line number Diff line
@@ -262,6 +262,112 @@ public class HdmiCecLocalDevicePlaybackTest {
        assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
    }

    @Test
    public void handleRoutingChange_otherDevice_None() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
            HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
        mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
        mStandby = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000);
        assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue();
        assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
        assertThat(mStandby).isFalse();
    }

    @Test
    public void handleRoutingChange_otherDevice_StandbyNow() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
            HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
        mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
        mStandby = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000);
        assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue();
        assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
        assertThat(mStandby).isTrue();
    }

    @Test
    public void handleRoutingChange_otherDevice_StandbyNow_InactiveSource() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
            HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
        mHdmiCecLocalDevicePlayback.setIsActiveSource(false);
        mStandby = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000);
        assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue();
        assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
        assertThat(mStandby).isFalse();
    }

    @Test
    public void handleRoutingChange_sameDevice_StandbyNow_ActiveSource() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
            HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
        mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
        mStandby = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
                        mPlaybackPhysicalAddress);
        assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue();
        assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue();
        assertThat(mStandby).isFalse();
    }

    @Test
    public void handleRoutingInformation_otherDevice_None() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
            HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
        mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
        mStandby = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
        assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue();
        assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
        assertThat(mStandby).isFalse();
    }

    @Test
    public void handleRoutingInformation_otherDevice_StandbyNow() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
            HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
        mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
        mStandby = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
        assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue();
        assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
        assertThat(mStandby).isTrue();
    }

    @Test
    public void handleRoutingInformation_otherDevice_StandbyNow_InactiveSource() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
            HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
        mHdmiCecLocalDevicePlayback.setIsActiveSource(false);
        mStandby = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
        assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue();
        assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
        assertThat(mStandby).isFalse();
    }

    @Test
    public void handleRoutingInformation_sameDevice_StandbyNow_ActiveSource() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
            HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
        mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
        mStandby = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV,
                        mPlaybackPhysicalAddress);
        assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue();
        assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue();
        assertThat(mStandby).isFalse();
    }

    // Playback device does not handle routing control related feature right now
    @Ignore("b/120845532")
    @Test
@@ -629,4 +735,43 @@ public class HdmiCecLocalDevicePlaybackTest {
                mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress());
        assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue();
    }

    @Test
    public void handleSetStreamPath_otherDevice_None() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
            HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
        mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
        mStandby = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
        assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue();
        assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
        assertThat(mStandby).isFalse();
    }

    @Test
    public void handleSetStreamPath_otherDevice_StandbyNow() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
            HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
        mHdmiCecLocalDevicePlayback.setIsActiveSource(true);
        mStandby = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
        assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue();
        assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
        assertThat(mStandby).isTrue();
    }

    @Test
    public void handleSetStreamPath_otherDevice_StandbyNow_InactiveSource() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
            HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
        mHdmiCecLocalDevicePlayback.setIsActiveSource(false);
        mStandby = false;
        HdmiCecMessage message =
                HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
        assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue();
        assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse();
        assertThat(mStandby).isFalse();
    }
}