am b6665d95: Merge "Use DistracterFilterCheckingIsInDictionary for User History" into lmp-dev
* commit 'b6665d958a78ed0bd726e67b4dad9cec91ab2c3c': Use DistracterFilterCheckingIsInDictionary for User Historymain
commit
e44c4d2541
|
@ -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) {
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue