Capitalize the displayed text in the suggestion bar when all of the user typed chars are upper case

bug:3014227
Change-Id: Ic453e2fde57ce51be00f3a506e1c9328103ca99a
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 4729585..01f3ba6 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1389,7 +1389,7 @@
             if (mKeyboardSwitcher.getInputView().isShifted()
                     && mKeyboardSwitcher.isAlphabetMode()
                     && mComposing.length() == 0) {
-                mWord.setCapitalized(true);
+                mWord.setFirstCharCapitalized(true);
             }
             mComposing.append((char) primaryCode);
             mWord.add(primaryCode, keyCodes);
@@ -2020,7 +2020,7 @@
                     touching.word.charAt(i)
                 });
             }
-            foundWord.setCapitalized(Character.isUpperCase(touching.word.charAt(0)));
+            foundWord.setFirstCharCapitalized(Character.isUpperCase(touching.word.charAt(0)));
         }
         // Found a match, show suggestions
         if (foundWord != null || alternatives != null) {
@@ -2177,7 +2177,7 @@
     }
 
     public boolean preferCapitalization() {
-        return mWord.isCapitalized();
+        return mWord.isFirstCharCapitalized();
     }
 
     private void toggleLanguage(boolean reset, boolean next) {
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 92bbe43..3b89894 100755
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -96,7 +96,10 @@
     private boolean mHaveCorrection;
     private CharSequence mOriginalWord;
     private String mLowerOriginalWord;
-    private boolean mCapitalize;
+
+    // TODO: Remove these member variables by passing more context to addWord() callback method
+    private boolean mIsFirstCharCapitalized;
+    private boolean mIsAllUpperCase;
 
     private int mCorrectionMode = CORRECTION_BASIC;
 
@@ -219,7 +222,8 @@
             boolean includeTypedWordIfValid, CharSequence prevWordForBigram) {
         LatinImeLogger.onStartSuggestion(prevWordForBigram);
         mHaveCorrection = false;
-        mCapitalize = wordComposer.isCapitalized();
+        mIsFirstCharCapitalized = wordComposer.isFirstCharCapitalized();
+        mIsAllUpperCase = wordComposer.isAllUpperCase();
         collectGarbage(mSuggestions, mPrefMaxSuggestions);
         Arrays.fill(mPriorities, 0);
         Arrays.fill(mNextLettersFrequencies, 0);
@@ -453,7 +457,9 @@
         StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1) 
                 : new StringBuilder(getApproxMaxWordLength());
         sb.setLength(0);
-        if (mCapitalize) {
+        if (mIsAllUpperCase) {
+            sb.append(new String(word, offset, length).toUpperCase());
+        } else if (mIsFirstCharCapitalized) {
             sb.append(Character.toUpperCase(word[offset]));
             if (length > 1) {
                 sb.append(word, offset + 1, length - 1);
diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
index fe4c685..2e415b7 100644
--- a/java/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -39,9 +39,9 @@
     private boolean mAutoCapitalized;
     
     /**
-     * Whether the user chose to capitalize the word.
+     * Whether the user chose to capitalize the first char of the word.
      */
-    private boolean mIsCapitalized;
+    private boolean mIsFirstCharCapitalized;
 
     public WordComposer() {
         mCodes = new ArrayList<int[]>(12);
@@ -54,7 +54,7 @@
         mTypedWord = new StringBuilder(copy.mTypedWord);
         mCapsCount = copy.mCapsCount;
         mAutoCapitalized = copy.mAutoCapitalized;
-        mIsCapitalized = copy.mIsCapitalized;
+        mIsFirstCharCapitalized = copy.mIsFirstCharCapitalized;
     }
 
     /**
@@ -62,7 +62,7 @@
      */
     public void reset() {
         mCodes.clear();
-        mIsCapitalized = false;
+        mIsFirstCharCapitalized = false;
         mPreferredWord = null;
         mTypedWord.setLength(0);
         mCapsCount = 0;
@@ -138,18 +138,26 @@
         return mTypedWord;
     }
 
-    public void setCapitalized(boolean capitalized) {
-        mIsCapitalized = capitalized;
+    public void setFirstCharCapitalized(boolean capitalized) {
+        mIsFirstCharCapitalized = capitalized;
     }
     
     /**
      * Whether or not the user typed a capital letter as the first letter in the word
      * @return capitalization preference
      */
-    public boolean isCapitalized() {
-        return mIsCapitalized;
+    public boolean isFirstCharCapitalized() {
+        return mIsFirstCharCapitalized;
     }
-    
+
+    /**
+     * Whether or not all of the user typed chars are upper case
+     * @return true if all user typed chars are upper case, false otherwise
+     */
+    public boolean isAllUpperCase() {
+        return (mCapsCount > 0) && (mCapsCount == size());
+    }
+
     /**
      * Stores the user's selected word, before it is actually committed to the text field.
      * @param preferred