Merge "Move a generic string utility to StringUtils"
commit
e9f69e1661
|
@ -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.
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 =
|
||||||
|
@ -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(
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
@ -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…
Reference in New Issue