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

Commit 25f640f9 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "[CEC] Standby when <Active Source> lost" into rvc-dev am: 96931ab2

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11623665

Change-Id: I0ff45fd9aec6d0fc2469b5676d851fd57ed46b86
parents f4c00c72 96931ab2
Loading
Loading
Loading
Loading
+16 −0
Original line number Original line Diff line number Diff line
@@ -500,6 +500,22 @@ final class Constants {
    static final String PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_WAKE_UP_AND_SEND_ACTIVE_SOURCE =
    static final String PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_WAKE_UP_AND_SEND_ACTIVE_SOURCE =
            "wake_up_and_send_active_source";
            "wake_up_and_send_active_source";


    /**
     * Property to decide the device behaviour when <Active Source> is lost.
     *
     * <p>This property applies to playback devices.
     * <p>Possible values are:
     * <ul>
     * <li><b>none</b> No power state change (default).
     * <li><b>standby_now</b> PowerManager.goToSleep() is called.
     * </ul>
     */
    static final String POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST =
            "ro.hdmi.cec.source.power_state_change_on_active_source_lost";

    static final String POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE = "none";
    static final String POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW = "standby_now";

    static final int RECORDING_TYPE_DIGITAL_RF = 1;
    static final int RECORDING_TYPE_DIGITAL_RF = 1;
    static final int RECORDING_TYPE_ANALOGUE_RF = 2;
    static final int RECORDING_TYPE_ANALOGUE_RF = 2;
    static final int RECORDING_TYPE_EXTERNAL_PHYSICAL_ADDRESS = 3;
    static final int RECORDING_TYPE_EXTERNAL_PHYSICAL_ADDRESS = 3;
+30 −0
Original line number Original line Diff line number Diff line
@@ -67,6 +67,10 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
    @VisibleForTesting
    @VisibleForTesting
    protected String mPlaybackDeviceActionOnRoutingControl;
    protected String mPlaybackDeviceActionOnRoutingControl;


    // Behaviour of the device when <Active Source> is lost in favor of another device.
    @VisibleForTesting
    protected String mPowerStateChangeOnActiveSourceLost;

    HdmiCecLocalDevicePlayback(HdmiControlService service) {
    HdmiCecLocalDevicePlayback(HdmiControlService service) {
        super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
        super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);


@@ -79,6 +83,10 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
        mPlaybackDeviceActionOnRoutingControl = SystemProperties.get(
        mPlaybackDeviceActionOnRoutingControl = SystemProperties.get(
                Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL,
                Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL,
                Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_NONE);
                Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_NONE);

        mPowerStateChangeOnActiveSourceLost = SystemProperties.get(
                Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
                Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
    }
    }


    @Override
    @Override
@@ -240,6 +248,28 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
        return !getWakeLock().isHeld();
        return !getWakeLock().isHeld();
    }
    }


    @Override
    @ServiceThreadOnly
    protected boolean handleActiveSource(HdmiCecMessage message) {
        super.handleActiveSource(message);
        if (mIsActiveSource) {
            return true;
        }
        switch (mPowerStateChangeOnActiveSourceLost) {
            case Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW:
                mService.standby();
                return true;
            case Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE:
                return true;
            default:
                Slog.w(TAG, "Invalid property '"
                        + Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST
                        + "' value: "
                        + mPowerStateChangeOnActiveSourceLost);
                return true;
        }
    }

    @ServiceThreadOnly
    @ServiceThreadOnly
    protected boolean handleUserControlPressed(HdmiCecMessage message) {
    protected boolean handleUserControlPressed(HdmiCecMessage message) {
        assertRunOnServiceThread();
        assertRunOnServiceThread();
+52 −0
Original line number Original line Diff line number Diff line
@@ -57,6 +57,7 @@ public class HdmiCecLocalDevicePlaybackTest {
    private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
    private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
    private int mPlaybackPhysicalAddress;
    private int mPlaybackPhysicalAddress;
    private boolean mWokenUp;
    private boolean mWokenUp;
    private boolean mStandby;


    @Mock private IPowerManager mIPowerManagerMock;
    @Mock private IPowerManager mIPowerManagerMock;
    @Mock private IThermalService mIThermalServiceMock;
    @Mock private IThermalService mIThermalServiceMock;
@@ -76,6 +77,11 @@ public class HdmiCecLocalDevicePlaybackTest {
                    mWokenUp = true;
                    mWokenUp = true;
                }
                }


                @Override
                void standby() {
                    mStandby = true;
                }

                @Override
                @Override
                boolean isControlEnabled() {
                boolean isControlEnabled() {
                    return true;
                    return true;
@@ -336,6 +342,52 @@ public class HdmiCecLocalDevicePlaybackTest {
        assertThat(mNativeWrapper.getResultMessages()).contains(standbyMessage);
        assertThat(mNativeWrapper.getResultMessages()).contains(standbyMessage);
    }
    }


    @Test
    public void handleActiveSource_ActiveSource_None() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
                Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE;
        mStandby = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1,
                                         mPlaybackPhysicalAddress);
        assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue();
        mTestLooper.dispatchAll();
        assertThat(mStandby).isFalse();
    }

    @Test
    public void handleActiveSource_notActiveSource_None() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
                Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE;
        mStandby = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
        assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue();
        mTestLooper.dispatchAll();
        assertThat(mStandby).isFalse();
    }

    @Test
    public void handleActiveSource_ActiveSource_StandbyNow() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
                Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW;
        mStandby = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1,
                                         mPlaybackPhysicalAddress);
        assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue();
        mTestLooper.dispatchAll();
        assertThat(mStandby).isFalse();
    }

    @Test
    public void handleActiveSource_notActiveSource_StandbyNow() {
        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
                Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW;
        mStandby = false;
        HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
        assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue();
        mTestLooper.dispatchAll();
        assertThat(mStandby).isTrue();
    }

    @Test
    @Test
    public void sendVolumeKeyEvent_up_volumeEnabled() {
    public void sendVolumeKeyEvent_up_volumeEnabled() {
        mHdmiControlService.setHdmiCecVolumeControlEnabled(true);
        mHdmiControlService.setHdmiCecVolumeControlEnabled(true);