Revert "Make SuggestedWords immutable"

This reverts commit c208f4dfb7abe1b7a83c725d515edb3615d5d927
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 6c9a827..59fa66d 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1827,8 +1827,9 @@
                 builder.addTypedWordAndPreviousSuggestions(typedWord, previousSuggestions);
             }
         }
-        if (Utils.shouldBlockAutoCorrectionBySafetyNet(builder, mSuggest)) {
-            builder.setShouldBlockAutoCorrectionBySafetyNet();
+        final SuggestedWords suggestedWords = builder.build();
+        if (Utils.shouldBlockAutoCorrectionBySafetyNet(suggestedWords, mSuggest)) {
+            suggestedWords.setShouldBlockAutoCorrectionBySatefyNet();
         }
         showSuggestions(builder.build(), typedWord);
     }
@@ -1836,7 +1837,7 @@
     public void showSuggestions(final SuggestedWords suggestedWords, final CharSequence typedWord) {
         final CharSequence autoCorrection;
         if (suggestedWords.size() > 0) {
-            if (!suggestedWords.mShouldBlockAutoCorrectionBySafetyNet
+            if (!suggestedWords.shouldBlockAutoCorrectionBySafetyNet()
                     && suggestedWords.hasAutoCorrectionWord()) {
                 autoCorrection = suggestedWords.getWord(1);
             } else {
@@ -1910,7 +1911,8 @@
         if (suggestion.length() == 1 && isShowingPunctuationList()) {
             // Word separators are suggested before the user inputs something.
             // So, LatinImeLogger logs "" as a user's input.
-            LatinImeLogger.logOnManualSuggestion("", suggestion.toString(), index, suggestions);
+            LatinImeLogger.logOnManualSuggestion(
+                    "", suggestion.toString(), index, suggestions.mWords);
             // Rely on onCodeInput to do the complicated swapping/stripping logic consistently.
             final int primaryCode = suggestion.charAt(0);
             onCodeInput(primaryCode, new int[] { primaryCode },
@@ -1921,7 +1923,7 @@
         // We need to log before we commit, because the word composer will store away the user
         // typed word.
         LatinImeLogger.logOnManualSuggestion(mWordComposer.getTypedWord().toString(),
-                suggestion.toString(), index, suggestions);
+                suggestion.toString(), index, suggestions.mWords);
         mExpectingUpdateSelection = true;
         commitChosenWord(suggestion, LastComposedWord.COMMIT_TYPE_MANUAL_PICK,
                 LastComposedWord.NOT_A_SEPARATOR);
diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java
index 9d4307f..e3dadf2 100644
--- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java
+++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java
@@ -22,6 +22,8 @@
 
 import com.android.inputmethod.keyboard.Keyboard;
 
+import java.util.List;
+
 public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener {
 
     public static boolean sDBG = false;
@@ -42,7 +44,7 @@
     }
 
     public static void logOnManualSuggestion(
-            String before, String after, int position, SuggestedWords suggestions) {
+            String before, String after, int position, List<CharSequence> suggestions) {
     }
 
     public static void logOnAutoCorrection(String before, String after, int separatorCode) {
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
index bc6c527..ff8945f 100644
--- a/java/src/com/android/inputmethod/latin/SuggestedWords.java
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -20,25 +20,22 @@
 import android.view.inputmethod.CompletionInfo;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 
 public class SuggestedWords {
-    public static final SuggestedWords EMPTY = new SuggestedWords(null, false, false, false, false,
-            null);
+    public static final SuggestedWords EMPTY = new SuggestedWords(null, false, false, false, null);
 
-    private final List<CharSequence> mWords;
+    public final List<CharSequence> mWords;
     public final boolean mTypedWordValid;
     public final boolean mHasAutoCorrectionCandidate;
     public final boolean mIsPunctuationSuggestions;
-    public final boolean mShouldBlockAutoCorrectionBySafetyNet;
     private final List<SuggestedWordInfo> mSuggestedWordInfoList;
+    private boolean mShouldBlockAutoCorrectionBySafetyNet;
 
-    SuggestedWords(List<CharSequence> words, boolean typedWordValid,
+    private SuggestedWords(List<CharSequence> words, boolean typedWordValid,
             boolean hasAutoCorrectionCandidate, boolean isPunctuationSuggestions,
-            boolean shouldBlockAutoCorrectionBySafetyNet,
             List<SuggestedWordInfo> suggestedWordInfoList) {
         if (words != null) {
             mWords = words;
@@ -48,8 +45,8 @@
         mTypedWordValid = typedWordValid;
         mHasAutoCorrectionCandidate = hasAutoCorrectionCandidate;
         mIsPunctuationSuggestions = isPunctuationSuggestions;
-        mShouldBlockAutoCorrectionBySafetyNet = shouldBlockAutoCorrectionBySafetyNet;
         mSuggestedWordInfoList = suggestedWordInfoList;
+        mShouldBlockAutoCorrectionBySafetyNet = false;
     }
 
     public int size() {
@@ -65,23 +62,24 @@
     }
 
     public boolean hasAutoCorrectionWord() {
-        return mHasAutoCorrectionCandidate && size() > 1 && mTypedWordValid;
+        return mHasAutoCorrectionCandidate && size() > 1 && !mTypedWordValid;
+    }
+
+    public boolean isPunctuationSuggestions() {
+        return mIsPunctuationSuggestions;
+    }
+
+    public void setShouldBlockAutoCorrectionBySatefyNet() {
+        mShouldBlockAutoCorrectionBySafetyNet = true;
+    }
+
+    public boolean shouldBlockAutoCorrectionBySafetyNet() {
+        return mShouldBlockAutoCorrectionBySafetyNet;
     }
 
     public boolean willAutoCorrect() {
         return !mTypedWordValid && mHasAutoCorrectionCandidate
-                && !mShouldBlockAutoCorrectionBySafetyNet;
-    }
-
-    @Override
-    public String toString() {
-        // Pretty-print method to help debug
-        return "SuggestedWords.Builder:"
-                + " mTypedWordValid = " + mTypedWordValid
-                + " mHasAutoCorrectionCandidate = " + mHasAutoCorrectionCandidate
-                + " mIsPunctuationSuggestions = " + mIsPunctuationSuggestions
-                + " mShouldBlockAutoCorrectionBySafetyNet" + mShouldBlockAutoCorrectionBySafetyNet
-                + " mWords=" + Arrays.toString(mWords.toArray());
+                && !shouldBlockAutoCorrectionBySafetyNet();
     }
 
     public static class Builder {
@@ -89,7 +87,6 @@
         private boolean mTypedWordValid;
         private boolean mHasMinimalSuggestion;
         private boolean mIsPunctuationSuggestions;
-        private boolean mShouldBlockAutoCorrectionBySafetyNet;
         private List<SuggestedWordInfo> mSuggestedWordInfoList =
                 new ArrayList<SuggestedWordInfo>();
 
@@ -154,11 +151,6 @@
             return this;
         }
 
-        public Builder setShouldBlockAutoCorrectionBySafetyNet() {
-            mShouldBlockAutoCorrectionBySafetyNet = true;
-            return this;
-        }
-
         // Should get rid of the first one (what the user typed previously) from suggestions
         // and replace it with what the user currently typed.
         public Builder addTypedWordAndPreviousSuggestions(CharSequence typedWord,
@@ -184,8 +176,7 @@
 
         public SuggestedWords build() {
             return new SuggestedWords(mWords, mTypedWordValid, mHasMinimalSuggestion,
-                    mIsPunctuationSuggestions, mShouldBlockAutoCorrectionBySafetyNet,
-                    mSuggestedWordInfoList);
+                    mIsPunctuationSuggestions, mSuggestedWordInfoList);
         }
 
         public int size() {
@@ -196,20 +187,18 @@
             return mWords.get(pos);
         }
 
-        public boolean isTypedWordValid() {
-            return mTypedWordValid;
-        }
-
         @Override
         public String toString() {
             // Pretty-print method to help debug
-            return "SuggestedWords.Builder:"
-                    + " mTypedWordValid = " + mTypedWordValid
-                    + " mHasMinimalSuggestion = " + mHasMinimalSuggestion
-                    + " mIsPunctuationSuggestions = " + mIsPunctuationSuggestions
-                    + " mShouldBlockAutoCorrectionBySafetyNet"
-                    + mShouldBlockAutoCorrectionBySafetyNet
-                    + " mWords=" + Arrays.toString(mWords.toArray());
+            final StringBuilder sb = new StringBuilder("StringBuilder: mTypedWordValid = "
+                    + mTypedWordValid + " ; mHasMinimalSuggestion = " + mHasMinimalSuggestion
+                    + " ; mIsPunctuationSuggestions = " + mIsPunctuationSuggestions
+                    + " --- ");
+            for (CharSequence s : mWords) {
+                sb.append(s);
+                sb.append(" ; ");
+            }
+            return sb.toString();
         }
     }
 
diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java
index 69b2902..f6bc854 100644
--- a/java/src/com/android/inputmethod/latin/Utils.java
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -190,11 +190,11 @@
 
     // TODO: Resolve the inconsistencies between the native auto correction algorithms and
     // this safety net
-    public static boolean shouldBlockAutoCorrectionBySafetyNet(SuggestedWords.Builder suggestions,
+    public static boolean shouldBlockAutoCorrectionBySafetyNet(SuggestedWords suggestions,
             Suggest suggest) {
         // Safety net for auto correction.
         // Actually if we hit this safety net, it's actually a bug.
-        if (suggestions.size() <= 1 || suggestions.isTypedWordValid()) return false;
+        if (suggestions.size() <= 1 || suggestions.mTypedWordValid) return false;
         // If user selected aggressive auto correction mode, there is no need to use the safety
         // net.
         if (suggest.isAggressiveAutoCorrectionMode()) return false;
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionsView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionsView.java
index 20eb55c..e5638ef 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionsView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionsView.java
@@ -307,7 +307,7 @@
             }
             if (LatinImeLogger.sDBG) {
                 if (index == mCenterSuggestionIndex && suggestions.mHasAutoCorrectionCandidate
-                        && suggestions.mShouldBlockAutoCorrectionBySafetyNet) {
+                        && suggestions.shouldBlockAutoCorrectionBySafetyNet()) {
                     return 0xFFFF0000;
                 }
             }
@@ -335,7 +335,7 @@
 
         public void layout(SuggestedWords suggestions, ViewGroup stripView, ViewGroup placer,
                 int stripWidth) {
-            if (suggestions.mIsPunctuationSuggestions) {
+            if (suggestions.isPunctuationSuggestions()) {
                 layoutPunctuationSuggestions(suggestions, stripView);
                 return;
             }