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

Commit 22d11e19 authored by Nathalie Le Clair's avatar Nathalie Le Clair
Browse files

Implement KEYCODE_TV_POWER

For devices that are not Android TV devices and not connected to a TV via HDMI, KEYCODE_TV_POWER is ignored.
For the following Android TV devices, KEYCODE_TV_POWER is an alias of KEYCODE_POWER:
- Devices that don't support HDMI
- HDMI TV panel devices
- HDMI devices with POWER_CONTROL_MODE set to NONE
- HDMI devices with CEC control disabled
For all other HDMI devices, KEYCODE_TV_POWER is forwarded to the HDMI stack by calling toggleAndFollowTvPower(). For HDMI source devices, this results in
1. Toggling of the HDMI-connected TV power state over HDMI-CEC
2. The source device following the TV power state

Bug: 157402294
Test: adb shell input keyevent KEYCODE_TV_POWER, manually verified TV power toggle behavior on ADT3

Change-Id: I59cd3f2a5c2b7a551176ab40ef9c559ad502a974
parent eb197bf6
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -519,8 +519,13 @@ public class KeyEvent extends InputEvent implements Parcelable {
    /** Key code constant: Settings key.
     * Starts the system settings activity. */
    public static final int KEYCODE_SETTINGS        = 176;
    /** Key code constant: TV power key.
     * On TV remotes, toggles the power on a television screen. */
    /**
     * Key code constant: TV power key.
     * On HDMI TV panel devices and Android TV devices that don't support HDMI, toggles the power
     * state of the device.
     * On HDMI source devices, toggles the power state of the HDMI-connected TV via HDMI-CEC and
     * makes the source device follow this power state.
     */
    public static final int KEYCODE_TV_POWER        = 177;
    /** Key code constant: TV input key.
     * On TV remotes, switches the input on a television screen. */
+26 −0
Original line number Diff line number Diff line
@@ -3687,6 +3687,32 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                break;
            }

            case KeyEvent.KEYCODE_TV_POWER: {
                result &= ~ACTION_PASS_TO_USER;
                isWakeKey = false; // wake-up will be handled separately
                HdmiControlManager hdmiControlManager = getHdmiControlManager();
                if (hdmiControlManager != null && hdmiControlManager.shouldHandleTvPowerKey()) {
                    if (down) {
                        hdmiControlManager.toggleAndFollowTvPower();
                    }
                } else if (mHasFeatureLeanback) {
                    KeyEvent fallbackEvent = KeyEvent.obtain(
                            event.getDownTime(), event.getEventTime(),
                            event.getAction(), KeyEvent.KEYCODE_POWER,
                            event.getRepeatCount(), event.getMetaState(),
                            event.getDeviceId(), event.getScanCode(),
                            event.getFlags(), event.getSource(), event.getDisplayId(), null);
                    if (down) {
                        interceptPowerKeyDown(fallbackEvent, interactive);
                    } else {
                        interceptPowerKeyUp(fallbackEvent, interactive, canceled);
                    }
                }
                // Ignore this key for any device that is not connected to a TV via HDMI and
                // not an Android TV device.
                break;
            }

            case KeyEvent.KEYCODE_POWER: {
                EventLogTags.writeInterceptPower(
                        KeyEvent.actionToString(event.getAction()),