Loading java/src/com/android/inputmethod/latin/StringUtils.java +31 −0 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,10 @@ import java.util.ArrayList; import java.util.Locale; import java.util.Locale; public final class StringUtils { public final class StringUtils { public static final int CAPITALIZE_NONE = 0; // No caps, or mixed case public static final int CAPITALIZE_FIRST = 1; // First only public static final int CAPITALIZE_ALL = 2; // All caps private StringUtils() { private StringUtils() { // This utility class is not publicly instantiable. // This utility class is not publicly instantiable. } } Loading Loading @@ -171,4 +175,31 @@ public final class StringUtils { } } return list.toArray(new String[list.size()]); return list.toArray(new String[list.size()]); } } // This method assumes the text is not empty or null. public static int getCapitalizationType(final String text) { // If the first char is not uppercase, then the word is either all lower case or // camel case, and in either case we return CAPITALIZE_NONE. if (!Character.isUpperCase(text.codePointAt(0))) return CAPITALIZE_NONE; final int len = text.length(); int capsCount = 1; int letterCount = 1; for (int i = 1; i < len; i = text.offsetByCodePoints(i, 1)) { if (1 != capsCount && letterCount != capsCount) break; final int codePoint = text.codePointAt(i); if (Character.isUpperCase(codePoint)) { ++capsCount; ++letterCount; } else if (Character.isLetter(codePoint)) { // We need to discount non-letters since they may not be upper-case, but may // still be part of a word (e.g. single quote or dash, as in "IT'S" or "FULL-TIME") ++letterCount; } } // We know the first char is upper case. So we want to test if either every letter other // than the first is lower case, or if they are all upper case. If the string is exactly // one char long, then we will arrive here with letterCount 1, and this is correct, too. if (1 == capsCount) return CAPITALIZE_FIRST; return (letterCount == capsCount ? CAPITALIZE_ALL : CAPITALIZE_NONE); } } } java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java +2 −33 Original line number Original line Diff line number Diff line Loading @@ -58,10 +58,6 @@ public final class AndroidSpellCheckerService extends SpellCheckerService public static final String PREF_USE_CONTACTS_KEY = "pref_spellcheck_use_contacts"; public static final String PREF_USE_CONTACTS_KEY = "pref_spellcheck_use_contacts"; public static final int CAPITALIZE_NONE = 0; // No caps, or mixed case public static final int CAPITALIZE_FIRST = 1; // First only public static final int CAPITALIZE_ALL = 2; // All caps private final static String[] EMPTY_STRING_ARRAY = new String[0]; private final static String[] EMPTY_STRING_ARRAY = new String[0]; private Map<String, DictionaryPool> mDictionaryPools = CollectionUtils.newSynchronizedTreeMap(); private Map<String, DictionaryPool> mDictionaryPools = CollectionUtils.newSynchronizedTreeMap(); private Map<String, UserBinaryDictionary> mUserDictionaries = private Map<String, UserBinaryDictionary> mUserDictionaries = Loading Loading @@ -325,13 +321,13 @@ public final class AndroidSpellCheckerService extends SpellCheckerService } } Collections.reverse(mSuggestions); Collections.reverse(mSuggestions); StringUtils.removeDupes(mSuggestions); StringUtils.removeDupes(mSuggestions); if (CAPITALIZE_ALL == capitalizeType) { if (StringUtils.CAPITALIZE_ALL == capitalizeType) { for (int i = 0; i < mSuggestions.size(); ++i) { for (int i = 0; i < mSuggestions.size(); ++i) { // get(i) returns a CharSequence which is actually a String so .toString() // get(i) returns a CharSequence which is actually a String so .toString() // should return the same object. // should return the same object. mSuggestions.set(i, mSuggestions.get(i).toString().toUpperCase(locale)); mSuggestions.set(i, mSuggestions.get(i).toString().toUpperCase(locale)); } } } else if (CAPITALIZE_FIRST == capitalizeType) { } else if (StringUtils.CAPITALIZE_FIRST == capitalizeType) { for (int i = 0; i < mSuggestions.size(); ++i) { for (int i = 0; i < mSuggestions.size(); ++i) { // Likewise // Likewise mSuggestions.set(i, StringUtils.toTitleCase( mSuggestions.set(i, StringUtils.toTitleCase( Loading Loading @@ -438,31 +434,4 @@ public final class AndroidSpellCheckerService extends SpellCheckerService } } return new DictAndProximity(dictionaryCollection, proximityInfo); return new DictAndProximity(dictionaryCollection, proximityInfo); } } // This method assumes the text is not empty or null. public static int getCapitalizationType(String text) { // If the first char is not uppercase, then the word is either all lower case, // and in either case we return CAPITALIZE_NONE. if (!Character.isUpperCase(text.codePointAt(0))) return CAPITALIZE_NONE; final int len = text.length(); int capsCount = 1; int letterCount = 1; for (int i = 1; i < len; i = text.offsetByCodePoints(i, 1)) { if (1 != capsCount && letterCount != capsCount) break; final int codePoint = text.codePointAt(i); if (Character.isUpperCase(codePoint)) { ++capsCount; ++letterCount; } else if (Character.isLetter(codePoint)) { // We need to discount non-letters since they may not be upper-case, but may // still be part of a word (e.g. single quote or dash, as in "IT'S" or "FULL-TIME") ++letterCount; } } // We know the first char is upper case. So we want to test if either every letter other // than the first is lower case, or if they are all upper case. If the string is exactly // one char long, then we will arrive here with letterCount 1, and this is correct, too. if (1 == capsCount) return CAPITALIZE_FIRST; return (letterCount == capsCount ? CAPITALIZE_ALL : CAPITALIZE_NONE); } } } java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java +3 −3 Original line number Original line Diff line number Diff line Loading @@ -214,14 +214,14 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { // If the word is in there as is, then it's in the dictionary. If not, we'll test lower // If the word is in there as is, then it's in the dictionary. If not, we'll test lower // case versions, but only if the word is not already all-lower case or mixed case. // case versions, but only if the word is not already all-lower case or mixed case. if (dict.isValidWord(text)) return true; if (dict.isValidWord(text)) return true; if (AndroidSpellCheckerService.CAPITALIZE_NONE == capitalizeType) return false; if (StringUtils.CAPITALIZE_NONE == capitalizeType) return false; // If we come here, we have a capitalized word (either First- or All-). // If we come here, we have a capitalized word (either First- or All-). // Downcase the word and look it up again. If the word is only capitalized, we // Downcase the word and look it up again. If the word is only capitalized, we // tested all possibilities, so if it's still negative we can return false. // tested all possibilities, so if it's still negative we can return false. final String lowerCaseText = text.toLowerCase(mLocale); final String lowerCaseText = text.toLowerCase(mLocale); if (dict.isValidWord(lowerCaseText)) return true; if (dict.isValidWord(lowerCaseText)) return true; if (AndroidSpellCheckerService.CAPITALIZE_FIRST == capitalizeType) return false; if (StringUtils.CAPITALIZE_FIRST == capitalizeType) return false; // If the lower case version is not in the dictionary, it's still possible // If the lower case version is not in the dictionary, it's still possible // that we have an all-caps version of a word that needs to be capitalized // that we have an all-caps version of a word that needs to be capitalized Loading Loading @@ -296,7 +296,7 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { } } } } final int capitalizeType = AndroidSpellCheckerService.getCapitalizationType(text); final int capitalizeType = StringUtils.getCapitalizationType(text); boolean isInDict = true; boolean isInDict = true; DictAndProximity dictInfo = null; DictAndProximity dictInfo = null; try { try { Loading Loading
java/src/com/android/inputmethod/latin/StringUtils.java +31 −0 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,10 @@ import java.util.ArrayList; import java.util.Locale; import java.util.Locale; public final class StringUtils { public final class StringUtils { public static final int CAPITALIZE_NONE = 0; // No caps, or mixed case public static final int CAPITALIZE_FIRST = 1; // First only public static final int CAPITALIZE_ALL = 2; // All caps private StringUtils() { private StringUtils() { // This utility class is not publicly instantiable. // This utility class is not publicly instantiable. } } Loading Loading @@ -171,4 +175,31 @@ public final class StringUtils { } } return list.toArray(new String[list.size()]); return list.toArray(new String[list.size()]); } } // This method assumes the text is not empty or null. public static int getCapitalizationType(final String text) { // If the first char is not uppercase, then the word is either all lower case or // camel case, and in either case we return CAPITALIZE_NONE. if (!Character.isUpperCase(text.codePointAt(0))) return CAPITALIZE_NONE; final int len = text.length(); int capsCount = 1; int letterCount = 1; for (int i = 1; i < len; i = text.offsetByCodePoints(i, 1)) { if (1 != capsCount && letterCount != capsCount) break; final int codePoint = text.codePointAt(i); if (Character.isUpperCase(codePoint)) { ++capsCount; ++letterCount; } else if (Character.isLetter(codePoint)) { // We need to discount non-letters since they may not be upper-case, but may // still be part of a word (e.g. single quote or dash, as in "IT'S" or "FULL-TIME") ++letterCount; } } // We know the first char is upper case. So we want to test if either every letter other // than the first is lower case, or if they are all upper case. If the string is exactly // one char long, then we will arrive here with letterCount 1, and this is correct, too. if (1 == capsCount) return CAPITALIZE_FIRST; return (letterCount == capsCount ? CAPITALIZE_ALL : CAPITALIZE_NONE); } } }
java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java +2 −33 Original line number Original line Diff line number Diff line Loading @@ -58,10 +58,6 @@ public final class AndroidSpellCheckerService extends SpellCheckerService public static final String PREF_USE_CONTACTS_KEY = "pref_spellcheck_use_contacts"; public static final String PREF_USE_CONTACTS_KEY = "pref_spellcheck_use_contacts"; public static final int CAPITALIZE_NONE = 0; // No caps, or mixed case public static final int CAPITALIZE_FIRST = 1; // First only public static final int CAPITALIZE_ALL = 2; // All caps private final static String[] EMPTY_STRING_ARRAY = new String[0]; private final static String[] EMPTY_STRING_ARRAY = new String[0]; private Map<String, DictionaryPool> mDictionaryPools = CollectionUtils.newSynchronizedTreeMap(); private Map<String, DictionaryPool> mDictionaryPools = CollectionUtils.newSynchronizedTreeMap(); private Map<String, UserBinaryDictionary> mUserDictionaries = private Map<String, UserBinaryDictionary> mUserDictionaries = Loading Loading @@ -325,13 +321,13 @@ public final class AndroidSpellCheckerService extends SpellCheckerService } } Collections.reverse(mSuggestions); Collections.reverse(mSuggestions); StringUtils.removeDupes(mSuggestions); StringUtils.removeDupes(mSuggestions); if (CAPITALIZE_ALL == capitalizeType) { if (StringUtils.CAPITALIZE_ALL == capitalizeType) { for (int i = 0; i < mSuggestions.size(); ++i) { for (int i = 0; i < mSuggestions.size(); ++i) { // get(i) returns a CharSequence which is actually a String so .toString() // get(i) returns a CharSequence which is actually a String so .toString() // should return the same object. // should return the same object. mSuggestions.set(i, mSuggestions.get(i).toString().toUpperCase(locale)); mSuggestions.set(i, mSuggestions.get(i).toString().toUpperCase(locale)); } } } else if (CAPITALIZE_FIRST == capitalizeType) { } else if (StringUtils.CAPITALIZE_FIRST == capitalizeType) { for (int i = 0; i < mSuggestions.size(); ++i) { for (int i = 0; i < mSuggestions.size(); ++i) { // Likewise // Likewise mSuggestions.set(i, StringUtils.toTitleCase( mSuggestions.set(i, StringUtils.toTitleCase( Loading Loading @@ -438,31 +434,4 @@ public final class AndroidSpellCheckerService extends SpellCheckerService } } return new DictAndProximity(dictionaryCollection, proximityInfo); return new DictAndProximity(dictionaryCollection, proximityInfo); } } // This method assumes the text is not empty or null. public static int getCapitalizationType(String text) { // If the first char is not uppercase, then the word is either all lower case, // and in either case we return CAPITALIZE_NONE. if (!Character.isUpperCase(text.codePointAt(0))) return CAPITALIZE_NONE; final int len = text.length(); int capsCount = 1; int letterCount = 1; for (int i = 1; i < len; i = text.offsetByCodePoints(i, 1)) { if (1 != capsCount && letterCount != capsCount) break; final int codePoint = text.codePointAt(i); if (Character.isUpperCase(codePoint)) { ++capsCount; ++letterCount; } else if (Character.isLetter(codePoint)) { // We need to discount non-letters since they may not be upper-case, but may // still be part of a word (e.g. single quote or dash, as in "IT'S" or "FULL-TIME") ++letterCount; } } // We know the first char is upper case. So we want to test if either every letter other // than the first is lower case, or if they are all upper case. If the string is exactly // one char long, then we will arrive here with letterCount 1, and this is correct, too. if (1 == capsCount) return CAPITALIZE_FIRST; return (letterCount == capsCount ? CAPITALIZE_ALL : CAPITALIZE_NONE); } } }
java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java +3 −3 Original line number Original line Diff line number Diff line Loading @@ -214,14 +214,14 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { // If the word is in there as is, then it's in the dictionary. If not, we'll test lower // If the word is in there as is, then it's in the dictionary. If not, we'll test lower // case versions, but only if the word is not already all-lower case or mixed case. // case versions, but only if the word is not already all-lower case or mixed case. if (dict.isValidWord(text)) return true; if (dict.isValidWord(text)) return true; if (AndroidSpellCheckerService.CAPITALIZE_NONE == capitalizeType) return false; if (StringUtils.CAPITALIZE_NONE == capitalizeType) return false; // If we come here, we have a capitalized word (either First- or All-). // If we come here, we have a capitalized word (either First- or All-). // Downcase the word and look it up again. If the word is only capitalized, we // Downcase the word and look it up again. If the word is only capitalized, we // tested all possibilities, so if it's still negative we can return false. // tested all possibilities, so if it's still negative we can return false. final String lowerCaseText = text.toLowerCase(mLocale); final String lowerCaseText = text.toLowerCase(mLocale); if (dict.isValidWord(lowerCaseText)) return true; if (dict.isValidWord(lowerCaseText)) return true; if (AndroidSpellCheckerService.CAPITALIZE_FIRST == capitalizeType) return false; if (StringUtils.CAPITALIZE_FIRST == capitalizeType) return false; // If the lower case version is not in the dictionary, it's still possible // If the lower case version is not in the dictionary, it's still possible // that we have an all-caps version of a word that needs to be capitalized // that we have an all-caps version of a word that needs to be capitalized Loading Loading @@ -296,7 +296,7 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { } } } } final int capitalizeType = AndroidSpellCheckerService.getCapitalizationType(text); final int capitalizeType = StringUtils.getCapitalizationType(text); boolean isInDict = true; boolean isInDict = true; DictAndProximity dictInfo = null; DictAndProximity dictInfo = null; try { try { Loading