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

Commit 8fcd566a authored by Paul Colta's avatar Paul Colta Committed by Android (Google) Code Review
Browse files

Merge "HDMI: Delay querying the power status in DeviceSelectionAction" into main

parents 859057d9 8f5ea6b2
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -61,6 +61,11 @@ final class DeviceSelectActionFromTv extends HdmiCecFeatureAction {
    @VisibleForTesting
    static final int STATE_WAIT_FOR_DEVICE_POWER_ON = 3;

    // State in which we wait for device to complete a possible power state change triggered by
    // <Set Stream Path>.
    @VisibleForTesting
    static final int STATE_WAIT_FOR_POWER_STATE_CHANGE = 4;

    private final HdmiDeviceInfo mTarget;
    private final HdmiCecMessage mGivePowerStatus;
    private final boolean mIsCec20;
@@ -100,7 +105,12 @@ final class DeviceSelectActionFromTv extends HdmiCecFeatureAction {
        // Wake-up on <Set Stream Path> was not mandatory before CEC 2.0.
        // The message is re-sent at the end of the action for devices that don't support 2.0.
        sendSetStreamPath();
        mState = STATE_WAIT_FOR_POWER_STATE_CHANGE;
        addTimer(mState, HdmiConfig.TIMEOUT_MS);
        return true;
    }

    private void checkForPowerStateChange() {
        if (!mIsCec20) {
            queryDevicePowerStatus();
        } else {
@@ -114,12 +124,11 @@ final class DeviceSelectActionFromTv extends HdmiCecFeatureAction {
                queryDevicePowerStatus();
            } else if (targetPowerStatus == HdmiControlManager.POWER_STATUS_ON) {
                finishWithCallback(HdmiControlManager.RESULT_SUCCESS);
                return true;
                return;
            }
        }
        mState = STATE_WAIT_FOR_REPORT_POWER_STATUS;
        addTimer(mState, HdmiConfig.TIMEOUT_MS);
        return true;
    }

    private void queryDevicePowerStatus() {
@@ -210,6 +219,9 @@ final class DeviceSelectActionFromTv extends HdmiCecFeatureAction {
                mState = STATE_WAIT_FOR_REPORT_POWER_STATUS;
                addTimer(mState, HdmiConfig.TIMEOUT_MS);
                break;
            case STATE_WAIT_FOR_POWER_STATE_CHANGE:
                checkForPowerStateChange();
                break;
        }
    }

+30 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1;
import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_2;
import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.DeviceSelectActionFromTv.STATE_WAIT_FOR_DEVICE_POWER_ON;
import static com.android.server.hdmi.DeviceSelectActionFromTv.STATE_WAIT_FOR_POWER_STATE_CHANGE;
import static com.android.server.hdmi.DeviceSelectActionFromTv.STATE_WAIT_FOR_REPORT_POWER_STATUS;

import static com.google.common.truth.Truth.assertThat;
@@ -230,11 +231,15 @@ public class DeviceSelectActionFromTvTest {
                                                 "testDeviceSelect");
        action.start();
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).contains(SET_STREAM_PATH);
        mNativeWrapper.clearResultMessages();
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        action.handleTimerEvent(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_REPORT_POWER_STATUS);
        action.processCommand(REPORT_POWER_STATUS_ON);
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).contains(SET_STREAM_PATH);
        assertThat(callback.getResult()).isEqualTo(HdmiControlManager.RESULT_SUCCESS);
    }
@@ -249,10 +254,14 @@ public class DeviceSelectActionFromTvTest {
                                        /*isCec20=*/false);
        action.start();
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).contains(SET_STREAM_PATH);
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        action.handleTimerEvent(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_REPORT_POWER_STATUS);
        action.processCommand(REPORT_POWER_STATUS_STANDBY);
        mTestLooper.dispatchAll();

        HdmiCecMessage userControlPressed = HdmiCecMessageBuilder.buildUserControlPressed(
                        ADDR_TV, ADDR_PLAYBACK_1, HdmiCecKeycode.CEC_KEYCODE_POWER);
        assertThat(mNativeWrapper.getResultMessages()).contains(userControlPressed);
@@ -261,6 +270,7 @@ public class DeviceSelectActionFromTvTest {
        action.handleTimerEvent(STATE_WAIT_FOR_DEVICE_POWER_ON);
        action.processCommand(REPORT_POWER_STATUS_ON);
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).contains(SET_STREAM_PATH);
        assertThat(callback.getResult()).isEqualTo(HdmiControlManager.RESULT_SUCCESS);
    }
@@ -275,8 +285,11 @@ public class DeviceSelectActionFromTvTest {
                                        /*isCec20=*/false);
        action.start();
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).contains(SET_STREAM_PATH);
        mNativeWrapper.clearResultMessages();
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        action.handleTimerEvent(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_REPORT_POWER_STATUS);
        action.processCommand(REPORT_POWER_STATUS_STANDBY);
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_DEVICE_POWER_ON);
@@ -288,6 +301,7 @@ public class DeviceSelectActionFromTvTest {
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_REPORT_POWER_STATUS);
        action.processCommand(REPORT_POWER_STATUS_ON);
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).contains(SET_STREAM_PATH);
        assertThat(callback.getResult()).isEqualTo(HdmiControlManager.RESULT_SUCCESS);
    }
@@ -302,8 +316,11 @@ public class DeviceSelectActionFromTvTest {
                                        /*isCec20=*/false);
        action.start();
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).contains(SET_STREAM_PATH);
        mNativeWrapper.clearResultMessages();
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        action.handleTimerEvent(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_REPORT_POWER_STATUS);
        action.processCommand(REPORT_POWER_STATUS_STANDBY);
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_DEVICE_POWER_ON);
@@ -316,6 +333,7 @@ public class DeviceSelectActionFromTvTest {
        action.handleTimerEvent(STATE_WAIT_FOR_REPORT_POWER_STATUS);
        // Give up getting power status, and just send <Set Stream Path>
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).contains(SET_STREAM_PATH);
        assertThat(callback.getResult()).isEqualTo(HdmiControlManager.RESULT_SUCCESS);
    }
@@ -332,7 +350,10 @@ public class DeviceSelectActionFromTvTest {
                                                 "testDeviceSelect");
        action.start();
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).contains(SET_STREAM_PATH);
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        action.handleTimerEvent(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        assertThat(callback.getResult()).isEqualTo(HdmiControlManager.RESULT_SUCCESS);
    }

@@ -348,11 +369,15 @@ public class DeviceSelectActionFromTvTest {
                                                 "testDeviceSelect");
        action.start();
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).contains(SET_STREAM_PATH);
        mNativeWrapper.clearResultMessages();
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        action.handleTimerEvent(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_REPORT_POWER_STATUS);
        action.processCommand(REPORT_POWER_STATUS_ON);
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).doesNotContain(SET_STREAM_PATH);
        assertThat(callback.getResult()).isEqualTo(HdmiControlManager.RESULT_SUCCESS);
    }
@@ -369,10 +394,14 @@ public class DeviceSelectActionFromTvTest {
                                        /*isCec20=*/true);
        action.start();
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).contains(SET_STREAM_PATH);
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        action.handleTimerEvent(STATE_WAIT_FOR_POWER_STATE_CHANGE);
        assertThat(actionTimer.getState()).isEqualTo(STATE_WAIT_FOR_REPORT_POWER_STATUS);
        action.processCommand(REPORT_POWER_STATUS_STANDBY);
        mTestLooper.dispatchAll();

        HdmiCecMessage userControlPressed = HdmiCecMessageBuilder.buildUserControlPressed(
                        ADDR_TV, ADDR_PLAYBACK_1, HdmiCecKeycode.CEC_KEYCODE_POWER);
        assertThat(mNativeWrapper.getResultMessages()).doesNotContain(userControlPressed);
@@ -381,6 +410,7 @@ public class DeviceSelectActionFromTvTest {
        action.handleTimerEvent(STATE_WAIT_FOR_DEVICE_POWER_ON);
        action.processCommand(REPORT_POWER_STATUS_ON);
        mTestLooper.dispatchAll();

        assertThat(mNativeWrapper.getResultMessages()).doesNotContain(SET_STREAM_PATH);
        assertThat(callback.getResult()).isEqualTo(HdmiControlManager.RESULT_SUCCESS);
    }