New method for cycling symbols.

This commit is contained in:
2024-10-21 15:15:35 +02:00
parent 5d66997f77
commit 552fa0d94f
10 changed files with 725 additions and 230 deletions
+2 -2
View File
@@ -11,8 +11,8 @@ android {
minSdk 19
//noinspection OldTargetApi
targetSdk 34
versionCode 21
versionName "0.2.1"
versionCode 3
versionName "0.3"
}
buildTypes {
+1 -1
View File
@@ -27,7 +27,7 @@
<activity
android:name=".SettingsActivity"
android:exported="true"
android:exported="false"
android:label="@string/preferences_label">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -22,32 +22,27 @@ package cfpi_fpsi.eu.titanboard;
import android.annotation.SuppressLint;
import android.inputmethodservice.InputMethodService;
import android.os.Vibrator;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection;
import java.util.ArrayList;
import java.util.Set;
// TODO: Implement auto-correct.
// TODO: Implement auto-caps.
// TODO: Implement device recognition and a keymap picking based on it.
/**
* @noinspection deprecation
*/
public class InputMethod extends InputMethodService {
public MetaKeyManager mMetaKeyManager;
public KeymapManager mKeymapManager;
public String mCurrentLanguage;
private int mKeyCounter = 0;
public String mCurrentKeymap;
private SymbolCycler mSymbolCycler;
private boolean mRegularKeyPressed = false;
private InputView mInputView;
private Settings mSettings;
public InputView mInputView;
public Settings mSettings;
@Override
public void onCreate() {
@@ -56,6 +51,7 @@ public class InputMethod extends InputMethodService {
Vibrator mVibrator = (Vibrator) getBaseContext().getSystemService(VIBRATOR_SERVICE);
mMetaKeyManager = new MetaKeyManager(mVibrator);
mKeymapManager = new KeymapManager(getResources().getXml(R.xml.keymaps_titan));
mSymbolCycler = new SymbolCycler(this);
cycleKeymaps();
}
@@ -100,30 +96,17 @@ public class InputMethod extends InputMethodService {
mMetaKeyManager.adjustMetaStateAfterKeypress();
return true;
default:
ArrayList<String> mCurrentValues = getKeyValues(keyCode);
ArrayList<String> symbols = getKeyValues(keyCode);
if (mCurrentValues == null) {
if (symbols == null) {
return false;
}
mRegularKeyPressed = true;
if (event.getRepeatCount() == 0) {
conn.commitText(mCurrentValues.get(0), 1);
} else if (event.getRepeatCount() % 7 == 0) {
mKeyCounter++;
if (mKeyCounter >= mCurrentValues.size()) {
mKeyCounter = 0;
}
mInputView.updateSymbolsView(mCurrentValues, mKeyCounter);
ExtractedText text = conn.getExtractedText(new ExtractedTextRequest(), 0);
if (text != null) {
conn.setComposingRegion(text.selectionStart - 1, text.selectionStart);
conn.setComposingText(mCurrentValues.get(mKeyCounter), 1);
}
if (event.getRepeatCount() == 0 && !symbols.isEmpty()) {
conn.commitText(symbols.get(0), 1);
mSymbolCycler.startAutomaticCycling(symbols, conn);
}
return true;
@@ -135,36 +118,37 @@ public class InputMethod extends InputMethodService {
// there, and then select the next keymap.
ArrayList<String> selectedLanguages = mSettings.getSelectedKeymaps();
if (selectedLanguages.isEmpty() || mCurrentLanguage == null) {
mCurrentLanguage = "eu";
if (selectedLanguages.isEmpty() || mCurrentKeymap == null) {
mCurrentKeymap = getBaseContext().getResources().getString(R.string.keymap_default);
return;
}
int index = selectedLanguages.indexOf(mCurrentLanguage);
int index = selectedLanguages.indexOf(mCurrentKeymap);
if (index == selectedLanguages.size() - 1) {
index = 0;
} else {
++index;
}
mCurrentLanguage = selectedLanguages.get(index);
mCurrentKeymap = selectedLanguages.get(index);
}
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (mRegularKeyPressed) {
InputConnection conn = getCurrentInputConnection();
if (conn == null) {
return false;
}
conn.finishComposingText();
mMetaKeyManager.adjustMetaStateAfterKeypress();
mKeyCounter = 0;
mRegularKeyPressed = false;
mInputView.updateSymbolsView(null, 0);
}
InputConnection conn = getCurrentInputConnection();
if (conn == null) {
return false;
}
conn.finishComposingText();
mSymbolCycler.stopCycling();
mRegularKeyPressed = false;
mInputView.updateSymbolsView(null, 0);
mMetaKeyManager.updateMetaStateUp(keyCode, event);
mInputView.updateStateText();
@@ -179,9 +163,11 @@ public class InputMethod extends InputMethodService {
@Override
public void onStartInput(EditorInfo info, boolean restarting) {
super.onStartInput(info, restarting);
if (!mSettings.getSelectedKeymaps().contains(mCurrentLanguage)) {
if (!mSettings.getSelectedKeymaps().contains(mCurrentKeymap)) {
cycleKeymaps();
}
mInputView.updateStateText();
}
@@ -193,13 +179,13 @@ public class InputMethod extends InputMethodService {
private ArrayList<String> getKeyValues(int keyCode) {
if (mMetaKeyManager.getAlt().isActive()) {
return mKeymapManager.getKeyAlt(mCurrentLanguage, keyCode);
return mKeymapManager.getKeyAlt(mCurrentKeymap, keyCode);
}
if (mMetaKeyManager.getShift().isActive()) {
return mKeymapManager.getKeyShift(mCurrentLanguage, keyCode);
return mKeymapManager.getKeyShift(mCurrentKeymap, keyCode);
}
return mKeymapManager.getKeyBase(mCurrentLanguage, keyCode);
return mKeymapManager.getKeyBase(mCurrentKeymap, keyCode);
}
}
@@ -67,7 +67,7 @@ public class InputView extends RelativeLayout {
public void updateStateText() {
MetaKeyManager metaManager = mInputMethod.mMetaKeyManager;
KeymapManager keymapManager = mInputMethod.mKeymapManager;
String currentLanguage = mInputMethod.mCurrentLanguage;
String currentLanguage = mInputMethod.mCurrentKeymap;
mStateButton.setPaintFlags(mStateButton.getPaintFlags() & ~(Paint.UNDERLINE_TEXT_FLAG));
@@ -24,16 +24,21 @@ import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @noinspection deprecation
*/
public class Settings implements SharedPreferences.OnSharedPreferenceChangeListener {
private final SharedPreferences mPreferences;
private final Map<String, Object> mPreferenceValues;
private final Context mContext;
@SuppressWarnings("unchecked")
public Settings(Context context) {
mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
mContext = context;
SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
PreferenceManager.setDefaultValues(mContext, R.xml.preferences, false);
mPreferences.registerOnSharedPreferenceChangeListener(this);
mPreferenceValues = (Map<String, Object>) mPreferences.getAll();
}
@@ -46,24 +51,36 @@ public class Settings implements SharedPreferences.OnSharedPreferenceChangeListe
}
}
public Object getOrDefault(String key, Object defaultValue) {
Object value = mPreferenceValues.get(key);
return value == null ? defaultValue : value;
}
public boolean isAutoCapsEnabled() {
return (boolean) mPreferenceValues.get("auto_caps");
return (boolean) getOrDefault("auto_caps",
mContext.getResources().getBoolean(R.bool.auto_caps_default));
}
public boolean isAutoPeriodsEnabled() {
return (boolean) mPreferenceValues.get("auto_periods");
return (boolean) getOrDefault("auto_periods",
mContext.getResources().getBoolean(R.bool.auto_periods_default));
}
public boolean isAutocorrectEnabled() {
return (boolean) mPreferenceValues.get("auto_correct");
return (boolean) getOrDefault("auto_correct",
mContext.getResources().getBoolean(R.bool.autocorrect_default));
}
public int getLongClickSpeed() {
return Integer.parseInt((String) mPreferenceValues.get("long_click_speed"));
public int getCycleSpeed() {
return Integer.parseInt((String) getOrDefault("cycle_speed",
mContext.getResources().getString(R.string.cycle_speed_default)));
}
@SuppressWarnings("unchecked")
public ArrayList<String> getSelectedKeymaps() {
Set<String> selectedKeymaps = (Set<String>) mPreferenceValues.get("selected_keymaps");
Set<String> selectedKeymaps = (Set<String>)
getOrDefault("selected_keymaps",
mContext.getResources().getStringArray(R.array.selected_keymap_defaults));
return new ArrayList<>(selectedKeymaps);
}
}
@@ -0,0 +1,77 @@
/*
* An input method for the Unihertz Titan/physical keyboard phones
* Copyright (C) 2024 Emil Kosz
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package cfpi_fpsi.eu.titanboard;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection;
import java.util.ArrayList;
public class SymbolCycler extends Handler {
private final InputMethod mInputMethod;
private final SymbolCyclerRunnable mRunnable;
private int mIndex;
private ArrayList<String> mSymbols;
private InputConnection mConn;
public SymbolCycler(Context context) {
super(Looper.getMainLooper());
mInputMethod = (InputMethod) context;
mRunnable = new SymbolCyclerRunnable();
}
public void startAutomaticCycling(ArrayList<String> symbols, InputConnection conn) {
mSymbols = symbols;
mConn = conn;
mIndex = 0;
stopCycling();
postDelayed(mRunnable, mInputMethod.mSettings.getCycleSpeed());
}
public void stopCycling() {
removeCallbacks(mRunnable);
}
public void cycle() {
mIndex++;
if (mIndex == mSymbols.size()) {
mIndex = 0;
}
mInputMethod.mInputView.updateSymbolsView(mSymbols, mIndex);
ExtractedText text = mConn.getExtractedText(new ExtractedTextRequest(), 0);
if (text != null) {
mConn.setComposingRegion(text.selectionStart - 1, text.selectionStart);
mConn.setComposingText(mSymbols.get(mIndex), 1);
}
}
private class SymbolCyclerRunnable implements Runnable {
@Override
public void run() {
cycle();
postDelayed(this, mInputMethod.mSettings.getCycleSpeed());
}
}
}
+15 -8
View File
@@ -19,20 +19,27 @@
<resources>
<string-array name="available_keymap_labels">
<item>European</item>
<item>Phonetic Cyrillic</item>
<item>English</item>
<item>Russian (Phonetic)</item>
<item>French</item>
<item>Polish</item>
<item>Greek</item>
</string-array>
<string-array name="available_keymaps">
<item>eu</item>
<item>цp</item>
<item>en</item>
<item>ru</item>
<item>fr</item>
<item>pl</item>
<item>el</item>
</string-array>
<string-array name="available_keymap_defaults">
<item>eu</item>
<string-array name="selected_keymap_defaults">
<item>en</item>
<item>ru</item>
</string-array>
<string-array name="long_click_speed_labels">
<string-array name="cycle_speed_labels">
<item>200 ms</item>
<item>300 ms</item>
<item>400 ms</item>
@@ -41,7 +48,7 @@
<item>1000 ms</item>
</string-array>
<string-array name="long_click_speeds">
<string-array name="cycle_speeds">
<item>200</item>
<item>300</item>
<item>400</item>
+3 -2
View File
@@ -3,7 +3,7 @@
<string name="ime_label">Titanboard</string>
<string name="preferences_label">Titanboard preferences</string>
<string name="preferences_long_click_speed">Long click speed</string>
<string name="preferences_cycle_speed">Cycling speed</string>
<string name="preferences_auto_caps">Automatic capitalization</string>
<string name="preferences_auto_periods">Automatic periods</string>
<string name="preferences_auto_correct">Autocorrect</string>
@@ -13,5 +13,6 @@
<string name="inputview_symbols_latched_state">#?</string>
<string name="inputview_symbols_locked_state">#!</string>
<string name="long_click_speed_default">400</string>
<string name="keymap_default">en</string>
<string name="cycle_speed_default">500</string>
</resources>
+563 -156
View File
@@ -18,271 +18,160 @@
-->
<device-keymap-list>
<!-- European -->
<!-- Checked with German, French, Italian, Spanish, Polish, Romanian, Dutch, Serbo-Croatian,
Turkish, Hungarian, Swedish, Czech, Portuguese, Catalan, Serbian, Albanian. -->
<!-- English -->
<keymap
name="eu"
latched-name="Eu"
locked-name="EU">
<!-- Checked. -->
name="en"
latched-name="En"
locked-name="EN">
<key code="29"> <!-- A -->
<base value="a" />
<base value="ä" />
<base value="à" />
<base value="â" />
<base value="æ" />
<base value="á" />
<base value="ą" />
<base value="ă" />
<base value="å" />
<base value="ã" />
<base value="à" /> <!-- Used in loanwords -->
<base value="â" /> <!-- So is this -->
<base value="å" /> <!-- Rare, but used -->
<shift value="A" />
<shift value="Ä" />
<shift value="À" />
<shift value="Â" />
<shift value="Æ" />
<shift value="Á" />
<shift value="Ą" />
<shift value="Ă" />
<shift value="Å" />
<shift value="Ã" />
<alt value="@" />
</key>
<!-- Checked -->
<key code="30"> <!-- B -->
<base value="b" />
<shift value="B" />
<alt value="7" />
</key>
<!-- Checked -->
<key code="31"> <!-- C -->
<base value="c" />
<base value="ç" />
<base value="ć" />
<base value="č" />
<base value="ç" /> <!-- Used in loanwords, e.g. façade -->
<shift value="C" />
<shfit value="Ç" />
<shift value="Ć" />
<shift value="Č" />
<base value="Ç" />
<alt value="," />
<alt value="&amp;" />
</key>
<!-- Checked -->
<key code="32"> <!-- D -->
<base value="d" />
<base value="đ" />
<base value="ď" />
<shift value="D" />
<shift value="Đ" />
<shift value="Ď" />
<alt value="&quot;" />
<alt value="„" />
<alt value="“" />
<alt value="”" />
<alt value="«" />
<alt value="»" />
</key>
<!-- Checked -->
<key code="33"> <!-- E -->
<base value="e" />
<base value="é" />
<base value="è" />
<base value="ê" />
<base value="ë" />
<base value="ę" />
<base value="ě" />
<base value="é" /> <!-- Used in loanwords -->
<base value="è" /> <!-- So is this -->
<base value="ê" /> <!-- And this -->
<shift value="E" />
<shift value="É" />
<shift value="È" />
<shift value="Ê" />
<shift value="Ë" />
<shift value="Ę" />
<shift value="Ě" />
<alt value="_" />
<alt value="~" />
</key>
<!-- Checked -->
<key code="34"> <!-- F -->
<base value="f" />
<shift value="F" />
<alt value="+" />
<alt value="=" />
</key>
<!-- Checked -->
<key code="35"> <!-- G -->
<base value="g" />
<base value="ğ" />
<shift value="G" />
<shift value="Ğ" />
<alt value="*" />
<alt value="^" />
</key>
<!-- Checked -->
<key code="36"> <!-- H -->
<base value="h" />
<shift value="H" />
<alt value="#" />
<alt value="€" />
<alt value="$" />
<alt value="€" />
</key>
<!-- Checked -->
<key code="37"> <!-- I -->
<base value="i" />
<base value="î" />
<base value="ï" />
<base value="ì" />
<base value="í" />
<base value="ı" />
<base value="ï" /> <!-- Used in loanwords -->
<shift value="I" />
<shift value="Î" />
<shift value="Ï" />
<shift value="Ì" />
<shift value="Í" />
<shift value="I" />
<alt value="2" />
</key>
<!-- Checked -->
<key code="38"> <!-- J -->
<base value="j" />
<base value="j́" />
<shift value="J" />
<shift value="J́" />
<alt value="4" />
</key>
<!-- Checked -->
<key code="39"> <!-- K -->
<base value="k" />
<shift value="K" />
<alt value="5" />
</key>
<!-- Checked -->
<key code="40"> <!-- L -->
<base value="l" />
<base value="ł" />
<shift value="L" />
<shift value="Ł" />
<alt value="6" />
</key>
<!-- Checked -->
<key code="41"> <!-- M -->
<base value="m" />
<shift value="M" />
<alt value="9" />
</key>
<!-- Checked -->
<key code="42"> <!-- N -->
<base value="n" />
<base value="ñ" />
<base value="ń" />
<base value="ň" />
<base value="ñ" /> <!-- Used in loanwords -->
<shift value="N" />
<shift value="Ñ" />
<shift value="Ń" />
<shift value="Ň" />
<alt value="8" />
</key>
<!-- Checked -->
<key code="43"> <!-- O -->
<base value="o" />
<base value="ö" />
<base value="ô" />
<base value="œ" />
<base value="ò" />
<base value="ó" />
<base value="ő" />
<base value="õ" />
<base value="ø" />
<base value="ö" /> <!-- Used in loanwords -->
<shift value="O" />
<shift value="Ö" />
<shift value="Ô" />
<shift value="Œ" />
<shift value="Ò" />
<shift value="Ó" />
<shift value="Ő" />
<shift value="Õ" />
<shift value="Ø" />
<alt value="3" />
</key>
<!-- Checked -->
<key code="44"> <!-- P -->
<base value="p" />
<shift value="P" />
<alt value="0" />
</key>
<!-- Checked -->
<key code="45"> <!-- Q -->
<base value="q" />
<shift value="Q" />
<alt value=":" />
<alt value=";" />
</key>
<!-- Checked -->
<key code="46"> <!-- R -->
<base value="r" />
<base value="ř" />
<shift value="R" />
<shift value="Ř" />
<alt value="-" />
<alt value="–" />
<alt value="—" />
</key>
<!-- Checked -->
<key code="47"> <!-- S -->
<base value="s" />
<base value="ß" />
<base value="ś" />
<base value="ș" />
<base value="š" />
<base value="ş" />
<shift value="S" />
<shift value="ẞ" />
<shift value="Ś" />
<shift value="Ș" />
<shift value="Š" />
<shift value="Ş" />
<alt value="&apos;" />
<alt value="‚" />
<alt value="‘" />
<alt value="’" />
</key>
<!-- Checked -->
<key code="48"> <!-- T -->
<base value="t" />
<base value="ț" />
<base value="ť" />
<shift value="T" />
<shift value="Ț" />
<shift value="Ť" />
<alt value="(" />
<alt value="&lt;" />
<alt value="[" />
<alt value="{" />
</key>
<!-- Checked -->
<key code="49"> <!-- U -->
<base value="u" />
<base value="ü" />
<base value="ù" />
<base value="û" />
<base value="ú" />
<base value="ű" />
<base value="ů" />
<base value="û" /> <!-- Used in loanwords -->
<shift value="U" />
<shift value="Ü" />
<shift value="Ù" />
<shift value="Û" />
<shift value="Ú" />
<shift value="Ű" />
<shift value="Ů" />
<alt value="1" />
</key>
<!-- Checked -->
<key code="50"> <!-- V -->
<base value="v" />
<shift value="V" />
<alt value="." />
<alt value="…" />
</key>
<!-- Checked -->
<key code="51"> <!-- W -->
<base value="w" />
<shift value="W" />
@@ -290,48 +179,405 @@
<alt value="\\" />
<alt value="|" />
</key>
<!-- Checked -->
<key code="52"> <!-- X -->
<base value="x" />
<shift value="X" />
<alt value="?" />
<alt value="¿" />
</key>
<!-- Checked -->
<key code="53"> <!-- Y -->
<base value="y" />
<base value="ÿ" />
<base value="ý" />
<shift value="Y" />
<shift value="Ÿ" />
<shift value="Ý" />
<alt value=")" />
<alt value="&gt;" />
<alt value="]" />
<alt value="}" />
</key>
<!-- Checked -->
<key code="54"> <!-- Z -->
<base value="z" />
<shift value="Z" />
<alt value="!" />
</key>
</keymap>
<!-- French -->
<keymap
name="fr"
latched-name="Fr"
locked-name="FR">
<key code="29"> <!-- A -->
<base value="a" />
<base value="à" />
<base value="â" />
<base value="ä" />
<base value="æ" />
<shift value="A" />
<shift value="À" />
<shift value="Â" />
<shift value="Ä" />
<shift value="Æ" />
<alt value="@" />
</key>
<key code="30"> <!-- B -->
<base value="b" />
<shift value="B" />
<alt value="7" />
</key>
<key code="31"> <!-- C -->
<base value="c" />
<base value="ç" />
<shift value="C" />
<shift value="Ç" />
<alt value="," />
<alt value="&amp;" />
</key>
<key code="32"> <!-- D -->
<base value="d" />
<shift value="D" />
<alt value="&quot;" />
<alt value="«" />
<alt value="»" />
<alt value="“" />
<alt value="”" />
</key>
<key code="33"> <!-- E -->
<base value="e" />
<base value="é" />
<base value="è" />
<base value="ê" />
<base value="ë" />
<shift value="E" />
<shift value="É" />
<shift value="È" />
<shift value="Ê" />
<shift value="Ë" />
<alt value="_" />
<alt value="~" />
</key>
<key code="34"> <!-- F -->
<base value="f" />
<shift value="F" />
<alt value="+" />
<alt value="=" />
</key>
<key code="35"> <!-- G -->
<base value="g" />
<shift value="G" />
<alt value="*" />
<alt value="^" />
</key>
<key code="36"> <!-- H -->
<base value="h" />
<shift value="H" />
<alt value="#" />
<alt value="€" />
<alt value="$" />
</key>
<key code="37"> <!-- I -->
<base value="i" />
<base value="î" />
<base value="ï" />
<shift value="I" />
<shift value="Î" />
<shift value="Ï" />
<alt value="2" />
</key>
<key code="38"> <!-- J -->
<base value="j" />
<shift value="J" />
<alt value="4" />
</key>
<key code="39"> <!-- K -->
<base value="k" />
<shift value="K" />
<alt value="5" />
</key>
<key code="40"> <!-- L -->
<base value="l" />
<shift value="L" />
<alt value="6" />
</key>
<key code="41"> <!-- M -->
<base value="m" />
<shift value="M" />
<alt value="9" />
</key>
<key code="42"> <!-- N -->
<base value="n" />
<shift value="N" />
<alt value="8" />
</key>
<key code="43"> <!-- O -->
<base value="o" />
<base value="ô" />
<base value="œ" />
<shift value="O" />
<shift value="Ô" />
<shift value="Œ" />
<alt value="3" />
</key>
<key code="44"> <!-- P -->
<base value="p" />
<shift value="P" />
<alt value="0" />
</key>
<key code="45"> <!-- Q -->
<base value="q" />
<shift value="Q" />
<alt value=":" />
<alt value=";" />
</key>
<key code="46"> <!-- R -->
<base value="r" />
<shift value="R" />
<alt value="-" />
<alt value="–" />
<alt value="—" />
</key>
<key code="47"> <!-- S -->
<base value="s" />
<shift value="S" />
<alt value="&apos;" />
<alt value="‹" />
<alt value="›" />
<alt value="‘" />
<alt value="’" />
</key>
<key code="48"> <!-- T -->
<base value="t" />
<shift value="T" />
<alt value="(" />
<alt value="&lt;" />
<alt value="[" />
<alt value="{" />
</key>
<key code="49"> <!-- U -->
<base value="u" />
<base value="ù" />
<base value="û" />
<shift value="U" />
<shift value="Ù" />
<shift value="Û" />
<alt value="1" />
</key>
<key code="50"> <!-- V -->
<base value="v" />
<shift value="V" />
<alt value="." />
<alt value="…" />
</key>
<key code="51"> <!-- W -->
<base value="w" />
<shift value="W" />
<alt value="/" />
<alt value="\\" />
<alt value="|" />
</key>
<key code="52"> <!-- X -->
<base value="x" />
<shift value="X" />
<alt value="?" />
</key>
<key code="53"> <!-- Y -->
<base value="y" />
<base value="ÿ" />
<shift value="Y" />
<shift value="Ÿ" />
<alt value=")" />
<alt value="&gt;" />
<alt value="]" />
<alt value="}" />
</key>
<key code="54"> <!-- Z -->
<base value="z" />
<shift value="Z" />
<alt value="!" />
</key>
</keymap>
<!-- Polish -->
<keymap
name="pl"
latched-name="Pl"
locked-name="PL">
<key code="29"> <!-- A -->
<base value="a" />
<base value="ą" />
<shift value="A" />
<shift value="Ą" />
<alt value="@" />
</key>
<key code="30"> <!-- B -->
<base value="b" />
<shift value="B" />
<alt value="7" />
</key>
<key code="31"> <!-- C -->
<base value="c" />
<base value="ć" />
<shift value="C" />
<shift value="Ć" />
<alt value="," />
<alt value="&amp;" />
</key>
<key code="32"> <!-- D -->
<base value="d" />
<shift value="D" />
<alt value="&quot;" />
<alt value="„" />
<alt value="”" />
<alt value="«" />
<alt value="»" />
</key>
<key code="33"> <!-- E -->
<base value="e" />
<base value="ę" />
<shift value="E" />
<shift value="Ę" />
<alt value="_" />
<alt value="~" />
</key>
<key code="34"> <!-- F -->
<base value="f" />
<shift value="F" />
<alt value="+" />
<alt value="=" />
</key>
<key code="35"> <!-- G -->
<base value="g" />
<shift value="G" />
<alt value="*" />
<alt value="^" />
</key>
<key code="36"> <!-- H -->
<base value="h" />
<shift value="H" />
<alt value="#" />
<alt value="€" />
<alt value="$" />
</key>
<key code="37"> <!-- I -->
<base value="i" />
<shift value="I" />
<alt value="2" />
</key>
<key code="38"> <!-- J -->
<base value="j" />
<shift value="J" />
<alt value="4" />
</key>
<key code="39"> <!-- K -->
<base value="k" />
<shift value="K" />
<alt value="5" />
</key>
<key code="40"> <!-- L -->
<base value="l" />
<base value="ł" />
<shift value="L" />
<shift value="Ł" />
<alt value="6" />
</key>
<key code="41"> <!-- M -->
<base value="m" />
<shift value="M" />
<alt value="9" />
</key>
<key code="42"> <!-- N -->
<base value="n" />
<base value="ń" />
<shift value="N" />
<shift value="Ń" />
<alt value="8" />
</key>
<key code="43"> <!-- O -->
<base value="o" />
<base value="ó" />
<shift value="O" />
<shift value="Ó" />
<alt value="3" />
</key>
<key code="44"> <!-- P -->
<base value="p" />
<shift value="P" />
<alt value="0" />
</key>
<key code="45"> <!-- Q -->
<base value="q" />
<shift value="Q" />
<alt value=":" />
<alt value=";" />
</key>
<key code="46"> <!-- R -->
<base value="r" />
<shift value="R" />
<alt value="-" />
<alt value="–" />
<alt value="—" />
</key>
<key code="47"> <!-- S -->
<base value="s" />
<base value="ś" />
<shift value="S" />
<shift value="Ś" />
<alt value="&apos;" />
<alt value="‚" />
<alt value="’" />
</key>
<key code="48"> <!-- T -->
<base value="t" />
<shift value="T" />
<alt value="(" />
<alt value="&lt;" />
<alt value="[" />
<alt value="{" />
</key>
<key code="49"> <!-- U -->
<base value="u" />
<shift value="U" />
<alt value="1" />
</key>
<key code="50"> <!-- V -->
<base value="v" />
<shift value="V" />
<alt value="." />
<alt value="…" />
</key>
<key code="51"> <!-- W -->
<base value="w" />
<shift value="W" />
<alt value="/" />
<alt value="\\" />
<alt value="|" />
</key>
<key code="52"> <!-- X -->
<base value="x" />
<base value="ź" />
<shift value="X" />
<shift value="Ź" />
<alt value="?" />
</key>
<key code="53"> <!-- Y -->
<base value="y" />
<shift value="Y" />
<alt value=")" />
<alt value="&gt;" />
<alt value="]" />
<alt value="}" />
</key>
<key code="54"> <!-- Z -->
<base value="z" />
<base value="ż" />
<base value="ź" />
<base value="ž" />
<shift value="Z" />
<shift value="Ż" />
<shift value="Ź" />
<shift value="Ž" />
<alt value="!" />
<alt value="¡" />
</key>
</keymap>
<!-- Cyrillic phonetic -->
<!-- Russian (Phonetic) -->
<!-- https://en.wikipedia.org/wiki/Phonetic_keyboard_layout#Russian_Phonetic_Keyboard_2.0 -->
<keymap
name="цp"
latched-name="Цp"
locked-name="ЦP">
name="ru"
latched-name="Ru"
locked-name="RU">
<key code="29"> <!-- A -->
<base value="а" />
<base value="a" />
<shift value="A" />
<alt value="@" />
</key>
@@ -352,10 +598,10 @@
<base value="д" />
<shift value="Д" />
<alt value="&quot;" />
<alt value="„" />
<alt value="”" />
<alt value="«" />
<alt value="»" />
<alt value="„" />
<alt value="“" />
</key>
<key code="33"> <!-- E -->
<base value="e" />
@@ -383,6 +629,7 @@
<shift value="Ш" />
<shift value="Щ" />
<alt value="#" />
<alt value="₽" />
<alt value="€" />
<alt value="$" />
</key>
@@ -421,8 +668,8 @@
<alt value="8" />
</key>
<key code="43"> <!-- O -->
<base value="о" />
<shift value="О" />
<base value="o" />
<shift value="O" />
<alt value="3" />
</key>
<key code="44"> <!-- P -->
@@ -444,8 +691,8 @@
<alt value="—" />
</key>
<key code="47"> <!-- S -->
<base value="с" />
<shift value="С" />
<base value="c" />
<shift value="C" />
<alt value="&apos;" />
<alt value="‚" />
<alt value="’" />
@@ -484,7 +731,6 @@
<shift value="Х" />
<shift value="Ъ" />
<alt value="?" />
<alt value="¿" />
</key>
<key code="53"> <!-- Y -->
<base value="я" />
@@ -498,7 +744,168 @@
<base value="з" />
<shift value="З" />
<alt value="!" />
<alt value="¡" />
</key>
</keymap>
<!-- Greek -->
<!-- https://en.wikipedia.org/wiki/List_of_QWERTY_keyboard_language_variants#/media/File:Greek_keyboard_mono_3b.png -->
<!-- TODO: add diacritics -->
<keymap
name="el"
latched-name="El"
locked-name="EL">
<key code="29"> <!-- A -->
<base value="α" />
<shift value="Α" />
<alt value="@" />
</key>
<key code="30"> <!-- B -->
<base value="β" />
<shift value="Β" />
<alt value="7" />
</key>
<key code="31"> <!-- C -->
<base value="ψ" />
<shift value="Ψ" />
<alt value="," />
<alt value="&amp;" />
</key>
<key code="32"> <!-- D -->
<base value="δ" />
<shift value="Δ" />
<alt value="&quot;" />
<alt value="«" />
<alt value="»" />
<alt value="„" />
<alt value="“" />
</key>
<key code="33"> <!-- E -->
<base value="ε" />
<shift value="E" />
<alt value="_" />
<alt value="~" />
</key>
<key code="34"> <!-- F -->
<base value="φ" />
<shift value="Φ" />
<alt value="+" />
<alt value="=" />
</key>
<key code="35"> <!-- G -->
<base value="γ" />
<shift value="Γ" />
<alt value="*" />
<alt value="^" />
</key>
<key code="36"> <!-- H -->
<base value="η" />
<shift value="H" />
<alt value="#" />
<alt value="₽" />
<alt value="€" />
<alt value="$" />
</key>
<key code="37"> <!-- I -->
<base value="ι" />
<shift value="I" />
<alt value="2" />
</key>
<key code="38"> <!-- J -->
<base value="ξ" />
<shift value="Ξ" />
<alt value="4" />
</key>
<key code="39"> <!-- K -->
<base value="κ" />
<shift value="Κ" />
<alt value="5" />
</key>
<key code="40"> <!-- L -->
<base value="λ" />
<shift value="Λ" />
<alt value="6" />
</key>
<key code="41"> <!-- M -->
<base value="μ" />
<shift value="М" />
<alt value="9" />
</key>
<key code="42"> <!-- N -->
<base value="ν" />
<shift value="Ν" />
<alt value="8" />
</key>
<key code="43"> <!-- O -->
<base value="o" />
<shift value="O" />
<alt value="3" />
</key>
<key code="44"> <!-- P -->
<base value="π" />
<shift value="П" />
<alt value="0" />
</key>
<key code="45"> <!-- Q -->
<base value=";" />
<shift value=":" />
<alt value=":" />
<alt value=";" />
</key>
<key code="46"> <!-- R -->
<base value="ρ" />
<shift value="Ρ" />
<alt value="-" />
<alt value="–" />
<alt value="—" />
</key>
<key code="47"> <!-- S -->
<base value="σ" />
<shift value="Σ" />
<alt value="&apos;" />
<alt value="‚" />
<alt value="’" />
</key>
<key code="48"> <!-- T -->
<base value="τ" />
<shift value="Т" />
<alt value="(" />
<alt value="&lt;" />
<alt value="[" />
<alt value="{" />
</key>
<key code="49"> <!-- U -->
<base value="θ" />
<shift value="Θ" />
<alt value="1" />
</key>
<key code="50"> <!-- V -->
<base value="ω" />
<shift value="Ω" />
<alt value="." />
<alt value="…" />
</key>
<key code="51"> <!-- W -->
<base value="ς" />
<alt value="/" />
<alt value="\\" />
<alt value="|" />
</key>
<key code="52"> <!-- X -->
<base value="χ" />
<shift value="X" />
<alt value="?" />
</key>
<key code="53"> <!-- Y -->
<base value="υ" />
<shift value="Y" />
<alt value=")" />
<alt value="&gt;" />
<alt value="]" />
<alt value="}" />
</key>
<key code="54"> <!-- Z -->
<base value="ζ" />
<shift value="Z" />
<alt value="!" />
</key>
</keymap>
</device-keymap-list>
+6 -6
View File
@@ -32,13 +32,13 @@
android:key="autocorrect"
android:title="@string/preferences_auto_correct" />
<ListPreference
android:defaultValue="@string/long_click_speed_default"
android:entries="@array/long_click_speed_labels"
android:entryValues="@array/long_click_speeds"
android:key="long_click_speed"
android:title="@string/preferences_long_click_speed" />
android:defaultValue="@string/cycle_speed_default"
android:entries="@array/cycle_speed_labels"
android:entryValues="@array/cycle_speeds"
android:key="cycle_speed"
android:title="@string/preferences_cycle_speed" />
<MultiSelectListPreference
android:defaultValue="@array/available_keymap_defaults"
android:defaultValue="@array/selected_keymap_defaults"
android:entries="@array/available_keymap_labels"
android:entryValues="@array/available_keymaps"
android:key="selected_keymaps"