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);
+ }
+ }
+}