Re-synced MR1 and master for SpellChecker

Some auto-merges got lost, re-syncing master with the latest
and greatest from MR1.

Change-Id: Ifc0b5d1fd2e11e68d219c3f491f37d4c047579a0
diff --git a/core/java/android/widget/SpellChecker.java b/core/java/android/widget/SpellChecker.java
index e9a2644..a106159 100644
--- a/core/java/android/widget/SpellChecker.java
+++ b/core/java/android/widget/SpellChecker.java
@@ -97,19 +97,19 @@
         mCookie = hashCode();
     }
 
-    private void setLocale(Locale locale) {
+    private void resetSession() {
         closeSession();
-        final TextServicesManager textServicesManager = (TextServicesManager)
-                mTextView.getContext().getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
-        if (!textServicesManager.isSpellCheckerEnabled()) {
+
+        mTextServicesManager = (TextServicesManager) mTextView.getContext().
+                getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
+        if (!mTextServicesManager.isSpellCheckerEnabled()) {
             mSpellCheckerSession = null;
         } else {
-            mSpellCheckerSession = textServicesManager.newSpellCheckerSession(
+            mSpellCheckerSession = mTextServicesManager.newSpellCheckerSession(
                     null /* Bundle not currently used by the textServicesManager */,
-                    locale, this,
+                    mCurrentLocale, this,
                     false /* means any available languages from current spell checker */);
         }
-        mCurrentLocale = locale;
 
         // Restore SpellCheckSpans in pool
         for (int i = 0; i < mLength; i++) {
@@ -118,9 +118,19 @@
         }
         mLength = 0;
 
-        mSpellParsers = new SpellParser[0];
+        // Remove existing misspelled SuggestionSpans
+        mTextView.removeMisspelledSpans((Editable) mTextView.getText());
+    }
 
-        // This class is the global listener for locale change: warn other locale-aware objects
+    private void setLocale(Locale locale) {
+        mCurrentLocale = locale;
+
+        resetSession();
+
+        // Change SpellParsers' wordIterator locale
+        mWordIterator = new WordIterator(locale);
+
+        // This class is the listener for locale change: warn other locale-aware objects
         mTextView.onLocaleChanged();
     }
 
@@ -137,10 +147,6 @@
             mSpellCheckerSession.close();
         }
 
-        stopAllSpellParsers();
-    }
-
-    private void stopAllSpellParsers() {
         final int length = mSpellParsers.length;
         for (int i = 0; i < length; i++) {
             mSpellParsers[i].stop();
@@ -198,6 +204,12 @@
             // Re-check the entire text
             start = 0;
             end = mTextView.getText().length();
+        } else {
+            final boolean spellCheckerActivated = mTextServicesManager.isSpellCheckerEnabled();
+            if (isSessionActive() != spellCheckerActivated) {
+                // Spell checker has been turned of or off since last spellCheck
+                resetSession();
+            }
         }
 
         if (!isSessionActive()) return;
@@ -206,7 +218,7 @@
         final int length = mSpellParsers.length;
         for (int i = 0; i < length; i++) {
             final SpellParser spellParser = mSpellParsers[i];
-            if (!spellParser.isParsing()) {
+            if (spellParser.isFinished()) {
                 spellParser.init(start, end);
                 spellParser.parse();
                 return;
@@ -309,7 +321,7 @@
                     final int length = mSpellParsers.length;
                     for (int i = 0; i < length; i++) {
                         final SpellParser spellParser = mSpellParsers[i];
-                        if (!spellParser.isParsing()) {
+                        if (!spellParser.isFinished()) {
                             spellParser.parse();
                             break; // run one spell parser at a time to bound running time
                         }
@@ -395,12 +407,12 @@
             setRangeSpan((Editable) mTextView.getText(), start, end);
         }
 
-        public void stop() {
-            removeRangeSpan((Editable) mTextView.getText());
+        public boolean isFinished() {
+            return ((Editable) mTextView.getText()).getSpanStart(mRange) < 0;
         }
 
-        public boolean isParsing() {
-            return ((Editable) mTextView.getText()).getSpanStart(mRange) >= 0;
+        public void stop() {
+            removeRangeSpan((Editable) mTextView.getText());
         }
 
         private void setRangeSpan(Editable editable, int start, int end) {
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 66fd06d..d0da4fb 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -8942,7 +8942,6 @@
     }
 
     void onLocaleChanged() {
-        removeMisspelledSpans((Editable) mText);
         // Will be re-created on demand in getWordIterator with the proper new locale
         mWordIterator = null;
     }