Fix a bug where the user dict's locale match would be wrong
This is preparation for Bug: 5280929 Change-Id: Iab0096acf057aa288b1986d225aad815bd70b145
This commit is contained in:
parent
ea843f2a24
commit
d97def5925
1 changed files with 33 additions and 5 deletions
|
@ -25,16 +25,17 @@ import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.provider.UserDictionary.Words;
|
import android.provider.UserDictionary.Words;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import com.android.inputmethod.keyboard.ProximityInfo;
|
import com.android.inputmethod.keyboard.ProximityInfo;
|
||||||
|
|
||||||
public class UserDictionary extends ExpandableDictionary {
|
public class UserDictionary extends ExpandableDictionary {
|
||||||
|
|
||||||
private static final String[] PROJECTION_QUERY = {
|
private static final String[] PROJECTION_QUERY = {
|
||||||
Words.WORD,
|
Words.WORD,
|
||||||
Words.FREQUENCY,
|
Words.FREQUENCY,
|
||||||
};
|
};
|
||||||
|
|
||||||
private static final String[] PROJECTION_ADD = {
|
private static final String[] PROJECTION_ADD = {
|
||||||
Words._ID,
|
Words._ID,
|
||||||
Words.FREQUENCY,
|
Words.FREQUENCY,
|
||||||
|
@ -42,10 +43,11 @@ public class UserDictionary extends ExpandableDictionary {
|
||||||
};
|
};
|
||||||
|
|
||||||
private ContentObserver mObserver;
|
private ContentObserver mObserver;
|
||||||
private String mLocale;
|
final private String mLocale;
|
||||||
|
|
||||||
public UserDictionary(Context context, String locale) {
|
public UserDictionary(Context context, String locale) {
|
||||||
super(context, Suggest.DIC_USER);
|
super(context, Suggest.DIC_USER);
|
||||||
|
if (null == locale) throw new NullPointerException(); // Catch the error earlier
|
||||||
mLocale = locale;
|
mLocale = locale;
|
||||||
// Perform a managed query. The Activity will handle closing and re-querying the cursor
|
// Perform a managed query. The Activity will handle closing and re-querying the cursor
|
||||||
// when needed.
|
// when needed.
|
||||||
|
@ -73,9 +75,35 @@ public class UserDictionary extends ExpandableDictionary {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void loadDictionaryAsync() {
|
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()
|
Cursor cursor = getContext().getContentResolver()
|
||||||
.query(Words.CONTENT_URI, PROJECTION_QUERY, "(locale IS NULL) or (locale=?)",
|
.query(Words.CONTENT_URI, PROJECTION_QUERY, request.toString(),
|
||||||
new String[] { mLocale }, null);
|
localeElements, null);
|
||||||
addWords(cursor);
|
addWords(cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue