Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0806bb01 authored by Tom Ouyang's avatar Tom Ouyang
Browse files

Binary bigram lookup checks both uppercase and lowercase when previous word is uppercase.

Bug: 6363029
Change-Id: I71a1ed5b88f54fcc15bfaf89d3645b8f17ebb821
parent 1894c6e5
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -122,6 +122,23 @@ public class StringUtils {
        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.
     *
+20 −14
Original line number Diff line number Diff line
@@ -242,13 +242,8 @@ public class Suggest implements Dictionary.WordCallback {

        mBigramSuggestions = new ArrayList<SuggestedWordInfo>(PREF_MAX_BIGRAMS);

        CharSequence lowerPrevWord = prevWordForBigram.toString().toLowerCase();
        if (mMainDict != null && mMainDict.isValidWord(lowerPrevWord)) {
            prevWordForBigram = lowerPrevWord;
        }
        for (final Dictionary dictionary : mBigramDictionaries.values()) {
            dictionary.getBigrams(sEmptyWordComposer, prevWordForBigram, this);
        }
        getAllBigrams(prevWordForBigram, sEmptyWordComposer);

        // Nothing entered: return all bigrams for the previous word
        int insertCount = Math.min(mBigramSuggestions.size(), mPrefMaxSuggestions);
        for (int i = 0; i < insertCount; ++i) {
@@ -290,13 +285,7 @@ public class Suggest implements Dictionary.WordCallback {
            mBigramSuggestions = new ArrayList<SuggestedWordInfo>(PREF_MAX_BIGRAMS);

            if (!TextUtils.isEmpty(prevWordForBigram)) {
                CharSequence lowerPrevWord = prevWordForBigram.toString().toLowerCase();
                if (mMainDict != null && mMainDict.isValidWord(lowerPrevWord)) {
                    prevWordForBigram = lowerPrevWord;
                }
                for (final Dictionary dictionary : mBigramDictionaries.values()) {
                    dictionary.getBigrams(wordComposer, prevWordForBigram, this);
                }
                getAllBigrams(prevWordForBigram, wordComposer);
                if (TextUtils.isEmpty(consideredWord)) {
                    // Nothing entered: return all bigrams for the previous word
                    int insertCount = Math.min(mBigramSuggestions.size(), mPrefMaxSuggestions);
@@ -409,6 +398,23 @@ public class Suggest implements Dictionary.WordCallback {
                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(
            final String typedWord, final ArrayList<SuggestedWordInfo> suggestions) {
        final SuggestedWordInfo typedWordInfo = suggestions.get(0);
+11 −0
Original line number Diff line number Diff line
@@ -88,4 +88,15 @@ public class StringUtilsTests extends AndroidTestCase {
        assertEquals("in 5 elements at position 2,4", "key1,key3,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"));
    }
}