Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 104b582c authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi
Browse files

Add distracter cache to optimize the distracter test.

Bug: 13142176
Bug: 15428247
Change-Id: Ia390b148ffb36ace6c2010daf0f14838492413e8
parent 65cf23eb
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import java.util.concurrent.TimeUnit;

import android.content.Context;
import android.util.Log;
import android.util.LruCache;
import android.view.inputmethod.InputMethodSubtype;

import com.android.inputmethod.latin.DictionaryFacilitator;
@@ -36,9 +37,11 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
    private static final boolean DEBUG = false;

    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 DictionaryFacilitator mDictionaryFacilitator;
    private final LruCache<String, Boolean> mDistractersCache;
    private final Object mLock = new Object();

    /**
@@ -49,6 +52,7 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
    public DistracterFilterCheckingExactMatches(final Context context) {
        mContext = context;
        mDictionaryFacilitator = new DictionaryFacilitator();
        mDistractersCache = new LruCache<>(MAX_DISTRACTERS_CACHE_SIZE);
    }

    @Override
@@ -87,6 +91,7 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
            synchronized (mLock) {
                // Reset dictionaries for the locale.
                try {
                    mDistractersCache.evictAll();
                    loadDictionariesForLocale(locale);
                } catch (final InterruptedException e) {
                    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
        // word and its probability is higher than the tested word's probability.
        final int perfectMatchFreq = mDictionaryFacilitator.getFrequency(testedWord);
@@ -106,6 +120,10 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
            Log.d(TAG, "exactMatchFreq: " + exactMatchFreq);
            Log.d(TAG, "isDistracter: " + isDistracter);
        }
        if (isDistracter) {
            // Add the word to the cache.
            mDistractersCache.put(testedWord, Boolean.TRUE);
        }
        return isDistracter;
    }
}