get rid of reflection for creating dyamic dictionary types

This commit is contained in:
Helium314 2024-01-28 11:00:56 +01:00
parent 9f36109feb
commit 10d46619f9
5 changed files with 13 additions and 33 deletions

View file

@ -50,7 +50,6 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary
reloadDictionaryIfRequired();
}
// Note: This method is called by {@link DictionaryFacilitator} using Java reflection.
@ExternallyReferenced
public static ContactsBinaryDictionary getDictionary(final Context context, final Locale locale,
final File dictFile, final String dictNamePrefix, @Nullable final String account) {

View file

@ -34,8 +34,6 @@ import org.dslul.openboard.inputmethod.latin.utils.SuggestionResults;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
@ -76,19 +74,6 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
private String mChangeFrom = "";
private String mChangeTo = "";
public static final Map<String, Class<? extends ExpandableBinaryDictionary>>
DICT_TYPE_TO_CLASS = new HashMap<>();
static {
DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_USER_HISTORY, UserHistoryDictionary.class);
DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_USER, UserBinaryDictionary.class);
DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_CONTACTS, ContactsBinaryDictionary.class);
}
private static final String DICT_FACTORY_METHOD_NAME = "getDictionary";
private static final Class<?>[] DICT_FACTORY_METHOD_ARG_TYPES =
new Class[] { Context.class, Locale.class, File.class, String.class, String.class };
// todo: write cache never set, and never read (only written)
// tried to use read cache for a while, but small performance improvements are not worth the work (https://github.com/Helium314/openboard/issues/307)
private LruCache<String, Boolean> mValidSpellingWordReadCache;
@ -314,21 +299,20 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
private static ExpandableBinaryDictionary getSubDict(final String dictType,
final Context context, final Locale locale, final File dictFile,
final String dictNamePrefix, @Nullable final String account) {
final Class<? extends ExpandableBinaryDictionary> dictClass = DICT_TYPE_TO_CLASS.get(dictType);
if (dictClass == null) {
Log.e(TAG, "Cannot create dictionary: no class for " + dictType);
return null;
}
ExpandableBinaryDictionary dict = null;
try {
final Method factoryMethod = dictClass.getMethod(DICT_FACTORY_METHOD_NAME,
DICT_FACTORY_METHOD_ARG_TYPES);
final Object dict = factoryMethod.invoke(null, context, locale, dictFile, dictNamePrefix, account);
return (ExpandableBinaryDictionary) dict;
} catch (final NoSuchMethodException | SecurityException | IllegalAccessException
| IllegalArgumentException | InvocationTargetException e) {
dict = switch (dictType) {
case Dictionary.TYPE_USER_HISTORY -> UserHistoryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account);
case Dictionary.TYPE_USER -> UserBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account);
case Dictionary.TYPE_CONTACTS -> ContactsBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account);
default -> null;
};
} catch (final SecurityException | IllegalArgumentException e) {
Log.e(TAG, "Cannot create dictionary: " + dictType, e);
return null;
}
if (dict == null)
Log.e(TAG, "Cannot create dictionary for " + dictType);
return dict;
}
@Nullable

View file

@ -82,7 +82,6 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary {
reloadDictionaryIfRequired();
}
// Note: This method is called by {@link DictionaryFacilitator} using Java reflection.
@ExternallyReferenced
public static UserBinaryDictionary getDictionary(
final Context context, final Locale locale, final File dictFile,

View file

@ -49,8 +49,6 @@ public class UserHistoryDictionary extends ExpandableBinaryDictionary {
return getDictName(name, locale, dictFile);
}
// Note: This method is called by {@link DictionaryFacilitator} using Java reflection.
@SuppressWarnings("unused")
@ExternallyReferenced
public static UserHistoryDictionary getDictionary(final Context context, final Locale locale,
final File dictFile, final String dictNamePrefix, @Nullable final String account) {

View file

@ -19,7 +19,7 @@ import androidx.preference.TwoStatePreference;
import org.dslul.openboard.inputmethod.keyboard.KeyboardSwitcher;
import org.dslul.openboard.inputmethod.latin.BuildConfig;
import org.dslul.openboard.inputmethod.latin.DictionaryDumpBroadcastReceiver;
import org.dslul.openboard.inputmethod.latin.DictionaryFacilitatorImpl;
import org.dslul.openboard.inputmethod.latin.DictionaryFacilitator;
import org.dslul.openboard.inputmethod.latin.R;
/**
@ -41,7 +41,7 @@ public final class DebugSettingsFragment extends SubScreenFragment
addPreferencesFromResource(R.xml.prefs_screen_debug);
final PreferenceGroup dictDumpPreferenceGroup = findPreference(PREF_KEY_DUMP_DICTS);
for (final String dictName : DictionaryFacilitatorImpl.DICT_TYPE_TO_CLASS.keySet()) {
for (final String dictName : DictionaryFacilitator.DYNAMIC_DICTIONARY_TYPES) {
final Preference pref = new DictDumpPreference(getActivity(), dictName);
pref.setOnPreferenceClickListener(this);
dictDumpPreferenceGroup.addPreference(pref);