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

Commit 0786ebc9 authored by Marvin Ramin's avatar Marvin Ramin
Browse files

Update handling of incoming CEC power key presses

Update handling of <User Control Pressed> messages with power related
operands. Power commands change the power status properly and should not
be converted to power keycodes.

This particularly changes the handling of <User Control Pressed>["Power"]
which could be converted to KEYCODE_POWER before when the device was on
when the keycode was received, causing the device to turn off. This is
no longer supported and <User Control Pressed>["Power"] will be treated
as a power on command.

Test: atest HdmiCecLocalDeviceTest
Fixes: 174452275
Change-Id: I10f6d0d235d999bd29b54ba96728c0bda9697ec5
parent a02ab705
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -623,6 +623,14 @@ abstract class HdmiCecLocalDevice {
            return false;
        }

        if (isPowerOffOrToggleCommand(message) || isPowerOnOrToggleCommand(message)) {
            // Power commands should already be handled above. Don't continue and convert the CEC
            // keycode to Android keycode.
            // Do not <Feature Abort> as the local device should already be in the correct power
            // state.
            return true;
        }

        final long downTime = SystemClock.uptimeMillis();
        final byte[] params = message.getParams();
        final int keycode = HdmiCecKeycode.cecKeycodeAndParamsToAndroidKey(params);
+108 −0
Original line number Diff line number Diff line
@@ -112,6 +112,7 @@ public class HdmiCecLocalDeviceTest {
    private HdmiCecMessageValidator mMessageValidator;
    private static byte[] param;
    private boolean mStandbyMessageReceived;
    private boolean mWakeupMessageReceived;
    private boolean isControlEnabled;
    private int mPowerStatus;

@@ -130,10 +131,22 @@ public class HdmiCecLocalDeviceTest {
                                || mPowerStatus == HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON;
                    }

                    @Override
                    boolean isPowerStandbyOrTransient() {
                        return mPowerStatus == HdmiControlManager.POWER_STATUS_STANDBY
                                || mPowerStatus
                                == HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY;
                    }

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

                    @Override
                    void wakeUp() {
                        mWakeupMessageReceived = true;
                    }
                };
        mHdmiControlService.setIoLooper(mTestLooper.getLooper());
        mHdmiCecController = HdmiCecController.createWithNativeWrapper(
@@ -276,4 +289,99 @@ public class HdmiCecLocalDeviceTest {
        assertThat(result).isTrue();
    }

    @Test
    public void handleUserControlPressed_power_localDeviceInStandby_shouldTurnOn() {
        mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY;
        boolean result = mHdmiLocalDevice.handleUserControlPressed(
                HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
                        HdmiCecKeycode.CEC_KEYCODE_POWER));

        assertThat(result).isTrue();
        assertThat(mWakeupMessageReceived).isTrue();
        assertThat(mStandbyMessageReceived).isFalse();
    }

    @Test
    public void handleUserControlPressed_power_localDeviceOn_shouldNotChangePowerStatus() {
        mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
        boolean result = mHdmiLocalDevice.handleUserControlPressed(
                HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
                        HdmiCecKeycode.CEC_KEYCODE_POWER));

        assertThat(result).isTrue();
        assertThat(mWakeupMessageReceived).isFalse();
        assertThat(mStandbyMessageReceived).isFalse();
    }

    @Test
    public void handleUserControlPressed_powerToggleFunction_localDeviceInStandby_shouldTurnOn() {
        mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY;
        boolean result = mHdmiLocalDevice.handleUserControlPressed(
                HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
                        HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION));

        assertThat(result).isTrue();
        assertThat(mWakeupMessageReceived).isTrue();
        assertThat(mStandbyMessageReceived).isFalse();
    }

    @Test
    public void handleUserControlPressed_powerToggleFunction_localDeviceOn_shouldTurnOff() {
        mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
        boolean result = mHdmiLocalDevice.handleUserControlPressed(
                HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
                        HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION));

        assertThat(result).isTrue();
        assertThat(mWakeupMessageReceived).isFalse();
        assertThat(mStandbyMessageReceived).isTrue();
    }

    @Test
    public void handleUserControlPressed_powerOnFunction_localDeviceInStandby_shouldTurnOn() {
        mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY;
        boolean result = mHdmiLocalDevice.handleUserControlPressed(
                HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
                        HdmiCecKeycode.CEC_KEYCODE_POWER_ON_FUNCTION));

        assertThat(result).isTrue();
        assertThat(mWakeupMessageReceived).isTrue();
        assertThat(mStandbyMessageReceived).isFalse();
    }

    @Test
    public void handleUserControlPressed_powerOnFunction_localDeviceOn_noPowerStatusChange() {
        mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
        boolean result = mHdmiLocalDevice.handleUserControlPressed(
                HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
                        HdmiCecKeycode.CEC_KEYCODE_POWER_ON_FUNCTION));

        assertThat(result).isTrue();
        assertThat(mWakeupMessageReceived).isFalse();
        assertThat(mStandbyMessageReceived).isFalse();
    }

    @Test
    public void handleUserControlPressed_powerOffFunction_localDeviceStandby_noPowerStatusChange() {
        mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY;
        boolean result = mHdmiLocalDevice.handleUserControlPressed(
                HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
                        HdmiCecKeycode.CEC_KEYCODE_POWER_OFF_FUNCTION));

        assertThat(result).isTrue();
        assertThat(mWakeupMessageReceived).isFalse();
        assertThat(mStandbyMessageReceived).isFalse();
    }

    @Test
    public void handleUserControlPressed_powerOffFunction_localDeviceOn_shouldTurnOff() {
        mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
        boolean result = mHdmiLocalDevice.handleUserControlPressed(
                HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
                        HdmiCecKeycode.CEC_KEYCODE_POWER_OFF_FUNCTION));

        assertThat(result).isTrue();
        assertThat(mWakeupMessageReceived).isFalse();
        assertThat(mStandbyMessageReceived).isTrue();
    }
}