From dad5f57a036e3f0ad7278ccee5bd248192cbbad2 Mon Sep 17 00:00:00 2001 From: Jules Aguillon Date: Sat, 29 Jul 2023 18:37:06 +0200 Subject: [PATCH] Allow more than 2 layouts The two layout selection options are replaced by a ListGroupPreference that allow to enter an arbitrary amount of layouts. The "switch_second" and "switch_second_back" keys are replaced by "switch_forward" and "switch_backward", which allow to cycle through the selected layouts in two directions. Layouts are changed to place these two key on the space bar. The backward key is not shown if there's only two layouts. --- check_layout.py | 4 +- gen_layouts.py | 4 +- res/layout/pref_layouts_add_btn.xml | 4 + res/values-cs/strings.xml | 3 +- res/values-de/strings.xml | 3 +- res/values-es/strings.xml | 3 +- res/values-fa/strings.xml | 3 +- res/values-fr/strings.xml | 3 +- res/values-it/strings.xml | 3 +- res/values-ko/strings.xml | 3 +- res/values-lv/strings.xml | 3 +- res/values-pl/strings.xml | 3 +- res/values-pt/strings.xml | 3 +- res/values-ro/strings.xml | 3 +- res/values-ru/strings.xml | 3 +- res/values-tr/strings.xml | 3 +- res/values-vi/strings.xml | 3 +- res/values-zh-rCN/strings.xml | 3 +- res/values/layouts.xml | 4 +- res/values/strings.xml | 3 +- res/xml/bottom_row.xml | 2 +- res/xml/latn_bone.xml | 2 +- res/xml/latn_neo2.xml | 2 +- res/xml/settings.xml | 3 +- srcs/juloo.keyboard2/Config.java | 36 +++------ srcs/juloo.keyboard2/KeyValue.java | 8 +- srcs/juloo.keyboard2/Keyboard2.java | 51 +++++------- srcs/juloo.keyboard2/LayoutsPreference.java | 89 +++++++++++++++++++++ 28 files changed, 172 insertions(+), 85 deletions(-) create mode 100644 res/layout/pref_layouts_add_btn.xml create mode 100644 srcs/juloo.keyboard2/LayoutsPreference.java diff --git a/check_layout.py b/check_layout.py index f0c1a34..27a1f36 100644 --- a/check_layout.py +++ b/check_layout.py @@ -50,8 +50,8 @@ def check_layout(layout): bottom_row_keys = [ "ctrl", "fn", "switch_numeric", "change_method", "switch_emoji", - "config", "switch_second", "enter", "action", "left", "up", "right", - "down", "space" + "config", "switch_forward", "switch_backward", "enter", "action", + "left", "up", "right", "down", "space" ] if root.get("bottom_row") == "false": diff --git a/gen_layouts.py b/gen_layouts.py index a8f13c8..44c3563 100644 --- a/gen_layouts.py +++ b/gen_layouts.py @@ -54,10 +54,10 @@ def generate_arrays(out, layouts): item.text = s elem.append(item) return elem - none_item = [ ("none", "None") ] + none_item = [ ("system", "@string/pref_layout_e_system") ] custom_item = [ ("custom", "@string/pref_layout_e_custom") ] values_items, entries_items = zip(*(none_item + layouts + custom_item)) # unzip - ids_items = map(lambda s: "@xml/%s" % s if s not in ["none", "custom"] else "-1", values_items) + ids_items = map(lambda s: "@xml/%s" % s if s not in ["system", "custom"] else "-1", values_items) root = XML.Element("resources") root.append(XML.Comment(text="DO NOT EDIT. This file is generated, see gen_layouts.py.")) root.append(mk_array("string-array", "pref_layout_values", values_items)) diff --git a/res/layout/pref_layouts_add_btn.xml b/res/layout/pref_layouts_add_btn.xml new file mode 100644 index 0000000..ab1b271 --- /dev/null +++ b/res/layout/pref_layouts_add_btn.xml @@ -0,0 +1,4 @@ + + + + diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 45f74d2..3288b73 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -10,9 +10,10 @@ Upravit průhlednost pozadí klávesnice Upravit průhlednost kláves Upravit průhlednost stisknutých kláves - Změnit rozvržení klávesnice Dle nastavení systému Vlastní rozvržení + + (Univerzální) Diakritická znaménka Zobrazovat znaménka pro všechny instalované systémové jazyky Zobrazovat znaménka pouze pro současně zvolený jazyk diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index f6ee617..b7adf18 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -10,9 +10,10 @@ Deckkraft des Tastaturhintergrunds anpassen Deckkraft der Tasten anpassen Deckkraft gedrückter Tasten anpassen - Tastaturlayout ändern Systemeinstellung Eigenes Layout + + Akzente Akzente für alle installierten Sprachen anzeigen Akzente nur für die gewählte Sprache anzeigen diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index c54106b..76ea16a 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -10,9 +10,10 @@ Ajustar opacidad del fondo del teclado Ajustar opacidad de teclas Ajustar opacidad de teclas apretadas - Cambiar formato de teclado Ajustes del sistema Formato personalizado + + Acentos Mostrar acentos para todos los lenguajes instalados Solo mostrar acentos para el lenguaje seleccionado diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 0104a3c..b8203e7 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -10,9 +10,10 @@ تنظیم کدر بودن پس‌زمینه صفحه کلید تنظیم کدر بودن کلید تنظیم کدر بودن کلید فشرده شده - تغییر طرح صفحه کلید تنظیمات سامانه طرح صفارشی + + لهجه‌ها نمایش لهجه‌ها برای تمام زبان‌هی نصب شده فقط نمایش لهجه‌ها برای زبان‌های انتخاب شده diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 4619ca4..0245dce 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -10,9 +10,10 @@ Transparence du clavier Transparence des touches Transparence des touches pressées - Disposition des touches Paramètre système Disposition personnalisée + + Accents Afficher les accents pour les langues installées Afficher les accents pour la langue sélectionnée diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 51643df..8d3f23a 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -10,9 +10,10 @@ - Cambia layout tastiera Impostazioni di sistema + + Accenti Mostra accenti per tutte le lingue installate Mostra accenti solo per le lingue selezionate diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 686532b..9e95e5d 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -10,9 +10,10 @@ - 키보드 레이아웃 변경 시스템 세팅 + + 악센트 설치된 모든 언어의 악센트 표시 선택한 언어의 악센트만 표시 diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 10ec311..31ce651 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -10,9 +10,10 @@ Pielāgot tastatūras fona necaurredzamību Pielāgot taustiņu necaurredzamību Pielāgot piespiesta taustiņa necaurredzamību - Mainīt tastatūras izkārtojumu Ierīces iestatījumi Pielāgots izkārtojums + + Uzsvara zīmes Rādīt uzsvara zīmes visām uzstādītajām valodām Rādīt uzsvara zīmes tikai atlasītajām valodām diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index f5e4e7b..fed2600 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -10,9 +10,10 @@ Nieprzezroczystość tła klawiatury Nieprzezroczystość klawisza Nieprzezroczystość naciśniętego klawisza - Zmień układ klawiatury Systemowy Własny układ + + Znaki diakrytyczne Pokaż znaki diakryt. dla wszystkich zainstalowanych języków Pokaż znaki diakryt. tylko dla wybranego języka diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index cc5a21c..991a58b 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -10,9 +10,10 @@ Ajustar opacidade do fundo do teclado Ajustar opacidade das teclas Ajustar opacidade das teclas pressionadas - Mudar layout do teclado Mesmo do sistema Layout personalizado + + Acentos Mostrar acentos para todos os idiomas instalados Mostrar acentos só para o idioma selecionado diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 3347004..d56bda3 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -10,9 +10,10 @@ Modifică opacitatea fundalului tastaturii Modifică opacitatea tastelor Modifică opacitatea tastei apăsate - Schimbă aranjamentul tastaturii Setări de Sistem Aranjament personalizat + + Accente Arată accentele pentru toate limbile instalate Aratp accentele doar pentru limba selectată diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index ed6caed..a8d38f8 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -10,9 +10,10 @@ Изменить прозрачность фона Изменить прозрачность клавиш Изменить прозрачность нажатой клавиши - Изменить раскладку клавиатуры Системные настройки Пользовательская раскладка + + Акцент Показывать акценты для всех установленных языков Показывать акценты только для выбранного языка diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index b318866..8c729a0 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -10,9 +10,10 @@ - Klavye Düzenini Değiştir Sistem Ayarları + + Aksanlar Yüklü tüm dillerin aksanlarını göster Sadece seçili dilin aksanlarını göster diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 96fadbe..991fa60 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -10,9 +10,10 @@ Tùy chỉnh độ trong suốt của bàn phím Tùy chỉnh độ trong suốt của phím Tùy chỉnh độ trong suốt của phím khi nhấn - Thay đổi bố cục bàn phím Hệ thống Tùy chỉnh bố cục + + Dấu phụ Hiển thị cho các ngôn ngữ đã cài đặt Chỉ hiển thị cho các ngôn ngữ đã chọn diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 01bc65d..6140208 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -10,9 +10,10 @@ 调整键盘背景透明度 调整按键透明度 调整按下的按键的透明度 - 改变键盘布局 系统设置 自定义布局 + + 声调 显示所有安装的语言的声调符号 只显示选择的语言的声调符号 diff --git a/res/values/layouts.xml b/res/values/layouts.xml index 3a972be..4c9779f 100644 --- a/res/values/layouts.xml +++ b/res/values/layouts.xml @@ -2,7 +2,7 @@ - none + system latn_qwerty_us latn_colemak latn_dvorak @@ -43,7 +43,7 @@ custom - None + @string/pref_layout_e_system QWERTY (US) Colemak Dvorak diff --git a/res/values/strings.xml b/res/values/strings.xml index 6a280f5..a3e50d3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10,9 +10,10 @@ Adjust keyboard background opacity Adjust key opacity Adjust pressed key opacity - Change keyboard layout System settings Custom layout + Add an alternate layout + Layout %1$d: %2$s Accents Show accents for all installed languages Only show accents for the selected language diff --git a/res/xml/bottom_row.xml b/res/xml/bottom_row.xml index 56493dc..24705e1 100644 --- a/res/xml/bottom_row.xml +++ b/res/xml/bottom_row.xml @@ -2,7 +2,7 @@ - + diff --git a/res/xml/latn_bone.xml b/res/xml/latn_bone.xml index ea31131..9078f79 100644 --- a/res/xml/latn_bone.xml +++ b/res/xml/latn_bone.xml @@ -39,7 +39,7 @@ - + diff --git a/res/xml/latn_neo2.xml b/res/xml/latn_neo2.xml index 939e131..f8904f1 100644 --- a/res/xml/latn_neo2.xml +++ b/res/xml/latn_neo2.xml @@ -42,7 +42,7 @@ - + diff --git a/res/xml/settings.xml b/res/xml/settings.xml index e21e6a7..b735e5a 100644 --- a/res/xml/settings.xml +++ b/res/xml/settings.xml @@ -1,8 +1,7 @@ - - + diff --git a/srcs/juloo.keyboard2/Config.java b/srcs/juloo.keyboard2/Config.java index 09db10d..b38604b 100644 --- a/srcs/juloo.keyboard2/Config.java +++ b/srcs/juloo.keyboard2/Config.java @@ -8,6 +8,7 @@ import android.os.Build; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.KeyEvent; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -25,8 +26,8 @@ final class Config public final float sublabelTextSize; // From preferences - public KeyboardData layout; // Or 'null' for the system defaults - public KeyboardData second_layout; // Or 'null' for none + /** [null] represent the [system] layout. */ + public List layouts; public KeyboardData custom_layout; // Might be 'null' public boolean show_numpad = false; // From the 'numpad_layout' option, also apply to the numeric pane. @@ -56,7 +57,6 @@ final class Config // Dynamically set public boolean shouldOfferSwitchingToNextInputMethod; - public boolean shouldOfferSwitchingToSecond; public boolean shouldOfferVoiceTyping; public String actionLabel; // Might be 'null' public int actionId; // Meaningful only when 'actionLabel' isn't 'null' @@ -80,7 +80,6 @@ final class Config refresh(res); // initialized later shouldOfferSwitchingToNextInputMethod = false; - shouldOfferSwitchingToSecond = false; shouldOfferVoiceTyping = false; actionLabel = null; actionId = 0; @@ -116,8 +115,10 @@ final class Config { keyboardHeightPercent = _prefs.getInt("keyboard_height", 35); } - layout = layout_of_string(res, _prefs.getString("layout", "none")); - second_layout = tweak_secondary_layout(layout_of_string(res, _prefs.getString("second_layout", "none"))); + List layout_names = LayoutsPreference.load_from_preferences(_prefs); + layouts = new ArrayList(); + for (String l : layout_names) + layouts.add(layout_of_string(res, l)); custom_layout = KeyboardData.load_string(_prefs.getString("custom_layout", "")); inverse_numpad = _prefs.getString("numpad_layout", "default").equals("low_first"); number_row = _prefs.getBoolean("number_row", false); @@ -214,8 +215,10 @@ final class Config case ACTION: return (swapEnterActionKey && action_key != null) ? KeyValue.getKeyByName("enter") : action_key; - case SWITCH_SECOND: - return shouldOfferSwitchingToSecond ? key : null; + case SWITCH_FORWARD: + return (layouts.size() > 1) ? key : null; + case SWITCH_BACKWARD: + return (layouts.size() > 2) ? key : null; case SWITCH_VOICE_TYPING: return shouldOfferVoiceTyping ? key : null; } @@ -287,23 +290,6 @@ final class Config }); } - /** Modify a layout to turn it into a secondary layout by changing the - "switch_second" key. */ - KeyboardData tweak_secondary_layout(KeyboardData layout) - { - if (layout == null) - return null; - return layout.mapKeys(new KeyboardData.MapKeyValues() { - public KeyValue apply(KeyValue key, boolean localized) - { - if (key.getKind() == KeyValue.Kind.Event - && key.getEvent() == KeyValue.Event.SWITCH_SECOND) - return KeyValue.getKeyByName("switch_second_back"); - return key; - } - }); - } - private float get_dip_pref(DisplayMetrics dm, String pref_name, float def) { float value; diff --git a/srcs/juloo.keyboard2/KeyValue.java b/srcs/juloo.keyboard2/KeyValue.java index b3008ca..84a214b 100644 --- a/srcs/juloo.keyboard2/KeyValue.java +++ b/srcs/juloo.keyboard2/KeyValue.java @@ -15,8 +15,8 @@ final class KeyValue CHANGE_METHOD, CHANGE_METHOD_PREV, ACTION, - SWITCH_SECOND, - SWITCH_SECOND_BACK, + SWITCH_FORWARD, + SWITCH_BACKWARD, SWITCH_GREEKMATH, CAPS_LOCK, SWITCH_VOICE_TYPING, @@ -346,8 +346,8 @@ final class KeyValue case "switch_numeric": return eventKey("123+", Event.SWITCH_NUMERIC, FLAG_SMALLER_FONT); case "switch_emoji": return eventKey(0x01, Event.SWITCH_EMOJI, FLAG_SMALLER_FONT); case "switch_back_emoji": return eventKey("ABC", Event.SWITCH_BACK_EMOJI, 0); - case "switch_second": return eventKey(0x13, Event.SWITCH_SECOND, FLAG_SMALLER_FONT); - case "switch_second_back": return eventKey(0x14, Event.SWITCH_SECOND_BACK, FLAG_SMALLER_FONT); + case "switch_forward": return eventKey(0x13, Event.SWITCH_FORWARD, FLAG_SMALLER_FONT); + case "switch_backward": return eventKey(0x14, Event.SWITCH_BACKWARD, FLAG_SMALLER_FONT); case "switch_greekmath": return eventKey("πλ∇¬", Event.SWITCH_GREEKMATH, FLAG_SMALLER_FONT); case "change_method": return eventKey(0x09, Event.CHANGE_METHOD, FLAG_SMALLER_FONT); case "change_method_prev": return eventKey(0x09, Event.CHANGE_METHOD_PREV, FLAG_SMALLER_FONT); diff --git a/srcs/juloo.keyboard2/Keyboard2.java b/srcs/juloo.keyboard2/Keyboard2.java index 3606213..1b59e5e 100644 --- a/srcs/juloo.keyboard2/Keyboard2.java +++ b/srcs/juloo.keyboard2/Keyboard2.java @@ -30,7 +30,8 @@ public class Keyboard2 extends InputMethodService private KeyEventHandler _keyeventhandler; // If not 'null', the layout to use instead of [_currentTextLayout]. private KeyboardData _currentSpecialLayout; - private Current_text_layout _currentTextLayout; + /** Current layout index in [Config.layouts]. */ + private int _currentTextLayout; // Layout associated with the currently selected locale. Not 'null'. private KeyboardData _localeTextLayout; private ViewGroup _emojiPane = null; @@ -43,23 +44,31 @@ public class Keyboard2 extends InputMethodService { if (_currentSpecialLayout != null) return _currentSpecialLayout; - KeyboardData layout; - if (_currentTextLayout == Current_text_layout.SECONDARY) - layout = _config.second_layout; - else if (_config.layout == null) + KeyboardData layout = null; + if (_currentTextLayout >= _config.layouts.size()) + _currentTextLayout = 0; + if (_currentTextLayout < _config.layouts.size()) + layout = _config.layouts.get(_currentTextLayout); + if (layout == null) layout = _localeTextLayout; - else - layout = _config.layout; return _config.modify_layout(layout); } - void setTextLayout(Current_text_layout layout) + void setTextLayout(int l) { - _currentTextLayout = layout; + if (l == _currentTextLayout) + return; + _currentTextLayout = l; _currentSpecialLayout = null; _keyboardView.setKeyboard(current_layout()); } + void incrTextLayout(int delta) + { + int s = _config.layouts.size(); + setTextLayout((_currentTextLayout + delta + s) % s); + } + void setSpecialLayout(KeyboardData l) { _currentSpecialLayout = l; @@ -162,15 +171,6 @@ public class Keyboard2 extends InputMethodService if (default_layout == null) default_layout = loadLayout(R.xml.latn_qwerty_us); _localeTextLayout = default_layout; - if (_config.second_layout == null) - { - _config.shouldOfferSwitchingToSecond = false; - _currentTextLayout = Current_text_layout.PRIMARY; - } - else - { - _config.shouldOfferSwitchingToSecond = true; - } } private String actionLabel_of_imeAction(int action) @@ -419,13 +419,12 @@ public class Keyboard2 extends InputMethodService conn.performEditorAction(actionId); break; - case SWITCH_SECOND: - if (_config.second_layout != null) - setTextLayout(Current_text_layout.SECONDARY); + case SWITCH_FORWARD: + incrTextLayout(1); break; - case SWITCH_SECOND_BACK: - setTextLayout(Current_text_layout.PRIMARY); + case SWITCH_BACKWARD: + incrTextLayout(-1); break; case SWITCH_GREEKMATH: @@ -469,10 +468,4 @@ public class Keyboard2 extends InputMethodService { return View.inflate(new ContextThemeWrapper(this, _config.theme), layout, null); } - - private static enum Current_text_layout - { - PRIMARY, - SECONDARY - } } diff --git a/srcs/juloo.keyboard2/LayoutsPreference.java b/srcs/juloo.keyboard2/LayoutsPreference.java new file mode 100644 index 0000000..5d1d566 --- /dev/null +++ b/srcs/juloo.keyboard2/LayoutsPreference.java @@ -0,0 +1,89 @@ +package juloo.keyboard2; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.util.AttributeSet; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class LayoutsPreference extends ListGroupPreference +{ + static final String KEY = "layouts"; + static final List DEFAULT = Collections.singletonList("system"); + + /** Layout names as stored in the preferences. */ + String[] _layout_names; + /** Text displayed for each layout in the dialog list. */ + String[] _layout_display_names; + + public LayoutsPreference(Context ctx, AttributeSet attrs) + { + super(ctx, attrs); + setKey(KEY); + Resources res = ctx.getResources(); + _layout_names = res.getStringArray(R.array.pref_layout_values); + _layout_display_names = res.getStringArray(R.array.pref_layout_entries); + } + + public static List load_from_preferences(SharedPreferences prefs) + { + return load_from_preferences(KEY, prefs, DEFAULT); + } + + @Override + protected void onSetInitialValue(boolean restoreValue, Object defaultValue) + { + super.onSetInitialValue(restoreValue, defaultValue); + if (_values.size() == 0) + set_values(new ArrayList(DEFAULT), false); + } + + @Override + String label_of_value(String value, int i) + { + return getContext().getString(R.string.pref_layouts_item, i + 1, value); + } + + @Override + AddButton on_attach_add_button(AddButton prev_btn) + { + if (prev_btn == null) + return new LayoutsAddButton(getContext()); + return prev_btn; + } + + @Override + boolean should_allow_remove_item() + { + return (_values.size() > 1); + } + + void select(final SelectionCallback callback) + { + ArrayAdapter layouts = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, _layout_display_names); + new AlertDialog.Builder(getContext()) + .setView(R.layout.custom_extra_key_add_dialog) + .setAdapter(layouts, new DialogInterface.OnClickListener(){ + public void onClick(DialogInterface dialog, int which) + { + callback.select(_layout_names[which]); + } + }) + .show(); + } + + class LayoutsAddButton extends AddButton + { + public LayoutsAddButton(Context ctx) + { + super(ctx); + setLayoutResource(R.layout.pref_layouts_add_btn); + } + } +}