From 9bcfec8bd1c1662b250c0a313505aa6e0bc06383 Mon Sep 17 00:00:00 2001 From: Jules Aguillon Date: Sat, 24 Jun 2023 23:29:24 +0200 Subject: [PATCH] Per-script extra keys Allows to define a locale's script in 'method.xml' and use that to add the extra keys for a locale to layouts of the same script only. A locale of an undefined script will add its extra keys to every layouts. A layout of an undefined script will have the extra keys of all the enabled locales. --- srcs/juloo.keyboard2/Config.java | 4 +- srcs/juloo.keyboard2/ExtraKeys.java | 57 +++++++++++++++++++++++++++++ srcs/juloo.keyboard2/Keyboard2.java | 34 ++++------------- 3 files changed, 66 insertions(+), 29 deletions(-) create mode 100644 srcs/juloo.keyboard2/ExtraKeys.java diff --git a/srcs/juloo.keyboard2/Config.java b/srcs/juloo.keyboard2/Config.java index 8406be2..3e9d624 100644 --- a/srcs/juloo.keyboard2/Config.java +++ b/srcs/juloo.keyboard2/Config.java @@ -57,7 +57,7 @@ final class Config public String actionLabel; // Might be 'null' public int actionId; // Meaningful only when 'actionLabel' isn't 'null' public boolean swapEnterActionKey; // Swap the "enter" and "action" keys - public Set extra_keys_subtype; + public ExtraKeys extra_keys_subtype; public Set extra_keys_param; public final IKeyEventHandler handler; @@ -176,7 +176,7 @@ final class Config final Set extra_keys = new HashSet(); final Set remove_keys = new HashSet(); if (extra_keys_subtype != null) - extra_keys.addAll(extra_keys_subtype); + extra_keys_subtype.compute(extra_keys, kw.script); extra_keys.addAll(extra_keys_param); boolean number_row = this.number_row && !show_numpad; if (number_row) diff --git a/srcs/juloo.keyboard2/ExtraKeys.java b/srcs/juloo.keyboard2/ExtraKeys.java new file mode 100644 index 0000000..22187c1 --- /dev/null +++ b/srcs/juloo.keyboard2/ExtraKeys.java @@ -0,0 +1,57 @@ +package juloo.keyboard2; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +class ExtraKeys +{ + Map> _keys_per_script; + + public ExtraKeys() + { + _keys_per_script = new HashMap>(); + } + + public void add_keys_for_script(String script, List kvs) + { + List ks = _keys_per_script.get(script); + if (ks == null) ks = new ArrayList(); + ks.addAll(kvs); + _keys_per_script.put(script, ks); + } + + /** Add the keys that should be added to the keyboard into [dst]. [null] is + a valid script. */ + public void compute(Set dst, String script) + { + if (script == null) + { + for (String sc : _keys_per_script.keySet()) + get_keys_of_script(dst, sc); + } + else + { + get_keys_of_script(dst, null); + get_keys_of_script(dst, script); + } + } + + void get_keys_of_script(Set dst, String script) + { + List ks = _keys_per_script.get(script); + if (ks != null) + dst.addAll(ks); + } + + public static List parse_extra_keys(String str) + { + List dst = new ArrayList(); + String[] ks = str.split("\\|"); + for (int i = 0; i < ks.length; i++) + dst.add(KeyValue.getKeyByName(ks[i])); + return dst; + } +} diff --git a/srcs/juloo.keyboard2/Keyboard2.java b/srcs/juloo.keyboard2/Keyboard2.java index f8aab34..8a5c69b 100644 --- a/srcs/juloo.keyboard2/Keyboard2.java +++ b/srcs/juloo.keyboard2/Keyboard2.java @@ -99,19 +99,18 @@ public class Keyboard2 extends InputMethodService return Arrays.asList(); } - private void extra_keys_of_subtype(Set dst, InputMethodSubtype subtype) + private void extra_keys_of_subtype(ExtraKeys dst, InputMethodSubtype subtype) { String extra_keys = subtype.getExtraValueOf("extra_keys"); + String script = subtype.getExtraValueOf("script"); if (extra_keys == null) return; - String[] ks = extra_keys.split("\\|"); - for (int i = 0; i < ks.length; i++) - dst.add(KeyValue.getKeyByName(ks[i])); + dst.add_keys_for_script(script, ExtraKeys.parse_extra_keys(extra_keys)); } private void refreshAccentsOption(InputMethodManager imm, InputMethodSubtype subtype) { - HashSet extra_keys = new HashSet(); + ExtraKeys extra_keys = new ExtraKeys(); List enabled_subtypes = getEnabledSubtypes(imm); switch (_config.accents) { @@ -132,16 +131,6 @@ public class Keyboard2 extends InputMethodService _config.shouldOfferSwitchingToNextInputMethod = true; } - private void refreshSubtypeLegacyFallback() - { - // Fallback for the accents option: Only respect the "None" case - switch (_config.accents) - { - case 1: case 2: case 3: _config.extra_keys_subtype = null; break; - case 4: _config.extra_keys_subtype = new HashSet(); break; - } - } - InputMethodManager get_imm() { return (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); @@ -156,20 +145,11 @@ public class Keyboard2 extends InputMethodService _config.shouldOfferSwitchingToNextInputMethod = shouldOfferSwitchingToNextInputMethod(); _config.shouldOfferVoiceTyping = (get_voice_typing_im(imm) != null); KeyboardData default_layout = null; - if (VERSION.SDK_INT < 12) - { - // Subtypes won't work well under API level 12 (getExtraValueOf) - refreshSubtypeLegacyFallback(); - } - else + _config.extra_keys_subtype = null; + if (VERSION.SDK_INT >= 12) { InputMethodSubtype subtype = imm.getCurrentInputMethodSubtype(); - if (subtype == null) - { - // On some rare cases, [subtype] is null. - refreshSubtypeLegacyFallback(); - } - else + if (subtype != null) { String s = subtype.getExtraValueOf("default_layout"); if (s != null)