From d40f3f6bc1bcf07800fbee0468fe90d307ca28bb Mon Sep 17 00:00:00 2001
From: Jean Chalard <jchalard@google.com>
Date: Fri, 12 Apr 2013 20:45:18 +0900
Subject: [PATCH] Reject a previously user-refused suggestion.

If the user gestures a word, then hits backspace in
disapproval, and gestures about the same thing again,
make sure that we don't suggest the same thing again.

Bug: 7549311
Change-Id: I793bc4df7c3841fa8f2f4146707c26e873f374c1
---
 .../android/inputmethod/latin/LatinIME.java   |  2 ++
 .../android/inputmethod/latin/Suggest.java    |  5 +++++
 .../inputmethod/latin/WordComposer.java       | 20 +++++++++++++++++++
 3 files changed, 27 insertions(+)

diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 094ccd77f6..47d51c5866 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1747,7 +1747,9 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
                         ResearchLogger.getInstance().uncommitCurrentLogUnit(
                                 word, false /* dumpCurrentLogUnit */);
                     }
+                    final String rejectedSuggestion = mWordComposer.getTypedWord();
                     mWordComposer.reset();
+                    mWordComposer.setRejectedBatchModeSuggestion(rejectedSuggestion);
                 } else {
                     mWordComposer.deleteLast();
                 }
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 6464bd0d78..5abadf3dca 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -334,6 +334,11 @@ public final class Suggest {
             }
         }
 
+        if (suggestionsContainer.size() > 1 && TextUtils.equals(suggestionsContainer.get(0).mWord,
+                wordComposer.getRejectedBatchModeSuggestion())) {
+            final SuggestedWordInfo rejected = suggestionsContainer.remove(0);
+            suggestionsContainer.add(1, rejected);
+        }
         SuggestedWordInfo.removeDups(suggestionsContainer);
         // In the batch input mode, the most relevant suggested word should act as a "typed word"
         // (typedWordValid=true), not as an "auto correct word" (willAutoCorrect=false).
diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
index 1af12428db..098e8ac7bd 100644
--- a/java/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -42,6 +42,13 @@ public final class WordComposer {
     private String mAutoCorrection;
     private boolean mIsResumed;
     private boolean mIsBatchMode;
+    // A memory of the last rejected batch mode suggestion, if any. This goes like this: the user
+    // gestures a word, is displeased with the results and hits backspace, then gestures again.
+    // At the very least we should avoid re-suggesting the same thing, and to do that we memorize
+    // the rejected suggestion in this variable.
+    // TODO: this should be done in a comprehensive way by the User History feature instead of
+    // as an ad-hockery here.
+    private String mRejectedBatchModeSuggestion;
 
     // Cache these values for performance
     private int mCapsCount;
@@ -64,6 +71,7 @@ public final class WordComposer {
         mIsResumed = false;
         mIsBatchMode = false;
         mCursorPositionWithinWord = 0;
+        mRejectedBatchModeSuggestion = null;
         refreshSize();
     }
 
@@ -79,6 +87,7 @@ public final class WordComposer {
         mIsResumed = source.mIsResumed;
         mIsBatchMode = source.mIsBatchMode;
         mCursorPositionWithinWord = source.mCursorPositionWithinWord;
+        mRejectedBatchModeSuggestion = source.mRejectedBatchModeSuggestion;
         refreshSize();
     }
 
@@ -95,6 +104,7 @@ public final class WordComposer {
         mIsResumed = false;
         mIsBatchMode = false;
         mCursorPositionWithinWord = 0;
+        mRejectedBatchModeSuggestion = null;
         refreshSize();
     }
 
@@ -384,6 +394,7 @@ public final class WordComposer {
         mAutoCorrection = null;
         mCursorPositionWithinWord = 0;
         mIsResumed = false;
+        mRejectedBatchModeSuggestion = null;
         return lastComposedWord;
     }
 
@@ -396,10 +407,19 @@ public final class WordComposer {
         mCapitalizedMode = lastComposedWord.mCapitalizedMode;
         mAutoCorrection = null; // This will be filled by the next call to updateSuggestion.
         mCursorPositionWithinWord = mCodePointSize;
+        mRejectedBatchModeSuggestion = null;
         mIsResumed = true;
     }
 
     public boolean isBatchMode() {
         return mIsBatchMode;
     }
+
+    public void setRejectedBatchModeSuggestion(final String rejectedSuggestion) {
+        mRejectedBatchModeSuggestion = rejectedSuggestion;
+    }
+
+    public String getRejectedBatchModeSuggestion() {
+        return mRejectedBatchModeSuggestion;
+    }
 }
-- 
GitLab