diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/DictionaryFacilitatorImpl.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/DictionaryFacilitatorImpl.java index 1eeb6c8bf..af0f45643 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/DictionaryFacilitatorImpl.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/DictionaryFacilitatorImpl.java @@ -719,45 +719,65 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator { false /* firstSuggestionExceedsConfidenceThreshold */); final float[] weightOfLangModelVsSpatialModel = new float[] { Dictionary.NOT_A_WEIGHT_OF_LANG_MODEL_VS_SPATIAL_MODEL }; + + // start getting suggestions for secondary locale first, but in separate thread + final ArrayList dictionarySuggestionsSecondary = new ArrayList<>(); + final CountDownLatch waitForSecondaryDictionary = new CountDownLatch(1); + if (mSecondaryDictionaryGroup != null) { + ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD).execute(new Runnable() { + @Override + public void run() { + dictionarySuggestionsSecondary.addAll(getSuggestions(composedData, + ngramContext, settingsValuesForSuggestion, sessionId, proximityInfoHandle, + weightOfLangModelVsSpatialModel, mSecondaryDictionaryGroup)); + waitForSecondaryDictionary.countDown(); + } + }); + } + + // get main locale suggestions + final ArrayList dictionarySuggestions = getSuggestions(composedData, + ngramContext, settingsValuesForSuggestion, sessionId, proximityInfoHandle, + weightOfLangModelVsSpatialModel, mDictionaryGroup); + suggestionResults.addAll(dictionarySuggestions); + if (null != suggestionResults.mRawSuggestions) { + suggestionResults.mRawSuggestions.addAll(dictionarySuggestions); + } + + // wait for secondary locale suggestions + if (mSecondaryDictionaryGroup != null) { + try { waitForSecondaryDictionary.await(); } + catch (InterruptedException e) { + Log.w(TAG, "Interrupted while trying to get secondary locale suggestions", e); + } + suggestionResults.addAll(dictionarySuggestionsSecondary); + if (null != suggestionResults.mRawSuggestions) { + suggestionResults.mRawSuggestions.addAll(dictionarySuggestionsSecondary); + } + } + + return suggestionResults; + } + + private ArrayList getSuggestions(ComposedData composedData, + NgramContext ngramContext, SettingsValuesForSuggestion settingsValuesForSuggestion, + int sessionId, long proximityInfoHandle, float[] weightOfLangModelVsSpatialModel, + DictionaryGroup dictGroup) { + final ArrayList suggestions = new ArrayList<>(); for (final String dictType : ALL_DICTIONARY_TYPES) { - final Dictionary dictionary = mDictionaryGroup.getDict(dictType); + final Dictionary dictionary = dictGroup.getDict(dictType); if (null == dictionary) continue; final float weightForLocale = composedData.mIsBatchMode - ? mDictionaryGroup.mWeightForGesturingInLocale - : mDictionaryGroup.mWeightForTypingInLocale; + ? dictGroup.mWeightForGesturingInLocale + : dictGroup.mWeightForTypingInLocale; final ArrayList dictionarySuggestions = dictionary.getSuggestions(composedData, ngramContext, proximityInfoHandle, settingsValuesForSuggestion, sessionId, weightForLocale, weightOfLangModelVsSpatialModel); if (null == dictionarySuggestions) continue; - suggestionResults.addAll(dictionarySuggestions); - if (null != suggestionResults.mRawSuggestions) { - suggestionResults.mRawSuggestions.addAll(dictionarySuggestions); - } + suggestions.addAll(dictionarySuggestions); } - // now same for secondary dictionary group - // todo: performance... second check is usually faster than 1st one - // (or it's just dictionary size) - // but still may add up to 100 ms on S4 mini (average ca 30) - // relative: +70% compared to only one dictionary group - if (mSecondaryDictionaryGroup != null) - for (final String dictType : ALL_DICTIONARY_TYPES) { - final Dictionary dictionary = mSecondaryDictionaryGroup.getDict(dictType); - if (null == dictionary) continue; - final float weightForLocale = composedData.mIsBatchMode - ? mSecondaryDictionaryGroup.mWeightForGesturingInLocale - : mSecondaryDictionaryGroup.mWeightForTypingInLocale; - final ArrayList dictionarySuggestions = - dictionary.getSuggestions(composedData, ngramContext, - proximityInfoHandle, settingsValuesForSuggestion, sessionId, - weightForLocale, weightOfLangModelVsSpatialModel); - if (null == dictionarySuggestions) continue; - suggestionResults.addAll(dictionarySuggestions); - if (null != suggestionResults.mRawSuggestions) { - suggestionResults.mRawSuggestions.addAll(dictionarySuggestions); - } - } - return suggestionResults; + return suggestions; } // Spell checker is using this, and has its own instance of DictionaryFacilitatorImpl,