Merge "Treat TV_POWER as POWER on non-CEC sink" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-04-26 15:33:15 +00:00
committed by Android (Google) Code Review
5 changed files with 60 additions and 9 deletions

View File

@@ -422,6 +422,9 @@ public class HdmiControlService extends SystemService {
// Set to true if the logical address allocation is completed. // Set to true if the logical address allocation is completed.
private boolean mAddressAllocated = false; private boolean mAddressAllocated = false;
// Whether a CEC-enabled sink is connected to the playback device
private boolean mIsCecAvailable = false;
// Object that handles logging statsd atoms. // Object that handles logging statsd atoms.
// Use getAtomWriter() instead of accessing directly, to allow dependency injection for testing. // Use getAtomWriter() instead of accessing directly, to allow dependency injection for testing.
private HdmiCecAtomWriter mAtomWriter = new HdmiCecAtomWriter(); private HdmiCecAtomWriter mAtomWriter = new HdmiCecAtomWriter();
@@ -2229,6 +2232,7 @@ public class HdmiControlService extends SystemService {
pw.println("mProhibitMode: " + mProhibitMode); pw.println("mProhibitMode: " + mProhibitMode);
pw.println("mPowerStatus: " + mPowerStatusController.getPowerStatus()); pw.println("mPowerStatus: " + mPowerStatusController.getPowerStatus());
pw.println("mIsCecAvailable: " + mIsCecAvailable);
pw.println("mCecVersion: " + mCecVersion); pw.println("mCecVersion: " + mCecVersion);
// System settings // System settings
@@ -2450,7 +2454,7 @@ public class HdmiControlService extends SystemService {
if (hdmiCecEnabled != HdmiControlManager.HDMI_CEC_CONTROL_ENABLED) { if (hdmiCecEnabled != HdmiControlManager.HDMI_CEC_CONTROL_ENABLED) {
return false; return false;
} }
return true; return mIsCecAvailable;
} }
@ServiceThreadOnly @ServiceThreadOnly
@@ -2835,24 +2839,24 @@ public class HdmiControlService extends SystemService {
private void invokeHdmiControlStatusChangeListenerLocked( private void invokeHdmiControlStatusChangeListenerLocked(
Collection<IHdmiControlStatusChangeListener> listeners, Collection<IHdmiControlStatusChangeListener> listeners,
@HdmiControlManager.HdmiCecControl int isEnabled) { @HdmiControlManager.HdmiCecControl int isEnabled) {
if (listeners.isEmpty()) {
return;
}
if (isEnabled == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED) { if (isEnabled == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED) {
queryDisplayStatus(new IHdmiControlCallback.Stub() { queryDisplayStatus(new IHdmiControlCallback.Stub() {
public void onComplete(int status) { public void onComplete(int status) {
boolean isAvailable = true;
if (status == HdmiControlManager.POWER_STATUS_UNKNOWN if (status == HdmiControlManager.POWER_STATUS_UNKNOWN
|| status == HdmiControlManager.RESULT_EXCEPTION || status == HdmiControlManager.RESULT_EXCEPTION
|| status == HdmiControlManager.RESULT_SOURCE_NOT_AVAILABLE) { || status == HdmiControlManager.RESULT_SOURCE_NOT_AVAILABLE) {
isAvailable = false; mIsCecAvailable = false;
} else {
mIsCecAvailable = true;
} }
invokeHdmiControlStatusChangeListenerLocked(listeners, isEnabled, isAvailable);
} }
}); });
return; } else {
mIsCecAvailable = false;
}
if (!listeners.isEmpty()) {
invokeHdmiControlStatusChangeListenerLocked(listeners, isEnabled, mIsCecAvailable);
} }
invokeHdmiControlStatusChangeListenerLocked(listeners, isEnabled, false);
} }
private void invokeHdmiControlStatusChangeListenerLocked( private void invokeHdmiControlStatusChangeListenerLocked(

View File

@@ -138,6 +138,7 @@ public class DevicePowerStatusActionTest {
mDevicePowerStatusAction = DevicePowerStatusAction.create(mPlaybackDevice, ADDR_TV, mDevicePowerStatusAction = DevicePowerStatusAction.create(mPlaybackDevice, ADDR_TV,
mCallbackMock); mCallbackMock);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mNativeWrapper.clearResultMessages();
} }
@Test @Test

View File

@@ -60,6 +60,7 @@ import java.util.concurrent.TimeUnit;
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
/** Tests for {@link HdmiCecLocalDevicePlayback} class. */ /** Tests for {@link HdmiCecLocalDevicePlayback} class. */
public class HdmiCecLocalDevicePlaybackTest { public class HdmiCecLocalDevicePlaybackTest {
private static final int TIMEOUT_MS = HdmiConfig.TIMEOUT_MS + 1;
private static final int PORT_1 = 1; private static final int PORT_1 = 1;
private static final HdmiDeviceInfo INFO_TV = new HdmiDeviceInfo( private static final HdmiDeviceInfo INFO_TV = new HdmiDeviceInfo(
@@ -1045,6 +1046,10 @@ public class HdmiCecLocalDevicePlaybackTest {
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
// 4. DUT turned off. // 4. DUT turned off.
mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF); mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
// TODO(b/184939731): remove waiting times once pending actions no longer block <Standby>
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
HdmiCecMessage standbyMessageBroadcast = HdmiCecMessageBuilder.buildStandby( HdmiCecMessage standbyMessageBroadcast = HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.mAddress, ADDR_BROADCAST); mHdmiCecLocalDevicePlayback.mAddress, ADDR_BROADCAST);
@@ -1502,6 +1507,7 @@ public class HdmiCecLocalDevicePlaybackTest {
@Test @Test
public void queryDisplayStatus() { public void queryDisplayStatus() {
mTestLooper.moveTimeForward(TIMEOUT_MS);
mHdmiControlService.queryDisplayStatus(new IHdmiControlCallback.Stub() { mHdmiControlService.queryDisplayStatus(new IHdmiControlCallback.Stub() {
@Override @Override
public void onComplete(int result) { public void onComplete(int result) {
@@ -1618,6 +1624,12 @@ public class HdmiCecLocalDevicePlaybackTest {
@Test @Test
public void shouldHandleTvPowerKey_CecDisabled() { public void shouldHandleTvPowerKey_CecDisabled() {
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
HdmiCecMessage reportPowerStatusMessage = HdmiCecMessageBuilder.buildReportPowerStatus(
Constants.ADDR_TV, mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON);
mNativeWrapper.onCecMessage(reportPowerStatusMessage);
mTestLooper.dispatchAll();
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setIntValue( mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
HdmiControlManager.HDMI_CEC_CONTROL_DISABLED); HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
@@ -1626,14 +1638,35 @@ public class HdmiCecLocalDevicePlaybackTest {
@Test @Test
public void shouldHandleTvPowerKey_PowerControlModeNone() { public void shouldHandleTvPowerKey_PowerControlModeNone() {
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
HdmiCecMessage reportPowerStatusMessage = HdmiCecMessageBuilder.buildReportPowerStatus(
Constants.ADDR_TV, mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON);
mNativeWrapper.onCecMessage(reportPowerStatusMessage);
mTestLooper.dispatchAll();
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue( mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE, HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_NONE); HdmiControlManager.POWER_CONTROL_MODE_NONE);
assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isFalse(); assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isFalse();
} }
@Test
public void shouldHandleTvPowerKey_CecNotAvailable() {
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
// TV doesn't report its power status
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isFalse();
}
@Test @Test
public void shouldHandleTvPowerKey_CecEnabled_PowerControlModeTv() { public void shouldHandleTvPowerKey_CecEnabled_PowerControlModeTv() {
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
HdmiCecMessage reportPowerStatusMessage = HdmiCecMessageBuilder.buildReportPowerStatus(
Constants.ADDR_TV, mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON);
mNativeWrapper.onCecMessage(reportPowerStatusMessage);
mTestLooper.dispatchAll();
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setIntValue( mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);

View File

@@ -61,6 +61,7 @@ import java.util.ArrayList;
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
/** Tests for {@link HdmiCecLocalDeviceTv} class. */ /** Tests for {@link HdmiCecLocalDeviceTv} class. */
public class HdmiCecLocalDeviceTvTest { public class HdmiCecLocalDeviceTvTest {
private static final int TIMEOUT_MS = HdmiConfig.TIMEOUT_MS + 1;
private HdmiControlService mHdmiControlService; private HdmiControlService mHdmiControlService;
private HdmiCecController mHdmiCecController; private HdmiCecController mHdmiCecController;
@@ -294,6 +295,10 @@ public class HdmiCecLocalDeviceTvTest {
HdmiControlManager.TV_SEND_STANDBY_ON_SLEEP_ENABLED); HdmiControlManager.TV_SEND_STANDBY_ON_SLEEP_ENABLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF); mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
// TODO(184939731): remove waiting times once pending actions no longer block <Standby>
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
HdmiCecMessage standby = HdmiCecMessageBuilder.buildStandby(ADDR_TV, ADDR_BROADCAST); HdmiCecMessage standby = HdmiCecMessageBuilder.buildStandby(ADDR_TV, ADDR_BROADCAST);
assertThat(mNativeWrapper.getResultMessages()).contains(standby); assertThat(mNativeWrapper.getResultMessages()).contains(standby);

View File

@@ -142,6 +142,7 @@ public class OneTouchPlayActionTest {
mPhysicalAddress = 0x2000; mPhysicalAddress = 0x2000;
mNativeWrapper.setPhysicalAddress(mPhysicalAddress); mNativeWrapper.setPhysicalAddress(mPhysicalAddress);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mNativeWrapper.clearResultMessages();
} }
private OneTouchPlayAction createOneTouchPlayAction(HdmiCecLocalDevicePlayback device, private OneTouchPlayAction createOneTouchPlayAction(HdmiCecLocalDevicePlayback device,
@@ -161,6 +162,7 @@ public class OneTouchPlayActionTest {
mLocalDevices.add(playbackDevice); mLocalDevices.add(playbackDevice);
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mNativeWrapper.clearResultMessages();
TestActionTimer actionTimer = new TestActionTimer(); TestActionTimer actionTimer = new TestActionTimer();
TestCallback callback = new TestCallback(); TestCallback callback = new TestCallback();
@@ -203,6 +205,7 @@ public class OneTouchPlayActionTest {
mLocalDevices.add(playbackDevice); mLocalDevices.add(playbackDevice);
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mNativeWrapper.clearResultMessages();
TestActionTimer actionTimer = new TestActionTimer(); TestActionTimer actionTimer = new TestActionTimer();
TestCallback callback = new TestCallback(); TestCallback callback = new TestCallback();
@@ -245,6 +248,7 @@ public class OneTouchPlayActionTest {
mLocalDevices.add(playbackDevice); mLocalDevices.add(playbackDevice);
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mNativeWrapper.clearResultMessages();
TestActionTimer actionTimer = new TestActionTimer(); TestActionTimer actionTimer = new TestActionTimer();
TestCallback callback = new TestCallback(); TestCallback callback = new TestCallback();
@@ -297,6 +301,7 @@ public class OneTouchPlayActionTest {
mLocalDevices.add(playbackDevice); mLocalDevices.add(playbackDevice);
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mNativeWrapper.clearResultMessages();
TestActionTimer actionTimer = new TestActionTimer(); TestActionTimer actionTimer = new TestActionTimer();
TestCallback callback = new TestCallback(); TestCallback callback = new TestCallback();
@@ -342,6 +347,7 @@ public class OneTouchPlayActionTest {
mHdmiControlService.getHdmiCecNetwork().updateDevicePowerStatus(ADDR_TV, mHdmiControlService.getHdmiCecNetwork().updateDevicePowerStatus(ADDR_TV,
HdmiControlManager.POWER_STATUS_ON); HdmiControlManager.POWER_STATUS_ON);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mNativeWrapper.clearResultMessages();
TestActionTimer actionTimer = new TestActionTimer(); TestActionTimer actionTimer = new TestActionTimer();
TestCallback callback = new TestCallback(); TestCallback callback = new TestCallback();
@@ -376,6 +382,7 @@ public class OneTouchPlayActionTest {
mHdmiControlService.getHdmiCecNetwork().updateDevicePowerStatus(ADDR_TV, mHdmiControlService.getHdmiCecNetwork().updateDevicePowerStatus(ADDR_TV,
HdmiControlManager.POWER_STATUS_UNKNOWN); HdmiControlManager.POWER_STATUS_UNKNOWN);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mNativeWrapper.clearResultMessages();
TestActionTimer actionTimer = new TestActionTimer(); TestActionTimer actionTimer = new TestActionTimer();
TestCallback callback = new TestCallback(); TestCallback callback = new TestCallback();
@@ -420,6 +427,7 @@ public class OneTouchPlayActionTest {
mHdmiControlService.getHdmiCecNetwork().updateDevicePowerStatus(ADDR_TV, mHdmiControlService.getHdmiCecNetwork().updateDevicePowerStatus(ADDR_TV,
HdmiControlManager.POWER_STATUS_STANDBY); HdmiControlManager.POWER_STATUS_STANDBY);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mNativeWrapper.clearResultMessages();
TestActionTimer actionTimer = new TestActionTimer(); TestActionTimer actionTimer = new TestActionTimer();
TestCallback callback = new TestCallback(); TestCallback callback = new TestCallback();