Disable screensavers if below first battery warning level.

Don't activate on sleep if below the threshold, and quit any currently
running dream when the threshold is reached.

Bug:6999949
Change-Id: I961b350d24ee6f95e502228aaa57312b0ffbadc1
diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java
index 6ae16a4..4192a93 100644
--- a/services/java/com/android/server/BatteryService.java
+++ b/services/java/com/android/server/BatteryService.java
@@ -204,6 +204,11 @@
         return mBatteryLevel;
     }
 
+    // true if battery level is below the first warning threshold
+    public final boolean isBatteryLow() {
+        return mBatteryPresent && mBatteryLevel <= mLowBatteryWarningLevel;
+    }
+
     void systemReady() {
         // check our power situation now that it is safe to display the shutdown dialog.
         shutdownIfNoPower();
diff --git a/services/java/com/android/server/power/PowerManagerService.java b/services/java/com/android/server/power/PowerManagerService.java
index a5cb55a..9f2b247 100644
--- a/services/java/com/android/server/power/PowerManagerService.java
+++ b/services/java/com/android/server/power/PowerManagerService.java
@@ -1137,7 +1137,7 @@
      */
     private void updateDreamLocked(int dirty) {
         if ((dirty & (DIRTY_WAKEFULNESS | DIRTY_SETTINGS
-                | DIRTY_IS_POWERED | DIRTY_STAY_ON)) != 0) {
+                | DIRTY_IS_POWERED | DIRTY_STAY_ON | DIRTY_BATTERY_STATE)) != 0) {
             scheduleSandmanLocked();
         }
     }
@@ -1163,13 +1163,13 @@
         boolean startDreaming = false;
         synchronized (mLock) {
             mSandmanScheduled = false;
-
+            boolean canDream = canDreamLocked();
             if (DEBUG_SPEW) {
-                Log.d(TAG, "handleSandman: canDream=" + canDreamLocked()
+                Log.d(TAG, "handleSandman: canDream=" + canDream
                         + ", mWakefulness=" + wakefulnessToString(mWakefulness));
             }
 
-            if (canDreamLocked() && mWakefulness == WAKEFULNESS_NAPPING) {
+            if (canDream && mWakefulness == WAKEFULNESS_NAPPING) {
                 startDreaming = true;
             }
         }
@@ -1253,8 +1253,11 @@
      * assuming there has been no recent user activity and no wake locks are held.
      */
     private boolean canDreamLocked() {
-        return mIsPowered && mDreamsSupportedConfig
-                && mDreamsEnabledSetting && mDreamsActivateOnSleepSetting;
+        return mIsPowered
+                && mDreamsSupportedConfig
+                && mDreamsEnabledSetting
+                && mDreamsActivateOnSleepSetting
+                && !mBatteryService.isBatteryLow();
     }
 
     /**