Determine if CEC stack should handle KEYCODE_TV_POWER
Bug: 157402294 Test: atest HdmiCecLocalDevicePlaybackTest and atest HdmiCecLocalDeviceTvTest Change-Id: I1ffc246ff25354d3d61548d10756f1088850d367
This commit is contained in:
@@ -847,6 +847,20 @@ public final class HdmiControlManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether the HDMI CEC stack should handle KEYCODE_TV_POWER.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.HDMI_CEC)
|
||||
public boolean shouldHandleTvPowerKey() {
|
||||
try {
|
||||
return mService.shouldHandleTvPowerKey();
|
||||
} catch (RemoteException e) {
|
||||
throw e.rethrowFromSystemServer();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Controls whether volume control commands via HDMI CEC are enabled.
|
||||
*
|
||||
|
||||
@@ -71,6 +71,11 @@ public final class HdmiControlServiceWrapper {
|
||||
HdmiControlServiceWrapper.this.toggleAndFollowTvPower();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldHandleTvPowerKey() {
|
||||
return HdmiControlServiceWrapper.this.shouldHandleTvPowerKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void queryDisplayStatus(IHdmiControlCallback callback) {
|
||||
HdmiControlServiceWrapper.this.queryDisplayStatus(callback);
|
||||
@@ -367,6 +372,11 @@ public final class HdmiControlServiceWrapper {
|
||||
/** @hide */
|
||||
public void toggleAndFollowTvPower() {}
|
||||
|
||||
/** @hide */
|
||||
public boolean shouldHandleTvPowerKey() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public void queryDisplayStatus(IHdmiControlCallback callback) {}
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@ interface IHdmiControlService {
|
||||
HdmiDeviceInfo getActiveSource();
|
||||
void oneTouchPlay(IHdmiControlCallback callback);
|
||||
void toggleAndFollowTvPower();
|
||||
boolean shouldHandleTvPowerKey();
|
||||
void queryDisplayStatus(IHdmiControlCallback callback);
|
||||
void addHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener);
|
||||
void removeHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener);
|
||||
|
||||
@@ -194,6 +194,11 @@ public class HdmiAudioSystemClientTest {
|
||||
public void toggleAndFollowTvPower() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldHandleTvPowerKey() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void queryDisplayStatus(final IHdmiControlCallback callback) {
|
||||
}
|
||||
|
||||
@@ -1652,6 +1652,12 @@ public class HdmiControlService extends SystemService {
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldHandleTvPowerKey() {
|
||||
enforceAccessPermission();
|
||||
return HdmiControlService.this.shouldHandleTvPowerKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void queryDisplayStatus(final IHdmiControlCallback callback) {
|
||||
enforceAccessPermission();
|
||||
@@ -2334,6 +2340,24 @@ public class HdmiControlService extends SystemService {
|
||||
source.toggleAndFollowTvPower();
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
protected boolean shouldHandleTvPowerKey() {
|
||||
if (isTvDevice()) {
|
||||
return false;
|
||||
}
|
||||
String powerControlMode = getHdmiCecConfig().getStringValue(
|
||||
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE);
|
||||
if (powerControlMode.equals(HdmiControlManager.POWER_CONTROL_MODE_NONE)) {
|
||||
return false;
|
||||
}
|
||||
int hdmiCecEnabled = getHdmiCecConfig().getIntValue(
|
||||
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED);
|
||||
if (hdmiCecEnabled != HdmiControlManager.HDMI_CEC_CONTROL_ENABLED) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@ServiceThreadOnly
|
||||
protected void queryDisplayStatus(final IHdmiControlCallback callback) {
|
||||
assertRunOnServiceThread();
|
||||
|
||||
@@ -77,6 +77,15 @@ final class FakeHdmiCecConfig extends HdmiCecConfig {
|
||||
+ " </allowed-values>"
|
||||
+ " <default-value int-value=\"1\" />"
|
||||
+ " </setting>"
|
||||
+ " <setting name=\"hdmi_cec_enabled\""
|
||||
+ " value-type=\"int\""
|
||||
+ " user-configurable=\"true\">"
|
||||
+ " <allowed-values>"
|
||||
+ " <value int-value=\"0\" />"
|
||||
+ " <value int-value=\"1\" />"
|
||||
+ " </allowed-values>"
|
||||
+ " <default-value int-value=\"1\" />"
|
||||
+ " </setting>"
|
||||
+ "</cec-settings>";
|
||||
|
||||
FakeHdmiCecConfig(@NonNull Context context) {
|
||||
|
||||
@@ -1334,4 +1334,31 @@ public class HdmiCecLocalDevicePlaybackTest {
|
||||
assertThat(mNativeWrapper.getResultMessages()).contains(userControlReleased);
|
||||
assertThat(mStandby).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldHandleTvPowerKey_CecDisabled() {
|
||||
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setIntValue(
|
||||
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
|
||||
HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
|
||||
assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldHandleTvPowerKey_PowerControlModeNone() {
|
||||
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
|
||||
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
|
||||
HdmiControlManager.POWER_CONTROL_MODE_NONE);
|
||||
assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldHandleTvPowerKey_CecEnabled_PowerControlModeTv() {
|
||||
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setIntValue(
|
||||
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
|
||||
HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
|
||||
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
|
||||
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
|
||||
HdmiControlManager.POWER_CONTROL_MODE_TV);
|
||||
assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isTrue();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -192,4 +192,15 @@ public class HdmiCecLocalDeviceTvTest {
|
||||
assertThat(mHdmiControlService.getActiveSource().getPhysicalAddress()).isEqualTo(
|
||||
externalDevice.getPhysicalAddress());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldHandleTvPowerKey_CecEnabled_PowerControlModeTv() {
|
||||
mHdmiCecLocalDeviceTv.mService.getHdmiCecConfig().setIntValue(
|
||||
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
|
||||
HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
|
||||
mHdmiCecLocalDeviceTv.mService.getHdmiCecConfig().setStringValue(
|
||||
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
|
||||
HdmiControlManager.POWER_CONTROL_MODE_TV);
|
||||
assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isFalse();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user