diff options
Diffstat (limited to 'srcs/juloo.keyboard2/DeviceLocales.java')
| -rw-r--r-- | srcs/juloo.keyboard2/DeviceLocales.java | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/srcs/juloo.keyboard2/DeviceLocales.java b/srcs/juloo.keyboard2/DeviceLocales.java new file mode 100644 index 0000000..a6cfdaf --- /dev/null +++ b/srcs/juloo.keyboard2/DeviceLocales.java @@ -0,0 +1,83 @@ +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<Loc> installed; + public final Loc default_; + + public static DeviceLocales load(Context ctx) + { + InputMethodManager imm = + (InputMethodManager)ctx.getSystemService(Context.INPUT_METHOD_SERVICE); + List<Loc> 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<ExtraKeys> extra_keys = new ArrayList<ExtraKeys>(); + 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 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; + } + } + + private DeviceLocales(List<Loc> locs, Loc def) + { installed = locs; default_ = def; } + + private static List<Loc> get_installed_locales(String pkg, InputMethodManager imm) + { + List<Loc> locs = new ArrayList<Loc>(); + 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<Loc> 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; + } +} |
