From e9a0e66716dab4dd3184d009d8920de1961efdfa Mon Sep 17 00:00:00 2001 From: Amin Bandali Date: Mon, 16 Dec 2024 21:45:41 -0500 Subject: Rename to Kelar Keyboard (org.kelar.inputmethod.latin) --- .../inputmethod/latin/DictionaryCollection.java | 140 +++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 java/src/org/kelar/inputmethod/latin/DictionaryCollection.java (limited to 'java/src/org/kelar/inputmethod/latin/DictionaryCollection.java') diff --git a/java/src/org/kelar/inputmethod/latin/DictionaryCollection.java b/java/src/org/kelar/inputmethod/latin/DictionaryCollection.java new file mode 100644 index 000000000..16affc317 --- /dev/null +++ b/java/src/org/kelar/inputmethod/latin/DictionaryCollection.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.kelar.inputmethod.latin; + +import android.util.Log; + +import org.kelar.inputmethod.latin.SuggestedWords.SuggestedWordInfo; +import org.kelar.inputmethod.latin.common.ComposedData; +import org.kelar.inputmethod.latin.settings.SettingsValuesForSuggestion; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Locale; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Class for a collection of dictionaries that behave like one dictionary. + */ +public final class DictionaryCollection extends Dictionary { + private final String TAG = DictionaryCollection.class.getSimpleName(); + protected final CopyOnWriteArrayList mDictionaries; + + public DictionaryCollection(final String dictType, final Locale locale) { + super(dictType, locale); + mDictionaries = new CopyOnWriteArrayList<>(); + } + + public DictionaryCollection(final String dictType, final Locale locale, + final Dictionary... dictionaries) { + super(dictType, locale); + if (null == dictionaries) { + mDictionaries = new CopyOnWriteArrayList<>(); + } else { + mDictionaries = new CopyOnWriteArrayList<>(dictionaries); + mDictionaries.removeAll(Collections.singleton(null)); + } + } + + public DictionaryCollection(final String dictType, final Locale locale, + final Collection dictionaries) { + super(dictType, locale); + mDictionaries = new CopyOnWriteArrayList<>(dictionaries); + mDictionaries.removeAll(Collections.singleton(null)); + } + + @Override + public ArrayList getSuggestions(final ComposedData composedData, + final NgramContext ngramContext, final long proximityInfoHandle, + final SettingsValuesForSuggestion settingsValuesForSuggestion, + final int sessionId, final float weightForLocale, + final float[] inOutWeightOfLangModelVsSpatialModel) { + final CopyOnWriteArrayList dictionaries = mDictionaries; + if (dictionaries.isEmpty()) return null; + // To avoid creating unnecessary objects, we get the list out of the first + // dictionary and add the rest to it if not null, hence the get(0) + ArrayList suggestions = dictionaries.get(0).getSuggestions(composedData, + ngramContext, proximityInfoHandle, settingsValuesForSuggestion, sessionId, + weightForLocale, inOutWeightOfLangModelVsSpatialModel); + if (null == suggestions) suggestions = new ArrayList<>(); + final int length = dictionaries.size(); + for (int i = 1; i < length; ++ i) { + final ArrayList sugg = dictionaries.get(i).getSuggestions( + composedData, ngramContext, proximityInfoHandle, settingsValuesForSuggestion, + sessionId, weightForLocale, inOutWeightOfLangModelVsSpatialModel); + if (null != sugg) suggestions.addAll(sugg); + } + return suggestions; + } + + @Override + public boolean isInDictionary(final String word) { + for (int i = mDictionaries.size() - 1; i >= 0; --i) + if (mDictionaries.get(i).isInDictionary(word)) return true; + return false; + } + + @Override + public int getFrequency(final String word) { + int maxFreq = -1; + for (int i = mDictionaries.size() - 1; i >= 0; --i) { + final int tempFreq = mDictionaries.get(i).getFrequency(word); + maxFreq = Math.max(tempFreq, maxFreq); + } + return maxFreq; + } + + @Override + public int getMaxFrequencyOfExactMatches(final String word) { + int maxFreq = -1; + for (int i = mDictionaries.size() - 1; i >= 0; --i) { + final int tempFreq = mDictionaries.get(i).getMaxFrequencyOfExactMatches(word); + maxFreq = Math.max(tempFreq, maxFreq); + } + return maxFreq; + } + + @Override + public boolean isInitialized() { + return !mDictionaries.isEmpty(); + } + + @Override + public void close() { + for (final Dictionary dict : mDictionaries) + dict.close(); + } + + // Warning: this is not thread-safe. Take necessary precaution when calling. + public void addDictionary(final Dictionary newDict) { + if (null == newDict) return; + if (mDictionaries.contains(newDict)) { + Log.w(TAG, "This collection already contains this dictionary: " + newDict); + } + mDictionaries.add(newDict); + } + + // Warning: this is not thread-safe. Take necessary precaution when calling. + public void removeDictionary(final Dictionary dict) { + if (mDictionaries.contains(dict)) { + mDictionaries.remove(dict); + } else { + Log.w(TAG, "This collection does not contain this dictionary: " + dict); + } + } +} -- cgit v1.2.3-83-g751a