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:
Nathalie Le Clair
2020-12-14 10:08:23 +01:00
parent 76b105c20a
commit d0df8698c4
8 changed files with 101 additions and 0 deletions

View File

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

View File

@@ -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) {}

View File

@@ -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);

View File

@@ -194,6 +194,11 @@ public class HdmiAudioSystemClientTest {
public void toggleAndFollowTvPower() {
}
@Override
public boolean shouldHandleTvPowerKey() {
return false;
}
@Override
public void queryDisplayStatus(final IHdmiControlCallback callback) {
}

View File

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

View File

@@ -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) {

View File

@@ -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();
}
}

View File

@@ -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();
}
}