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(); reloadDictionaryIfRequired();
} }
// Note: This method is called by {@link DictionaryFacilitator} using Java reflection.
@ExternallyReferenced @ExternallyReferenced
public static ContactsBinaryDictionary getDictionary(final Context context, final Locale locale, public static ContactsBinaryDictionary getDictionary(final Context context, final Locale locale,
final File dictFile, final String dictNamePrefix, @Nullable final String account) { 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.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -76,19 +74,6 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
private String mChangeFrom = ""; private String mChangeFrom = "";
private String mChangeTo = ""; 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) // 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) // 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; private LruCache<String, Boolean> mValidSpellingWordReadCache;
@ -314,21 +299,20 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
private static ExpandableBinaryDictionary getSubDict(final String dictType, private static ExpandableBinaryDictionary getSubDict(final String dictType,
final Context context, final Locale locale, final File dictFile, final Context context, final Locale locale, final File dictFile,
final String dictNamePrefix, @Nullable final String account) { final String dictNamePrefix, @Nullable final String account) {
final Class<? extends ExpandableBinaryDictionary> dictClass = DICT_TYPE_TO_CLASS.get(dictType); ExpandableBinaryDictionary dict = null;
if (dictClass == null) {
Log.e(TAG, "Cannot create dictionary: no class for " + dictType);
return null;
}
try { try {
final Method factoryMethod = dictClass.getMethod(DICT_FACTORY_METHOD_NAME, dict = switch (dictType) {
DICT_FACTORY_METHOD_ARG_TYPES); case Dictionary.TYPE_USER_HISTORY -> UserHistoryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account);
final Object dict = factoryMethod.invoke(null, context, locale, dictFile, dictNamePrefix, account); case Dictionary.TYPE_USER -> UserBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account);
return (ExpandableBinaryDictionary) dict; case Dictionary.TYPE_CONTACTS -> ContactsBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account);
} catch (final NoSuchMethodException | SecurityException | IllegalAccessException default -> null;
| IllegalArgumentException | InvocationTargetException e) { };
} catch (final SecurityException | IllegalArgumentException e) {
Log.e(TAG, "Cannot create dictionary: " + dictType, 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 @Nullable

View file

@ -82,7 +82,6 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary {
reloadDictionaryIfRequired(); reloadDictionaryIfRequired();
} }
// Note: This method is called by {@link DictionaryFacilitator} using Java reflection.
@ExternallyReferenced @ExternallyReferenced
public static UserBinaryDictionary getDictionary( public static UserBinaryDictionary getDictionary(
final Context context, final Locale locale, final File dictFile, 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); return getDictName(name, locale, dictFile);
} }
// Note: This method is called by {@link DictionaryFacilitator} using Java reflection.
@SuppressWarnings("unused")
@ExternallyReferenced @ExternallyReferenced
public static UserHistoryDictionary getDictionary(final Context context, final Locale locale, public static UserHistoryDictionary getDictionary(final Context context, final Locale locale,
final File dictFile, final String dictNamePrefix, @Nullable final String account) { 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.keyboard.KeyboardSwitcher;
import org.dslul.openboard.inputmethod.latin.BuildConfig; import org.dslul.openboard.inputmethod.latin.BuildConfig;
import org.dslul.openboard.inputmethod.latin.DictionaryDumpBroadcastReceiver; 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; import org.dslul.openboard.inputmethod.latin.R;
/** /**
@ -41,7 +41,7 @@ public final class DebugSettingsFragment extends SubScreenFragment
addPreferencesFromResource(R.xml.prefs_screen_debug); addPreferencesFromResource(R.xml.prefs_screen_debug);
final PreferenceGroup dictDumpPreferenceGroup = findPreference(PREF_KEY_DUMP_DICTS); 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); final Preference pref = new DictDumpPreference(getActivity(), dictName);
pref.setOnPreferenceClickListener(this); pref.setOnPreferenceClickListener(this);
dictDumpPreferenceGroup.addPreference(pref); dictDumpPreferenceGroup.addPreference(pref);