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:
@@ -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. */
|
||||
|
||||
@@ -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()),
|
||||
|
||||
Reference in New Issue
Block a user