diff options
Diffstat (limited to 'srcs/juloo.keyboard2')
| -rw-r--r-- | srcs/juloo.keyboard2/DeviceLocales.java | 83 | ||||
| -rw-r--r-- | srcs/juloo.keyboard2/EditorConfig.java | 13 | ||||
| -rw-r--r-- | srcs/juloo.keyboard2/Keyboard2.java | 72 |
3 files changed, 107 insertions, 61 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; + } +} diff --git a/srcs/juloo.keyboard2/EditorConfig.java b/srcs/juloo.keyboard2/EditorConfig.java index bdfab3c..2bfbcef 100644 --- a/srcs/juloo.keyboard2/EditorConfig.java +++ b/srcs/juloo.keyboard2/EditorConfig.java @@ -1,9 +1,11 @@ package juloo.keyboard2; import android.content.res.Resources; +import android.os.Build.VERSION; import android.text.InputType; import android.text.TextUtils; import android.view.inputmethod.EditorInfo; +import juloo.keyboard2.CandidatesView; public final class EditorConfig { @@ -27,10 +29,14 @@ public final class EditorConfig public boolean caps_initially_updated = false; /** CurrentlyTypedWord. */ - public CharSequence initial_text_before_cursor = null; + public CharSequence initial_text_before_cursor = null; // Might be [null]. public int initial_sel_start; public int initial_sel_end; + /** Suggestions. */ + // Doesn't override [_config.suggestions_enabled]. + public boolean should_show_candidates_view; + public EditorConfig() {} public void refresh(EditorInfo info, Resources res) @@ -72,9 +78,12 @@ public final class EditorConfig caps_initially_enabled = (info.initialCapsMode != 0); caps_initially_updated = caps_should_update_state(info); /* CurrentlyTypedWord */ - initial_text_before_cursor = info.getInitialTextBeforeCursor(10, 0); + if (VERSION.SDK_INT >= 30) + initial_text_before_cursor = info.getInitialTextBeforeCursor(10, 0); initial_sel_start = info.initialSelStart; initial_sel_end = info.initialSelEnd; + /* Suggestions */ + should_show_candidates_view = CandidatesView.should_show(info); } String actionLabel_of_imeAction(int action, Resources res) diff --git a/srcs/juloo.keyboard2/Keyboard2.java b/srcs/juloo.keyboard2/Keyboard2.java index a2940d5..a919405 100644 --- a/srcs/juloo.keyboard2/Keyboard2.java +++ b/srcs/juloo.keyboard2/Keyboard2.java @@ -13,7 +13,6 @@ import android.util.LogPrinter; import android.view.*; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; -import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; import android.widget.FrameLayout; @@ -38,6 +37,8 @@ public class Keyboard2 extends InputMethodService private KeyboardData _currentSpecialLayout; /** Layout associated with the currently selected locale. Not 'null'. */ private KeyboardData _localeTextLayout; + /** Installed and current locales. */ + private DeviceLocales _device_locales; private ViewGroup _emojiPane = null; private ViewGroup _clipboard_pane = null; private Handler _handler; @@ -119,6 +120,7 @@ public class Keyboard2 extends InputMethodService prefs.registerOnSharedPreferenceChangeListener(this); _config = Config.globalConfig(); Logs.set_debug_logs(getResources().getBoolean(R.bool.debug_logs)); + refreshSubtypeImm(); create_keyboard_view(); ClipboardHistoryService.on_startup(this, _keyeventhandler); _foldStateTracker.setChangedCallback(() -> { refresh_config(); }); @@ -138,79 +140,31 @@ public class Keyboard2 extends InputMethodService _candidates_view = (CandidatesView)_container_view.findViewById(R.id.candidates_view); } - private List<InputMethodSubtype> getEnabledSubtypes(InputMethodManager imm) - { - String pkg = getPackageName(); - for (InputMethodInfo imi : imm.getEnabledInputMethodList()) - if (imi.getPackageName().equals(pkg)) - return imm.getEnabledInputMethodSubtypeList(imi, true); - return Arrays.asList(); - } - - private ExtraKeys extra_keys_of_subtype(InputMethodSubtype subtype) - { - String extra_keys = subtype.getExtraValueOf("extra_keys"); - String script = subtype.getExtraValueOf("script"); - if (extra_keys != null) - return ExtraKeys.parse(script, extra_keys); - return ExtraKeys.EMPTY; - } - - private void refreshAccentsOption(InputMethodManager imm, List<InputMethodSubtype> enabled_subtypes) - { - List<ExtraKeys> extra_keys = new ArrayList<ExtraKeys>(); - for (InputMethodSubtype s : enabled_subtypes) - extra_keys.add(extra_keys_of_subtype(s)); - _config.extra_keys_subtype = ExtraKeys.merge(extra_keys); - } - InputMethodManager get_imm() { return (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); } - private InputMethodSubtype defaultSubtypes(InputMethodManager imm, List<InputMethodSubtype> enabled_subtypes) - { - if (VERSION.SDK_INT < 24) - return imm.getCurrentInputMethodSubtype(); - // 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; - for (InputMethodSubtype s : enabled_subtypes) - if (s.getLanguageTag().equals(current_subtype.getLanguageTag())) - return s; - return null; - } - private void refreshSubtypeImm() { - InputMethodManager imm = get_imm(); _config.shouldOfferVoiceTyping = true; KeyboardData default_layout = null; - _config.extra_keys_subtype = null; - if (VERSION.SDK_INT >= 12) + _device_locales = DeviceLocales.load(this); + if (_device_locales.default_ != null) { - List<InputMethodSubtype> enabled_subtypes = getEnabledSubtypes(imm); - InputMethodSubtype subtype = defaultSubtypes(imm, enabled_subtypes); - if (subtype != null) - { - String s = subtype.getExtraValueOf("default_layout"); - if (s != null) - default_layout = LayoutsPreference.layout_of_string(getResources(), s); - refreshAccentsOption(imm, enabled_subtypes); - } + String layout_name = _device_locales.default_.default_layout; + if (layout_name != null) + default_layout = LayoutsPreference.layout_of_string(getResources(), layout_name); } + _config.extra_keys_subtype = _device_locales.extra_keys(); if (default_layout == null) default_layout = loadLayout(R.xml.latn_qwerty_us); _localeTextLayout = default_layout; } - private void refresh_candidates_view(EditorInfo info) + private void refresh_candidates_view() { - boolean should_show = CandidatesView.should_show(info); - _config.should_show_candidates_view = should_show; + boolean should_show = _config.editor_config.should_show_candidates_view; _candidates_view.setVisibility(should_show ? View.VISIBLE : View.GONE); } @@ -220,7 +174,6 @@ public class Keyboard2 extends InputMethodService { int prev_theme = _config.theme; _config.refresh(getResources(), _foldStateTracker.isUnfolded()); - refreshSubtypeImm(); // Refreshing the theme config requires re-creating the views if (prev_theme != _config.theme) { @@ -252,7 +205,7 @@ public class Keyboard2 extends InputMethodService { _config.editor_config.refresh(info, getResources()); refresh_config(); - refresh_candidates_view(info); + refresh_candidates_view(); _currentSpecialLayout = refresh_special_layout(); _keyboardView.setKeyboard(current_layout()); _keyeventhandler.started(_config); @@ -339,6 +292,7 @@ public class Keyboard2 extends InputMethodService public void onCurrentInputMethodSubtypeChanged(InputMethodSubtype subtype) { refreshSubtypeImm(); + refresh_candidates_view(); _keyboardView.setKeyboard(current_layout()); } |
