Merge "CEC: Define a system property to keep playback device awake"
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user