diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java index c87e51e358911..37f0a64df6132 100644 --- a/core/java/android/view/KeyEvent.java +++ b/core/java/android/view/KeyEvent.java @@ -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. */ diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 6919ceaa5a9ff..d88f5cf672d92 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -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()),