Merge "CEC: Define a system property to keep playback device awake"
diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java
index 0c86aed..e434f39 100644
--- a/services/core/java/com/android/server/hdmi/Constants.java
+++ b/services/core/java/com/android/server/hdmi/Constants.java
@@ -214,6 +214,10 @@
// 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;
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
index a8f6954..1e43670 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
@@ -38,9 +38,11 @@
// 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 @@
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 @@
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();
+ }
+ }
}