aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/com/android')
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionary.java9
-rw-r--r--java/src/com/android/inputmethod/latin/DicTraverseSession.java11
-rw-r--r--java/src/com/android/inputmethod/latin/DictionaryFacilitator.java30
-rw-r--r--java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java48
-rw-r--r--java/src/com/android/inputmethod/latin/DictionaryFacilitatorLruCache.java18
-rw-r--r--java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java67
-rw-r--r--java/src/com/android/inputmethod/latin/LastComposedWord.java4
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java10
-rw-r--r--java/src/com/android/inputmethod/latin/NgramContext.java10
-rw-r--r--java/src/com/android/inputmethod/latin/RichInputConnection.java9
-rw-r--r--java/src/com/android/inputmethod/latin/WordComposer.java3
-rw-r--r--java/src/com/android/inputmethod/latin/makedict/FormatSpec.java4
-rw-r--r--java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java15
-rw-r--r--java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java4
-rw-r--r--java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java4
-rw-r--r--java/src/com/android/inputmethod/latin/utils/DistracterFilter.java97
-rw-r--r--java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingExactMatchesAndSuggestions.java325
-rw-r--r--java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingIsInDictionary.java64
-rw-r--r--java/src/com/android/inputmethod/latin/utils/NgramContextUtils.java5
-rw-r--r--java/src/com/android/inputmethod/latin/utils/WordInputEventForPersonalization.java30
20 files changed, 108 insertions, 659 deletions
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index b0eae0832..7e4d66583 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -27,6 +27,7 @@ import com.android.inputmethod.latin.common.Constants;
import com.android.inputmethod.latin.common.FileUtils;
import com.android.inputmethod.latin.common.InputPointers;
import com.android.inputmethod.latin.common.StringUtils;
+import com.android.inputmethod.latin.define.DecoderSpecificConstants;
import com.android.inputmethod.latin.makedict.DictionaryHeader;
import com.android.inputmethod.latin.makedict.FormatSpec;
import com.android.inputmethod.latin.makedict.FormatSpec.DictionaryOptions;
@@ -319,9 +320,9 @@ public final class BinaryDictionary extends Dictionary {
final int count = session.mOutputSuggestionCount[0];
final ArrayList<SuggestedWordInfo> suggestions = new ArrayList<>();
for (int j = 0; j < count; ++j) {
- final int start = j * Constants.DICTIONARY_MAX_WORD_LENGTH;
+ final int start = j * DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH;
int len = 0;
- while (len < Constants.DICTIONARY_MAX_WORD_LENGTH
+ while (len < DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH
&& session.mOutputCodePoints[start + len] != 0) {
++len;
}
@@ -390,7 +391,7 @@ public final class BinaryDictionary extends Dictionary {
return null;
}
final int[] codePoints = StringUtils.toCodePointArray(word);
- final int[] outCodePoints = new int[Constants.DICTIONARY_MAX_WORD_LENGTH];
+ final int[] outCodePoints = new int[DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH];
final boolean[] outFlags = new boolean[FORMAT_WORD_PROPERTY_OUTPUT_FLAG_COUNT];
final int[] outProbabilityInfo =
new int[FORMAT_WORD_PROPERTY_OUTPUT_PROBABILITY_INFO_COUNT];
@@ -431,7 +432,7 @@ public final class BinaryDictionary extends Dictionary {
* If token is 0, this method newly starts iterating the dictionary.
*/
public GetNextWordPropertyResult getNextWordProperty(final int token) {
- final int[] codePoints = new int[Constants.DICTIONARY_MAX_WORD_LENGTH];
+ final int[] codePoints = new int[DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH];
final boolean[] isBeginningOfSentence = new boolean[1];
final int nextToken = getNextWordNative(mNativeDict, token, codePoints,
isBeginningOfSentence);
diff --git a/java/src/com/android/inputmethod/latin/DicTraverseSession.java b/java/src/com/android/inputmethod/latin/DicTraverseSession.java
index e7fd99ee8..6816f129a 100644
--- a/java/src/com/android/inputmethod/latin/DicTraverseSession.java
+++ b/java/src/com/android/inputmethod/latin/DicTraverseSession.java
@@ -16,8 +16,8 @@
package com.android.inputmethod.latin;
-import com.android.inputmethod.latin.common.Constants;
import com.android.inputmethod.latin.common.NativeSuggestOptions;
+import com.android.inputmethod.latin.define.DecoderSpecificConstants;
import com.android.inputmethod.latin.utils.JniUtils;
import java.util.Locale;
@@ -28,14 +28,15 @@ public final class DicTraverseSession {
}
// Must be equal to MAX_RESULTS in native/jni/src/defines.h
private static final int MAX_RESULTS = 18;
- public final int[] mInputCodePoints = new int[Constants.DICTIONARY_MAX_WORD_LENGTH];
+ public final int[] mInputCodePoints =
+ new int[DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH];
public final int[][] mPrevWordCodePointArrays =
- new int[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][];
+ new int[DecoderSpecificConstants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][];
public final boolean[] mIsBeginningOfSentenceArray =
- new boolean[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ new boolean[DecoderSpecificConstants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
public final int[] mOutputSuggestionCount = new int[1];
public final int[] mOutputCodePoints =
- new int[Constants.DICTIONARY_MAX_WORD_LENGTH * MAX_RESULTS];
+ new int[DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH * MAX_RESULTS];
public final int[] mSpaceIndices = new int[MAX_RESULTS];
public final int[] mOutputScores = new int[MAX_RESULTS];
public final int[] mOutputTypes = new int[MAX_RESULTS];
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
index d174b40dd..a451b672d 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
@@ -18,7 +18,6 @@ package com.android.inputmethod.latin;
import android.content.Context;
import android.util.Pair;
-import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.keyboard.KeyboardLayout;
@@ -28,7 +27,6 @@ import com.android.inputmethod.latin.utils.SuggestionResults;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@@ -90,8 +88,6 @@ public interface DictionaryFacilitator {
void onUpdateMainDictionaryAvailability(boolean isMainDictionaryAvailable);
}
- void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes);
-
// TODO: remove this, it's confusing with seamless multiple language switching
void setIsMonolingualUser(final boolean isMonolingualUser);
@@ -113,24 +109,22 @@ public interface DictionaryFacilitator {
boolean isConfidentAboutCurrentLanguageBeing(final Locale mLocale);
- void resetDictionaries(final Context context, final Locale[] newLocales,
- final boolean useContactsDict, final boolean usePersonalizedDicts,
- final boolean forceReloadMainDictionary,
- @Nullable final String account,
- final DictionaryInitializationListener listener);
-
- void resetDictionariesWithDictNamePrefix(final Context context,
+ void resetDictionaries(
+ final Context context,
final Locale[] newLocales,
final boolean useContactsDict,
final boolean usePersonalizedDicts,
final boolean forceReloadMainDictionary,
- @Nullable final DictionaryInitializationListener listener,
+ @Nullable final String account,
final String dictNamePrefix,
- @Nullable final String account);
+ @Nullable final DictionaryInitializationListener listener);
@UsedForTesting
- void resetDictionariesForTesting(final Context context, final Locale[] locales,
- final ArrayList<String> dictionaryTypes, final HashMap<String, File> dictionaryFiles,
+ void resetDictionariesForTesting(
+ final Context context,
+ final Locale[] locales,
+ final ArrayList<String> dictionaryTypes,
+ final HashMap<String, File> dictionaryFiles,
final Map<String, Map<String, String>> additionalDictAttributes,
@Nullable final String account);
@@ -177,4 +171,10 @@ public interface DictionaryFacilitator {
void dumpDictionaryForDebug(final String dictName);
ArrayList<Pair<String, DictionaryStats>> getStatsOfEnabledSubDicts();
+
+ void addOrIncrementTerm(String fileName,
+ String finalWordToBeAdded,
+ NgramContext ngramContext,
+ int increment,
+ int timeStampInSeconds);
}
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java
index 96603ef20..4ed94058a 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java
@@ -20,7 +20,6 @@ import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
-import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.keyboard.KeyboardLayout;
@@ -29,9 +28,6 @@ import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.common.Constants;
import com.android.inputmethod.latin.personalization.UserHistoryDictionary;
import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
-import com.android.inputmethod.latin.utils.DistracterFilter;
-import com.android.inputmethod.latin.utils.DistracterFilterCheckingExactMatchesAndSuggestions;
-import com.android.inputmethod.latin.utils.DistracterFilterCheckingIsInDictionary;
import com.android.inputmethod.latin.utils.ExecutorUtils;
import com.android.inputmethod.latin.utils.SuggestionResults;
@@ -42,7 +38,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -76,7 +71,6 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
private volatile CountDownLatch mLatchForWaitingLoadingMainDictionaries = new CountDownLatch(0);
// To synchronize assigning mDictionaryGroup to ensure closing dictionaries.
private final Object mLock = new Object();
- private final DistracterFilter mDistracterFilter;
public static final Map<String, Class<? extends ExpandableBinaryDictionary>>
DICT_TYPE_TO_CLASS = new HashMap<>();
@@ -233,15 +227,6 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
}
public DictionaryFacilitatorImpl() {
- mDistracterFilter = DistracterFilter.EMPTY_DISTRACTER_FILTER;
- }
-
- public DictionaryFacilitatorImpl(final Context context) {
- mDistracterFilter = new DistracterFilterCheckingExactMatchesAndSuggestions(context);
- }
-
- public void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes) {
- mDistracterFilter.updateEnabledSubtypes(enabledSubtypes);
}
// TODO: remove this, it's confusing with seamless multiple language switching
@@ -342,16 +327,6 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
}
}
- public void resetDictionaries(final Context context, final Locale[] newLocales,
- final boolean useContactsDict, final boolean usePersonalizedDicts,
- final boolean forceReloadMainDictionary,
- @Nullable final String account,
- final DictionaryInitializationListener listener) {
- resetDictionariesWithDictNamePrefix(context, newLocales, useContactsDict,
- usePersonalizedDicts, forceReloadMainDictionary, listener, "" /* dictNamePrefix */,
- account);
- }
-
@Nullable
static DictionaryGroup findDictionaryGroupWithLocale(final DictionaryGroup[] dictionaryGroups,
final Locale locale) {
@@ -363,14 +338,15 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
return null;
}
- public void resetDictionariesWithDictNamePrefix(final Context context,
+ public void resetDictionaries(
+ final Context context,
final Locale[] newLocales,
final boolean useContactsDict,
final boolean usePersonalizedDicts,
final boolean forceReloadMainDictionary,
- @Nullable final DictionaryInitializationListener listener,
+ @Nullable final String account,
final String dictNamePrefix,
- @Nullable final String account) {
+ @Nullable final DictionaryInitializationListener listener) {
final HashMap<Locale, ArrayList<String>> existingDictionariesToCleanup = new HashMap<>();
// TODO: Make subDictTypesToUse configurable by resource or a static final list.
final HashSet<String> subDictTypesToUse = new HashSet<>();
@@ -554,7 +530,6 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
dictionaryGroup.closeDict(dictType);
}
}
- mDistracterFilter.close();
}
@UsedForTesting
@@ -668,9 +643,7 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
// We don't add words with 0-frequency (assuming they would be profanity etc.).
final boolean isValid = maxFreq > 0;
UserHistoryDictionary.addToDictionary(userHistoryDictionary, ngramContext, secondWord,
- isValid, timeStampInSeconds,
- new DistracterFilterCheckingIsInDictionary(
- mDistracterFilter, userHistoryDictionary));
+ isValid, timeStampInSeconds);
}
private void removeWord(final String dictName, final String word) {
@@ -773,10 +746,12 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
return maxFreq;
}
+ @Override
public int getFrequency(final String word) {
return getFrequencyInternal(word, false /* isGettingMaxFrequencyOfExactMatches */);
}
+ @Override
public int getMaxFrequencyOfExactMatches(final String word) {
return getFrequencyInternal(word, true /* isGettingMaxFrequencyOfExactMatches */);
}
@@ -820,4 +795,13 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
}
return statsOfEnabledSubDicts;
}
+
+ @Override
+ public void addOrIncrementTerm(String fileName,
+ String word,
+ NgramContext ngramContext,
+ int increment,
+ int timeStampInSeconds) {
+ // Do nothing.
+ }
}
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorLruCache.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorLruCache.java
index 666813da5..85ecf93f3 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorLruCache.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorLruCache.java
@@ -28,10 +28,11 @@ import android.util.LruCache;
/**
* Cache for dictionary facilitators of multiple locales.
- * This class automatically creates and releases facilitator instances using LRU policy.
+ * This class automatically creates and releases up to 3 facilitator instances using LRU policy.
*/
public class DictionaryFacilitatorLruCache {
- static final String TAG = DictionaryFacilitatorLruCache.class.getSimpleName();
+ private static final String TAG = "DictionaryFacilitatorLruCache";
+ private static final int MAX_DICTIONARY_FACILITATOR_COUNT = 3;
private static final int WAIT_FOR_LOADING_MAIN_DICT_IN_MILLISECONDS = 1000;
private static final int MAX_RETRY_COUNT_FOR_WAITING_FOR_LOADING_DICT = 5;
@@ -74,10 +75,10 @@ public class DictionaryFacilitatorLruCache {
private final Object mLock = new Object();
private boolean mUseContactsDictionary = false;
- public DictionaryFacilitatorLruCache(final Context context, final int maxSize,
- final String dictionaryNamePrefix) {
+ public DictionaryFacilitatorLruCache(final Context context, final String dictionaryNamePrefix) {
mContext = context;
- mLruCache = new DictionaryFacilitatorLruCacheInner(mCachedLocales, maxSize);
+ mLruCache = new DictionaryFacilitatorLruCacheInner(
+ mCachedLocales, MAX_DICTIONARY_FACILITATOR_COUNT);
mDictionaryNamePrefix = dictionaryNamePrefix;
}
@@ -103,11 +104,10 @@ public class DictionaryFacilitatorLruCache {
private void resetDictionariesForLocaleLocked(final DictionaryFacilitator dictionaryFacilitator,
final Locale locale) {
// Note: Given that personalized dictionaries are not used here; we can pass null account.
- dictionaryFacilitator.resetDictionariesWithDictNamePrefix(mContext, new Locale[] { locale },
+ dictionaryFacilitator.resetDictionaries(mContext, new Locale[]{locale},
mUseContactsDictionary, false /* usePersonalizedDicts */,
- false /* forceReloadMainDictionary */, null /* listener */,
- mDictionaryNamePrefix,
- null /* account */);
+ false /* forceReloadMainDictionary */, null /* account */,
+ mDictionaryNamePrefix, null /* listener */);
}
public void setUseContactsDictionary(final boolean useContectsDictionary) {
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index 1c54a20e7..413c5b8a1 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -22,8 +22,8 @@ import android.util.Log;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.common.ComposedData;
-import com.android.inputmethod.latin.common.Constants;
import com.android.inputmethod.latin.common.FileUtils;
+import com.android.inputmethod.latin.define.DecoderSpecificConstants;
import com.android.inputmethod.latin.makedict.DictionaryHeader;
import com.android.inputmethod.latin.makedict.FormatSpec;
import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
@@ -31,7 +31,6 @@ import com.android.inputmethod.latin.makedict.WordProperty;
import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
import com.android.inputmethod.latin.utils.AsyncResultHolder;
import com.android.inputmethod.latin.utils.CombinedFormatUtils;
-import com.android.inputmethod.latin.utils.DistracterFilter;
import com.android.inputmethod.latin.utils.ExecutorUtils;
import com.android.inputmethod.latin.utils.WordInputEventForPersonalization;
@@ -40,7 +39,6 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
-import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -57,7 +55,6 @@ import javax.annotation.Nullable;
*
* A class that extends this abstract class must have a static factory method named
* getDictionary(Context context, Locale locale, File dictFile, String dictNamePrefix)
- * @see DictionaryFacilitator#getSubDict(String,Context,Locale,File,String)
*/
abstract public class ExpandableBinaryDictionary extends Dictionary {
private static final boolean DEBUG = false;
@@ -73,7 +70,8 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
/**
* The maximum length of a word in this dictionary.
*/
- protected static final int MAX_WORD_LENGTH = Constants.DICTIONARY_MAX_WORD_LENGTH;
+ protected static final int MAX_WORD_LENGTH =
+ DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH;
private static final int DICTIONARY_FORMAT_VERSION = FormatSpec.VERSION4;
@@ -171,33 +169,9 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
private static void asyncExecuteTaskWithLock(final Lock lock, final String executorName,
final Runnable task) {
- asyncPreCheckAndExecuteTaskWithLock(lock, null /* preCheckTask */, executorName, task);
- }
-
- private void asyncPreCheckAndExecuteTaskWithWriteLock(
- final Callable<Boolean> preCheckTask, final Runnable task) {
- asyncPreCheckAndExecuteTaskWithLock(mLock.writeLock(), preCheckTask,
- mDictName /* executorName */, task);
-
- }
-
- // Execute task with lock when the result of preCheckTask is true or preCheckTask is null.
- private static void asyncPreCheckAndExecuteTaskWithLock(final Lock lock,
- final Callable<Boolean> preCheckTask, final String executorName, final Runnable task) {
- final String tag = TAG;
ExecutorUtils.getExecutor(executorName).execute(new Runnable() {
@Override
public void run() {
- if (preCheckTask != null) {
- try {
- if (!preCheckTask.call().booleanValue()) {
- return;
- }
- } catch (final Exception e) {
- Log.e(tag, "The pre check task throws an exception.", e);
- return;
- }
- }
lock.lock();
try {
task.run();
@@ -304,17 +278,8 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
}
}
- private void updateDictionaryWithWriteLockIfWordIsNotADistracter(
- @Nonnull final Runnable updateTask,
- @Nonnull final String word, @Nonnull final DistracterFilter distracterFilter) {
+ private void updateDictionaryWithWriteLock(@Nonnull final Runnable updateTask) {
reloadDictionaryIfRequired();
- final Callable<Boolean> preCheckTask = new Callable<Boolean>() {
- @Override
- public Boolean call() throws Exception {
- return !distracterFilter.isDistracterToWordsInDictionaries(
- NgramContext.EMPTY_PREV_WORDS_INFO, word, mLocale);
- }
- };
final Runnable task = new Runnable() {
@Override
public void run() {
@@ -325,23 +290,22 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
updateTask.run();
}
};
- asyncPreCheckAndExecuteTaskWithWriteLock(preCheckTask, task);
+ asyncExecuteTaskWithWriteLock(task);
}
/**
* Adds unigram information of a word to the dictionary. May overwrite an existing entry.
*/
- public void addUnigramEntryWithCheckingDistracter(final String word, final int frequency,
+ public void addUnigramEntry(final String word, final int frequency,
final String shortcutTarget, final int shortcutFreq, final boolean isNotAWord,
- final boolean isPossiblyOffensive, final int timestamp,
- @Nonnull final DistracterFilter distracterFilter) {
- updateDictionaryWithWriteLockIfWordIsNotADistracter(new Runnable() {
+ final boolean isPossiblyOffensive, final int timestamp) {
+ updateDictionaryWithWriteLock(new Runnable() {
@Override
public void run() {
addUnigramLocked(word, frequency, shortcutTarget, shortcutFreq,
isNotAWord, isPossiblyOffensive, timestamp);
}
- }, word, distracterFilter);
+ });
}
protected void addUnigramLocked(final String word, final int frequency,
@@ -429,12 +393,11 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
}
/**
- * Update dictionary for the word with the ngramContext if the word is not a distracter.
+ * Update dictionary for the word with the ngramContext.
*/
- public void updateEntriesForWordWithCheckingDistracter(@Nonnull final NgramContext ngramContext,
- final String word, final boolean isValidWord, final int count, final int timestamp,
- @Nonnull final DistracterFilter distracterFilter) {
- updateDictionaryWithWriteLockIfWordIsNotADistracter(new Runnable() {
+ public void updateEntriesForWord(@Nonnull final NgramContext ngramContext,
+ final String word, final boolean isValidWord, final int count, final int timestamp) {
+ updateDictionaryWithWriteLock(new Runnable() {
@Override
public void run() {
final BinaryDictionary binaryDictionary = getBinaryDictionary();
@@ -449,7 +412,7 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
}
}
}
- }, word, distracterFilter);
+ });
}
public interface UpdateEntriesForInputEventsCallback {
@@ -652,7 +615,7 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
/**
* Reloads the dictionary. Access is controlled on a per dictionary file basis.
*/
- private final void asyncReloadDictionary() {
+ private void asyncReloadDictionary() {
final AtomicBoolean isReloading = mIsReloading;
if (!isReloading.compareAndSet(false, true)) {
return;
diff --git a/java/src/com/android/inputmethod/latin/LastComposedWord.java b/java/src/com/android/inputmethod/latin/LastComposedWord.java
index 9fcdb2229..426d33e6d 100644
--- a/java/src/com/android/inputmethod/latin/LastComposedWord.java
+++ b/java/src/com/android/inputmethod/latin/LastComposedWord.java
@@ -19,8 +19,8 @@ package com.android.inputmethod.latin;
import android.text.TextUtils;
import com.android.inputmethod.event.Event;
-import com.android.inputmethod.latin.common.Constants;
import com.android.inputmethod.latin.common.InputPointers;
+import com.android.inputmethod.latin.define.DecoderSpecificConstants;
import java.util.ArrayList;
@@ -53,7 +53,7 @@ public final class LastComposedWord {
public final NgramContext mNgramContext;
public final int mCapitalizedMode;
public final InputPointers mInputPointers =
- new InputPointers(Constants.DICTIONARY_MAX_WORD_LENGTH);
+ new InputPointers(DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH);
private boolean mActive;
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 9a1df4995..c118e4aeb 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -128,7 +128,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
final Settings mSettings;
private final DictionaryFacilitator mDictionaryFacilitator =
- DictionaryFacilitatorProvider.newDictionaryFacilitator(this /* context */);
+ DictionaryFacilitatorProvider.newDictionaryFacilitator();
final InputLogic mInputLogic = new InputLogic(this /* LatinIME */,
this /* SuggestionStripViewAccessor */, mDictionaryFacilitator);
// We expect to have only one decoder in almost all cases, hence the default capacity of 1.
@@ -608,8 +608,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
if (!mHandler.hasPendingReopenDictionaries()) {
resetDictionaryFacilitator(locales);
}
- mDictionaryFacilitator.updateEnabledSubtypes(mRichImm.getMyEnabledInputMethodSubtypeList(
- true /* allowsImplicitlySelectedSubtypes */));
refreshPersonalizationDictionarySession(currentSettingsValues);
resetDictionaryFacilitatorIfNecessary();
mStatsUtilsManager.onLoadSettings(this /* context */, currentSettingsValues,
@@ -679,7 +677,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
mDictionaryFacilitator.resetDictionaries(this /* context */, locales,
settingsValues.mUseContactsDict, settingsValues.mUsePersonalizedDicts,
false /* forceReloadMainDictionary */,
- settingsValues.mAccount,
+ settingsValues.mAccount, "" /* dictNamePrefix */,
this /* DictionaryInitializationListener */);
if (settingsValues.mAutoCorrectionEnabledPerUserSettings) {
mInputLogic.mSuggest.setAutoCorrectionThreshold(
@@ -697,7 +695,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
mDictionaryFacilitator.getLocales(), settingsValues.mUseContactsDict,
settingsValues.mUsePersonalizedDicts,
true /* forceReloadMainDictionary */,
- settingsValues.mAccount,
+ settingsValues.mAccount, "" /* dictNamePrefix */,
this /* DictionaryInitializationListener */);
}
@@ -1810,7 +1808,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
mDictionaryFacilitator.resetDictionaries(this, new Locale[] { locale },
settingsValues.mUseContactsDict, settingsValues.mUsePersonalizedDicts,
false /* forceReloadMainDictionary */,
- settingsValues.mAccount,
+ settingsValues.mAccount, "", /* dictionaryNamePrefix */
this /* DictionaryInitializationListener */);
}
diff --git a/java/src/com/android/inputmethod/latin/NgramContext.java b/java/src/com/android/inputmethod/latin/NgramContext.java
index 2d66fb000..53bec6e59 100644
--- a/java/src/com/android/inputmethod/latin/NgramContext.java
+++ b/java/src/com/android/inputmethod/latin/NgramContext.java
@@ -19,8 +19,8 @@ package com.android.inputmethod.latin;
import android.text.TextUtils;
import com.android.inputmethod.annotations.UsedForTesting;
-import com.android.inputmethod.latin.common.Constants;
import com.android.inputmethod.latin.common.StringUtils;
+import com.android.inputmethod.latin.define.DecoderSpecificConstants;
import java.util.ArrayList;
import java.util.Arrays;
@@ -108,11 +108,13 @@ public class NgramContext {
mPrevWordsCount = prevWordsInfo.length;
}
- // Create next prevWordsInfo using current prevWordsInfo.
+ /**
+ * Create next prevWordsInfo using current prevWordsInfo.
+ */
@Nonnull
public NgramContext getNextNgramContext(final WordInfo wordInfo) {
- final int nextPrevWordCount = Math.min(Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM,
- mPrevWordsCount + 1);
+ final int nextPrevWordCount = Math.min(
+ DecoderSpecificConstants.MAX_PREV_WORD_COUNT_FOR_N_GRAM, mPrevWordsCount + 1);
final WordInfo[] prevWordsInfo = new WordInfo[nextPrevWordCount];
prevWordsInfo[0] = wordInfo;
System.arraycopy(mPrevWordsInfo, 0, prevWordsInfo, 1, nextPrevWordCount - 1);
diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java
index 660a051b9..0210d7e18 100644
--- a/java/src/com/android/inputmethod/latin/RichInputConnection.java
+++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java
@@ -16,6 +16,8 @@
package com.android.inputmethod.latin;
+import static com.android.inputmethod.latin.define.DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH;
+
import android.inputmethodservice.InputMethodService;
import android.os.Build;
import android.os.Bundle;
@@ -35,6 +37,7 @@ import com.android.inputmethod.compat.InputConnectionCompatUtils;
import com.android.inputmethod.latin.common.Constants;
import com.android.inputmethod.latin.common.UnicodeSurrogate;
import com.android.inputmethod.latin.common.StringUtils;
+import com.android.inputmethod.latin.define.DecoderSpecificConstants;
import com.android.inputmethod.latin.inputlogic.PrivateCommandPerformer;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
import com.android.inputmethod.latin.utils.CapsModeUtils;
@@ -60,9 +63,9 @@ public final class RichInputConnection implements PrivateCommandPerformer {
private static final boolean DEBUG_PREVIOUS_TEXT = false;
private static final boolean DEBUG_BATCH_NESTING = false;
// Provision for long words and separators between the words.
- private static final int LOOKBACK_CHARACTER_NUM = Constants.DICTIONARY_MAX_WORD_LENGTH
- * (Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM + 1) /* words */
- + Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM /* separators */;
+ private static final int LOOKBACK_CHARACTER_NUM = DICTIONARY_MAX_WORD_LENGTH
+ * (DecoderSpecificConstants.MAX_PREV_WORD_COUNT_FOR_N_GRAM + 1) /* words */
+ + DecoderSpecificConstants.MAX_PREV_WORD_COUNT_FOR_N_GRAM /* separators */;
private static final int INVALID_CURSOR_POSITION = -1;
/**
diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
index e6f2f1ec9..32ef1021d 100644
--- a/java/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -26,6 +26,7 @@ import com.android.inputmethod.latin.common.CoordinateUtils;
import com.android.inputmethod.latin.common.InputPointers;
import com.android.inputmethod.latin.common.StringUtils;
import com.android.inputmethod.latin.define.DebugFlags;
+import com.android.inputmethod.latin.define.DecoderSpecificConstants;
import java.util.ArrayList;
import java.util.Collections;
@@ -36,7 +37,7 @@ import javax.annotation.Nonnull;
* A place to store the currently composing word with information such as adjacent key codes as well
*/
public final class WordComposer {
- private static final int MAX_WORD_LENGTH = Constants.DICTIONARY_MAX_WORD_LENGTH;
+ private static final int MAX_WORD_LENGTH = DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH;
private static final boolean DBG = DebugFlags.DEBUG_ENABLED;
public static final int CAPS_MODE_OFF = 0;
diff --git a/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java b/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java
index eba9654a5..3348a3767 100644
--- a/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java
+++ b/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java
@@ -17,7 +17,7 @@
package com.android.inputmethod.latin.makedict;
import com.android.inputmethod.annotations.UsedForTesting;
-import com.android.inputmethod.latin.common.Constants;
+import com.android.inputmethod.latin.define.DecoderSpecificConstants;
import java.util.Date;
import java.util.HashMap;
@@ -186,7 +186,7 @@ public final class FormatSpec {
// TODO: Make this value adaptative to content data, store it in the header, and
// use it in the reading code.
- static final int MAX_WORD_LENGTH = Constants.DICTIONARY_MAX_WORD_LENGTH;
+ static final int MAX_WORD_LENGTH = DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH;
// These flags are used only in the static dictionary.
static final int MASK_CHILDREN_ADDRESS_TYPE = 0xC0;
diff --git a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
index 2e41027a4..b6286b203 100644
--- a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
@@ -17,18 +17,14 @@
package com.android.inputmethod.latin.personalization;
import android.content.Context;
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
import com.android.inputmethod.annotations.ExternallyReferenced;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.Dictionary;
import com.android.inputmethod.latin.ExpandableBinaryDictionary;
import com.android.inputmethod.latin.NgramContext;
-import com.android.inputmethod.latin.common.Constants;
+import com.android.inputmethod.latin.define.DecoderSpecificConstants;
import com.android.inputmethod.latin.define.ProductionFlags;
-import com.android.inputmethod.latin.settings.LocalSettingsConstants;
-import com.android.inputmethod.latin.utils.DistracterFilter;
import java.io.File;
import java.util.Locale;
@@ -97,15 +93,14 @@ public class UserHistoryDictionary extends DecayingExpandableBinaryDictionaryBas
* @param word the word the user inputted
* @param isValid whether the word is valid or not
* @param timestamp the timestamp when the word has been inputted
- * @param distracterFilter the filter to check whether the word is a distracter
*/
public static void addToDictionary(final ExpandableBinaryDictionary userHistoryDictionary,
@Nonnull final NgramContext ngramContext, final String word, final boolean isValid,
- final int timestamp, @Nonnull final DistracterFilter distracterFilter) {
- if (word.length() > Constants.DICTIONARY_MAX_WORD_LENGTH) {
+ final int timestamp) {
+ if (word.length() > DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH) {
return;
}
- userHistoryDictionary.updateEntriesForWordWithCheckingDistracter(ngramContext, word,
- isValid, 1 /* count */, timestamp, distracterFilter);
+ userHistoryDictionary.updateEntriesForWord(ngramContext, word,
+ isValid, 1 /* count */, timestamp);
}
}
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
index 4d1bea618..95293bf2f 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
@@ -71,10 +71,8 @@ public final class AndroidSpellCheckerService extends SpellCheckerService
// TODO: Make each spell checker session has its own session id.
private final ConcurrentLinkedQueue<Integer> mSessionIdPool = new ConcurrentLinkedQueue<>();
- private static final int MAX_DICTIONARY_FACILITATOR_COUNT = 3;
private final DictionaryFacilitatorLruCache mDictionaryFacilitatorCache =
- new DictionaryFacilitatorLruCache(this /* context */, MAX_DICTIONARY_FACILITATOR_COUNT,
- DICTIONARY_NAME_PREFIX);
+ new DictionaryFacilitatorLruCache(this /* context */, DICTIONARY_NAME_PREFIX);
private final ConcurrentHashMap<Locale, Keyboard> mKeyboardCache = new ConcurrentHashMap<>();
// The threshold for a suggestion to be considered "recommended".
diff --git a/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java b/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java
index fcce1ecdd..e355b7e1f 100644
--- a/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java
@@ -27,8 +27,8 @@ import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.AssetFileAddress;
import com.android.inputmethod.latin.BinaryDictionaryGetter;
import com.android.inputmethod.latin.R;
-import com.android.inputmethod.latin.common.Constants;
import com.android.inputmethod.latin.common.LocaleUtils;
+import com.android.inputmethod.latin.define.DecoderSpecificConstants;
import com.android.inputmethod.latin.makedict.DictionaryHeader;
import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
@@ -450,7 +450,7 @@ public class DictionaryInfoUtils {
return false;
}
final int length = text.length();
- if (length > Constants.DICTIONARY_MAX_WORD_LENGTH) {
+ if (length > DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH) {
return false;
}
int i = 0;
diff --git a/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java b/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java
deleted file mode 100644
index 525212c96..000000000
--- a/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.inputmethod.latin.utils;
-
-import android.view.inputmethod.InputMethodSubtype;
-
-import com.android.inputmethod.annotations.UsedForTesting;
-import com.android.inputmethod.latin.NgramContext;
-
-import java.util.List;
-import java.util.Locale;
-
-import javax.annotation.Nonnull;
-
-public interface DistracterFilter {
- /**
- * Determine whether a word is a distracter to words in dictionaries.
- *
- * @param ngramContext the n-gram context
- * @param testedWord the word that will be tested to see whether it is a distracter to words
- * in dictionaries.
- * @param locale the locale of word.
- * @return true if testedWord is a distracter, otherwise false.
- */
- public boolean isDistracterToWordsInDictionaries(final NgramContext ngramContext,
- final String testedWord, final Locale locale);
-
- @UsedForTesting
- public int getWordHandlingType(final NgramContext ngramContext, final String testedWord,
- final Locale locale);
-
- public void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes);
-
- public void close();
-
- public static final class HandlingType {
- private final static int REQUIRE_NO_SPECIAL_HANDLINGS = 0x0;
- private final static int SHOULD_BE_LOWER_CASED = 0x1;
- private final static int SHOULD_BE_HANDLED_AS_OOV = 0x2;
-
- public static int getHandlingType(final boolean shouldBeLowerCased, final boolean isOov) {
- int wordHandlingType = HandlingType.REQUIRE_NO_SPECIAL_HANDLINGS;
- if (shouldBeLowerCased) {
- wordHandlingType |= HandlingType.SHOULD_BE_LOWER_CASED;
- }
- if (isOov) {
- wordHandlingType |= HandlingType.SHOULD_BE_HANDLED_AS_OOV;
- }
- return wordHandlingType;
- }
-
- public static boolean shouldBeLowerCased(final int handlingType) {
- return (handlingType & SHOULD_BE_LOWER_CASED) != 0;
- }
-
- public static boolean shouldBeHandledAsOov(final int handlingType) {
- return (handlingType & SHOULD_BE_HANDLED_AS_OOV) != 0;
- }
- }
-
- @Nonnull
- public static final DistracterFilter EMPTY_DISTRACTER_FILTER = new DistracterFilter() {
- @Override
- public boolean isDistracterToWordsInDictionaries(NgramContext ngramContext,
- String testedWord, Locale locale) {
- return false;
- }
-
- @Override
- public int getWordHandlingType(final NgramContext ngramContext,
- final String testedWord, final Locale locale) {
- return HandlingType.REQUIRE_NO_SPECIAL_HANDLINGS;
- }
-
- @Override
- public void close() {
- }
-
- @Override
- public void updateEnabledSubtypes(List<InputMethodSubtype> enabledSubtypes) {
- }
- };
-}
diff --git a/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingExactMatchesAndSuggestions.java b/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingExactMatchesAndSuggestions.java
deleted file mode 100644
index 09bb03f65..000000000
--- a/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingExactMatchesAndSuggestions.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.inputmethod.latin.utils;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.text.InputType;
-import android.util.Log;
-import android.util.LruCache;
-import android.util.Pair;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputMethodSubtype;
-
-import com.android.inputmethod.keyboard.Keyboard;
-import com.android.inputmethod.keyboard.KeyboardId;
-import com.android.inputmethod.keyboard.KeyboardLayoutSet;
-import com.android.inputmethod.latin.DictionaryFacilitator;
-import com.android.inputmethod.latin.DictionaryFacilitatorLruCache;
-import com.android.inputmethod.latin.NgramContext;
-import com.android.inputmethod.latin.RichInputMethodSubtype;
-import com.android.inputmethod.latin.SuggestedWords;
-import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
-import com.android.inputmethod.latin.WordComposer;
-import com.android.inputmethod.latin.common.StringUtils;
-import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
-
-/**
- * This class is used to prevent distracters being added to personalization
- * or user history dictionaries
- */
-public class DistracterFilterCheckingExactMatchesAndSuggestions implements DistracterFilter {
- private static final String TAG =
- DistracterFilterCheckingExactMatchesAndSuggestions.class.getSimpleName();
- private static final boolean DEBUG = false;
-
- private static final int MAX_DICTIONARY_FACILITATOR_CACHE_SIZE = 3;
- private static final int MAX_DISTRACTERS_CACHE_SIZE = 1024;
-
- private final Context mContext;
- private final ConcurrentHashMap<Locale, InputMethodSubtype> mLocaleToSubtypeCache;
- private final ConcurrentHashMap<Locale, Keyboard> mLocaleToKeyboardCache;
- private final DictionaryFacilitatorLruCache mDictionaryFacilitatorLruCache;
- // The key is a pair of a locale and a word. The value indicates the word is a distracter to
- // words of the locale.
- private final LruCache<Pair<Locale, String>, Boolean> mDistractersCache;
- private final Object mLock = new Object();
-
- // If the score of the top suggestion exceeds this value, the tested word (e.g.,
- // an OOV, a misspelling, or an in-vocabulary word) would be considered as a distracter to
- // words in dictionary. The greater the threshold is, the less likely the tested word would
- // become a distracter, which means the tested word will be more likely to be added to
- // the dictionary.
- private static final float DISTRACTER_WORD_SCORE_THRESHOLD = 0.4f;
-
- /**
- * Create a DistracterFilter instance.
- *
- * @param context the context.
- */
- public DistracterFilterCheckingExactMatchesAndSuggestions(final Context context) {
- mContext = context;
- mLocaleToSubtypeCache = new ConcurrentHashMap<>();
- mLocaleToKeyboardCache = new ConcurrentHashMap<>();
- mDictionaryFacilitatorLruCache = new DictionaryFacilitatorLruCache(context,
- MAX_DICTIONARY_FACILITATOR_CACHE_SIZE, "" /* dictionaryNamePrefix */);
- mDistractersCache = new LruCache<>(MAX_DISTRACTERS_CACHE_SIZE);
- }
-
- @Override
- public void close() {
- mLocaleToSubtypeCache.clear();
- mLocaleToKeyboardCache.clear();
- mDictionaryFacilitatorLruCache.evictAll();
- // Don't clear mDistractersCache.
- }
-
- @Override
- public void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes) {
- final Map<Locale, InputMethodSubtype> newLocaleToSubtypeMap = new HashMap<>();
- if (enabledSubtypes != null) {
- for (final InputMethodSubtype subtype : enabledSubtypes) {
- final Locale locale = SubtypeLocaleUtils.getSubtypeLocale(subtype);
- if (newLocaleToSubtypeMap.containsKey(locale)) {
- // Multiple subtypes are enabled for one locale.
- // TODO: Investigate what we should do for this case.
- continue;
- }
- newLocaleToSubtypeMap.put(locale, subtype);
- }
- }
- if (mLocaleToSubtypeCache.equals(newLocaleToSubtypeMap)) {
- // Enabled subtypes have not been changed.
- return;
- }
- // Update subtype and keyboard map for locales that are in the current mapping.
- for (final Locale locale: mLocaleToSubtypeCache.keySet()) {
- if (newLocaleToSubtypeMap.containsKey(locale)) {
- final InputMethodSubtype newSubtype = newLocaleToSubtypeMap.remove(locale);
- if (newSubtype.equals(newLocaleToSubtypeMap.get(locale))) {
- // Mapping has not been changed.
- continue;
- }
- mLocaleToSubtypeCache.replace(locale, newSubtype);
- } else {
- mLocaleToSubtypeCache.remove(locale);
- }
- mLocaleToKeyboardCache.remove(locale);
- }
- // Add locales that are not in the current mapping.
- mLocaleToSubtypeCache.putAll(newLocaleToSubtypeMap);
- }
-
- private Keyboard getKeyboardForLocale(final Locale locale) {
- final Keyboard cachedKeyboard = mLocaleToKeyboardCache.get(locale);
- if (cachedKeyboard != null) {
- return cachedKeyboard;
- }
- final InputMethodSubtype subtype = mLocaleToSubtypeCache.get(locale);
- if (subtype == null) {
- return null;
- }
- final EditorInfo editorInfo = new EditorInfo();
- editorInfo.inputType = InputType.TYPE_CLASS_TEXT;
- final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(
- mContext, editorInfo);
- final Resources res = mContext.getResources();
- final int keyboardWidth = ResourceUtils.getDefaultKeyboardWidth(res);
- final int keyboardHeight = ResourceUtils.getDefaultKeyboardHeight(res);
- builder.setKeyboardGeometry(keyboardWidth, keyboardHeight);
- builder.setSubtype(new RichInputMethodSubtype(subtype));
- builder.setIsSpellChecker(false /* isSpellChecker */);
- final KeyboardLayoutSet layoutSet = builder.build();
- final Keyboard newKeyboard = layoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET);
- mLocaleToKeyboardCache.put(locale, newKeyboard);
- return newKeyboard;
- }
-
- /**
- * Determine whether a word is a distracter to words in dictionaries.
- *
- * @param ngramContext the n-gram context. Not used for now.
- * @param testedWord the word that will be tested to see whether it is a distracter to words
- * in dictionaries.
- * @param locale the locale of word.
- * @return true if testedWord is a distracter, otherwise false.
- */
- @Override
- public boolean isDistracterToWordsInDictionaries(final NgramContext ngramContext,
- final String testedWord, final Locale locale) {
- if (locale == null) {
- return false;
- }
- if (!mLocaleToSubtypeCache.containsKey(locale)) {
- Log.e(TAG, "Locale " + locale + " is not enabled.");
- // TODO: Investigate what we should do for disabled locales.
- return false;
- }
- final DictionaryFacilitator dictionaryFacilitator =
- mDictionaryFacilitatorLruCache.get(locale);
- if (DEBUG) {
- Log.d(TAG, "testedWord: " + testedWord);
- }
- final Pair<Locale, String> cacheKey = new Pair<>(locale, testedWord);
- final Boolean isCachedDistracter = mDistractersCache.get(cacheKey);
- if (isCachedDistracter != null && isCachedDistracter) {
- if (DEBUG) {
- Log.d(TAG, "isDistracter: true (cache hit)");
- }
- return true;
- }
-
- final boolean isDistracterCheckedByGetMaxFreqencyOfExactMatches =
- checkDistracterUsingMaxFreqencyOfExactMatches(dictionaryFacilitator, testedWord);
- if (isDistracterCheckedByGetMaxFreqencyOfExactMatches) {
- // Add the pair of locale and word to the cache.
- mDistractersCache.put(cacheKey, Boolean.TRUE);
- return true;
- }
- if (dictionaryFacilitator.isValidSuggestionWord(testedWord)) {
- // Valid word is not a distracter.
- if (DEBUG) {
- Log.d(TAG, "isDistracter: false (valid word)");
- }
- return false;
- }
-
- final Keyboard keyboard = getKeyboardForLocale(locale);
- final boolean isDistracterCheckedByGetSuggestion =
- checkDistracterUsingGetSuggestions(dictionaryFacilitator, keyboard, testedWord);
- if (isDistracterCheckedByGetSuggestion) {
- // Add the pair of locale and word to the cache.
- mDistractersCache.put(cacheKey, Boolean.TRUE);
- return true;
- }
- return false;
- }
-
- private static boolean checkDistracterUsingMaxFreqencyOfExactMatches(
- final DictionaryFacilitator dictionaryFacilitator, final String testedWord) {
- // The tested word is a distracter when there is a word that is exact matched to the tested
- // word and its probability is higher than the tested word's probability.
- final int perfectMatchFreq = dictionaryFacilitator.getFrequency(testedWord);
- final int exactMatchFreq = dictionaryFacilitator.getMaxFrequencyOfExactMatches(testedWord);
- final boolean isDistracter = perfectMatchFreq < exactMatchFreq;
- if (DEBUG) {
- Log.d(TAG, "perfectMatchFreq: " + perfectMatchFreq);
- Log.d(TAG, "exactMatchFreq: " + exactMatchFreq);
- Log.d(TAG, "isDistracter: " + isDistracter);
- }
- return isDistracter;
- }
-
- private boolean checkDistracterUsingGetSuggestions(
- final DictionaryFacilitator dictionaryFacilitator, final Keyboard keyboard,
- final String testedWord) {
- if (keyboard == null) {
- return false;
- }
- final SettingsValuesForSuggestion settingsValuesForSuggestion =
- new SettingsValuesForSuggestion(false /* blockPotentiallyOffensive */,
- false /* spaceAwareGestureEnabled */);
- final int trailingSingleQuotesCount = StringUtils.getTrailingSingleQuotesCount(testedWord);
- final String consideredWord = trailingSingleQuotesCount > 0 ?
- testedWord.substring(0, testedWord.length() - trailingSingleQuotesCount) :
- testedWord;
- final WordComposer composer = new WordComposer();
- final int[] codePoints = StringUtils.toCodePointArray(testedWord);
- final int[] coordinates = keyboard.getCoordinates(codePoints);
- composer.setComposingWord(codePoints, coordinates);
- final SuggestionResults suggestionResults;
- synchronized (mLock) {
- suggestionResults = dictionaryFacilitator.getSuggestionResults(composer,
- NgramContext.EMPTY_PREV_WORDS_INFO,
- keyboard.getProximityInfo().getNativeProximityInfo(),
- settingsValuesForSuggestion, 0 /* sessionId */,
- SuggestedWords.INPUT_STYLE_TYPING,
- keyboard.getKeyboardLayout());
- }
- if (suggestionResults.isEmpty()) {
- return false;
- }
- final SuggestedWordInfo firstSuggestion = suggestionResults.first();
- final boolean isDistracter = suggestionExceedsDistracterThreshold(
- firstSuggestion, consideredWord, DISTRACTER_WORD_SCORE_THRESHOLD);
- if (DEBUG) {
- Log.d(TAG, "isDistracter: " + isDistracter);
- }
- return isDistracter;
- }
-
- private static boolean suggestionExceedsDistracterThreshold(final SuggestedWordInfo suggestion,
- final String consideredWord, final float distracterThreshold) {
- if (suggestion == null) {
- return false;
- }
- final int suggestionScore = suggestion.mScore;
- final float normalizedScore = BinaryDictionaryUtils.calcNormalizedScore(
- consideredWord, suggestion.mWord, suggestionScore);
- if (DEBUG) {
- Log.d(TAG, "normalizedScore: " + normalizedScore);
- Log.d(TAG, "distracterThreshold: " + distracterThreshold);
- }
- if (normalizedScore > distracterThreshold) {
- return true;
- }
- return false;
- }
-
- private boolean shouldBeLowerCased(final NgramContext ngramContext, final String testedWord,
- final Locale locale) {
- final DictionaryFacilitator dictionaryFacilitator =
- mDictionaryFacilitatorLruCache.get(locale);
- if (dictionaryFacilitator.isValidSuggestionWord(testedWord)) {
- return false;
- }
- final String lowerCaseWord = testedWord.toLowerCase(locale);
- if (testedWord.equals(lowerCaseWord)) {
- return false;
- }
- if (dictionaryFacilitator.isValidSuggestionWord(lowerCaseWord)) {
- return true;
- }
- if (StringUtils.getCapitalizationType(testedWord) == StringUtils.CAPITALIZE_FIRST
- && !ngramContext.isValid()) {
- // TODO: Check beginning-of-sentence.
- return true;
- }
- return false;
- }
-
- @Override
- public int getWordHandlingType(final NgramContext ngramContext, final String testedWord,
- final Locale locale) {
- // TODO: Use this method for user history dictionary.
- if (testedWord == null|| locale == null) {
- return HandlingType.getHandlingType(false /* shouldBeLowerCased */, false /* isOov */);
- }
- final boolean shouldBeLowerCased = shouldBeLowerCased(ngramContext, testedWord, locale);
- final String caseModifiedWord = shouldBeLowerCased
- ? testedWord.toLowerCase(locale) : testedWord;
- final boolean isOov = !mDictionaryFacilitatorLruCache.get(locale).isValidSuggestionWord(
- caseModifiedWord);
- return HandlingType.getHandlingType(shouldBeLowerCased, isOov);
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingIsInDictionary.java b/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingIsInDictionary.java
deleted file mode 100644
index 4c99fed9f..000000000
--- a/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingIsInDictionary.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.inputmethod.latin.utils;
-
-import java.util.List;
-import java.util.Locale;
-
-import android.view.inputmethod.InputMethodSubtype;
-
-import com.android.inputmethod.latin.Dictionary;
-import com.android.inputmethod.latin.NgramContext;
-
-public class DistracterFilterCheckingIsInDictionary implements DistracterFilter {
- private final DistracterFilter mDistracterFilter;
- private final Dictionary mDictionary;
-
- public DistracterFilterCheckingIsInDictionary(final DistracterFilter distracterFilter,
- final Dictionary dictionary) {
- mDistracterFilter = distracterFilter;
- mDictionary = dictionary;
- }
-
- @Override
- public boolean isDistracterToWordsInDictionaries(NgramContext ngramContext,
- String testedWord, Locale locale) {
- if (mDictionary.isInDictionary(testedWord)) {
- // This filter treats entries that are already in the dictionary as non-distracters
- // because they have passed the filtering in the past.
- return false;
- }
- return mDistracterFilter.isDistracterToWordsInDictionaries(
- ngramContext, testedWord, locale);
- }
-
- @Override
- public int getWordHandlingType(final NgramContext ngramContext, final String testedWord,
- final Locale locale) {
- return mDistracterFilter.getWordHandlingType(ngramContext, testedWord, locale);
- }
-
- @Override
- public void updateEnabledSubtypes(List<InputMethodSubtype> enabledSubtypes) {
- // Do nothing.
- }
-
- @Override
- public void close() {
- // Do nothing.
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/utils/NgramContextUtils.java b/java/src/com/android/inputmethod/latin/utils/NgramContextUtils.java
index 7d2ddd268..727df1a93 100644
--- a/java/src/com/android/inputmethod/latin/utils/NgramContextUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/NgramContextUtils.java
@@ -18,7 +18,7 @@ package com.android.inputmethod.latin.utils;
import com.android.inputmethod.latin.NgramContext;
import com.android.inputmethod.latin.NgramContext.WordInfo;
-import com.android.inputmethod.latin.common.Constants;
+import com.android.inputmethod.latin.define.DecoderSpecificConstants;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
import java.util.Arrays;
@@ -59,7 +59,8 @@ public final class NgramContextUtils {
final SpacingAndPunctuations spacingAndPunctuations, final int n) {
if (prev == null) return NgramContext.EMPTY_PREV_WORDS_INFO;
final String[] w = SPACE_REGEX.split(prev);
- final WordInfo[] prevWordsInfo = new WordInfo[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ final WordInfo[] prevWordsInfo =
+ new WordInfo[DecoderSpecificConstants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
Arrays.fill(prevWordsInfo, WordInfo.EMPTY_WORD_INFO);
for (int i = 0; i < prevWordsInfo.length; i++) {
final int focusedWordIndex = w.length - n - i;
diff --git a/java/src/com/android/inputmethod/latin/utils/WordInputEventForPersonalization.java b/java/src/com/android/inputmethod/latin/utils/WordInputEventForPersonalization.java
index 86a5b19ec..fc0a9cb6c 100644
--- a/java/src/com/android/inputmethod/latin/utils/WordInputEventForPersonalization.java
+++ b/java/src/com/android/inputmethod/latin/utils/WordInputEventForPersonalization.java
@@ -20,10 +20,9 @@ import android.util.Log;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.NgramContext;
-import com.android.inputmethod.latin.common.Constants;
import com.android.inputmethod.latin.common.StringUtils;
+import com.android.inputmethod.latin.define.DecoderSpecificConstants;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
-import com.android.inputmethod.latin.utils.DistracterFilter.HandlingType;
import java.util.ArrayList;
import java.util.List;
@@ -37,20 +36,19 @@ public final class WordInputEventForPersonalization {
public final int[] mTargetWord;
public final int mPrevWordsCount;
- public final int[][] mPrevWordArray = new int[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][];
+ public final int[][] mPrevWordArray =
+ new int[DecoderSpecificConstants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][];
public final boolean[] mIsPrevWordBeginningOfSentenceArray =
- new boolean[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
- public final boolean mIsValid;
+ new boolean[DecoderSpecificConstants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
// Time stamp in seconds.
public final int mTimestamp;
@UsedForTesting
public WordInputEventForPersonalization(final CharSequence targetWord,
- final NgramContext ngramContext, final boolean isValid, final int timestamp) {
+ final NgramContext ngramContext, final int timestamp) {
mTargetWord = StringUtils.toCodePointArray(targetWord);
mPrevWordsCount = ngramContext.getPrevWordCount();
ngramContext.outputToArray(mPrevWordArray, mIsPrevWordBeginningOfSentenceArray);
- mIsValid = isValid;
mTimestamp = timestamp;
}
@@ -58,8 +56,7 @@ public final class WordInputEventForPersonalization {
// objects.
public static ArrayList<WordInputEventForPersonalization> createInputEventFrom(
final List<String> tokens, final int timestamp,
- final SpacingAndPunctuations spacingAndPunctuations, final Locale locale,
- final DistracterFilter distracterFilter) {
+ final SpacingAndPunctuations spacingAndPunctuations, final Locale locale) {
final ArrayList<WordInputEventForPersonalization> inputEvents = new ArrayList<>();
final int N = tokens.size();
NgramContext ngramContext = NgramContext.EMPTY_PREV_WORDS_INFO;
@@ -88,7 +85,7 @@ public final class WordInputEventForPersonalization {
}
final WordInputEventForPersonalization inputEvent =
detectWhetherVaildWordOrNotAndGetInputEvent(
- ngramContext, tempWord, timestamp, locale, distracterFilter);
+ ngramContext, tempWord, timestamp, locale);
if (inputEvent == null) {
continue;
}
@@ -100,19 +97,10 @@ public final class WordInputEventForPersonalization {
private static WordInputEventForPersonalization detectWhetherVaildWordOrNotAndGetInputEvent(
final NgramContext ngramContext, final String targetWord, final int timestamp,
- final Locale locale, final DistracterFilter distracterFilter) {
+ final Locale locale) {
if (locale == null) {
return null;
}
- final int wordHandlingType = distracterFilter.getWordHandlingType(ngramContext,
- targetWord, locale);
- final String word = HandlingType.shouldBeLowerCased(wordHandlingType) ?
- targetWord.toLowerCase(locale) : targetWord;
- if (distracterFilter.isDistracterToWordsInDictionaries(ngramContext, targetWord, locale)) {
- // The word is a distracter.
- return null;
- }
- return new WordInputEventForPersonalization(word, ngramContext,
- !HandlingType.shouldBeHandledAsOov(wordHandlingType), timestamp);
+ return new WordInputEventForPersonalization(targetWord, ngramContext, timestamp);
}
}