package juloo.keyboard2; import android.content.Context; import android.os.Build.VERSION; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; import java.util.ArrayList; import java.util.List; public final class DeviceLocales { public final List installed; public final Loc default_; public static DeviceLocales load(Context ctx) { InputMethodManager imm = (InputMethodManager)ctx.getSystemService(Context.INPUT_METHOD_SERVICE); List locs = get_installed_locales(ctx.getPackageName(), imm); return new DeviceLocales(locs, current_locale(imm, locs)); } /** Extra keys required by all the installed locales. */ public ExtraKeys extra_keys() { List extra_keys = new ArrayList(); for (Loc l : installed) extra_keys.add(l.extra_keys); return ExtraKeys.merge(extra_keys); } public static final class Loc { public final String lang_tag; public final String script; public final String default_layout; // Might be [null] public final ExtraKeys extra_keys; public final String dictionary; // Might be [null] public Loc(InputMethodSubtype st) { lang_tag = st.getLanguageTag(); script = st.getExtraValueOf("script"); default_layout = st.getExtraValueOf("default_layout"); String extra_keys_s = st.getExtraValueOf("extra_keys"); extra_keys = (extra_keys_s != null) ? ExtraKeys.parse(script, extra_keys_s) : ExtraKeys.EMPTY; dictionary = st.getExtraValueOf("dictionary"); } } private DeviceLocales(List locs, Loc def) { installed = locs; default_ = def; } private static List get_installed_locales(String pkg, InputMethodManager imm) { List locs = new ArrayList(); for (InputMethodInfo imi : imm.getEnabledInputMethodList()) if (imi.getPackageName().equals(pkg)) { for (InputMethodSubtype subtype : imm.getEnabledInputMethodSubtypeList(imi, true)) locs.add(new Loc(subtype)); break; } return locs; } private static Loc current_locale(InputMethodManager imm, List installed) { // Android might return a random subtype, for example, the first in the // list alphabetically. InputMethodSubtype current_subtype = imm.getCurrentInputMethodSubtype(); if (current_subtype == null) return null; if (VERSION.SDK_INT < 24) return new Loc(current_subtype); String default_lang_tag = current_subtype.getLanguageTag(); for (Loc l : installed) if (l.lang_tag.equals(default_lang_tag)) return l; return null; } }