am be4e1539: [ML17] Add a method to switch the most probable language

* commit 'be4e1539cb3be157a000a500598be8bd15a2477d':
  [ML17] Add a method to switch the most probable language
main
Jean Chalard 2014-10-07 10:14:34 +00:00 committed by Android Git Automerger
commit f3339bb19f
1 changed files with 33 additions and 6 deletions

View File

@ -62,6 +62,7 @@ public class DictionaryFacilitator {
private static final int CAPITALIZED_FORM_MAX_PROBABILITY_FOR_INSERT = 140; private static final int CAPITALIZED_FORM_MAX_PROBABILITY_FOR_INSERT = 140;
private DictionaryGroup[] mDictionaryGroups = new DictionaryGroup[] { new DictionaryGroup() }; private DictionaryGroup[] mDictionaryGroups = new DictionaryGroup[] { new DictionaryGroup() };
private DictionaryGroup mMostProbableDictionaryGroup = mDictionaryGroups[0];
private boolean mIsUserDictEnabled = false; private boolean mIsUserDictEnabled = false;
private volatile CountDownLatch mLatchForWaitingLoadingMainDictionaries = new CountDownLatch(0); private volatile CountDownLatch mLatchForWaitingLoadingMainDictionaries = new CountDownLatch(0);
// To synchronize assigning mDictionaryGroup to ensure closing dictionaries. // To synchronize assigning mDictionaryGroup to ensure closing dictionaries.
@ -126,9 +127,16 @@ public class DictionaryFacilitator {
* A group of dictionaries that work together for a single language. * A group of dictionaries that work together for a single language.
*/ */
private static class DictionaryGroup { private static class DictionaryGroup {
// TODO: Run evaluation to determine a reasonable value for these constants. The current
// values are ad-hoc and chosen without any particular care or methodology.
public static final float WEIGHT_FOR_MOST_PROBABLE_LANGUAGE = 1.0f;
public static final float WEIGHT_FOR_GESTURING_IN_NOT_MOST_PROBABLE_LANGUAGE = 0.95f;
public static final float WEIGHT_FOR_TYPING_IN_NOT_MOST_PROBABLE_LANGUAGE = 0.6f;
public final Locale mLocale; public final Locale mLocale;
private Dictionary mMainDict; private Dictionary mMainDict;
public float mWeightForLocale = 1.0f; public float mWeightForTypingInLocale = WEIGHT_FOR_MOST_PROBABLE_LANGUAGE;
public float mWeightForGesturingInLocale = WEIGHT_FOR_MOST_PROBABLE_LANGUAGE;
public final ConcurrentHashMap<String, ExpandableBinaryDictionary> mSubDictMap = public final ConcurrentHashMap<String, ExpandableBinaryDictionary> mSubDictMap =
new ConcurrentHashMap<>(); new ConcurrentHashMap<>();
@ -245,8 +253,21 @@ public class DictionaryFacilitator {
} }
private DictionaryGroup getDictionaryGroupForMostProbableLanguage() { private DictionaryGroup getDictionaryGroupForMostProbableLanguage() {
// TODO: implement this return mMostProbableDictionaryGroup;
return mDictionaryGroups[0]; }
public void switchMostProbableLanguage(final Locale locale) {
final DictionaryGroup newMostProbableDictionaryGroup =
findDictionaryGroupWithLocale(mDictionaryGroups, locale);
mMostProbableDictionaryGroup.mWeightForTypingInLocale =
DictionaryGroup.WEIGHT_FOR_TYPING_IN_NOT_MOST_PROBABLE_LANGUAGE;
mMostProbableDictionaryGroup.mWeightForGesturingInLocale =
DictionaryGroup.WEIGHT_FOR_GESTURING_IN_NOT_MOST_PROBABLE_LANGUAGE;
newMostProbableDictionaryGroup.mWeightForTypingInLocale =
DictionaryGroup.WEIGHT_FOR_MOST_PROBABLE_LANGUAGE;
newMostProbableDictionaryGroup.mWeightForGesturingInLocale =
DictionaryGroup.WEIGHT_FOR_MOST_PROBABLE_LANGUAGE;
mMostProbableDictionaryGroup = newMostProbableDictionaryGroup;
} }
private static ExpandableBinaryDictionary getSubDict(final String dictType, private static ExpandableBinaryDictionary getSubDict(final String dictType,
@ -366,6 +387,7 @@ public class DictionaryFacilitator {
synchronized (mLock) { synchronized (mLock) {
oldDictionaryGroups = mDictionaryGroups; oldDictionaryGroups = mDictionaryGroups;
mDictionaryGroups = newDictionaryGroups; mDictionaryGroups = newDictionaryGroups;
mMostProbableDictionaryGroup = newDictionaryGroups[0];
mIsUserDictEnabled = UserBinaryDictionary.isEnabled(context); mIsUserDictEnabled = UserBinaryDictionary.isEnabled(context);
if (hasAtLeastOneUninitializedMainDictionary()) { if (hasAtLeastOneUninitializedMainDictionary()) {
asyncReloadUninitializedMainDictionaries(context, newLocales, listener); asyncReloadUninitializedMainDictionaries(context, newLocales, listener);
@ -455,13 +477,15 @@ public class DictionaryFacilitator {
dictionaryGroups[i] = new DictionaryGroup(locale, mainDictionary, subDicts); dictionaryGroups[i] = new DictionaryGroup(locale, mainDictionary, subDicts);
} }
mDictionaryGroups = dictionaryGroups; mDictionaryGroups = dictionaryGroups;
mMostProbableDictionaryGroup = dictionaryGroups[0];
} }
public void closeDictionaries() { public void closeDictionaries() {
final DictionaryGroup[] dictionaryGroups; final DictionaryGroup[] dictionaryGroups;
synchronized (mLock) { synchronized (mLock) {
dictionaryGroups = mDictionaryGroups; dictionaryGroups = mDictionaryGroups;
mDictionaryGroups = new DictionaryGroup[] { new DictionaryGroup() }; mMostProbableDictionaryGroup = new DictionaryGroup();
mDictionaryGroups = new DictionaryGroup[] { mMostProbableDictionaryGroup };
} }
for (final DictionaryGroup dictionaryGroup : dictionaryGroups) { for (final DictionaryGroup dictionaryGroup : dictionaryGroups) {
for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) {
@ -476,7 +500,7 @@ public class DictionaryFacilitator {
@UsedForTesting @UsedForTesting
public ExpandableBinaryDictionary getSubDictForTesting(final String dictName) { public ExpandableBinaryDictionary getSubDictForTesting(final String dictName) {
return mDictionaryGroups[0].getSubDict(dictName); return mMostProbableDictionaryGroup.getSubDict(dictName);
} }
// The main dictionaries are loaded asynchronously. Don't cache the return value // The main dictionaries are loaded asynchronously. Don't cache the return value
@ -653,10 +677,13 @@ public class DictionaryFacilitator {
for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) {
final Dictionary dictionary = dictionaryGroup.getDict(dictType); final Dictionary dictionary = dictionaryGroup.getDict(dictType);
if (null == dictionary) continue; if (null == dictionary) continue;
final float weightForLocale = composer.isBatchMode()
? dictionaryGroup.mWeightForGesturingInLocale
: dictionaryGroup.mWeightForTypingInLocale;
final ArrayList<SuggestedWordInfo> dictionarySuggestions = final ArrayList<SuggestedWordInfo> dictionarySuggestions =
dictionary.getSuggestions(composer, ngramContext, proximityInfo, dictionary.getSuggestions(composer, ngramContext, proximityInfo,
settingsValuesForSuggestion, sessionId, settingsValuesForSuggestion, sessionId,
dictionaryGroup.mWeightForLocale, weightOfLangModelVsSpatialModel); weightForLocale, weightOfLangModelVsSpatialModel);
if (null == dictionarySuggestions) continue; if (null == dictionarySuggestions) continue;
suggestionResults.addAll(dictionarySuggestions); suggestionResults.addAll(dictionarySuggestions);
if (null != suggestionResults.mRawSuggestions) { if (null != suggestionResults.mRawSuggestions) {