Merge "Binary bigram lookup checks both uppercase and lowercase when previous word is uppercase."
commit
bebcae8ff5
|
@ -122,6 +122,23 @@ public class StringUtils {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if cs contains any upper case characters.
|
||||||
|
*
|
||||||
|
* @param cs the CharSequence to check
|
||||||
|
* @return {@code true} if cs contains any upper case characters, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public static boolean hasUpperCase(final CharSequence cs) {
|
||||||
|
final int length = cs.length();
|
||||||
|
for (int i = 0, cp = 0; i < length; i += Character.charCount(cp)) {
|
||||||
|
cp = Character.codePointAt(cs, i);
|
||||||
|
if (Character.isUpperCase(cp)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove duplicates from an array of strings.
|
* Remove duplicates from an array of strings.
|
||||||
*
|
*
|
||||||
|
|
|
@ -242,13 +242,8 @@ public class Suggest implements Dictionary.WordCallback {
|
||||||
|
|
||||||
mBigramSuggestions = new ArrayList<SuggestedWordInfo>(PREF_MAX_BIGRAMS);
|
mBigramSuggestions = new ArrayList<SuggestedWordInfo>(PREF_MAX_BIGRAMS);
|
||||||
|
|
||||||
CharSequence lowerPrevWord = prevWordForBigram.toString().toLowerCase();
|
getAllBigrams(prevWordForBigram, sEmptyWordComposer);
|
||||||
if (mMainDict != null && mMainDict.isValidWord(lowerPrevWord)) {
|
|
||||||
prevWordForBigram = lowerPrevWord;
|
|
||||||
}
|
|
||||||
for (final Dictionary dictionary : mBigramDictionaries.values()) {
|
|
||||||
dictionary.getBigrams(sEmptyWordComposer, prevWordForBigram, this);
|
|
||||||
}
|
|
||||||
// Nothing entered: return all bigrams for the previous word
|
// Nothing entered: return all bigrams for the previous word
|
||||||
int insertCount = Math.min(mBigramSuggestions.size(), mPrefMaxSuggestions);
|
int insertCount = Math.min(mBigramSuggestions.size(), mPrefMaxSuggestions);
|
||||||
for (int i = 0; i < insertCount; ++i) {
|
for (int i = 0; i < insertCount; ++i) {
|
||||||
|
@ -290,13 +285,7 @@ public class Suggest implements Dictionary.WordCallback {
|
||||||
mBigramSuggestions = new ArrayList<SuggestedWordInfo>(PREF_MAX_BIGRAMS);
|
mBigramSuggestions = new ArrayList<SuggestedWordInfo>(PREF_MAX_BIGRAMS);
|
||||||
|
|
||||||
if (!TextUtils.isEmpty(prevWordForBigram)) {
|
if (!TextUtils.isEmpty(prevWordForBigram)) {
|
||||||
CharSequence lowerPrevWord = prevWordForBigram.toString().toLowerCase();
|
getAllBigrams(prevWordForBigram, wordComposer);
|
||||||
if (mMainDict != null && mMainDict.isValidWord(lowerPrevWord)) {
|
|
||||||
prevWordForBigram = lowerPrevWord;
|
|
||||||
}
|
|
||||||
for (final Dictionary dictionary : mBigramDictionaries.values()) {
|
|
||||||
dictionary.getBigrams(wordComposer, prevWordForBigram, this);
|
|
||||||
}
|
|
||||||
if (TextUtils.isEmpty(consideredWord)) {
|
if (TextUtils.isEmpty(consideredWord)) {
|
||||||
// Nothing entered: return all bigrams for the previous word
|
// Nothing entered: return all bigrams for the previous word
|
||||||
int insertCount = Math.min(mBigramSuggestions.size(), mPrefMaxSuggestions);
|
int insertCount = Math.min(mBigramSuggestions.size(), mPrefMaxSuggestions);
|
||||||
|
@ -409,6 +398,23 @@ public class Suggest implements Dictionary.WordCallback {
|
||||||
false /* isObsoleteSuggestions */);
|
false /* isObsoleteSuggestions */);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds all bigram predictions for prevWord. Also checks the lower case version of prevWord if
|
||||||
|
* it contains any upper case characters.
|
||||||
|
*/
|
||||||
|
private void getAllBigrams(final CharSequence prevWord, final WordComposer wordComposer) {
|
||||||
|
if (StringUtils.hasUpperCase(prevWord)) {
|
||||||
|
// TODO: Must pay attention to locale when changing case.
|
||||||
|
final CharSequence lowerPrevWord = prevWord.toString().toLowerCase();
|
||||||
|
for (final Dictionary dictionary : mBigramDictionaries.values()) {
|
||||||
|
dictionary.getBigrams(wordComposer, lowerPrevWord, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (final Dictionary dictionary : mBigramDictionaries.values()) {
|
||||||
|
dictionary.getBigrams(wordComposer, prevWord, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static ArrayList<SuggestedWordInfo> getSuggestionsInfoListWithDebugInfo(
|
private static ArrayList<SuggestedWordInfo> getSuggestionsInfoListWithDebugInfo(
|
||||||
final String typedWord, final ArrayList<SuggestedWordInfo> suggestions) {
|
final String typedWord, final ArrayList<SuggestedWordInfo> suggestions) {
|
||||||
final SuggestedWordInfo typedWordInfo = suggestions.get(0);
|
final SuggestedWordInfo typedWordInfo = suggestions.get(0);
|
||||||
|
|
|
@ -88,4 +88,15 @@ public class StringUtilsTests extends AndroidTestCase {
|
||||||
assertEquals("in 5 elements at position 2,4", "key1,key3,key5",
|
assertEquals("in 5 elements at position 2,4", "key1,key3,key5",
|
||||||
StringUtils.removeFromCsvIfExists("key", "key1,key,key3,key,key5"));
|
StringUtils.removeFromCsvIfExists("key", "key1,key,key3,key,key5"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testHasUpperCase() {
|
||||||
|
assertTrue("single upper-case string", StringUtils.hasUpperCase("String"));
|
||||||
|
assertTrue("multi upper-case string", StringUtils.hasUpperCase("stRInG"));
|
||||||
|
assertTrue("all upper-case string", StringUtils.hasUpperCase("STRING"));
|
||||||
|
assertTrue("upper-case string with non-letters", StringUtils.hasUpperCase("He's"));
|
||||||
|
|
||||||
|
assertFalse("empty string", StringUtils.hasUpperCase(""));
|
||||||
|
assertFalse("lower-case string", StringUtils.hasUpperCase("string"));
|
||||||
|
assertFalse("lower-case string with non-letters", StringUtils.hasUpperCase("he's"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue