From 25a6e71ee815a196d76358cf132c45eb38a10b35 Mon Sep 17 00:00:00 2001 From: Jules Aguillon Date: Mon, 19 Sep 2022 11:41:18 +0200 Subject: [PATCH] Add the Extra Keys option Allows to add more keys to the keyboard from a predefined list. The implementation doesn't use MultiSelectListPreference because it doesn't seem possible to change the item layout to properly show the rendered symbols. --- res/values/attrs.xml | 6 ++ res/values/strings.xml | 1 + res/xml/settings.xml | 19 ++++- srcs/juloo.keyboard2/Config.java | 10 ++- srcs/juloo.keyboard2/EmojiKeyButton.java | 2 +- .../ExtraKeyCheckBoxPreference.java | 72 +++++++++++++++++++ srcs/juloo.keyboard2/Keyboard2.java | 6 +- srcs/juloo.keyboard2/Theme.java | 14 ++-- 8 files changed, 114 insertions(+), 16 deletions(-) create mode 100644 res/values/attrs.xml create mode 100644 srcs/juloo.keyboard2/ExtraKeyCheckBoxPreference.java diff --git a/res/values/attrs.xml b/res/values/attrs.xml new file mode 100644 index 0000000..b012a7c --- /dev/null +++ b/res/values/attrs.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 78042ee..513b88f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -12,6 +12,7 @@ Hide accents Automatic capitalisation Press Shift at the beginning of a sentence + Add keys to the keyboard Keyboard layout for programming None Typing diff --git a/res/xml/settings.xml b/res/xml/settings.xml index 6a87c4f..afe1546 100644 --- a/res/xml/settings.xml +++ b/res/xml/settings.xml @@ -1,9 +1,26 @@ - + + + + + + + + + + + + + + + + + + diff --git a/srcs/juloo.keyboard2/Config.java b/srcs/juloo.keyboard2/Config.java index 9dbf556..0f2fd69 100644 --- a/srcs/juloo.keyboard2/Config.java +++ b/srcs/juloo.keyboard2/Config.java @@ -47,7 +47,8 @@ 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; // 'null' means all the keys + public Set extra_keys_subtype; + public Set extra_keys_param; public final IKeyEventHandler handler; @@ -81,7 +82,7 @@ final class Config actionLabel = null; actionId = 0; swapEnterActionKey = false; - extra_keys = null; + extra_keys_subtype = null; handler = h; } @@ -149,6 +150,7 @@ final class Config accents = Integer.valueOf(prefs.getString("accents", "1")); theme = getThemeId(res, prefs.getString("theme", "")); autocapitalisation = prefs.getBoolean("autocapitalisation", true); + extra_keys_param = ExtraKeyCheckBoxPreference.get_extra_keys(prefs); } /** Update the layout according to the configuration. @@ -164,7 +166,9 @@ final class Config KeyValue.getKeyByName("action").withSymbol(actionLabel); // Extra keys are removed from the set as they are encountered during the // first iteration then automatically added. - final Set extra_keys = new HashSet(this.extra_keys); + final Set extra_keys = new HashSet(); + extra_keys.addAll(extra_keys_subtype); + extra_keys.addAll(extra_keys_param); KeyboardData kw = original_kw.mapKeys(new KeyboardData.MapKeyValues() { public KeyValue apply(KeyValue key, boolean localized) { diff --git a/srcs/juloo.keyboard2/EmojiKeyButton.java b/srcs/juloo.keyboard2/EmojiKeyButton.java index 7fd3583..4463169 100644 --- a/srcs/juloo.keyboard2/EmojiKeyButton.java +++ b/srcs/juloo.keyboard2/EmojiKeyButton.java @@ -18,7 +18,7 @@ public class EmojiKeyButton extends Button _key = (key_name == null) ? null : KeyValue.getKeyByName(key_name); setText(_key.getString()); if (_key.hasFlags(KeyValue.FLAG_KEY_FONT)) - setTypeface(Theme.getSpecialKeyFont(context)); + setTypeface(Theme.getKeyFont(context)); } public void onClick(View v) diff --git a/srcs/juloo.keyboard2/ExtraKeyCheckBoxPreference.java b/srcs/juloo.keyboard2/ExtraKeyCheckBoxPreference.java new file mode 100644 index 0000000..887476a --- /dev/null +++ b/srcs/juloo.keyboard2/ExtraKeyCheckBoxPreference.java @@ -0,0 +1,72 @@ +package juloo.keyboard2; + +import android.content.Context; +import android.content.res.TypedArray; +import android.content.SharedPreferences; +import android.preference.CheckBoxPreference; +import android.util.AttributeSet; +import android.view.View; +import android.widget.TextView; +import java.util.HashSet; +import java.util.Set; + +public class ExtraKeyCheckBoxPreference extends CheckBoxPreference +{ + public static String[] extra_keys = new String[] + { + "accent_aigu", + "accent_grave", + "accent_double_aigu", + "accent_dot_above", + "accent_circonflexe", + "accent_tilde", + "accent_cedille", + "accent_trema", + "accent_ring", + "accent_caron", + "accent_macron", + "accent_ogonek", + "€", + "ß", + "£" + }; + + boolean _key_font; + + public ExtraKeyCheckBoxPreference(Context context, AttributeSet attrs) + { + super(context, attrs); + final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ExtraKeyCheckBoxPreference); + int index = a.getInteger(R.styleable.ExtraKeyCheckBoxPreference_index, 0); + a.recycle(); + String key_name = extra_keys[index]; + setKey(pref_key_of_key_name(key_name)); + KeyValue kv = KeyValue.getKeyByName(key_name); + setTitle(kv.getString()); + _key_font = kv.hasFlags(KeyValue.FLAG_KEY_FONT); + } + + @Override + protected void onBindView(View view) + { + super.onBindView(view); + TextView title = (TextView)view.findViewById(android.R.id.title); + title.setTypeface(_key_font ? Theme.getKeyFont(getContext()) : null); + } + + static String pref_key_of_key_name(String key_name) + { + return "extra_key_" + key_name; + } + + public static Set get_extra_keys(SharedPreferences prefs) + { + HashSet ks = new HashSet(); + for (String key_name : extra_keys) + { + if (prefs.getBoolean(pref_key_of_key_name(key_name), false)) + ks.add(KeyValue.getKeyByName(key_name)); + } + return ks; + } +} diff --git a/srcs/juloo.keyboard2/Keyboard2.java b/srcs/juloo.keyboard2/Keyboard2.java index b2197a1..4140a45 100644 --- a/srcs/juloo.keyboard2/Keyboard2.java +++ b/srcs/juloo.keyboard2/Keyboard2.java @@ -117,7 +117,7 @@ public class Keyboard2 extends InputMethodService case 4: break; default: throw new IllegalArgumentException(); } - _config.extra_keys = extra_keys; + _config.extra_keys_subtype = extra_keys; if (enabled_subtypes.size() > 1) _config.shouldOfferSwitchingToNextInputMethod = true; } @@ -127,8 +127,8 @@ public class Keyboard2 extends InputMethodService // Fallback for the accents option: Only respect the "None" case switch (_config.accents) { - case 1: case 2: case 3: _config.extra_keys = null; break; - case 4: _config.extra_keys = new HashSet(); break; + case 1: case 2: case 3: _config.extra_keys_subtype = null; break; + case 4: _config.extra_keys_subtype = new HashSet(); break; } // Fallback for the layout option: Use qwerty in the "system settings" case _currentTextLayout = (_config.layout == -1) ? R.xml.qwerty : _config.layout; diff --git a/srcs/juloo.keyboard2/Theme.java b/srcs/juloo.keyboard2/Theme.java index 1461389..e7c7e7f 100644 --- a/srcs/juloo.keyboard2/Theme.java +++ b/srcs/juloo.keyboard2/Theme.java @@ -42,7 +42,7 @@ public class Theme s.recycle(); _keyLabelPaint = initLabelPaint(Paint.Align.CENTER, null); _keySubLabelPaint = initLabelPaint(Paint.Align.LEFT, null); - Typeface specialKeyFont = getSpecialKeyFont(context); + Typeface specialKeyFont = getKeyFont(context); _specialKeyLabelPaint = initLabelPaint(Paint.Align.CENTER, specialKeyFont); _specialKeySubLabelPaint = initLabelPaint(Paint.Align.LEFT, specialKeyFont); } @@ -69,14 +69,12 @@ public class Theme return (paint); } - private static Typeface _specialKeyFont = null; + private static Typeface _key_font = null; - static public Typeface getSpecialKeyFont(Context context) + static public Typeface getKeyFont(Context context) { - if (_specialKeyFont == null) - { - _specialKeyFont = Typeface.createFromAsset(context.getAssets(), "special_font.ttf"); - } - return _specialKeyFont; + if (_key_font == null) + _key_font = Typeface.createFromAsset(context.getAssets(), "special_font.ttf"); + return _key_font; } }