Delay audio notification on user interaction

Fix the eng pieces of bug 6445429.

Change-Id: I1963d2e701e4b4639cdc75cc3161668d0601747d
diff --git a/src/com/android/settings/CryptKeeper.java b/src/com/android/settings/CryptKeeper.java
index 10c067d..1cb12f3 100644
--- a/src/com/android/settings/CryptKeeper.java
+++ b/src/com/android/settings/CryptKeeper.java
@@ -35,11 +35,16 @@
 import android.os.storage.IMountService;
 import android.provider.Settings;
 import android.telephony.TelephonyManager;
+import android.text.Editable;
 import android.text.TextUtils;
+import android.text.TextWatcher;
 import android.util.Log;
 import android.view.KeyEvent;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnClickListener;
+import android.view.View.OnKeyListener;
+import android.view.View.OnTouchListener;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
@@ -67,7 +72,8 @@
  *     -n com.android.settings/.CryptKeeper
  * </pre>
  */
-public class CryptKeeper extends Activity implements TextView.OnEditorActionListener {
+public class CryptKeeper extends Activity implements TextView.OnEditorActionListener,
+        OnKeyListener, OnTouchListener, TextWatcher {
     private static final String TAG = "CryptKeeper";
 
     private static final String DECRYPT_STATE = "trigger_restart_framework";
@@ -103,6 +109,8 @@
     private int mCooldown;
     PowerManager.WakeLock mWakeLock;
     private EditText mPasswordEntry;
+    /** Number of calls to {@link #notifyUser()} to ignore before notifying. */
+    private int mNotificationCountdown = 0;
 
     /**
      * Used to propagate state through configuration changes (e.g. screen rotation)
@@ -236,8 +244,11 @@
      * Notify the user that we are awaiting input. Currently this sends an audio alert.
      */
     private void notifyUser() {
-        Log.d(TAG, "Notifying user that we are waiting for input...");
-        if (mAudioManager != null) {
+        if (mNotificationCountdown > 0) {
+            Log.d(TAG, "Counting down to notify user..." + mNotificationCountdown);
+            --mNotificationCountdown;
+        } else if (mAudioManager != null) {
+            Log.d(TAG, "Notifying user that we are waiting for input...");
             try {
                 // Play the standard keypress sound at full volume. This should be available on
                 // every device. We cannot play a ringtone here because media services aren't
@@ -478,6 +489,10 @@
         mPasswordEntry = (EditText) findViewById(R.id.passwordEntry);
         mPasswordEntry.setOnEditorActionListener(this);
         mPasswordEntry.requestFocus();
+        // Become quiet when the user interacts with the Edit text screen.
+        mPasswordEntry.setOnKeyListener(this);
+        mPasswordEntry.setOnTouchListener(this);
+        mPasswordEntry.addTextChangedListener(this);
 
         // Disable the Emergency call button if the device has no voice telephone capability
         final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
@@ -522,9 +537,9 @@
         }, 0);
 
         updateEmergencyCallButtonState();
-        // Notify the user in 30 seconds that we are waiting for him to enter the password.
+        // Notify the user in 120 seconds that we are waiting for him to enter the password.
         mHandler.removeMessages(MESSAGE_NOTIFY);
-        mHandler.sendEmptyMessageDelayed(MESSAGE_NOTIFY, 30 * 1000);
+        mHandler.sendEmptyMessageDelayed(MESSAGE_NOTIFY, 120 * 1000);
     }
 
     /**
@@ -706,4 +721,39 @@
                         | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
         startActivity(intent);
     }
+
+    /**
+     * Listen to key events so we can disable sounds when we get a keyinput in EditText.
+     */
+    private void delayAudioNotification() {
+        Log.d(TAG, "User entering password: delay audio notification");
+        mNotificationCountdown = 20;
+    }
+
+    @Override
+    public boolean onKey(View v, int keyCode, KeyEvent event) {
+        delayAudioNotification();
+        return false;
+    }
+
+    @Override
+    public boolean onTouch(View v, MotionEvent event) {
+        delayAudioNotification();
+        return false;
+    }
+
+    @Override
+    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+        return;
+    }
+
+    @Override
+    public void onTextChanged(CharSequence s, int start, int before, int count) {
+        delayAudioNotification();
+    }
+
+    @Override
+    public void afterTextChanged(Editable s) {
+        return;
+    }
 }