Add language suffix to main dictionary
Bug: 6319377 Change-Id: Ie6a887fefa12e33c17bfeb5d22984e7c1a7bdb46main
parent
2be51f4fd0
commit
78ab80844b
|
@ -17,11 +17,8 @@
|
||||||
package com.android.inputmethod.latin;
|
package com.android.inputmethod.latin;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.AssetFileDescriptor;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
|
|
||||||
import com.android.inputmethod.keyboard.ProximityInfo;
|
import com.android.inputmethod.keyboard.ProximityInfo;
|
||||||
import com.android.inputmethod.latin.LocaleUtils.RunInLocale;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
|
@ -20,11 +20,8 @@ import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.PackageManager.NameNotFoundException;
|
import android.content.pm.PackageManager.NameNotFoundException;
|
||||||
import android.content.res.AssetFileDescriptor;
|
import android.content.res.AssetFileDescriptor;
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.android.inputmethod.latin.LocaleUtils.RunInLocale;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
@ -155,14 +152,8 @@ class BinaryDictionaryGetter {
|
||||||
* Returns a file address from a resource, or null if it cannot be opened.
|
* Returns a file address from a resource, or null if it cannot be opened.
|
||||||
*/
|
*/
|
||||||
private static AssetFileAddress loadFallbackResource(final Context context,
|
private static AssetFileAddress loadFallbackResource(final Context context,
|
||||||
final int fallbackResId, final Locale locale) {
|
final int fallbackResId) {
|
||||||
final RunInLocale<AssetFileDescriptor> job = new RunInLocale<AssetFileDescriptor>() {
|
final AssetFileDescriptor afd = context.getResources().openRawResourceFd(fallbackResId);
|
||||||
@Override
|
|
||||||
protected AssetFileDescriptor job(Resources res) {
|
|
||||||
return res.openRawResourceFd(fallbackResId);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
final AssetFileDescriptor afd = job.runInLocale(context.getResources(), locale);
|
|
||||||
if (afd == null) {
|
if (afd == null) {
|
||||||
Log.e(TAG, "Found the resource but cannot read it. Is it compressed? resId="
|
Log.e(TAG, "Found the resource but cannot read it. Is it compressed? resId="
|
||||||
+ fallbackResId);
|
+ fallbackResId);
|
||||||
|
@ -299,8 +290,7 @@ class BinaryDictionaryGetter {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!foundMainDict && dictPackSettings.isWordListActive(mainDictId)) {
|
if (!foundMainDict && dictPackSettings.isWordListActive(mainDictId)) {
|
||||||
final AssetFileAddress fallbackAsset = loadFallbackResource(context, fallbackResId,
|
final AssetFileAddress fallbackAsset = loadFallbackResource(context, fallbackResId);
|
||||||
locale);
|
|
||||||
if (null != fallbackAsset) {
|
if (null != fallbackAsset) {
|
||||||
fileList.add(fallbackAsset);
|
fileList.add(fallbackAsset);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,8 +21,6 @@ import android.content.res.AssetFileDescriptor;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.android.inputmethod.latin.LocaleUtils.RunInLocale;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
@ -101,13 +99,7 @@ public class DictionaryFactory {
|
||||||
final int resId, final Locale locale) {
|
final int resId, final Locale locale) {
|
||||||
AssetFileDescriptor afd = null;
|
AssetFileDescriptor afd = null;
|
||||||
try {
|
try {
|
||||||
final RunInLocale<AssetFileDescriptor> job = new RunInLocale<AssetFileDescriptor>() {
|
afd = context.getResources().openRawResourceFd(resId);
|
||||||
@Override
|
|
||||||
protected AssetFileDescriptor job(Resources res) {
|
|
||||||
return res.openRawResourceFd(resId);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
afd = job.runInLocale(context.getResources(), locale);
|
|
||||||
if (afd == null) {
|
if (afd == null) {
|
||||||
Log.e(TAG, "Found the resource but it is compressed. resId=" + resId);
|
Log.e(TAG, "Found the resource but it is compressed. resId=" + resId);
|
||||||
return null;
|
return null;
|
||||||
|
@ -163,41 +155,31 @@ public class DictionaryFactory {
|
||||||
* @return whether a (non-placeholder) dictionary is available or not.
|
* @return whether a (non-placeholder) dictionary is available or not.
|
||||||
*/
|
*/
|
||||||
public static boolean isDictionaryAvailable(Context context, Locale locale) {
|
public static boolean isDictionaryAvailable(Context context, Locale locale) {
|
||||||
final RunInLocale<Boolean> job = new RunInLocale<Boolean>() {
|
final Resources res = context.getResources();
|
||||||
@Override
|
final int resourceId = getMainDictionaryResourceId(res, locale);
|
||||||
protected Boolean job(Resources res) {
|
final AssetFileDescriptor afd = res.openRawResourceFd(resourceId);
|
||||||
final int resourceId = getMainDictionaryResourceId(res);
|
final boolean hasDictionary = isFullDictionary(afd);
|
||||||
final AssetFileDescriptor afd = res.openRawResourceFd(resourceId);
|
try {
|
||||||
final boolean hasDictionary = isFullDictionary(afd);
|
if (null != afd) afd.close();
|
||||||
try {
|
} catch (java.io.IOException e) {
|
||||||
if (null != afd) afd.close();
|
/* Um, what can we do here exactly? */
|
||||||
} catch (java.io.IOException e) {
|
}
|
||||||
/* Um, what can we do here exactly? */
|
return hasDictionary;
|
||||||
}
|
|
||||||
return hasDictionary;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return job.runInLocale(context.getResources(), locale);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Do not use the size of the dictionary as an unique dictionary ID.
|
// TODO: Do not use the size of the dictionary as an unique dictionary ID.
|
||||||
public static Long getDictionaryId(final Context context, final Locale locale) {
|
public static Long getDictionaryId(final Context context, final Locale locale) {
|
||||||
final RunInLocale<Long> job = new RunInLocale<Long>() {
|
final Resources res = context.getResources();
|
||||||
@Override
|
final int resourceId = getMainDictionaryResourceId(res, locale);
|
||||||
protected Long job(Resources res) {
|
final AssetFileDescriptor afd = res.openRawResourceFd(resourceId);
|
||||||
final int resourceId = getMainDictionaryResourceId(res);
|
final Long size = (afd != null && afd.getLength() > PLACEHOLDER_LENGTH)
|
||||||
final AssetFileDescriptor afd = res.openRawResourceFd(resourceId);
|
? afd.getLength()
|
||||||
final Long size = (afd != null && afd.getLength() > PLACEHOLDER_LENGTH)
|
: null;
|
||||||
? afd.getLength()
|
try {
|
||||||
: null;
|
if (null != afd) afd.close();
|
||||||
try {
|
} catch (java.io.IOException e) {
|
||||||
if (null != afd) afd.close();
|
}
|
||||||
} catch (java.io.IOException e) {
|
return size;
|
||||||
}
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return job.runInLocale(context.getResources(), locale);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Find the Right Way to find out whether the resource is a placeholder or not.
|
// TODO: Find the Right Way to find out whether the resource is a placeholder or not.
|
||||||
|
@ -214,13 +196,32 @@ public class DictionaryFactory {
|
||||||
return (afd != null && afd.getLength() > PLACEHOLDER_LENGTH);
|
return (afd != null && afd.getLength() > PLACEHOLDER_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final String DEFAULT_MAIN_DICT = "main";
|
||||||
|
private static final String MAIN_DICT_PREFIX = "main_";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a main dictionary resource id
|
* Returns a main dictionary resource id
|
||||||
|
* @param locale dictionary locale
|
||||||
* @return main dictionary resource id
|
* @return main dictionary resource id
|
||||||
*/
|
*/
|
||||||
public static int getMainDictionaryResourceId(Resources res) {
|
public static int getMainDictionaryResourceId(Resources res, Locale locale) {
|
||||||
final String MAIN_DIC_NAME = "main";
|
final String packageName = LatinIME.class.getPackage().getName();
|
||||||
String packageName = LatinIME.class.getPackage().getName();
|
int resId;
|
||||||
return res.getIdentifier(MAIN_DIC_NAME, "raw", packageName);
|
|
||||||
|
// Try to find main_language_country dictionary.
|
||||||
|
if (!locale.getCountry().isEmpty()) {
|
||||||
|
final String dictLanguageCountry = MAIN_DICT_PREFIX + locale.toString().toLowerCase();
|
||||||
|
if ((resId = res.getIdentifier(dictLanguageCountry, "raw", packageName)) != 0) {
|
||||||
|
return resId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to find main_language dictionary.
|
||||||
|
final String dictLanguage = MAIN_DICT_PREFIX + locale.getLanguage();
|
||||||
|
if ((resId = res.getIdentifier(dictLanguage, "raw", packageName)) != 0) {
|
||||||
|
return resId;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.getIdentifier(DEFAULT_MAIN_DICT, "raw", packageName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -493,37 +493,30 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
||||||
final String localeStr = mSubtypeSwitcher.getInputLocaleStr();
|
final String localeStr = mSubtypeSwitcher.getInputLocaleStr();
|
||||||
final Locale keyboardLocale = mSubtypeSwitcher.getInputLocale();
|
final Locale keyboardLocale = mSubtypeSwitcher.getInputLocale();
|
||||||
|
|
||||||
final Context context = this;
|
final ContactsDictionary oldContactsDictionary;
|
||||||
final RunInLocale<Void> job = new RunInLocale<Void>() {
|
if (mSuggest != null) {
|
||||||
@Override
|
oldContactsDictionary = mSuggest.getContactsDictionary();
|
||||||
protected Void job(Resources res) {
|
mSuggest.close();
|
||||||
final ContactsDictionary oldContactsDictionary;
|
} else {
|
||||||
if (mSuggest != null) {
|
oldContactsDictionary = null;
|
||||||
oldContactsDictionary = mSuggest.getContactsDictionary();
|
}
|
||||||
mSuggest.close();
|
|
||||||
} else {
|
|
||||||
oldContactsDictionary = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mainDicResId = DictionaryFactory.getMainDictionaryResourceId(res);
|
final int mainDicResId = DictionaryFactory.getMainDictionaryResourceId(
|
||||||
mSuggest = new Suggest(context, mainDicResId, keyboardLocale);
|
mResources, keyboardLocale);
|
||||||
if (mSettingsValues.mAutoCorrectEnabled) {
|
mSuggest = new Suggest(this, mainDicResId, keyboardLocale);
|
||||||
mSuggest.setAutoCorrectionThreshold(mSettingsValues.mAutoCorrectionThreshold);
|
if (mSettingsValues.mAutoCorrectEnabled) {
|
||||||
}
|
mSuggest.setAutoCorrectionThreshold(mSettingsValues.mAutoCorrectionThreshold);
|
||||||
|
}
|
||||||
|
|
||||||
mUserDictionary = new UserDictionary(context, localeStr);
|
mUserDictionary = new UserDictionary(this, localeStr);
|
||||||
mSuggest.setUserDictionary(mUserDictionary);
|
mSuggest.setUserDictionary(mUserDictionary);
|
||||||
mIsUserDictionaryAvailable = mUserDictionary.isEnabled();
|
mIsUserDictionaryAvailable = mUserDictionary.isEnabled();
|
||||||
|
|
||||||
resetContactsDictionary(oldContactsDictionary);
|
resetContactsDictionary(oldContactsDictionary);
|
||||||
|
|
||||||
mUserHistoryDictionary
|
mUserHistoryDictionary = new UserHistoryDictionary(
|
||||||
= new UserHistoryDictionary(context, localeStr, Suggest.DIC_USER_HISTORY);
|
this, localeStr, Suggest.DIC_USER_HISTORY);
|
||||||
mSuggest.setUserHistoryDictionary(mUserHistoryDictionary);
|
mSuggest.setUserHistoryDictionary(mUserHistoryDictionary);
|
||||||
return null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
job.runInLocale(mResources, keyboardLocale);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -560,7 +553,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
||||||
|
|
||||||
/* package private */ void resetSuggestMainDict() {
|
/* package private */ void resetSuggestMainDict() {
|
||||||
final Locale keyboardLocale = mSubtypeSwitcher.getInputLocale();
|
final Locale keyboardLocale = mSubtypeSwitcher.getInputLocale();
|
||||||
int mainDicResId = DictionaryFactory.getMainDictionaryResourceId(mResources);
|
int mainDicResId = DictionaryFactory.getMainDictionaryResourceId(
|
||||||
|
mResources, keyboardLocale);
|
||||||
mSuggest.resetMainDict(this, mainDicResId, keyboardLocale);
|
mSuggest.resetMainDict(this, mainDicResId, keyboardLocale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,7 @@ public class WhitelistDictionary extends ExpandableDictionary {
|
||||||
// TODO: Conform to the async load contact of ExpandableDictionary
|
// TODO: Conform to the async load contact of ExpandableDictionary
|
||||||
public WhitelistDictionary(final Context context, final Locale locale) {
|
public WhitelistDictionary(final Context context, final Locale locale) {
|
||||||
super(context, Suggest.DIC_WHITELIST);
|
super(context, Suggest.DIC_WHITELIST);
|
||||||
|
// TODO: Move whitelist dictionary into main dictionary.
|
||||||
final RunInLocale<Void> job = new RunInLocale<Void>() {
|
final RunInLocale<Void> job = new RunInLocale<Void>() {
|
||||||
@Override
|
@Override
|
||||||
protected Void job(Resources res) {
|
protected Void job(Resources res) {
|
||||||
|
|
|
@ -387,7 +387,8 @@ public class AndroidSpellCheckerService extends SpellCheckerService
|
||||||
final ProximityInfo proximityInfo = ProximityInfo.createSpellCheckerProximityInfo(
|
final ProximityInfo proximityInfo = ProximityInfo.createSpellCheckerProximityInfo(
|
||||||
SpellCheckerProximityInfo.getProximityForScript(script));
|
SpellCheckerProximityInfo.getProximityForScript(script));
|
||||||
final Resources resources = getResources();
|
final Resources resources = getResources();
|
||||||
final int fallbackResourceId = DictionaryFactory.getMainDictionaryResourceId(resources);
|
final int fallbackResourceId = DictionaryFactory.getMainDictionaryResourceId(
|
||||||
|
resources, locale);
|
||||||
final DictionaryCollection dictionaryCollection =
|
final DictionaryCollection dictionaryCollection =
|
||||||
DictionaryFactory.createDictionaryFromManager(this, locale, fallbackResourceId,
|
DictionaryFactory.createDictionaryFromManager(this, locale, fallbackResourceId,
|
||||||
true /* useFullEditDistance */);
|
true /* useFullEditDistance */);
|
||||||
|
|
Loading…
Reference in New Issue