Merge "[CEC] Standby when <Active Source> lost" into rvc-dev

This commit is contained in:
TreeHugger Robot
2020-06-08 10:52:23 +00:00
committed by Android (Google) Code Review
3 changed files with 98 additions and 0 deletions

View File

@@ -500,6 +500,22 @@ final class Constants {
static final String PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_WAKE_UP_AND_SEND_ACTIVE_SOURCE =
"wake_up_and_send_active_source";
/**
* Property to decide the device behaviour when <Active Source> is lost.
*
* <p>This property applies to playback devices.
* <p>Possible values are:
* <ul>
* <li><b>none</b> No power state change (default).
* <li><b>standby_now</b> PowerManager.goToSleep() is called.
* </ul>
*/
static final String POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST =
"ro.hdmi.cec.source.power_state_change_on_active_source_lost";
static final String POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE = "none";
static final String POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW = "standby_now";
static final int RECORDING_TYPE_DIGITAL_RF = 1;
static final int RECORDING_TYPE_ANALOGUE_RF = 2;
static final int RECORDING_TYPE_EXTERNAL_PHYSICAL_ADDRESS = 3;

View File

@@ -67,6 +67,10 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
@VisibleForTesting
protected String mPlaybackDeviceActionOnRoutingControl;
// Behaviour of the device when <Active Source> is lost in favor of another device.
@VisibleForTesting
protected String mPowerStateChangeOnActiveSourceLost;
HdmiCecLocalDevicePlayback(HdmiControlService service) {
super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
@@ -79,6 +83,10 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
mPlaybackDeviceActionOnRoutingControl = SystemProperties.get(
Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL,
Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_NONE);
mPowerStateChangeOnActiveSourceLost = SystemProperties.get(
Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
}
@Override
@@ -240,6 +248,28 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
return !getWakeLock().isHeld();
}
@Override
@ServiceThreadOnly
protected boolean handleActiveSource(HdmiCecMessage message) {
super.handleActiveSource(message);
if (mIsActiveSource) {
return true;
}
switch (mPowerStateChangeOnActiveSourceLost) {
case Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW:
mService.standby();
return true;
case Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE:
return true;
default:
Slog.w(TAG, "Invalid property '"
+ Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST
+ "' value: "
+ mPowerStateChangeOnActiveSourceLost);
return true;
}
}
@ServiceThreadOnly
protected boolean handleUserControlPressed(HdmiCecMessage message) {
assertRunOnServiceThread();

View File

@@ -57,6 +57,7 @@ public class HdmiCecLocalDevicePlaybackTest {
private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
private int mPlaybackPhysicalAddress;
private boolean mWokenUp;
private boolean mStandby;
@Mock private IPowerManager mIPowerManagerMock;
@Mock private IThermalService mIThermalServiceMock;
@@ -76,6 +77,11 @@ public class HdmiCecLocalDevicePlaybackTest {
mWokenUp = true;
}
@Override
void standby() {
mStandby = true;
}
@Override
boolean isControlEnabled() {
return true;
@@ -336,6 +342,52 @@ public class HdmiCecLocalDevicePlaybackTest {
assertThat(mNativeWrapper.getResultMessages()).contains(standbyMessage);
}
@Test
public void handleActiveSource_ActiveSource_None() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE;
mStandby = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue();
mTestLooper.dispatchAll();
assertThat(mStandby).isFalse();
}
@Test
public void handleActiveSource_notActiveSource_None() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE;
mStandby = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue();
mTestLooper.dispatchAll();
assertThat(mStandby).isFalse();
}
@Test
public void handleActiveSource_ActiveSource_StandbyNow() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW;
mStandby = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue();
mTestLooper.dispatchAll();
assertThat(mStandby).isFalse();
}
@Test
public void handleActiveSource_notActiveSource_StandbyNow() {
mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW;
mStandby = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue();
mTestLooper.dispatchAll();
assertThat(mStandby).isTrue();
}
@Test
public void sendVolumeKeyEvent_up_volumeEnabled() {
mHdmiControlService.setHdmiCecVolumeControlEnabled(true);