aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin/utils
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/com/android/inputmethod/latin/utils')
-rw-r--r--java/src/com/android/inputmethod/latin/utils/DistracterFilter.java57
-rw-r--r--java/src/com/android/inputmethod/latin/utils/DistracterFilterUtils.java7
-rw-r--r--java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java29
-rw-r--r--java/src/com/android/inputmethod/latin/utils/StringUtils.java9
4 files changed, 72 insertions, 30 deletions
diff --git a/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java b/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java
index 0a0379982..a21953259 100644
--- a/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java
+++ b/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java
@@ -16,8 +16,15 @@
package com.android.inputmethod.latin.utils;
+import java.util.Locale;
+import java.util.concurrent.TimeUnit;
+
+import android.content.Context;
+import android.util.Log;
+
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.latin.Constants;
+import com.android.inputmethod.latin.PrevWordsInfo;
import com.android.inputmethod.latin.Suggest;
import com.android.inputmethod.latin.Suggest.OnGetSuggestedWordsCallback;
import com.android.inputmethod.latin.SuggestedWords;
@@ -29,6 +36,11 @@ import com.android.inputmethod.latin.WordComposer;
* or user history dictionaries
*/
public class DistracterFilter {
+ private static final String TAG = DistracterFilter.class.getSimpleName();
+
+ private static final long TIMEOUT_TO_WAIT_LOADING_DICTIONARIES_IN_SECONDS = 120;
+
+ private final Context mContext;
private final Suggest mSuggest;
private final Keyboard mKeyboard;
@@ -42,13 +54,13 @@ public class DistracterFilter {
/**
* Create a DistracterFilter instance.
*
- * @param suggest an instance of Suggest which will be used to obtain a list of suggestions
- * for a potential distracter
+ * @param context the context.
* @param keyboard the keyboard that is currently being used. This information is needed
* when calling mSuggest.getSuggestedWords(...) to obtain a list of suggestions.
*/
- public DistracterFilter(final Suggest suggest, final Keyboard keyboard) {
- mSuggest = suggest;
+ public DistracterFilter(final Context context, final Keyboard keyboard) {
+ mContext = context;
+ mSuggest = new Suggest();
mKeyboard = keyboard;
}
@@ -66,29 +78,48 @@ public class DistracterFilter {
return false;
}
+ private void loadDictionariesForLocale(final Locale newlocale) throws InterruptedException {
+ mSuggest.mDictionaryFacilitator.resetDictionaries(mContext, newlocale,
+ false /* useContactsDict */, false /* usePersonalizedDicts */,
+ false /* forceReloadMainDictionary */, null /* listener */);
+ mSuggest.mDictionaryFacilitator.waitForLoadingMainDictionary(
+ TIMEOUT_TO_WAIT_LOADING_DICTIONARIES_IN_SECONDS, TimeUnit.SECONDS);
+ }
+
/**
* Determine whether a word is a distracter to words in dictionaries.
*
- * @param prevWord the previous word, or null if none.
+ * @param prevWordsInfo the information of previous words.
* @param testedWord the word that will be tested to see whether it is a distracter to words
* in dictionaries.
+ * @param locale the locale of words.
* @return true if testedWord is a distracter, otherwise false.
*/
- public boolean isDistracterToWordsInDictionaries(final String prevWord,
- final String testedWord) {
- if (mSuggest == null || mKeyboard == null) {
+ public boolean isDistracterToWordsInDictionaries(final PrevWordsInfo prevWordsInfo,
+ final String testedWord, final Locale locale) {
+ if (mKeyboard == null || locale == null) {
return false;
}
+ if (!locale.equals(mSuggest.mDictionaryFacilitator.getLocale())) {
+ // Reset dictionaries for the locale.
+ try {
+ loadDictionariesForLocale(locale);
+ } catch (final InterruptedException e) {
+ Log.e(TAG, "Interrupted while waiting for loading dicts in DistracterFilter", e);
+ return false;
+ }
+ }
final WordComposer composer = new WordComposer();
final int[] codePoints = StringUtils.toCodePointArray(testedWord);
final int[] coordinates;
coordinates = mKeyboard.getCoordinates(codePoints);
- composer.setComposingWord(codePoints, coordinates, prevWord);
+ composer.setComposingWord(codePoints, coordinates, prevWordsInfo.mPrevWord);
- final int trailingSingleQuotesCount = composer.trailingSingleQuotesCount();
- final String consideredWord = trailingSingleQuotesCount > 0 ? testedWord.substring(0,
- testedWord.length() - trailingSingleQuotesCount) : testedWord;
+ final int trailingSingleQuotesCount = StringUtils.getTrailingSingleQuotesCount(testedWord);
+ final String consideredWord = trailingSingleQuotesCount > 0 ?
+ testedWord.substring(0, testedWord.length() - trailingSingleQuotesCount) :
+ testedWord;
final AsyncResultHolder<Boolean> holder = new AsyncResultHolder<Boolean>();
final OnGetSuggestedWordsCallback callback = new OnGetSuggestedWordsCallback() {
@Override
@@ -103,7 +134,7 @@ public class DistracterFilter {
}
}
};
- mSuggest.getSuggestedWords(composer, prevWord, mKeyboard.getProximityInfo(),
+ mSuggest.getSuggestedWords(composer, prevWordsInfo, mKeyboard.getProximityInfo(),
true /* blockOffensiveWords */, true /* isCorrectionEnbaled */,
null /* additionalFeaturesOptions */, 0 /* sessionId */,
SuggestedWords.NOT_A_SEQUENCE_NUMBER, callback);
diff --git a/java/src/com/android/inputmethod/latin/utils/DistracterFilterUtils.java b/java/src/com/android/inputmethod/latin/utils/DistracterFilterUtils.java
index df07f976c..8a711a24e 100644
--- a/java/src/com/android/inputmethod/latin/utils/DistracterFilterUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/DistracterFilterUtils.java
@@ -16,17 +16,18 @@
package com.android.inputmethod.latin.utils;
+import android.content.Context;
+
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.KeyboardSwitcher;
import com.android.inputmethod.keyboard.MainKeyboardView;
-import com.android.inputmethod.latin.Suggest;
public class DistracterFilterUtils {
private DistracterFilterUtils() {
// This utility class is not publicly instantiable.
}
- public static final DistracterFilter createDistracterFilter(final Suggest suggest,
+ public static final DistracterFilter createDistracterFilter(final Context context,
final KeyboardSwitcher keyboardSwitcher) {
final MainKeyboardView mainKeyboardView = keyboardSwitcher.getMainKeyboardView();
// TODO: Create Keyboard when mainKeyboardView is null.
@@ -34,7 +35,7 @@ public class DistracterFilterUtils {
// spellchecker's logic.
final Keyboard keyboard = (mainKeyboardView != null) ?
mainKeyboardView.getKeyboard() : null;
- final DistracterFilter distracterFilter = new DistracterFilter(suggest, keyboard);
+ final DistracterFilter distracterFilter = new DistracterFilter(context, keyboard);
return distracterFilter;
}
}
diff --git a/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java b/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java
index 74e7db901..aaf4a4064 100644
--- a/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java
+++ b/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java
@@ -20,6 +20,7 @@ import android.util.Log;
import com.android.inputmethod.latin.Dictionary;
import com.android.inputmethod.latin.DictionaryFacilitatorForSuggest;
+import com.android.inputmethod.latin.PrevWordsInfo;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
import java.util.ArrayList;
@@ -85,7 +86,7 @@ public final class LanguageModelParam {
final ArrayList<LanguageModelParam> languageModelParams =
CollectionUtils.newArrayList();
final int N = tokens.size();
- String prevWord = null;
+ PrevWordsInfo prevWordsInfo = new PrevWordsInfo(null);
for (int i = 0; i < N; ++i) {
final String tempWord = tokens.get(i);
if (StringUtils.isEmptyStringOrWhiteSpaces(tempWord)) {
@@ -102,7 +103,7 @@ public final class LanguageModelParam {
+ tempWord + "\"");
}
// Sentence terminator found. Split.
- prevWord = null;
+ prevWordsInfo = new PrevWordsInfo(null);
continue;
}
if (DEBUG_TOKEN) {
@@ -110,19 +111,19 @@ public final class LanguageModelParam {
}
final LanguageModelParam languageModelParam =
detectWhetherVaildWordOrNotAndGetLanguageModelParam(
- prevWord, tempWord, timestamp, dictionaryFacilitator,
+ prevWordsInfo, tempWord, timestamp, dictionaryFacilitator,
distracterFilter);
if (languageModelParam == null) {
continue;
}
languageModelParams.add(languageModelParam);
- prevWord = languageModelParam.mTargetWord;
+ prevWordsInfo = new PrevWordsInfo(languageModelParam.mTargetWord);
}
return languageModelParams;
}
private static LanguageModelParam detectWhetherVaildWordOrNotAndGetLanguageModelParam(
- final String prevWord, final String targetWord, final int timestamp,
+ final PrevWordsInfo prevWordsInfo, final String targetWord, final int timestamp,
final DictionaryFacilitatorForSuggest dictionaryFacilitator,
final DistracterFilter distracterFilter) {
final Locale locale = dictionaryFacilitator.getLocale();
@@ -133,14 +134,14 @@ public final class LanguageModelParam {
// distracterFilter in the following code. If targetWord is a distracter,
// it should be filtered out.
if (dictionaryFacilitator.isValidWord(targetWord, false /* ignoreCase */)) {
- return createAndGetLanguageModelParamOfWord(prevWord, targetWord, timestamp,
+ return createAndGetLanguageModelParamOfWord(prevWordsInfo, targetWord, timestamp,
true /* isValidWord */, locale);
}
final String lowerCaseTargetWord = targetWord.toLowerCase(locale);
if (dictionaryFacilitator.isValidWord(lowerCaseTargetWord, false /* ignoreCase */)) {
// Add the lower-cased word.
- return createAndGetLanguageModelParamOfWord(prevWord, lowerCaseTargetWord,
+ return createAndGetLanguageModelParamOfWord(prevWordsInfo, lowerCaseTargetWord,
timestamp, true /* isValidWord */, locale);
}
@@ -150,26 +151,26 @@ public final class LanguageModelParam {
// Adding such a word to dictonaries would interfere with entering in-dictionary words. For
// example, adding "mot" to dictionaries might interfere with entering "not".
// This kind of OOV should be filtered out.
- if (distracterFilter.isDistracterToWordsInDictionaries(prevWord, targetWord)) {
+ if (distracterFilter.isDistracterToWordsInDictionaries(prevWordsInfo, targetWord, locale)) {
return null;
}
- return createAndGetLanguageModelParamOfWord(prevWord, targetWord, timestamp,
+ return createAndGetLanguageModelParamOfWord(prevWordsInfo, targetWord, timestamp,
false /* isValidWord */, locale);
}
private static LanguageModelParam createAndGetLanguageModelParamOfWord(
- final String prevWord, final String targetWord, final int timestamp,
+ final PrevWordsInfo prevWordsInfo, final String targetWord, final int timestamp,
final boolean isValidWord, final Locale locale) {
final String word;
if (StringUtils.getCapitalizationType(targetWord) == StringUtils.CAPITALIZE_FIRST
- && prevWord == null && !isValidWord) {
+ && prevWordsInfo.mPrevWord == null && !isValidWord) {
word = targetWord.toLowerCase(locale);
} else {
word = targetWord;
}
final int unigramProbability = isValidWord ?
UNIGRAM_PROBABILITY_FOR_VALID_WORD : UNIGRAM_PROBABILITY_FOR_OOV_WORD;
- if (prevWord == null) {
+ if (prevWordsInfo.mPrevWord == null) {
if (DEBUG) {
Log.d(TAG, "--- add unigram: current("
+ (isValidWord ? "Valid" : "OOV") + ") = " + word);
@@ -177,12 +178,12 @@ public final class LanguageModelParam {
return new LanguageModelParam(word, unigramProbability, timestamp);
}
if (DEBUG) {
- Log.d(TAG, "--- add bigram: prev = " + prevWord + ", current("
+ Log.d(TAG, "--- add bigram: prev = " + prevWordsInfo.mPrevWord + ", current("
+ (isValidWord ? "Valid" : "OOV") + ") = " + word);
}
final int bigramProbability = isValidWord ?
BIGRAM_PROBABILITY_FOR_VALID_WORD : BIGRAM_PROBABILITY_FOR_OOV_WORD;
- return new LanguageModelParam(prevWord, word, unigramProbability,
+ return new LanguageModelParam(prevWordsInfo.mPrevWord, word, unigramProbability,
bigramProbability, timestamp);
}
}
diff --git a/java/src/com/android/inputmethod/latin/utils/StringUtils.java b/java/src/com/android/inputmethod/latin/utils/StringUtils.java
index 374badc19..73ac9a573 100644
--- a/java/src/com/android/inputmethod/latin/utils/StringUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/StringUtils.java
@@ -538,6 +538,15 @@ public final class StringUtils {
? casedText.codePointAt(0) : CODE_UNSPECIFIED;
}
+ public static int getTrailingSingleQuotesCount(final CharSequence charSequence) {
+ final int lastIndex = charSequence.length() - 1;
+ int i = lastIndex;
+ while (i >= 0 && charSequence.charAt(i) == Constants.CODE_SINGLE_QUOTE) {
+ --i;
+ }
+ return lastIndex - i;
+ }
+
@UsedForTesting
public static class Stringizer<E> {
public String stringize(final E element) {