abouttreesummaryrefslogcommitdiff
diff options
context:
space:
mode:
authorJules Aguillon2023-06-24 23:29:24 +0200
committerJules Aguillon2023-06-24 23:29:24 +0200
commit9bcfec8bd1c1662b250c0a313505aa6e0bc06383 (patch)
tree4b1e257793f60fc812e1c2fc7d2bfaba28b496b7
parent5fc68373d3ee0ce61cfb819f0e623e3a3f63c374 (diff)
downloadunexpected-keyboard-9bcfec8bd1c1662b250c0a313505aa6e0bc06383.tar.gz
unexpected-keyboard-9bcfec8bd1c1662b250c0a313505aa6e0bc06383.zip
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.
-rw-r--r--srcs/juloo.keyboard2/Config.java4
-rw-r--r--srcs/juloo.keyboard2/ExtraKeys.java57
-rw-r--r--srcs/juloo.keyboard2/Keyboard2.java34
3 files changed, 66 insertions, 29 deletions
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<KeyValue> extra_keys_subtype;
+ public ExtraKeys extra_keys_subtype;
public Set<KeyValue> extra_keys_param;
public final IKeyEventHandler handler;
@@ -176,7 +176,7 @@ final class Config
final Set<KeyValue> extra_keys = new HashSet<KeyValue>();
final Set<KeyValue> remove_keys = new HashSet<KeyValue>();
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<String, List<KeyValue>> _keys_per_script;
+
+ public ExtraKeys()
+ {
+ _keys_per_script = new HashMap<String, List<KeyValue>>();
+ }
+
+ public void add_keys_for_script(String script, List<KeyValue> kvs)
+ {
+ List<KeyValue> ks = _keys_per_script.get(script);
+ if (ks == null) ks = new ArrayList<KeyValue>();
+ 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<KeyValue> 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<KeyValue> dst, String script)
+ {
+ List<KeyValue> ks = _keys_per_script.get(script);
+ if (ks != null)
+ dst.addAll(ks);
+ }
+
+ public static List<KeyValue> parse_extra_keys(String str)
+ {
+ List<KeyValue> dst = new ArrayList<KeyValue>();
+ 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<KeyValue> 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<KeyValue> extra_keys = new HashSet<KeyValue>();
+ ExtraKeys extra_keys = new ExtraKeys();
List<InputMethodSubtype> 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<KeyValue>(); 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)