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
This commit is contained in:
Nathalie Le Clair
2020-11-06 10:19:42 +01:00
parent eb197bf6a4
commit 22d11e197f
2 changed files with 33 additions and 2 deletions

View File

@@ -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. */

View File

@@ -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()),