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();
+        }
+    }
 }