Merge "CEC: Define a system property to keep playback device awake"

This commit is contained in:
Jinsuk Kim
2015-02-10 05:27:27 +00:00
committed by Android (Google) Code Review
2 changed files with 56 additions and 7 deletions

View File

@@ -214,6 +214,10 @@ final class Constants {
// values which denotes the device type in HDMI Spec 1.4.
static final String PROPERTY_DEVICE_TYPE = "ro.hdmi.device_type";
// Set to false to allow playback device to go to suspend mode even
// when it's an active source. True by default.
static final String PROPERTY_KEEP_AWAKE = "persist.sys.hdmi.keep_awake";
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

@@ -38,9 +38,11 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
// Used to keep the device awake while it is the active source. For devices that
// cannot wake up via CEC commands, this address the inconvenience of having to
// turn them on.
// turn them on. True by default, and can be disabled (i.e. device can go to sleep
// in active device status) by explicitly setting the system property
// persist.sys.hdmi.keep_awake to false.
// Lazily initialized - should call getWakeLock() to get the instance.
private WakeLock mWakeLock;
private ActiveWakeLock mWakeLock;
HdmiCecLocalDevicePlayback(HdmiControlService service) {
super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
@@ -142,19 +144,30 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
mIsActiveSource = on;
if (on) {
getWakeLock().acquire();
HdmiLogger.debug("active source: %b. Wake lock acquired", mIsActiveSource);
} else {
getWakeLock().release();
HdmiLogger.debug("Wake lock released");
}
}
@ServiceThreadOnly
private WakeLock getWakeLock() {
private ActiveWakeLock getWakeLock() {
assertRunOnServiceThread();
if (mWakeLock == null) {
mWakeLock = mService.getPowerManager().newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mWakeLock.setReferenceCounted(false);
if (SystemProperties.getBoolean(Constants.PROPERTY_KEEP_AWAKE, true)) {
mWakeLock = new SystemWakeLock();
} else {
// Create a dummy lock object that doesn't do anything about wake lock,
// hence allows the device to go to sleep even if it's the active source.
mWakeLock = new ActiveWakeLock() {
@Override
public void acquire() { }
@Override
public void release() { }
@Override
public boolean isHeld() { return false; }
};
HdmiLogger.debug("No wakelock is used to keep the display on.");
}
}
return mWakeLock;
}
@@ -258,4 +271,36 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
super.dump(pw);
pw.println("mIsActiveSource: " + mIsActiveSource);
}
// Wrapper interface over PowerManager.WakeLock
private interface ActiveWakeLock {
void acquire();
void release();
boolean isHeld();
}
private class SystemWakeLock implements ActiveWakeLock {
private final WakeLock mWakeLock;
public SystemWakeLock() {
mWakeLock = mService.getPowerManager().newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mWakeLock.setReferenceCounted(false);
}
@Override
public void acquire() {
mWakeLock.acquire();
HdmiLogger.debug("active source: %b. Wake lock acquired", mIsActiveSource);
}
@Override
public void release() {
mWakeLock.release();
HdmiLogger.debug("Wake lock released");
}
@Override
public boolean isHeld() {
return mWakeLock.isHeld();
}
}
}