From ec780e2868962bf17f0dfd35d36895f543bde40a Mon Sep 17 00:00:00 2001
From: satok <satok@google.com>
Date: Wed, 28 Sep 2011 15:59:11 +0900
Subject: [PATCH] Put SuggestionSpan as the indicater of the auto-correction

Bug: 5245468

Change-Id: Ia5609e1b3c69f5553e3632fbce60a55665a5b185
---
 .../compat/SuggestionSpanUtils.java           | 23 +++++++++++++++++++
 .../android/inputmethod/latin/LatinIME.java   | 11 +++++++++
 .../inputmethod/latin/SuggestionsView.java    | 10 +++-----
 .../com/android/inputmethod/latin/Utils.java  |  4 ++++
 4 files changed, 41 insertions(+), 7 deletions(-)

diff --git a/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java
index 5c54fa5480..876bd65f6b 100644
--- a/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java
+++ b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java
@@ -24,18 +24,22 @@ import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.TextUtils;
+import android.util.Log;
 
 import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.Locale;
 
 public class SuggestionSpanUtils {
+    private static final String TAG = SuggestionSpanUtils.class.getSimpleName();
     // TODO: Use reflection to get field values
     public static final String ACTION_SUGGESTION_PICKED =
             "android.text.style.SUGGESTION_PICKED";
     public static final String SUGGESTION_SPAN_PICKED_AFTER = "after";
     public static final String SUGGESTION_SPAN_PICKED_BEFORE = "before";
     public static final String SUGGESTION_SPAN_PICKED_HASHCODE = "hashcode";
+    // TODO: Use the API constant after it gets public.
+    public static final int FLAG_AUTO_CORRECTION = 0x0004;
     public static final int SUGGESTION_MAX_SIZE = 5;
     public static final boolean SUGGESTION_SPAN_IS_SUPPORTED;
 
@@ -50,6 +54,25 @@ public class SuggestionSpanUtils {
                 CLASS_SuggestionSpan != null && CONSTRUCTOR_SuggestionSpan != null;
     }
 
+    public static CharSequence getTextWithAutoCorrectionIndicatorUnderline(
+            Context context, CharSequence text) {
+        if (TextUtils.isEmpty(text) || CONSTRUCTOR_SuggestionSpan == null) {
+            return text;
+        }
+        final Spannable spannable = text instanceof Spannable
+                ? (Spannable) text : new SpannableString(text);
+        final Object[] args =
+                { context, null, new String[] {}, FLAG_AUTO_CORRECTION,
+                        (Class<?>) SuggestionSpanPickedNotificationReceiver.class };
+        final Object ss = CompatUtils.newInstance(CONSTRUCTOR_SuggestionSpan, args);
+        if (ss == null) {
+            Log.w(TAG, "Suggestion span was not created.");
+            return text;
+        }
+        spannable.setSpan(ss, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        return spannable;
+    }
+
     public static CharSequence getTextWithSuggestionSpan(Context context,
             CharSequence pickedWord, SuggestedWords suggestedWords) {
         if (TextUtils.isEmpty(pickedWord) || CONSTRUCTOR_SuggestionSpan == null
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 36e97af11d..c5f336b3fa 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1601,6 +1601,17 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
             mKeyboardSwitcher.onAutoCorrectionStateChanged(
                     words.hasWordAboveAutoCorrectionScoreThreshold());
         }
+
+        // Put a blue underline to a word in TextView which will be auto-corrected.
+        final InputConnection ic = getCurrentInputConnection();
+        if (ic != null && Utils.willAutoCorrect(words)) {
+            final CharSequence textWithUnderline =
+                    SuggestionSpanUtils.getTextWithAutoCorrectionIndicatorUnderline(
+                            this, mComposingStringBuilder);
+            if (!TextUtils.isEmpty(textWithUnderline)) {
+                ic.setComposingText(textWithUnderline, 1);
+            }
+        }
     }
 
     public void updateSuggestions() {
diff --git a/java/src/com/android/inputmethod/latin/SuggestionsView.java b/java/src/com/android/inputmethod/latin/SuggestionsView.java
index fe54f4ae1e..3271b8253f 100644
--- a/java/src/com/android/inputmethod/latin/SuggestionsView.java
+++ b/java/src/com/android/inputmethod/latin/SuggestionsView.java
@@ -260,7 +260,7 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
 
         private CharSequence getStyledSuggestionWord(SuggestedWords suggestions, int pos) {
             final CharSequence word = suggestions.getWord(pos);
-            final boolean isAutoCorrect = pos == 1 && willAutoCorrect(suggestions);
+            final boolean isAutoCorrect = pos == 1 && Utils.willAutoCorrect(suggestions);
             final boolean isTypedWordValid = pos == 0 && suggestions.mTypedWordValid;
             if (!isAutoCorrect && !isTypedWordValid)
                 return word;
@@ -278,14 +278,10 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
             return spannedWord;
         }
 
-        private static boolean willAutoCorrect(SuggestedWords suggestions) {
-            return !suggestions.mTypedWordValid && suggestions.mHasMinimalSuggestion;
-        }
-
         private int getWordPosition(int index, SuggestedWords suggestions) {
             // TODO: This works for 3 suggestions. Revisit this algorithm when there are 5 or more
             // suggestions.
-            final int centerPos = willAutoCorrect(suggestions) ? 1 : 0;
+            final int centerPos = Utils.willAutoCorrect(suggestions) ? 1 : 0;
             if (index == mCenterSuggestionIndex) {
                 return centerPos;
             } else if (index == centerPos) {
@@ -300,7 +296,7 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
             final boolean isSuggested = (pos != 0);
 
             final int color;
-            if (index == mCenterSuggestionIndex && willAutoCorrect(suggestions)) {
+            if (index == mCenterSuggestionIndex && Utils.willAutoCorrect(suggestions)) {
                 color = mColorAutoCorrect;
             } else if (isSuggested) {
                 color = mColorSuggested;
diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java
index 7712765675..de29304609 100644
--- a/java/src/com/android/inputmethod/latin/Utils.java
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -790,4 +790,8 @@ public class Utils {
         }
         return -1;
     }
+
+    public static boolean willAutoCorrect(SuggestedWords suggestions) {
+        return !suggestions.mTypedWordValid && suggestions.mHasMinimalSuggestion;
+    }
 }
-- 
GitLab