Use DistracterFilterCheckingIsInDictionary for User History

Bug: 13142176
Bug: 15531638
Change-Id: I7e4e5afa05c5cee6eedef62c053d81edac5fa6af
Keisuke Kuroyanagi 2014-08-07 18:39:06 +09:00
parent c08c506487
commit 87ab5b0518
2 changed files with 45 additions and 17 deletions

View File

@ -468,7 +468,9 @@ public class DictionaryFacilitator {
// We don't add words with 0-frequency (assuming they would be profanity etc.). // We don't add words with 0-frequency (assuming they would be profanity etc.).
final boolean isValid = maxFreq > 0; final boolean isValid = maxFreq > 0;
UserHistoryDictionary.addToDictionary(userHistoryDictionary, prevWordsInfo, secondWord, UserHistoryDictionary.addToDictionary(userHistoryDictionary, prevWordsInfo, secondWord,
isValid, timeStampInSeconds, mDistracterFilter); isValid, timeStampInSeconds,
new DistracterFilterCheckingIsInDictionary(
mDistracterFilter, userHistoryDictionary));
} }
private void removeWord(final String dictName, final String word) { private void removeWord(final String dictName, final String word) {

View File

@ -38,6 +38,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@ -163,9 +164,31 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
} }
private void asyncExecuteTaskWithLock(final Lock lock, final Runnable task) { private void asyncExecuteTaskWithLock(final Lock lock, final Runnable task) {
asyncPreCheckAndExecuteTaskWithLock(lock, null /* preCheckTask */, task);
}
private void asyncPreCheckAndExecuteTaskWithWriteLock(
final Callable<Boolean> preCheckTask, final Runnable task) {
asyncPreCheckAndExecuteTaskWithLock(mLock.writeLock(), preCheckTask, task);
}
// Execute task with lock when the result of preCheckTask is true or preCheckTask is null.
private void asyncPreCheckAndExecuteTaskWithLock(final Lock lock,
final Callable<Boolean> preCheckTask, final Runnable task) {
ExecutorUtils.getExecutor(mDictName).execute(new Runnable() { ExecutorUtils.getExecutor(mDictName).execute(new Runnable() {
@Override @Override
public void run() { 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(); lock.lock();
try { try {
task.run(); task.run();
@ -278,22 +301,25 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
final boolean isBlacklisted, final int timestamp, final boolean isBlacklisted, final int timestamp,
final DistracterFilter distracterFilter) { final DistracterFilter distracterFilter) {
reloadDictionaryIfRequired(); reloadDictionaryIfRequired();
asyncExecuteTaskWithWriteLock(new Runnable() { asyncPreCheckAndExecuteTaskWithWriteLock(
@Override new Callable<Boolean>() {
public void run() { @Override
if (mBinaryDictionary == null) { public Boolean call() throws Exception {
return; return !distracterFilter.isDistracterToWordsInDictionaries(
} PrevWordsInfo.EMPTY_PREV_WORDS_INFO, word, mLocale);
if (distracterFilter.isDistracterToWordsInDictionaries( }
PrevWordsInfo.EMPTY_PREV_WORDS_INFO, word, mLocale)) { },
// The word is a distracter. new Runnable() {
return; @Override
} public void run() {
runGCIfRequiredLocked(true /* mindsBlockByGC */); if (mBinaryDictionary == null) {
addUnigramLocked(word, frequency, shortcutTarget, shortcutFreq, return;
isNotAWord, isBlacklisted, timestamp); }
} runGCIfRequiredLocked(true /* mindsBlockByGC */);
}); addUnigramLocked(word, frequency, shortcutTarget, shortcutFreq,
isNotAWord, isBlacklisted, timestamp);
}
});
} }
protected void addUnigramLocked(final String word, final int frequency, protected void addUnigramLocked(final String word, final int frequency,