diff options
Diffstat (limited to 'srcs/juloo.keyboard2/dict/Dictionaries.java')
| -rw-r--r-- | srcs/juloo.keyboard2/dict/Dictionaries.java | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/srcs/juloo.keyboard2/dict/Dictionaries.java b/srcs/juloo.keyboard2/dict/Dictionaries.java new file mode 100644 index 0000000..ac43c9b --- /dev/null +++ b/srcs/juloo.keyboard2/dict/Dictionaries.java @@ -0,0 +1,149 @@ +package juloo.keyboard2.dict; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.Resources; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import juloo.cdict.Cdict; +import juloo.keyboard2.Logs; +import juloo.keyboard2.Utils; + +/** Manage and load installed dictionaries. */ +public final class Dictionaries +{ + public static Dictionaries instance(Context ctx) + { + if (_instance == null) + _instance = new Dictionaries(ctx); + return _instance; + } + + /** Util for finding a dictionary by name. Returns [null] if not found. */ + public static Cdict find_by_name(Cdict[] dicts, String name) + { + for (Cdict d : dicts) + if (d.name.equals(name)) + return d; + return null; + } + + /** Load an installed dictionary. Return [null] if the requested dictionary + is not installed or the dictionary couldn't be loaded. */ + public Cdict[] load(String dict_name) + { + if (_loaded_dictionaries.containsKey(dict_name)) + return _loaded_dictionaries.get(dict_name); + Cdict[] dict = load_uncached(dict_name); + _loaded_dictionaries.put(dict_name, dict); + return dict; + } + + public Set<String> get_installed() { return _installed_dictionaries; } + + public void install(String dict_name, byte[] data) throws IOException + { + FileOutputStream outp = _context.openFileOutput(dict_file_name(dict_name), + Context.MODE_PRIVATE); + outp.write(data); + outp.close(); + set_installed(dict_name); + } + + /** Return the absolute path used to store the dictionary with the given + name. Return the same result whether the dictionary is installed or not. */ + public File get_install_location(String dict_name) + { + return _context.getFileStreamPath(dict_file_name(dict_name)); + } + + /** Declare a dictionary as installed. A dictionary file must exist at the + path returned by [get_install_location(dict_name)]. */ + public void set_installed(String dict_name) + { + _installed_dictionaries.add(dict_name); + _loaded_dictionaries.remove(dict_name); + save(); + } + + public void uninstall(String dict_name) + { + _context.deleteFile(dict_file_name(dict_name)); + _installed_dictionaries.remove(dict_name); + _loaded_dictionaries.remove(dict_name); + save(); + } + + /** Private */ + + Context _context; + Set<String> _installed_dictionaries; + /** Might be 'null' when safe storage is not available. */ + SharedPreferences _shared_prefs; + Map<String, Cdict[]> _loaded_dictionaries; + + static Dictionaries _instance = null; + + static final String PREF_INSTALLED_DICTS = "installed"; + + Dictionaries(Context ctx) + { + _context = ctx; + _installed_dictionaries = new HashSet(); + _loaded_dictionaries = new TreeMap<String, Cdict[]>(); + load_prefs(); + } + + void load_prefs() + { + _shared_prefs = null; + try + { + _shared_prefs = + _context.getSharedPreferences("dictionaries", Context.MODE_PRIVATE); + Set<String> s = _shared_prefs.getStringSet(PREF_INSTALLED_DICTS, null); + if (s != null) + _installed_dictionaries.addAll(s); + } + catch (Exception e) + { + Logs.exn("", e); + } + } + + Cdict[] load_uncached(String dict_name) + { + if (!_installed_dictionaries.contains(dict_name)) + return null; + try + { + FileInputStream inp = _context.openFileInput(dict_file_name(dict_name)); + byte[] data = Utils.read_all_bytes(inp); + inp.close(); + return Cdict.of_bytes(data); + } + catch (IOException e) { return null; } + catch (Cdict.ConstructionError e) { return null; } + } + + void save() + { + if (_shared_prefs == null) + return; + _shared_prefs.edit() + .putStringSet(PREF_INSTALLED_DICTS, _installed_dictionaries) + .commit(); + } + + static String dict_file_name(String dict_name) + { + return dict_name + ".dict"; + } +} |
