Pause activities when the screen is off.

Bug: 19948628
Change-Id: I90923605d50f4ee381da4e05117879554e0a1dee
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 6e52358..25ca167 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -514,6 +514,7 @@
     boolean mDreamingLockscreen;
     boolean mDreamingSleepTokenNeeded;
     SleepToken mDreamingSleepToken;
+    SleepToken mScreenOffSleepToken;
     boolean mKeyguardSecure;
     boolean mKeyguardSecureIncludingHidden;
     volatile boolean mKeyguardOccluded;
@@ -5385,6 +5386,7 @@
     public void screenTurnedOff() {
         if (DEBUG_WAKEUP) Slog.i(TAG, "Screen turned off...");
 
+        updateScreenOffSleepToken(true);
         synchronized (mLock) {
             mScreenOnEarly = false;
             mScreenOnFully = false;
@@ -5399,6 +5401,7 @@
     public void screenTurningOn(final ScreenOnListener screenOnListener) {
         if (DEBUG_WAKEUP) Slog.i(TAG, "Screen turning on...");
 
+        updateScreenOffSleepToken(false);
         synchronized (mLock) {
             mScreenOnEarly = true;
             mScreenOnFully = false;
@@ -6021,6 +6024,20 @@
         } else {
             if (mDreamingSleepToken != null) {
                 mDreamingSleepToken.release();
+                mDreamingSleepToken = null;
+            }
+        }
+    }
+
+    private void updateScreenOffSleepToken(boolean acquire) {
+        if (acquire) {
+            if (mScreenOffSleepToken == null) {
+                mScreenOffSleepToken = mActivityManagerInternal.acquireSleepToken("ScreenOff");
+            }
+        } else {
+            if (mScreenOffSleepToken != null) {
+                mScreenOffSleepToken.release();
+                mScreenOffSleepToken = null;
             }
         }
     }