Add distracter cache to optimize the distracter test.
Bug: 13142176 Bug: 15428247 Change-Id: Ia390b148ffb36ace6c2010daf0f14838492413e8
This commit is contained in:
parent
65cf23eb38
commit
104b582c35
1 changed files with 18 additions and 0 deletions
|
@ -22,6 +22,7 @@ import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.util.LruCache;
|
||||||
import android.view.inputmethod.InputMethodSubtype;
|
import android.view.inputmethod.InputMethodSubtype;
|
||||||
|
|
||||||
import com.android.inputmethod.latin.DictionaryFacilitator;
|
import com.android.inputmethod.latin.DictionaryFacilitator;
|
||||||
|
@ -36,9 +37,11 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
|
||||||
private static final boolean DEBUG = false;
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
private static final long TIMEOUT_TO_WAIT_LOADING_DICTIONARIES_IN_SECONDS = 120;
|
private static final long TIMEOUT_TO_WAIT_LOADING_DICTIONARIES_IN_SECONDS = 120;
|
||||||
|
private static final int MAX_DISTRACTERS_CACHE_SIZE = 512;
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final DictionaryFacilitator mDictionaryFacilitator;
|
private final DictionaryFacilitator mDictionaryFacilitator;
|
||||||
|
private final LruCache<String, Boolean> mDistractersCache;
|
||||||
private final Object mLock = new Object();
|
private final Object mLock = new Object();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -49,6 +52,7 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
|
||||||
public DistracterFilterCheckingExactMatches(final Context context) {
|
public DistracterFilterCheckingExactMatches(final Context context) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mDictionaryFacilitator = new DictionaryFacilitator();
|
mDictionaryFacilitator = new DictionaryFacilitator();
|
||||||
|
mDistractersCache = new LruCache<>(MAX_DISTRACTERS_CACHE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -87,6 +91,7 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
// Reset dictionaries for the locale.
|
// Reset dictionaries for the locale.
|
||||||
try {
|
try {
|
||||||
|
mDistractersCache.evictAll();
|
||||||
loadDictionariesForLocale(locale);
|
loadDictionariesForLocale(locale);
|
||||||
} catch (final InterruptedException e) {
|
} catch (final InterruptedException e) {
|
||||||
Log.e(TAG, "Interrupted while waiting for loading dicts in DistracterFilter",
|
Log.e(TAG, "Interrupted while waiting for loading dicts in DistracterFilter",
|
||||||
|
@ -95,6 +100,15 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final Boolean isCachedDistracter = mDistractersCache.get(testedWord);
|
||||||
|
if (isCachedDistracter != null && isCachedDistracter) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "testedWord: " + testedWord);
|
||||||
|
Log.d(TAG, "isDistracter: true (cache hit)");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
// The tested word is a distracter when there is a word that is exact matched to the tested
|
// 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.
|
// word and its probability is higher than the tested word's probability.
|
||||||
final int perfectMatchFreq = mDictionaryFacilitator.getFrequency(testedWord);
|
final int perfectMatchFreq = mDictionaryFacilitator.getFrequency(testedWord);
|
||||||
|
@ -106,6 +120,10 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
|
||||||
Log.d(TAG, "exactMatchFreq: " + exactMatchFreq);
|
Log.d(TAG, "exactMatchFreq: " + exactMatchFreq);
|
||||||
Log.d(TAG, "isDistracter: " + isDistracter);
|
Log.d(TAG, "isDistracter: " + isDistracter);
|
||||||
}
|
}
|
||||||
|
if (isDistracter) {
|
||||||
|
// Add the word to the cache.
|
||||||
|
mDistractersCache.put(testedWord, Boolean.TRUE);
|
||||||
|
}
|
||||||
return isDistracter;
|
return isDistracter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue