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

Commit 8faa09f6 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Source device to toggle and follow TV power"

parents 5cf119de 6815a7ce
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -831,6 +831,22 @@ public final class HdmiControlManager {
        }
    }

    /**
     * For CEC source devices (OTT/STB/Audio system): toggle the power status of the HDMI-connected
     * display and follow the display's new power status.
     * For all other devices: no functionality.
     *
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.HDMI_CEC)
    public void toggleAndFollowTvPower() {
        try {
            mService.toggleAndFollowTvPower();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Controls whether volume control commands via HDMI CEC are enabled.
     *
+8 −0
Original line number Diff line number Diff line
@@ -66,6 +66,11 @@ public final class HdmiControlServiceWrapper {
            HdmiControlServiceWrapper.this.oneTouchPlay(callback);
        }

        @Override
        public void toggleAndFollowTvPower() {
            HdmiControlServiceWrapper.this.toggleAndFollowTvPower();
        }

        @Override
        public void queryDisplayStatus(IHdmiControlCallback callback) {
            HdmiControlServiceWrapper.this.queryDisplayStatus(callback);
@@ -359,6 +364,9 @@ public final class HdmiControlServiceWrapper {
    /** @hide */
    public void oneTouchPlay(IHdmiControlCallback callback) {}

    /** @hide */
    public void toggleAndFollowTvPower() {}

    /** @hide */
    public void queryDisplayStatus(IHdmiControlCallback callback) {}

+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ interface IHdmiControlService {
    int[] getSupportedTypes();
    HdmiDeviceInfo getActiveSource();
    void oneTouchPlay(IHdmiControlCallback callback);
    void toggleAndFollowTvPower();
    void queryDisplayStatus(IHdmiControlCallback callback);
    void addHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener);
    void removeHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener);
+4 −0
Original line number Diff line number Diff line
@@ -190,6 +190,10 @@ public class HdmiAudioSystemClientTest {
        public void oneTouchPlay(final IHdmiControlCallback callback) {
        }

        @Override
        public void toggleAndFollowTvPower() {
        }

        @Override
        public void queryDisplayStatus(final IHdmiControlCallback callback) {
        }
+46 −4
Original line number Diff line number Diff line
@@ -87,10 +87,14 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
    @ServiceThreadOnly
    protected void sendStandby(int deviceId) {
        assertRunOnServiceThread();

        // Send standby to TV only for now
        int targetAddress = Constants.ADDR_TV;
        mService.sendCecCommand(HdmiCecMessageBuilder.buildStandby(mAddress, targetAddress));
        String sendStandbyOnSleep = mService.getHdmiCecConfig().getStringValue(
                HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP);
        if (sendStandbyOnSleep.equals(HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST)) {
            mService.sendCecCommand(
                    HdmiCecMessageBuilder.buildStandby(mAddress, Constants.ADDR_BROADCAST));
            return;
        }
        mService.sendCecCommand(HdmiCecMessageBuilder.buildStandby(mAddress, Constants.ADDR_TV));
    }

    @ServiceThreadOnly
@@ -112,6 +116,44 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
        addAndStartAction(action);
    }

    @ServiceThreadOnly
    void toggleAndFollowTvPower() {
        assertRunOnServiceThread();
        // Wake up Android framework to take over CEC control from the microprocessor.
        mService.wakeUp();
        mService.queryDisplayStatus(new IHdmiControlCallback.Stub() {
            @Override
            public void onComplete(int status) {
                if (status == HdmiControlManager.POWER_STATUS_UNKNOWN) {
                    Slog.i(TAG, "TV power toggle: TV power status unknown");
                    sendUserControlPressedAndReleased(Constants.ADDR_TV,
                            HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION);
                    // Source device remains awake.
                } else if (status == HdmiControlManager.POWER_STATUS_ON
                        || status == HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON) {
                    Slog.i(TAG, "TV power toggle: turning off TV");
                    sendStandby(0 /*unused */);
                    // Source device goes to standby, to follow the toggled TV power state.
                    mService.standby();
                } else if (status == HdmiControlManager.POWER_STATUS_STANDBY
                        || status == HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY) {
                    Slog.i(TAG, "TV power toggle: turning on TV");
                    oneTouchPlay(new IHdmiControlCallback.Stub() {
                        @Override
                        public void onComplete(int result) {
                            if (result != HdmiControlManager.RESULT_SUCCESS) {
                                Slog.w(TAG, "Failed to complete One Touch Play. result=" + result);
                                sendUserControlPressedAndReleased(Constants.ADDR_TV,
                                        HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION);
                            }
                        }
                    });
                    // Source device remains awake, to follow the toggled TV power state.
                }
            }
        });
    }

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