diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/AppearanceScreen.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/AppearanceScreen.java index 05f6c517..910d5107 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/AppearanceScreen.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/AppearanceScreen.java @@ -24,10 +24,11 @@ public class AppearanceScreen extends BaseScreenFragment { private void createMainSection() { (new ItemStatusIcon(findPreference(ItemStatusIcon.NAME), activity.getSettings())).populate(); + ItemHapticFeedback hapticFeedback = (new ItemHapticFeedback(findPreference(ItemHapticFeedback.NAME), activity.getSettings())).populate(); ItemDropDown[] items = { new ItemSelectTheme(findPreference(ItemSelectTheme.NAME), activity), - new ItemSelectLayoutType(findPreference(ItemSelectLayoutType.NAME), activity), + new ItemSelectLayoutType(findPreference(ItemSelectLayoutType.NAME), activity, hapticFeedback::populate), new ItemSelectSettingsFontSize(findPreference(ItemSelectSettingsFontSize.NAME), this) }; diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/ItemHapticFeedback.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/ItemHapticFeedback.java new file mode 100644 index 00000000..34c12a63 --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/ItemHapticFeedback.java @@ -0,0 +1,37 @@ +package io.github.sspanak.tt9.preferences.screens.appearance; + +import androidx.annotation.NonNull; +import androidx.preference.Preference; +import androidx.preference.SwitchPreferenceCompat; + +import io.github.sspanak.tt9.preferences.items.ItemClickable; +import io.github.sspanak.tt9.preferences.settings.SettingsStore; + +class ItemHapticFeedback extends ItemClickable { + static final String NAME = "pref_haptic_feedback"; + private final SettingsStore settings; + + ItemHapticFeedback(Preference item, @NonNull SettingsStore settings) { + super(item); + this.settings = settings; + } + + @Override + protected boolean onClick(Preference p) { + return true; + } + + ItemHapticFeedback populate() { + return populate(settings.getMainViewLayout()); + } + + + ItemHapticFeedback populate(int mainViewLayout) { + if (item != null) { + item.setEnabled(mainViewLayout == SettingsStore.LAYOUT_NUMPAD || mainViewLayout == SettingsStore.LAYOUT_SMALL); + ((SwitchPreferenceCompat) item).setChecked(settings.getHapticFeedback()); + } + + return this; + } +} diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/ItemSelectLayoutType.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/ItemSelectLayoutType.java index 828bedce..5d228c2e 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/ItemSelectLayoutType.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/ItemSelectLayoutType.java @@ -1,6 +1,7 @@ package io.github.sspanak.tt9.preferences.screens.appearance; import androidx.preference.DropDownPreference; +import androidx.preference.Preference; import java.util.LinkedHashMap; @@ -8,15 +9,18 @@ import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.preferences.PreferencesActivity; import io.github.sspanak.tt9.preferences.items.ItemDropDown; import io.github.sspanak.tt9.preferences.settings.SettingsUI; +import io.github.sspanak.tt9.util.ConsumerCompat; public class ItemSelectLayoutType extends ItemDropDown { public static final String NAME = "pref_layout_type"; private final PreferencesActivity activity; + private final ConsumerCompat onChange; - public ItemSelectLayoutType(DropDownPreference item, PreferencesActivity activity) { + public ItemSelectLayoutType(DropDownPreference item, PreferencesActivity activity, ConsumerCompat onChange) { super(item); this.activity = activity; + this.onChange = onChange; } public ItemDropDown populate() { @@ -31,4 +35,12 @@ public class ItemSelectLayoutType extends ItemDropDown { return this; } + + @Override + protected boolean onClick(Preference preference, Object newKey) { + if (onChange != null) { + onChange.accept(Integer.parseInt(newKey.toString())); + } + return super.onClick(preference, newKey); + } } diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java index 46ae4537..3700d6fb 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java @@ -32,6 +32,10 @@ public class SettingsUI extends SettingsTyping { } } + public boolean getHapticFeedback() { + return prefs.getBoolean("pref_haptic_feedback", true); + } + public int getSettingsFontSize() { int defaultSize = DeviceInfo.isQinF21() || DeviceInfo.isLgX100S() ? FONT_SIZE_LARGE : FONT_SIZE_DEFAULT; return getStringifiedInt("pref_font_size", defaultSize); diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftBackspaceKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftBackspaceKey.java index b82ef380..29da7472 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftBackspaceKey.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftBackspaceKey.java @@ -8,6 +8,7 @@ import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.languages.LanguageKind; public class SoftBackspaceKey extends SoftKey { + private boolean hold; public SoftBackspaceKey(Context context) { super(context); @@ -23,11 +24,25 @@ public class SoftBackspaceKey extends SoftKey { @Override final protected boolean handlePress() { - return handleHold(); + super.handlePress(); + hold = false; + return deleteText(); } @Override - final protected boolean handleHold() { + final protected void handleHold() { + hold = true; + deleteText(); + } + + @Override + final protected boolean handleRelease() { + vibrate(hold ? Vibration.getReleaseVibration() : Vibration.getNoVibration()); + hold = false; + return true; + } + + private boolean deleteText() { if (validateTT9Handler() && !tt9.onBackspace()) { // Limited or special numeric field (e.g. formatted money or dates) cannot always return // the text length, therefore onBackspace() seems them as empty and does nothing. This results @@ -39,11 +54,6 @@ public class SoftBackspaceKey extends SoftKey { return false; } - @Override - final protected boolean handleRelease() { - return false; - } - @Override protected int getNoEmojiTitle() { return R.string.virtual_key_del; diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftFilterKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftFilterKey.java index 638f2c1b..bda369fe 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftFilterKey.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftFilterKey.java @@ -16,18 +16,18 @@ public class SoftFilterKey extends SoftKey { } @Override - protected boolean handleHold() { - if (!validateTT9Handler()) { - return false; + protected void handleHold() { + preventRepeat(); + if (validateTT9Handler() && tt9.onKeyFilterClear(false)) { + vibrate(Vibration.getHoldVibration()); } - - return tt9.onKeyFilterClear(false); } @Override protected boolean handleRelease() { - boolean multiplePress = getLastPressedKey() == getId(); - return tt9.onKeyFilterSuggestions(false, multiplePress); + return + validateTT9Handler() + && tt9.onKeyFilterSuggestions(false, getLastPressedKey() == getId()); } @Override diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftInputModeKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftInputModeKey.java index 65cfcbdc..97c1c6c2 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftInputModeKey.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftInputModeKey.java @@ -19,15 +19,13 @@ public class SoftInputModeKey extends SoftKey { } @Override - protected boolean handleHold() { + protected void handleHold() { preventRepeat(); if (validateTT9Handler()) { + vibrate(Vibration.getHoldVibration()); tt9.changeKeyboard(); - return true; } - - return false; } @Override diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java index b4125522..6dc54e9c 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java @@ -9,6 +9,7 @@ import android.text.Spanned; import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; import android.util.AttributeSet; +import android.view.HapticFeedbackConstants; import android.view.MotionEvent; import android.view.View; @@ -36,14 +37,17 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement public SoftKey(Context context) { super(context); + setHapticFeedbackEnabled(false); } public SoftKey(Context context, AttributeSet attrs) { super(context, attrs); + setHapticFeedbackEnabled(false); } public SoftKey(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + setHapticFeedbackEnabled(false); } @@ -51,12 +55,14 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement this.tt9 = tt9; } - public void setDarkTheme(boolean darkEnabled) { - int textColor = ContextCompat.getColor( - getContext(), - darkEnabled ? R.color.dark_button_text : R.color.button_text - ); - setTextColor(textColor); + + protected boolean validateTT9Handler() { + if (tt9 == null) { + Logger.w(LOG_TAG, "Traditional T9 handler is not set. Ignoring key press."); + return false; + } + + return true; } @@ -72,6 +78,7 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement } } + @Override public boolean onTouch(View view, MotionEvent event) { super.onTouchEvent(event); @@ -81,18 +88,18 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement if (action == MotionEvent.ACTION_DOWN) { return handlePress(); } else if (action == MotionEvent.ACTION_UP) { - preventRepeat(); - if (!repeat) { + if (!repeat || hold) { + hold = false; boolean result = handleRelease(); lastPressedKey = getId(); return result; } repeat = false; } - return false; } + @Override public boolean onLongClick(View view) { hold = true; @@ -103,6 +110,7 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement return true; } + /** * repeatOnLongPress * Repeatedly calls "handleHold()" upon holding the respective SoftKey, to simulate physical keyboard behavior. @@ -122,6 +130,7 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement } } + /** * preventRepeat * Prevents "handleHold()" from being called repeatedly when the SoftKey is being held. @@ -131,17 +140,23 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement repeatHandler.removeCallbacks(this::repeatOnLongPress); } + protected static int getLastPressedKey() { return lastPressedKey; } + protected boolean handlePress() { + if (validateTT9Handler()) { + vibrate(Vibration.getPressVibration(this)); + } + return false; } - protected boolean handleHold() { - return false; - } + + protected void handleHold() {} + protected boolean handleRelease() { if (!validateTT9Handler()) { @@ -149,29 +164,29 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement } int keyId = getId(); - if (keyId == R.id.soft_key_command_palette) return tt9.onKeyCommandPalette(false); - if (keyId == R.id.soft_key_settings) { tt9.showSettings(); return true; } if (keyId == R.id.soft_key_voice_input) { tt9.toggleVoiceInput(); return true; } return false; } - protected boolean validateTT9Handler() { - if (tt9 == null) { - Logger.w(LOG_TAG, "Traditional T9 handler is not set. Ignoring key press."); - return false; - } - return true; + public void setDarkTheme(boolean darkEnabled) { + int textColor = ContextCompat.getColor( + getContext(), + darkEnabled ? R.color.dark_button_text : R.color.button_text + ); + setTextColor(textColor); } + @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); setTextColor(getTextColors().withAlpha(enabled ? 255 : 80)); } + /** * getTitle * Generates the name of the key, for example: "OK", "Backspace", "1", etc... @@ -180,6 +195,7 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement return null; } + /** * getNoEmojiTitle * Generates a text representation of the key title, when emojis are not supported and getTitle() @@ -187,6 +203,7 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement */ protected int getNoEmojiTitle() { return 0; } + /** * getSubTitle * Generates a String describing what the key does. @@ -198,6 +215,7 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement return null; } + /** * Returns a meaningful key title depending on the current emoji support. */ @@ -210,6 +228,7 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement } } + /** * render * Sets the key label using "getTitle()" and "getSubtitle()" or if they both @@ -248,4 +267,11 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement setText(sb); } + + + protected void vibrate(int vibrationType) { + if (tt9 != null && tt9.getSettings().getHapticFeedback() && vibrationType != Vibration.getNoVibration()) { + getRootView().performHapticFeedback(vibrationType, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + } + } } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyArrow.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyArrow.java index e514968e..382fc731 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyArrow.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyArrow.java @@ -6,17 +6,36 @@ import android.util.AttributeSet; import io.github.sspanak.tt9.R; public class SoftKeyArrow extends SoftKey { + private boolean hold; + public SoftKeyArrow(Context context) { super(context); } public SoftKeyArrow(Context context, AttributeSet attrs) { super(context, attrs); } public SoftKeyArrow(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override - protected boolean handleRelease() { - return handleHold(); + protected boolean handlePress() { + hold = false; + return super.handlePress(); } @Override - protected boolean handleHold() { + protected void handleHold() { + hold = true; + moveCursor(); + } + + @Override + protected boolean handleRelease() { + if (hold) { + hold = false; + vibrate(Vibration.getReleaseVibration()); + return true; + } else { + return moveCursor(); + } + } + + private boolean moveCursor() { if (!validateTT9Handler()) { return false; } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeySettings.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeySettings.java index 3be55e6e..44d52ecb 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeySettings.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeySettings.java @@ -10,6 +10,15 @@ public class SoftKeySettings extends SoftKey { public SoftKeySettings(Context context, AttributeSet attrs) { super(context, attrs); } public SoftKeySettings(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } + @Override + protected boolean handleRelease() { + if (validateTT9Handler()) { + tt9.showSettings(); + return true; + } + + return false; + } @Override protected int getNoEmojiTitle() { diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftNumberKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftNumberKey.java index 3cd995ec..16d2a9fd 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftNumberKey.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftNumberKey.java @@ -28,18 +28,17 @@ public class SoftNumberKey extends SoftKey { } @Override - protected boolean handleHold() { + protected void handleHold() { int keyCode = Key.numberToCode(getUpsideDownNumber(getId())); if (keyCode < 0 || !validateTT9Handler()) { - return false; + return; } preventRepeat(); + vibrate(Vibration.getHoldVibration()); tt9.onKeyLongPress(keyCode, new KeyEvent(KeyEvent.ACTION_DOWN, keyCode)); tt9.onKeyUp(keyCode, new KeyEvent(KeyEvent.ACTION_UP, keyCode)); - - return true; } @Override diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftPunctuationKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftPunctuationKey.java index 4b520c39..684fb60f 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftPunctuationKey.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftPunctuationKey.java @@ -21,7 +21,7 @@ public class SoftPunctuationKey extends SoftKey { @Override protected boolean handleRelease() { - return tt9.onText(getKeyChar(), false); + return validateTT9Handler() && tt9.onText(getKeyChar(), false); } @Override diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/Vibration.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/Vibration.java new file mode 100644 index 00000000..ccc72316 --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/Vibration.java @@ -0,0 +1,31 @@ +package io.github.sspanak.tt9.ui.main.keys; + +import android.os.Build; +import android.view.HapticFeedbackConstants; + +class Vibration { + static int getNoVibration() { + return -1; + } + + static int getPressVibration(SoftKey key) { + return key instanceof SoftNumberKey ? HapticFeedbackConstants.KEYBOARD_TAP : HapticFeedbackConstants.VIRTUAL_KEY; + } + + static int getHoldVibration() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + return HapticFeedbackConstants.CONFIRM; + } else { + return HapticFeedbackConstants.VIRTUAL_KEY; + } + } + + + static int getReleaseVibration() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + return HapticFeedbackConstants.KEYBOARD_RELEASE; + } else { + return HapticFeedbackConstants.VIRTUAL_KEY; + } + } +} diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 63856d87..b953b626 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -141,4 +141,6 @@ Няма връзка с интернет Проблем с мрежовата връзка Изключване на микрофона… + Вибрация при натискане на виртуален клавиш + Вибрация diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 824a9e00..96beb432 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -21,6 +21,7 @@ Funktionstasten Unsichtbarer Modus Nur Wortliste + Vibrieren beim Drücken einer virtuellen Taste. Hilfe Dunkles Thema Automatische Buchstabenauswahl @@ -134,4 +135,5 @@ Keine Internetverbindung Spracheingabe ist nicht verfügbar Mikrofon ausschalten… + Vibration diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 1402bc06..6b422146 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -10,6 +10,7 @@ Teclas de función Modo invisible Solo lista de palabras + Vibrar al presionar una tecla virtual. Ayuda Grande Terminado @@ -141,4 +142,5 @@ Sin conexión a Internet La entrada de voz no está disponible Apagando el micrófono… + Vibración diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a509dd58..5b6865d8 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -20,6 +20,7 @@ Touches de fonction Invisible Seulement liste de mots + Vibrer lors de l\'appui sur une touche virtuelle. Aide Thème sombre Majuscules automatiques sur chaque ligne @@ -139,4 +140,5 @@ Pas de connexion Internet La saisie vocale n\'est pas disponible Désactivation du microphone… + Vibration diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 3fbd07e2..4ccb202c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -23,6 +23,7 @@ Tasti di funzione Invisibile Solo elenco delle parole + Vibrare alla pressione di un tasto virtuale. Aiuto Tema scuro Selezione automatica delle lettere @@ -134,5 +135,6 @@ Nessuna connessione Internet L\'input vocale non è disponibile Spegnimento del microfono… + Vibrazione diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 360575c3..b169e520 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -49,6 +49,7 @@ מקשי פונקציה מצב בלתי נראה רשימת מילים בלבד + לרטוט בעת לחיצה על מקש וירטואלי. עזרה סמל מצב @@ -144,4 +145,5 @@ אין חיבור לאינטרנט קלט קולי אינו זמין מכבה את המיקרופון… + רטט diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 5d54381c..ac9df84e 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -54,6 +54,7 @@ Funkcijos klavišai Nematomas režimas Tik žodžių sąrašas + Vibruoti paspaudus virtualų klavišą. Pagalba Atvirkštinė klavišų tvarka Įjunkite šį nustatymą jei pirmoje eilutėje turite 7–8–9, o ne 1–2–3. @@ -150,4 +151,5 @@ Nėra interneto ryšio Balso įvestis nėra prieinama Išjungiamas mikrofonas… + Vibracija diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 94ce49f0..6f2320c0 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -20,6 +20,7 @@ Functieknoppen Onzichtbare modus Alleen suggestielijst + Trillen bij het indrukken van een virtuele toets. Helpen Donker thema Automatische letterselectie @@ -132,4 +133,5 @@ Geen internetverbinding Spraakopvoer is niet beschikbaar Microfoon uitschakelen… + Trilling diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index fbc3cdf9..e6197d41 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -50,6 +50,7 @@ Teclas de função Modo invisível Apenas lista de palavras + Vibrar ao pressionar uma tecla virtual. Ajuda Ícone de status @@ -144,4 +145,5 @@ Sem conexão com a Internet A entrada de voz não está disponível Desligando o microfone… + Vibração diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index ac2cef1f..780fd752 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -20,6 +20,7 @@ Функциональные клавиши Невидимый режим Только список слов + Вибрировать при нажатии виртуальной клавиши. Помощь Темная тема Автоматические заглавные буквы на каждой строке @@ -141,4 +142,5 @@ Нет подключения к Интернету Голосовой ввод недоступен Отключение микрофона… + Вибрация diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 3053fe96..303f6821 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -21,6 +21,7 @@ İşlevsel Tuşlar Görünmez Sadece Tahminler + Sanal bir tuşa basıldığında titremek. Yardım Karanlık Tema Otomatik Harf Seçimi @@ -144,4 +145,5 @@ İnternet bağlantısı yok Sesli giriş kullanılamıyor Mikrofon kapatılıyor… + Titreşim diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 44ffde71..61e4c635 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -61,6 +61,7 @@ Функціональні клавіші Невидимий режим Лише список слів + Вібрувати при натисканні віртуальної клавіші. Допомога Зворотній порядок клавіш Використовуйте це налаштування, якщо у вас в першому ряді 7–8–9 замість 1–2–3. @@ -152,4 +153,5 @@ Немає підключення до Інтернету Голосовий ввід недоступний Вимикання мікрофона… + Вібрація diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 961b7f31..edee5268 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -64,6 +64,8 @@ Send with \"OK\" in Facebook Messenger Accidental Key Repeat Protection Off + Vibration + Vibrate when a virtual key is pressed. Help On-screen Layout Virtual numpad (BETA) diff --git a/app/src/main/res/xml/prefs_screen_appearance.xml b/app/src/main/res/xml/prefs_screen_appearance.xml index faaea6a4..47983920 100644 --- a/app/src/main/res/xml/prefs_screen_appearance.xml +++ b/app/src/main/res/xml/prefs_screen_appearance.xml @@ -10,6 +10,11 @@ app:key="pref_layout_type" app:title="@string/pref_layout" /> + +