From 63fa90a7910d9f43f27a0bf9a6702f8fb44ce3e7 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Thu, 30 Jul 2009 10:11:33 -0700 Subject: [PATCH] Check for missing characters in User/Contacts dictionary as well. Also accomodate for missing characters when doing diffs between words. --- .../latin/ExpandableDictionary.java | 27 +++++++++++------- .../android/inputmethod/latin/Suggest.java | 28 +++++++++++++------ 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/com/android/inputmethod/latin/ExpandableDictionary.java b/src/com/android/inputmethod/latin/ExpandableDictionary.java index 5235e8712..3f20783e4 100644 --- a/src/com/android/inputmethod/latin/ExpandableDictionary.java +++ b/src/com/android/inputmethod/latin/ExpandableDictionary.java @@ -102,7 +102,10 @@ public class ExpandableDictionary extends Dictionary { public void getWords(final WordComposer codes, final WordCallback callback) { mInputLength = codes.size(); mMaxDepth = mInputLength * 3; - getWordsRec(mRoots, codes, mWordBuilder, 0, false, 1.0f, 0, callback); + getWordsRec(mRoots, codes, mWordBuilder, 0, false, 1.0f, 0, -1, callback); + for (int i = 0; i < mInputLength; i++) { + getWordsRec(mRoots, codes, mWordBuilder, 0, false, 1.0f, 0, i, callback); + } } @Override @@ -163,7 +166,7 @@ public class ExpandableDictionary extends Dictionary { * @param callback the callback class for adding a word */ protected void getWordsRec(List roots, final WordComposer codes, final char[] word, - final int depth, boolean completion, float snr, int inputIndex, + final int depth, boolean completion, float snr, int inputIndex, int skipPos, WordCallback callback) { final int count = roots.size(); final int codeSize = mInputLength; @@ -193,18 +196,20 @@ public class ExpandableDictionary extends Dictionary { } } if (children != null) { - getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex, - callback); + getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex, + skipPos, callback); } - } else if (c == QUOTE && currentChars[0] != QUOTE) { + } else if ((c == QUOTE && currentChars[0] != QUOTE) || depth == skipPos) { // Skip the ' and continue deeper - word[depth] = QUOTE; + word[depth] = c; if (children != null) { getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex, - callback); + skipPos, callback); } } else { - for (int j = 0; j < currentChars.length; j++) { + // Don't use alternatives if we're looking for missing characters + final int alternativesSize = skipPos >= 0? 1 : currentChars.length; + for (int j = 0; j < alternativesSize; j++) { float addedAttenuation = (j > 0 ? 1f : 3f); if (currentChars[j] == -1) { break; @@ -223,11 +228,13 @@ public class ExpandableDictionary extends Dictionary { } if (children != null) { getWordsRec(children, codes, word, depth + 1, - true, snr * addedAttenuation, inputIndex + 1, callback); + true, snr * addedAttenuation, inputIndex + 1, + skipPos, callback); } } else if (children != null) { getWordsRec(children, codes, word, depth + 1, - false, snr * addedAttenuation, inputIndex + 1, callback); + false, snr * addedAttenuation, inputIndex + 1, + skipPos, callback); } } } diff --git a/src/com/android/inputmethod/latin/Suggest.java b/src/com/android/inputmethod/latin/Suggest.java index 077d76aba..bb6a153dc 100755 --- a/src/com/android/inputmethod/latin/Suggest.java +++ b/src/com/android/inputmethod/latin/Suggest.java @@ -113,24 +113,34 @@ public class Suggest implements Dictionary.WordCallback { mStringPool.add(sb); } } - + private boolean haveSufficientCommonality(String original, CharSequence suggestion) { - final int len = Math.min(original.length(), suggestion.length()); - if (len <= 2) return true; + final int originalLength = original.length(); + final int suggestionLength = suggestion.length(); + final int minLength = Math.min(originalLength, suggestionLength); + if (minLength <= 2) return true; int matching = 0; - for (int i = 0; i < len; i++) { - if (ExpandableDictionary.toLowerCase(original.charAt(i)) - == ExpandableDictionary.toLowerCase(suggestion.charAt(i))) { + int lessMatching = 0; // Count matches if we skip one character + int i; + for (i = 0; i < minLength; i++) { + final char origChar = ExpandableDictionary.toLowerCase(original.charAt(i)); + if (origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i))) { matching++; + lessMatching++; + } else if (i + 1 < suggestionLength + && origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i + 1))) { + lessMatching++; } } - if (len <= 4) { + matching = Math.max(matching, lessMatching); + + if (minLength <= 4) { return matching >= 2; } else { - return matching > len / 2; + return matching > minLength / 2; } } - + /** * Returns a list of words that match the list of character codes passed in. * This list will be overwritten the next time this function is called.