Improve power fail/reset

On power fail/reset, an encrypted device will sit at the enter password screen
indefinitely, chirping. This is designed to attract the attention of the user.

However, it also flattens the battery, and the user who's attention is not
drawn will discover a discharged phone the next morning. We have had many
complaints about this.

Keep current functionality, but power down after 10 minutes. It's a compromise,
but seems reasonable.

@bug 12582489

Change-Id: I895c0147bed978ecf6984af2c748f971dfa0d221
diff --git a/src/com/android/settings/CryptKeeper.java b/src/com/android/settings/CryptKeeper.java
index 1efe98f..c4e3e66 100644
--- a/src/com/android/settings/CryptKeeper.java
+++ b/src/com/android/settings/CryptKeeper.java
@@ -120,6 +120,8 @@
     private LockPatternView mLockPatternView;
     /** Number of calls to {@link #notifyUser()} to ignore before notifying. */
     private int mNotificationCountdown = 0;
+    /** Number of calls to {@link #notifyUser()} before we release the wakelock */
+    private int mReleaseWakeLockCountdown = 0;
 
     /**
      * Used to propagate state through configuration changes (e.g. screen rotation)
@@ -287,6 +289,14 @@
         // Notify the user again in 5 seconds.
         mHandler.removeMessages(MESSAGE_NOTIFY);
         mHandler.sendEmptyMessageDelayed(MESSAGE_NOTIFY, 5 * 1000);
+
+        if (mWakeLock.isHeld()) {
+            if (mReleaseWakeLockCountdown > 0) {
+                --mReleaseWakeLockCountdown;
+            } else {
+                mWakeLock.release();
+            }
+        }
     }
 
     /**
@@ -624,8 +634,12 @@
             if (pm != null) {
                 mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, TAG);
                 mWakeLock.acquire();
+                // Keep awake for 10 minutes - if the user hasn't been alerted by then
+                // best not to just drain their battery
+                mReleaseWakeLockCountdown = 96; // 96 * 5 + 120 = 600
             }
         }
+
         // Asynchronously throw up the IME, since there are issues with requesting it to be shown
         // immediately.
         if (mLockPatternView == null) {