Loading java/src/com/android/inputmethod/latin/Dictionary.java +4 −0 Original line number Diff line number Diff line Loading @@ -95,6 +95,10 @@ public abstract class Dictionary { return NOT_A_PROBABILITY; } public int getMaxFrequencyOfExactMatches(final String word) { return NOT_A_PROBABILITY; } /** * Compares the contents of the character array with the typed word and returns true if they * are the same. Loading java/src/com/android/inputmethod/latin/DictionaryFacilitator.java +24 −10 Original line number Diff line number Diff line Loading @@ -63,7 +63,7 @@ public class DictionaryFacilitator { private final Object mLock = new Object(); private final DistracterFilter mDistracterFilter; private static final String[] DICT_TYPES_ORDERED_TO_GET_SUGGESTION = private static final String[] DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS = new String[] { Dictionary.TYPE_MAIN, Dictionary.TYPE_USER_HISTORY, Loading @@ -89,8 +89,8 @@ public class DictionaryFacilitator { new Class[] { Context.class, Locale.class, File.class }; private static final String[] SUB_DICT_TYPES = Arrays.copyOfRange(DICT_TYPES_ORDERED_TO_GET_SUGGESTION, 1 /* start */, DICT_TYPES_ORDERED_TO_GET_SUGGESTION.length); Arrays.copyOfRange(DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS, 1 /* start */, DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS.length); /** * Class contains dictionaries for a locale. Loading Loading @@ -333,7 +333,7 @@ public class DictionaryFacilitator { dictionaries = mDictionaries; mDictionaries = new Dictionaries(); } for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTION) { for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { dictionaries.closeDict(dictType); } mDistracterFilter.close(); Loading Loading @@ -469,7 +469,7 @@ public class DictionaryFacilitator { final SuggestionResults suggestionResults = new SuggestionResults(dictionaries.mLocale, SuggestedWords.MAX_SUGGESTIONS); final float[] languageWeight = new float[] { Dictionary.NOT_A_LANGUAGE_WEIGHT }; for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTION) { for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { final Dictionary dictionary = dictionaries.getDict(dictType); if (null == dictionary) continue; final ArrayList<SuggestedWordInfo> dictionarySuggestions = Loading Loading @@ -502,7 +502,7 @@ public class DictionaryFacilitator { return false; } final String lowerCasedWord = word.toLowerCase(dictionaries.mLocale); for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTION) { for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { final Dictionary dictionary = dictionaries.getDict(dictType); // Ideally the passed map would come out of a {@link java.util.concurrent.Future} and // would be immutable once it's finished initializing, but concretely a null test is Loading @@ -516,16 +516,22 @@ public class DictionaryFacilitator { return false; } public int getFrequency(final String word) { private int getFrequencyInternal(final String word, final boolean isGettingMaxFrequencyOfExactMatches) { if (TextUtils.isEmpty(word)) { return Dictionary.NOT_A_PROBABILITY; } int maxFreq = -1; int maxFreq = Dictionary.NOT_A_PROBABILITY; final Dictionaries dictionaries = mDictionaries; for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTION) { for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { final Dictionary dictionary = dictionaries.getDict(dictType); if (dictionary == null) continue; final int tempFreq = dictionary.getFrequency(word); final int tempFreq; if (isGettingMaxFrequencyOfExactMatches) { tempFreq = dictionary.getMaxFrequencyOfExactMatches(word); } else { tempFreq = dictionary.getFrequency(word); } if (tempFreq >= maxFreq) { maxFreq = tempFreq; } Loading @@ -533,6 +539,14 @@ public class DictionaryFacilitator { return maxFreq; } public int getFrequency(final String word) { return getFrequencyInternal(word, false /* isGettingMaxFrequencyOfExactMatches */); } public int getMaxFrequencyOfExactMatches(final String word) { return getFrequencyInternal(word, true /* isGettingMaxFrequencyOfExactMatches */); } public void clearUserHistoryDictionary() { final ExpandableBinaryDictionary userHistoryDict = mDictionaries.getSubDict(Dictionary.TYPE_USER_HISTORY); Loading java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java +24 −0 Original line number Diff line number Diff line Loading @@ -441,6 +441,30 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { return mBinaryDictionary.isValidWord(word); } @Override public int getMaxFrequencyOfExactMatches(final String word) { reloadDictionaryIfRequired(); boolean lockAcquired = false; try { lockAcquired = mLock.readLock().tryLock( TIMEOUT_FOR_READ_OPS_IN_MILLISECONDS, TimeUnit.MILLISECONDS); if (lockAcquired) { if (mBinaryDictionary == null) { return NOT_A_PROBABILITY; } return mBinaryDictionary.getMaxFrequencyOfExactMatches(word); } } catch (final InterruptedException e) { Log.e(TAG, "Interrupted tryLock() in getMaxFrequencyOfExactMatches().", e); } finally { if (lockAcquired) { mLock.readLock().unlock(); } } return NOT_A_PROBABILITY; } protected boolean isValidNgramLocked(final PrevWordsInfo prevWordsInfo, final String word) { if (mBinaryDictionary == null) return false; return mBinaryDictionary.isValidNgram(prevWordsInfo, word); Loading java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java +12 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,18 @@ public final class ReadOnlyBinaryDictionary extends Dictionary { return NOT_A_PROBABILITY; } @Override public int getMaxFrequencyOfExactMatches(final String word) { if (mLock.readLock().tryLock()) { try { return mBinaryDictionary.getMaxFrequencyOfExactMatches(word); } finally { mLock.readLock().unlock(); } } return NOT_A_PROBABILITY; } @Override public void close() { mLock.writeLock().lock(); Loading Loading
java/src/com/android/inputmethod/latin/Dictionary.java +4 −0 Original line number Diff line number Diff line Loading @@ -95,6 +95,10 @@ public abstract class Dictionary { return NOT_A_PROBABILITY; } public int getMaxFrequencyOfExactMatches(final String word) { return NOT_A_PROBABILITY; } /** * Compares the contents of the character array with the typed word and returns true if they * are the same. Loading
java/src/com/android/inputmethod/latin/DictionaryFacilitator.java +24 −10 Original line number Diff line number Diff line Loading @@ -63,7 +63,7 @@ public class DictionaryFacilitator { private final Object mLock = new Object(); private final DistracterFilter mDistracterFilter; private static final String[] DICT_TYPES_ORDERED_TO_GET_SUGGESTION = private static final String[] DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS = new String[] { Dictionary.TYPE_MAIN, Dictionary.TYPE_USER_HISTORY, Loading @@ -89,8 +89,8 @@ public class DictionaryFacilitator { new Class[] { Context.class, Locale.class, File.class }; private static final String[] SUB_DICT_TYPES = Arrays.copyOfRange(DICT_TYPES_ORDERED_TO_GET_SUGGESTION, 1 /* start */, DICT_TYPES_ORDERED_TO_GET_SUGGESTION.length); Arrays.copyOfRange(DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS, 1 /* start */, DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS.length); /** * Class contains dictionaries for a locale. Loading Loading @@ -333,7 +333,7 @@ public class DictionaryFacilitator { dictionaries = mDictionaries; mDictionaries = new Dictionaries(); } for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTION) { for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { dictionaries.closeDict(dictType); } mDistracterFilter.close(); Loading Loading @@ -469,7 +469,7 @@ public class DictionaryFacilitator { final SuggestionResults suggestionResults = new SuggestionResults(dictionaries.mLocale, SuggestedWords.MAX_SUGGESTIONS); final float[] languageWeight = new float[] { Dictionary.NOT_A_LANGUAGE_WEIGHT }; for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTION) { for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { final Dictionary dictionary = dictionaries.getDict(dictType); if (null == dictionary) continue; final ArrayList<SuggestedWordInfo> dictionarySuggestions = Loading Loading @@ -502,7 +502,7 @@ public class DictionaryFacilitator { return false; } final String lowerCasedWord = word.toLowerCase(dictionaries.mLocale); for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTION) { for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { final Dictionary dictionary = dictionaries.getDict(dictType); // Ideally the passed map would come out of a {@link java.util.concurrent.Future} and // would be immutable once it's finished initializing, but concretely a null test is Loading @@ -516,16 +516,22 @@ public class DictionaryFacilitator { return false; } public int getFrequency(final String word) { private int getFrequencyInternal(final String word, final boolean isGettingMaxFrequencyOfExactMatches) { if (TextUtils.isEmpty(word)) { return Dictionary.NOT_A_PROBABILITY; } int maxFreq = -1; int maxFreq = Dictionary.NOT_A_PROBABILITY; final Dictionaries dictionaries = mDictionaries; for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTION) { for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { final Dictionary dictionary = dictionaries.getDict(dictType); if (dictionary == null) continue; final int tempFreq = dictionary.getFrequency(word); final int tempFreq; if (isGettingMaxFrequencyOfExactMatches) { tempFreq = dictionary.getMaxFrequencyOfExactMatches(word); } else { tempFreq = dictionary.getFrequency(word); } if (tempFreq >= maxFreq) { maxFreq = tempFreq; } Loading @@ -533,6 +539,14 @@ public class DictionaryFacilitator { return maxFreq; } public int getFrequency(final String word) { return getFrequencyInternal(word, false /* isGettingMaxFrequencyOfExactMatches */); } public int getMaxFrequencyOfExactMatches(final String word) { return getFrequencyInternal(word, true /* isGettingMaxFrequencyOfExactMatches */); } public void clearUserHistoryDictionary() { final ExpandableBinaryDictionary userHistoryDict = mDictionaries.getSubDict(Dictionary.TYPE_USER_HISTORY); Loading
java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java +24 −0 Original line number Diff line number Diff line Loading @@ -441,6 +441,30 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { return mBinaryDictionary.isValidWord(word); } @Override public int getMaxFrequencyOfExactMatches(final String word) { reloadDictionaryIfRequired(); boolean lockAcquired = false; try { lockAcquired = mLock.readLock().tryLock( TIMEOUT_FOR_READ_OPS_IN_MILLISECONDS, TimeUnit.MILLISECONDS); if (lockAcquired) { if (mBinaryDictionary == null) { return NOT_A_PROBABILITY; } return mBinaryDictionary.getMaxFrequencyOfExactMatches(word); } } catch (final InterruptedException e) { Log.e(TAG, "Interrupted tryLock() in getMaxFrequencyOfExactMatches().", e); } finally { if (lockAcquired) { mLock.readLock().unlock(); } } return NOT_A_PROBABILITY; } protected boolean isValidNgramLocked(final PrevWordsInfo prevWordsInfo, final String word) { if (mBinaryDictionary == null) return false; return mBinaryDictionary.isValidNgram(prevWordsInfo, word); Loading
java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java +12 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,18 @@ public final class ReadOnlyBinaryDictionary extends Dictionary { return NOT_A_PROBABILITY; } @Override public int getMaxFrequencyOfExactMatches(final String word) { if (mLock.readLock().tryLock()) { try { return mBinaryDictionary.getMaxFrequencyOfExactMatches(word); } finally { mLock.readLock().unlock(); } } return NOT_A_PROBABILITY; } @Override public void close() { mLock.writeLock().lock(); Loading