diff options
-rw-r--r-- | java/res/values/strings.xml | 2 | ||||
-rw-r--r-- | java/src/com/android/inputmethod/latin/UserDictionary.java | 38 | ||||
-rw-r--r-- | native/src/correction.cpp | 3 | ||||
-rw-r--r-- | native/src/unigram_dictionary.cpp | 14 |
4 files changed, 38 insertions, 19 deletions
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index acc6e5882..2f591fdf0 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -82,6 +82,8 @@ <!-- Option to configure dictionaries --> <string name="configure_dictionaries_title">Add-on dictionaries</string> + <!-- Name of the main dictionary, as opposed to auxiliary dictionaries (medical/entertainment/sports...) --> + <string name="main_dictionary">Main dictionary</string> <!-- Option to enable showing suggestions --> <string name="prefs_show_suggestions">Show correction suggestions</string> diff --git a/java/src/com/android/inputmethod/latin/UserDictionary.java b/java/src/com/android/inputmethod/latin/UserDictionary.java index 6608d8268..d696a6158 100644 --- a/java/src/com/android/inputmethod/latin/UserDictionary.java +++ b/java/src/com/android/inputmethod/latin/UserDictionary.java @@ -25,16 +25,17 @@ import android.database.Cursor; import android.net.Uri; import android.os.RemoteException; import android.provider.UserDictionary.Words; +import android.text.TextUtils; import com.android.inputmethod.keyboard.ProximityInfo; public class UserDictionary extends ExpandableDictionary { - + private static final String[] PROJECTION_QUERY = { Words.WORD, Words.FREQUENCY, }; - + private static final String[] PROJECTION_ADD = { Words._ID, Words.FREQUENCY, @@ -42,10 +43,11 @@ public class UserDictionary extends ExpandableDictionary { }; private ContentObserver mObserver; - private String mLocale; + final private String mLocale; public UserDictionary(Context context, String locale) { super(context, Suggest.DIC_USER); + if (null == locale) throw new NullPointerException(); // Catch the error earlier mLocale = locale; // Perform a managed query. The Activity will handle closing and re-querying the cursor // when needed. @@ -73,9 +75,35 @@ public class UserDictionary extends ExpandableDictionary { @Override public void loadDictionaryAsync() { + // Split the locale. For example "en" => ["en"], "de_DE" => ["de", "DE"], + // "en_US_foo_bar_qux" => ["en", "US", "foo_bar_qux"] because of the limit of 3. + // This is correct for locale processing. + // For this example, we'll look at the "en_US_POSIX" case. + final String[] localeElements = + TextUtils.isEmpty(mLocale) ? new String[] {} : mLocale.split("_", 3); + + final StringBuilder request = new StringBuilder("(locale is NULL)"); + String localeSoFar = ""; + // At start, localeElements = ["en", "US", "POSIX"] ; localeSoFar = "" ; + // and request = "(locale is NULL)" + for (int i = 0; i < localeElements.length; ++i) { + // i | localeSoFar | localeElements + // 0 | "" | ["en", "US", "POSIX"] + // 1 | "en_" | ["en", "US", "POSIX"] + // 2 | "en_US_" | ["en", "en_US", "POSIX"] + localeElements[i] = localeSoFar + localeElements[i]; + localeSoFar = localeElements[i] + "_"; + // i | request + // 0 | "(locale is NULL)" + // 1 | "(locale is NULL) or (locale=?)" + // 2 | "(locale is NULL) or (locale=?) or (locale=?)" + request.append(" or (locale=?)"); + } + // At the end, localeElements = ["en", "en_US", "en_US_POSIX"]; localeSoFar = en_US_POSIX_" + // and request = "(locale is NULL) or (locale=?) or (locale=?) or (locale=?)" Cursor cursor = getContext().getContentResolver() - .query(Words.CONTENT_URI, PROJECTION_QUERY, "(locale IS NULL) or (locale=?)", - new String[] { mLocale }, null); + .query(Words.CONTENT_URI, PROJECTION_QUERY, request.toString(), + localeElements, null); addWords(cursor); } diff --git a/native/src/correction.cpp b/native/src/correction.cpp index 5a0e608b8..d5bfed017 100644 --- a/native/src/correction.cpp +++ b/native/src/correction.cpp @@ -429,6 +429,9 @@ inline static void multiplyIntCapped(const int multiplier, int *base) { if (multiplier == 2) { *base = TWO_31ST_DIV_2 >= temp ? temp << 1 : S_INT_MAX; } else { + // TODO: This overflow check gives a wrong answer when, for example, + // temp = 2^16 + 1 and multiplier = 2^17 + 1. + // Fix this behavior. const int tempRetval = temp * multiplier; *base = tempRetval >= temp ? tempRetval : S_INT_MAX; } diff --git a/native/src/unigram_dictionary.cpp b/native/src/unigram_dictionary.cpp index 4e671a1c4..517dc843e 100644 --- a/native/src/unigram_dictionary.cpp +++ b/native/src/unigram_dictionary.cpp @@ -348,20 +348,6 @@ void UnigramDictionary::getSuggestionCandidates() { } } -static const int TWO_31ST_DIV_2 = S_INT_MAX / 2; -inline static void multiplyIntCapped(const int multiplier, int *base) { - const int temp = *base; - if (temp != S_INT_MAX) { - // Branch if multiplier == 2 for the optimization - if (multiplier == 2) { - *base = TWO_31ST_DIV_2 >= temp ? temp << 1 : S_INT_MAX; - } else { - const int tempRetval = temp * multiplier; - *base = tempRetval >= temp ? tempRetval : S_INT_MAX; - } - } -} - void UnigramDictionary::getMissingSpaceWords( const int inputLength, const int missingSpacePos, Correction *correction) { correction->setCorrectionParams(-1 /* skipPos */, -1 /* excessivePos */, |