mirror of
https://github.com/Helium314/HeliBoard.git
synced 2025-05-14 22:12:46 +00:00
get rid of reflection for creating dyamic dictionary types
This commit is contained in:
parent
9f36109feb
commit
10d46619f9
5 changed files with 13 additions and 33 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue