Announce dynamic content changes in lock confirmation settings.

Also re-orders updateStage() and setText/Selection calls so that text
events don't flush announcements. This does not change functionality.

Bug: 7256500
Change-Id: I8b10d66e9f73c7a630a8c3c5128372e18f26234c
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 4657be5..aab4ba6 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -40,6 +40,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.View.OnClickListener;
+import android.view.accessibility.AccessibilityEvent;
 import android.view.inputmethod.EditorInfo;
 import android.widget.Button;
 import android.widget.TextView;
@@ -272,8 +273,15 @@
         }
 
         protected void updateStage(Stage stage) {
+            final Stage previousStage = mUiStage;
             mUiStage = stage;
             updateUi();
+
+            // If the stage changed, announce the header for accessibility. This
+            // is a no-op when accessibility is disabled.
+            if (previousStage != stage) {
+                mHeaderText.announceForAccessibility(mHeaderText.getText());
+            }
         }
 
         /**
@@ -378,8 +386,8 @@
                 errorMsg = validatePassword(pin);
                 if (errorMsg == null) {
                     mFirstPin = pin;
-                    updateStage(Stage.NeedToConfirm);
                     mPasswordEntry.setText("");
+                    updateStage(Stage.NeedToConfirm);
                 }
             } else if (mUiStage == Stage.NeedToConfirm) {
                 if (mFirstPin.equals(pin)) {
@@ -389,11 +397,11 @@
                     mLockPatternUtils.saveLockPassword(pin, mRequestedQuality, isFallback);
                     getActivity().finish();
                 } else {
-                    updateStage(Stage.ConfirmWrong);
                     CharSequence tmp = mPasswordEntry.getText();
                     if (tmp != null) {
                         Selection.setSelection((Spannable) tmp, 0, tmp.length());
                     }
+                    updateStage(Stage.ConfirmWrong);
                 }
             }
             if (errorMsg != null) {
@@ -415,6 +423,7 @@
 
         private void showError(String msg, final Stage next) {
             mHeaderText.setText(msg);
+            mHeaderText.announceForAccessibility(mHeaderText.getText());
             Message mesg = mHandler.obtainMessage(MSG_SHOW_ERROR, next);
             mHandler.removeMessages(MSG_SHOW_ERROR);
             mHandler.sendMessageDelayed(mesg, ERROR_MESSAGE_TIMEOUT);
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index 180eee1..295e8ea 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -429,6 +429,7 @@
          * @param stage
          */
         protected void updateStage(Stage stage) {
+            final Stage previousStage = mUiStage;
 
             mUiStage = stage;
 
@@ -493,6 +494,12 @@
                 case ChoiceConfirmed:
                     break;
             }
+
+            // If the stage changed, announce the header for accessibility. This
+            // is a no-op when accessibility is disabled.
+            if (previousStage != stage) {
+                mHeaderText.announceForAccessibility(mHeaderText.getText());
+            }
         }
 
 
diff --git a/src/com/android/settings/ConfirmLockPassword.java b/src/com/android/settings/ConfirmLockPassword.java
index 1229046..96839ba 100644
--- a/src/com/android/settings/ConfirmLockPassword.java
+++ b/src/com/android/settings/ConfirmLockPassword.java
@@ -35,6 +35,7 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
 import android.view.inputmethod.EditorInfo;
 import android.widget.Button;
 import android.widget.TextView;
@@ -173,6 +174,7 @@
 
         private void showError(int msg) {
             mHeaderText.setText(msg);
+            mHeaderText.announceForAccessibility(mHeaderText.getText());
             mPasswordEntry.setText(null);
             mHandler.postDelayed(new Runnable() {
                 public void run() {
diff --git a/src/com/android/settings/ConfirmLockPattern.java b/src/com/android/settings/ConfirmLockPattern.java
index 2892930..dd375cc 100644
--- a/src/com/android/settings/ConfirmLockPattern.java
+++ b/src/com/android/settings/ConfirmLockPattern.java
@@ -180,7 +180,6 @@
         }
 
         private void updateStage(Stage stage) {
-
             switch (stage) {
                 case NeedToUnlock:
                     if (mHeaderText != null) {
@@ -220,6 +219,10 @@
                     mLockPatternView.setEnabled(false); // appearance of being disabled
                     break;
             }
+
+            // Always announce the header for accessibility. This is a no-op
+            // when accessibility is disabled.
+            mHeaderTextView.announceForAccessibility(mHeaderTextView.getText());
         }
 
         private Runnable mClearPatternRunnable = new Runnable() {