From a848897586223b050e87367b48ed2eebd0870d1d Mon Sep 17 00:00:00 2001 From: Jules Aguillon Date: Sun, 18 Jan 2026 17:26:41 +0100 Subject: Refactor: Split DeviceLocales out of Keyboard2 (#1154) * Refactor: Split DeviceLocales out of Keyboard2 This moves the code from Keyboard2 that handles the active IME subtypes and the current one. The goal is to access this information from the dictionary activity while simplifying the code of Keyboard2. * Refresh the candidates view when subtype changes This fixes the status message being inconsistently shown. * Refactor: Load DeviceLocales less often Previously, [DeviceLocales.load()] was called everytime the keyboard was shown on the screen. This operation is moderately costly and only need to be done when the IME subtype changes. * EditorConfig: Fix crash on Android 9--- srcs/juloo.keyboard2/DeviceLocales.java | 83 +++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 srcs/juloo.keyboard2/DeviceLocales.java (limited to 'srcs/juloo.keyboard2/DeviceLocales.java') 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 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 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 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; + } +} -- cgit v1.2.3