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

Commit 7d3836d6 authored by Jean Chalard's avatar Jean Chalard
Browse files

Move a generic string utility to StringUtils

Change-Id: I9cc2e9a7ac0b3346af40bcb083f939333336cf09
parent 5a5db35d
Loading
Loading
Loading
Loading
+31 −0
Original line number Original line Diff line number Diff line
@@ -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);
    }
}
}
+2 −33
Original line number Original line Diff line number Diff line
@@ -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);
    }
}
}
+3 −3
Original line number Original line Diff line number Diff line
@@ -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 {