1
0
Fork 0

Arrow keys enhancements (#283)

* added suggestion operation hotkey settings; DPAD arrow keys are now fully configurable

* added on-screen keys for filtering and selecting suggestions

* added missing French translations
This commit is contained in:
Dimo Karaivanov 2023-06-09 14:29:39 +03:00 committed by GitHub
parent ea1cc663d4
commit 09e5e1b2ca
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 285 additions and 110 deletions

View file

@ -34,9 +34,52 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:paddingTop="@dimen/numpad_padding_top"
android:paddingBottom="@dimen/numpad_padding_bottom"> android:paddingBottom="@dimen/numpad_padding_bottom">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="HardcodedText,KeyboardInaccessibleWidget">
<io.github.sspanak.tt9.ui.main.keys.SoftKey
android:id="@+id/soft_key_left_arrow"
style="@android:style/Widget.Holo.Button.Borderless"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/key_dpad_left"
android:textSize="@dimen/soft_key_icon_size" />
<io.github.sspanak.tt9.ui.main.keys.SoftKey
android:id="@+id/soft_key_clear_filter"
style="@android:style/Widget.Holo.Button.Borderless"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Clear" />
<io.github.sspanak.tt9.ui.main.keys.SoftKey
android:id="@+id/soft_key_filter_suggestions"
style="@android:style/Widget.Holo.Button.Borderless"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Filter" />
<io.github.sspanak.tt9.ui.main.keys.SoftKey
android:id="@+id/soft_key_right_arrow"
style="@android:style/Widget.Holo.Button.Borderless"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/key_dpad_right"
android:textSize="@dimen/soft_key_icon_size" />
</LinearLayout>
<View
android:id="@+id/separator_0"
style="@style/numRowSeparator" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/numpad_key_height" android:layout_height="@dimen/numpad_key_height"

View file

@ -31,6 +31,10 @@
<string name="key_call">Зелена слушалка</string> <string name="key_call">Зелена слушалка</string>
<string name="function_add_word_key">Добавяне на нова дума</string> <string name="function_add_word_key">Добавяне на нова дума</string>
<string name="function_backspace_key">Триене на текст</string> <string name="function_backspace_key">Триене на текст</string>
<string name="function_filter_clear_key">Изчистване на филтър</string>
<string name="function_filter_suggestions_key">Филтриране на думи</string>
<string name="function_previous_suggestion_key">Предишна дума</string>
<string name="function_next_suggestion_key">Следваща дума</string>
<string name="function_next_language_key">Следващ eзик</string> <string name="function_next_language_key">Следващ eзик</string>
<string name="function_next_mode_key">Режим на писане</string> <string name="function_next_mode_key">Режим на писане</string>
<string name="function_show_settings_key">Настройки</string> <string name="function_show_settings_key">Настройки</string>

View file

@ -9,7 +9,6 @@
<string name="add_word_exist">Le mot «%1$s» est déjà dans le dictionnaire.</string> <string name="add_word_exist">Le mot «%1$s» est déjà dans le dictionnaire.</string>
<string name="add_word_title">Ajouter un mot</string> <string name="add_word_title">Ajouter un mot</string>
<string name="pref_category_about">À propos de l\'application</string> <string name="pref_category_about">À propos de l\'application</string>
<string name="pref_help">Aide</string> <string name="pref_help">Aide</string>
<string name="pref_dark_theme">Thème sombre</string> <string name="pref_dark_theme">Thème sombre</string>
@ -23,6 +22,7 @@
<string name="dictionary_load_title">Charger le dictionnaire</string> <string name="dictionary_load_title">Charger le dictionnaire</string>
<string name="dictionary_not_found">Echec du chargement. Dictionnaire «%1$s» introuvable.</string> <string name="dictionary_not_found">Echec du chargement. Dictionnaire «%1$s» introuvable.</string>
<string name="pref_category_function_keys">Raccourcis clavier</string> <string name="pref_category_function_keys">Raccourcis clavier</string>
<string name="pref_category_abc_mode">Saisie ABC</string>
<string name="pref_category_appearance">Apparance</string> <string name="pref_category_appearance">Apparance</string>
<string name="dictionary_load_bad_char">Echec du chargement. Mot inadmissible «%1$s» à la ligne %2$d de langue «%3$s».</string> <string name="dictionary_load_bad_char">Echec du chargement. Mot inadmissible «%1$s» à la ligne %2$d de langue «%3$s».</string>
<string name="dictionary_truncated">Le dictionaire est supprimé avec succès.</string> <string name="dictionary_truncated">Le dictionaire est supprimé avec succès.</string>
@ -30,6 +30,8 @@
<string name="dictionary_loading_indeterminate">Chargement du dictionnaire</string> <string name="dictionary_loading_indeterminate">Chargement du dictionnaire</string>
<string name="dictionary_load_cancelled">Chargement est annulé.</string> <string name="dictionary_load_cancelled">Chargement est annulé.</string>
<string name="pref_category_predictive_mode">Saisie intuitive</string> <string name="pref_category_predictive_mode">Saisie intuitive</string>
<string name="pref_abc_auto_accept">Sélection de lettre automatique</string>
<string name="pref_abc_auto_accept_summary">Ajouter automatiquement la lettre sélectionnée après un court délai.</string>
<string name="pref_auto_space">Espace automatique</string> <string name="pref_auto_space">Espace automatique</string>
<string name="pref_auto_text_case">Majuscules automatiques</string> <string name="pref_auto_text_case">Majuscules automatiques</string>
<string name="pref_auto_space_summary">Ajouter automatiquement un espace après signes de ponctuation et mots.</string> <string name="pref_auto_space_summary">Ajouter automatiquement un espace après signes de ponctuation et mots.</string>
@ -37,6 +39,17 @@
<string name="dictionary_missing_go_load_it">Pas de dictionnaire pour langue «%1$s». Veuillez le charger à l\'écran Paramètres.</string> <string name="dictionary_missing_go_load_it">Pas de dictionnaire pour langue «%1$s». Veuillez le charger à l\'écran Paramètres.</string>
<string name="pref_category_keypad">Clavier</string> <string name="pref_category_keypad">Clavier</string>
<string name="char_space">Espace</string> <string name="char_space">Espace</string>
<string name="function_add_word_key">Ajouter un mot</string>
<string name="function_backspace_key">Retour arrière</string>
<string name="function_filter_clear_key">Supprimer le filtre</string>
<string name="function_filter_suggestions_key">Filtrer les mots</string>
<string name="function_previous_suggestion_key">Mot précédent</string>
<string name="function_next_suggestion_key">Mot suivant</string>
<string name="function_next_language_key">Langue suivante</string>
<string name="function_next_mode_key">Mode de saisie suivant</string>
<string name="function_show_settings_key">Afficher les paramètres</string>
<string name="function_reset_keys_title">Restaurer les paramètres par défaut</string>
<string name="function_reset_keys_done">Paramètres par défaut sont restaurés.</string>
<string name="setup_keyboard_status">État</string> <string name="setup_keyboard_status">État</string>
<string name="setup_default_keyboard">Sélectionnez le clavier par défaut</string> <string name="setup_default_keyboard">Sélectionnez le clavier par défaut</string>
<string name="setup_tt9_on">Traditional T9 est activé</string> <string name="setup_tt9_on">Traditional T9 est activé</string>

View file

@ -43,6 +43,10 @@
<string name="dictionary_missing_go_load_it">Отсутствует словарь для языка «%1$s». Вы можете загрузить его в Настройках.</string> <string name="dictionary_missing_go_load_it">Отсутствует словарь для языка «%1$s». Вы можете загрузить его в Настройках.</string>
<string name="function_add_word_key">Добавить новое слово</string> <string name="function_add_word_key">Добавить новое слово</string>
<string name="function_backspace_key">Стереть</string> <string name="function_backspace_key">Стереть</string>
<string name="function_filter_clear_key">Удалить фильтр</string>
<string name="function_filter_suggestions_key">Фильтровать слова</string>
<string name="function_previous_suggestion_key">Предыдущее слово</string>
<string name="function_next_suggestion_key">Следующее слово</string>
<string name="function_next_language_key">Следующий язык</string> <string name="function_next_language_key">Следующий язык</string>
<string name="function_next_mode_key">Режим ввода</string> <string name="function_next_mode_key">Режим ввода</string>
<string name="function_show_settings_key">Настройки</string> <string name="function_show_settings_key">Настройки</string>

View file

@ -48,7 +48,11 @@
<string name="key_hold_key">(затиснути)</string> <string name="key_hold_key">(затиснути)</string>
<string name="function_add_word_key">Додати нове слово</string> <string name="function_add_word_key">Додати нове слово</string>
<string name="function_backspace_key">Стерти</string> <string name="function_backspace_key">Стерти</string>
<string name="function_next_language_key">Слідуюча мова</string> <string name="function_filter_clear_key">Видалити фільтр</string>
<string name="function_filter_suggestions_key">Фільтрувати слова</string>
<string name="function_previous_suggestion_key">Попереднє слово</string>
<string name="function_next_suggestion_key">Наступне слово</string>
<string name="function_next_language_key">Наступна мова</string>
<string name="function_next_mode_key">Режим вводу</string> <string name="function_next_mode_key">Режим вводу</string>
<string name="function_show_settings_key">Налаштування</string> <string name="function_show_settings_key">Налаштування</string>
<string name="function_reset_keys_done">Налаштування кнопок за замовчуванням відновлено</string> <string name="function_reset_keys_done">Налаштування кнопок за замовчуванням відновлено</string>

View file

@ -15,9 +15,9 @@
<dimen name="pref_summary_size">19sp</dimen> <dimen name="pref_summary_size">19sp</dimen>
<!-- Numpad --> <!-- Numpad -->
<dimen name="numpad_padding_top">5dp</dimen>
<dimen name="numpad_padding_bottom">15dp</dimen> <dimen name="numpad_padding_bottom">15dp</dimen>
<dimen name="numpad_key_height">56dp</dimen> <dimen name="numpad_key_height">56dp</dimen>
<dimen name="numpad_row_separator_margin">10dp</dimen>
<dimen name="numpad_candidate_font_size">17sp</dimen> <dimen name="numpad_candidate_font_size">17sp</dimen>
<dimen name="numpad_candidate_height">32dp</dimen> <dimen name="numpad_candidate_height">32dp</dimen>

View file

@ -56,6 +56,10 @@
<string name="function_add_word_key">Add Word key</string> <string name="function_add_word_key">Add Word key</string>
<string name="function_backspace_key">Backspace key</string> <string name="function_backspace_key">Backspace key</string>
<string name="function_filter_clear_key">Clear Filter key</string>
<string name="function_filter_suggestions_key">Filter Suggestions key</string>
<string name="function_previous_suggestion_key">Previous Suggestion key</string>
<string name="function_next_suggestion_key">Next Suggestion key</string>
<string name="function_next_language_key">Next Language key</string> <string name="function_next_language_key">Next Language key</string>
<string name="function_next_mode_key">Input Mode key</string> <string name="function_next_mode_key">Input Mode key</string>
<string name="function_show_settings_key">Show Settings key</string> <string name="function_show_settings_key">Show Settings key</string>
@ -73,6 +77,10 @@
<string name="key_none" translatable="false">--</string> <string name="key_none" translatable="false">--</string>
<string name="key_back">Back</string> <string name="key_back">Back</string>
<string name="key_call">Call</string> <string name="key_call">Call</string>
<string name="key_dpad_up" translatable="false"></string>
<string name="key_dpad_down" translatable="false"></string>
<string name="key_dpad_left" translatable="false"></string>
<string name="key_dpad_right" translatable="false"></string>
<string name="key_menu" translatable="false">Menu</string> <string name="key_menu" translatable="false">Menu</string>
<string name="key_soft_left" translatable="false">Left Func</string> <string name="key_soft_left" translatable="false">Left Func</string>
<string name="key_soft_right" translatable="false">Right Func</string> <string name="key_soft_right" translatable="false">Right Func</string>

View file

@ -11,4 +11,12 @@
<item name="android:layout_height">match_parent</item> <item name="android:layout_height">match_parent</item>
<item name="android:layout_width">1dp</item> <item name="android:layout_width">1dp</item>
</style> </style>
<style name="numRowSeparator">
<item name="android:layout_marginBottom">@dimen/numpad_row_separator_margin</item>
<item name="android:layout_marginLeft">@dimen/numpad_row_separator_margin</item>
<item name="android:layout_marginRight">@dimen/numpad_row_separator_margin</item>
<item name="android:layout_height">1dp</item>
<item name="android:layout_width">match_parent</item>
</style>
</resources> </resources>

View file

@ -14,6 +14,30 @@
app:layout="@layout/pref_dropdown" app:layout="@layout/pref_dropdown"
app:title="@string/function_backspace_key" /> app:title="@string/function_backspace_key" />
<DropDownPreference
app:iconSpaceReserved="false"
app:key="key_filter_clear"
app:layout="@layout/pref_dropdown"
app:title="@string/function_filter_clear_key" />
<DropDownPreference
app:iconSpaceReserved="false"
app:key="key_filter_suggestions"
app:layout="@layout/pref_dropdown"
app:title="@string/function_filter_suggestions_key" />
<DropDownPreference
app:iconSpaceReserved="false"
app:key="key_previous_suggestion"
app:layout="@layout/pref_dropdown"
app:title="@string/function_previous_suggestion_key" />
<DropDownPreference
app:iconSpaceReserved="false"
app:key="key_next_suggestion"
app:layout="@layout/pref_dropdown"
app:title="@string/function_next_suggestion_key" />
<DropDownPreference <DropDownPreference
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:key="key_next_language" app:key="key_next_language"

View file

@ -227,10 +227,10 @@ abstract class KeyPadHandler extends InputMethodService {
} }
switch (keyCode) { switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP: return onUp(); case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_DOWN: return onDown(); case KeyEvent.KEYCODE_DPAD_DOWN:
case KeyEvent.KEYCODE_DPAD_LEFT: return onLeft(); case KeyEvent.KEYCODE_DPAD_LEFT:
case KeyEvent.KEYCODE_DPAD_RIGHT: return onRight(keyRepeatCounter > 0); case KeyEvent.KEYCODE_DPAD_RIGHT: return onArrow(keyCode, keyRepeatCounter > 0);
case KeyEvent.KEYCODE_STAR: case KeyEvent.KEYCODE_STAR:
case KeyEvent.KEYCODE_POUND: return onOtherKey(keyCode); case KeyEvent.KEYCODE_POUND: return onOtherKey(keyCode);
} }
@ -273,14 +273,11 @@ abstract class KeyPadHandler extends InputMethodService {
abstract protected boolean shouldTrackLeftRight(); abstract protected boolean shouldTrackLeftRight();
// default hardware key handlers // default hardware key handlers
abstract protected boolean onArrow(int key, boolean repeat);
abstract public boolean onBackspace(); abstract public boolean onBackspace();
abstract public boolean onOK();
abstract protected boolean onUp();
abstract protected boolean onDown();
abstract protected boolean onLeft();
abstract protected boolean onRight(boolean repeat);
abstract protected boolean onNumber(int key, boolean hold, int repeat); abstract protected boolean onNumber(int key, boolean hold, int repeat);
abstract protected boolean onOtherKey(int keyCode); abstract public boolean onOK();
abstract protected boolean onOtherKey(int key);
// customized key handlers // customized key handlers
abstract protected boolean onKeyAddWord(); abstract protected boolean onKeyAddWord();

View file

@ -210,6 +210,21 @@ public class TraditionalT9 extends KeyPadHandler {
} }
public boolean onArrow(int key, boolean repeat) {
if (key == settings.getKeyFilterClear()) {
return onKeyFilterClear();
} else if (key == settings.getKeyFilterSuggestions()) {
return onKeyFilterSuggestions(repeat);
} else if (key == settings.getKeyPreviousSuggestion()) {
return onKeyPreviousSuggestion();
} else if (key == settings.getKeyNextSuggestion()) {
return onKeyNextSuggestion();
}
return false;
}
public boolean onBackspace() { public boolean onBackspace() {
// 1. Dialer fields seem to handle backspace on their own and we must ignore it, // 1. Dialer fields seem to handle backspace on their own and we must ignore it,
// otherwise, keyDown race condition occur for all keys. // otherwise, keyDown race condition occur for all keys.
@ -235,84 +250,6 @@ public class TraditionalT9 extends KeyPadHandler {
} }
public boolean onOK() {
cancelAutoAccept();
if (!isInputViewShown() && !textField.isThereText()) {
forceShowWindowIfHidden();
return true;
} else if (isSuggestionViewHidden()) {
return performOKAction();
}
String word = suggestionBar.getCurrentSuggestion();
mInputMode.onAcceptSuggestion(word);
commitCurrentSuggestion();
autoCorrectSpace(word, true, KeyEvent.KEYCODE_ENTER);
resetKeyRepeat();
return true;
}
protected boolean onUp() {
if (previousSuggestion()) {
cancelAutoAccept();
mInputMode.setWordStem(suggestionBar.getCurrentSuggestion(), true);
textField.setComposingTextWithHighlightedStem(suggestionBar.getCurrentSuggestion(), mInputMode);
return true;
}
return false;
}
protected boolean onDown() {
if (nextSuggestion()) {
cancelAutoAccept();
mInputMode.setWordStem(suggestionBar.getCurrentSuggestion(), true);
textField.setComposingTextWithHighlightedStem(suggestionBar.getCurrentSuggestion(), mInputMode);
return true;
}
return false;
}
protected boolean onLeft() {
cancelAutoAccept();
if (mInputMode.clearWordStem()) {
mInputMode.loadSuggestions(this::getSuggestions, getComposingText());
} else {
jumpBeforeComposingText();
}
return true;
}
protected boolean onRight(boolean repeat) {
cancelAutoAccept();
String filter;
if (repeat && !suggestionBar.getSuggestion(1).equals("")) {
filter = suggestionBar.getSuggestion(1);
} else {
filter = getComposingText();
}
if (mInputMode.setWordStem(filter, repeat)) {
mInputMode.loadSuggestions(this::getSuggestions, filter);
} else if (filter.length() == 0) {
mInputMode.reset();
}
return true;
}
/** /**
* onNumber * onNumber
* *
@ -355,6 +292,27 @@ public class TraditionalT9 extends KeyPadHandler {
} }
public boolean onOK() {
cancelAutoAccept();
if (!isInputViewShown() && !textField.isThereText()) {
forceShowWindowIfHidden();
return true;
} else if (isSuggestionViewHidden()) {
return performOKAction();
}
String word = suggestionBar.getCurrentSuggestion();
mInputMode.onAcceptSuggestion(word);
commitCurrentSuggestion();
autoCorrectSpace(word, true, KeyEvent.KEYCODE_ENTER);
resetKeyRepeat();
return true;
}
public boolean onOtherKey(int keyCode) { public boolean onOtherKey(int keyCode) {
cancelAutoAccept(); cancelAutoAccept();
@ -399,6 +357,70 @@ public class TraditionalT9 extends KeyPadHandler {
} }
public boolean onKeyFilterClear() {
if (!suggestionBar.hasElements()) {
return false;
}
cancelAutoAccept();
if (mInputMode.clearWordStem()) {
mInputMode.loadSuggestions(this::getSuggestions, getComposingText());
return true;
}
return false;
}
public boolean onKeyFilterSuggestions(boolean repeat) {
if (!suggestionBar.hasElements()) {
return false;
}
cancelAutoAccept();
String filter;
if (repeat && !suggestionBar.getSuggestion(1).equals("")) {
filter = suggestionBar.getSuggestion(1);
} else {
filter = getComposingText();
}
if (mInputMode.setWordStem(filter, repeat)) {
mInputMode.loadSuggestions(this::getSuggestions, filter);
} else if (filter.length() == 0) {
mInputMode.reset();
}
return true;
}
public boolean onKeyNextSuggestion() {
if (nextSuggestion()) {
cancelAutoAccept();
mInputMode.setWordStem(suggestionBar.getCurrentSuggestion(), true);
textField.setComposingTextWithHighlightedStem(suggestionBar.getCurrentSuggestion(), mInputMode);
return true;
}
return false;
}
public boolean onKeyPreviousSuggestion() {
if (previousSuggestion()) {
cancelAutoAccept();
mInputMode.setWordStem(suggestionBar.getCurrentSuggestion(), true);
textField.setComposingTextWithHighlightedStem(suggestionBar.getCurrentSuggestion(), mInputMode);
return true;
}
return false;
}
public boolean onKeyNextLanguage() { public boolean onKeyNextLanguage() {
if (nextLang()) { if (nextLang()) {
cancelAutoAccept(); cancelAutoAccept();
@ -660,17 +682,6 @@ public class TraditionalT9 extends KeyPadHandler {
} }
private void jumpBeforeComposingText() {
String word = getComposingText();
textField.setComposingText(word, 0);
textField.finishComposingText();
mInputMode.onAcceptSuggestion(word);
mInputMode.reset();
setSuggestions(null);
}
private void autoCorrectSpace(String currentWord, boolean isWordAcceptedManually, int nextKey) { private void autoCorrectSpace(String currentWord, boolean isWordAcceptedManually, int nextKey) {
if (mInputMode.shouldDeletePrecedingSpace(inputType)) { if (mInputMode.shouldDeletePrecedingSpace(inputType)) {
textField.deletePrecedingSpace(currentWord); textField.deletePrecedingSpace(currentWord);

View file

@ -160,10 +160,24 @@ public class SettingsStore {
return !prefs.getBoolean("hotkeys_initialized", false); return !prefs.getBoolean("hotkeys_initialized", false);
} }
public void setDefaultKeys(int addWord, int backspace, int nextInputMode, int nextLanguage, int showSettings) { public void setDefaultKeys(
int addWord,
int backspace,
int filterClear,
int filterSuggestions,
int previousSuggestion,
int nextSuggestion,
int nextInputMode,
int nextLanguage,
int showSettings
) {
prefsEditor prefsEditor
.putString(SectionKeymap.ITEM_ADD_WORD, String.valueOf(addWord)) .putString(SectionKeymap.ITEM_ADD_WORD, String.valueOf(addWord))
.putString(SectionKeymap.ITEM_BACKSPACE, String.valueOf(backspace)) .putString(SectionKeymap.ITEM_BACKSPACE, String.valueOf(backspace))
.putString(SectionKeymap.ITEM_FILTER_CLEAR, String.valueOf(filterClear))
.putString(SectionKeymap.ITEM_FILTER_SUGGESTIONS, String.valueOf(filterSuggestions))
.putString(SectionKeymap.ITEM_PREVIOUS_SUGGESTION, String.valueOf(previousSuggestion))
.putString(SectionKeymap.ITEM_NEXT_SUGGESTION, String.valueOf(nextSuggestion))
.putString(SectionKeymap.ITEM_NEXT_INPUT_MODE, String.valueOf(nextInputMode)) .putString(SectionKeymap.ITEM_NEXT_INPUT_MODE, String.valueOf(nextInputMode))
.putString(SectionKeymap.ITEM_NEXT_LANGUAGE, String.valueOf(nextLanguage)) .putString(SectionKeymap.ITEM_NEXT_LANGUAGE, String.valueOf(nextLanguage))
.putString(SectionKeymap.ITEM_SHOW_SETTINGS, String.valueOf(showSettings)) .putString(SectionKeymap.ITEM_SHOW_SETTINGS, String.valueOf(showSettings))
@ -185,6 +199,18 @@ public class SettingsStore {
public int getKeyBackspace() { public int getKeyBackspace() {
return getFunctionKey(SectionKeymap.ITEM_BACKSPACE); return getFunctionKey(SectionKeymap.ITEM_BACKSPACE);
} }
public int getKeyFilterClear() {
return getFunctionKey(SectionKeymap.ITEM_FILTER_CLEAR);
}
public int getKeyFilterSuggestions() {
return getFunctionKey(SectionKeymap.ITEM_FILTER_SUGGESTIONS);
}
public int getKeyPreviousSuggestion() {
return getFunctionKey(SectionKeymap.ITEM_PREVIOUS_SUGGESTION);
}
public int getKeyNextSuggestion() {
return getFunctionKey(SectionKeymap.ITEM_NEXT_SUGGESTION);
}
public int getKeyNextInputMode() { public int getKeyNextInputMode() {
return getFunctionKey(SectionKeymap.ITEM_NEXT_INPUT_MODE); return getFunctionKey(SectionKeymap.ITEM_NEXT_INPUT_MODE);
} }
@ -195,6 +221,7 @@ public class SettingsStore {
return getFunctionKey(SectionKeymap.ITEM_SHOW_SETTINGS); return getFunctionKey(SectionKeymap.ITEM_SHOW_SETTINGS);
} }
/************* UI settings *************/ /************* UI settings *************/
public boolean getDarkTheme() { return prefs.getBoolean("pref_dark_theme", true); } public boolean getDarkTheme() { return prefs.getBoolean("pref_dark_theme", true); }

View file

@ -43,24 +43,36 @@ public class Hotkeys {
/** /**
* setDefault * setDefault
* Applies the default hotkey scheme. * Applies the default hotkey scheme.
*
* When a standard "Backspace" hardware key is available, "Backspace" hotkey association is not necessary, * When a standard "Backspace" hardware key is available, "Backspace" hotkey association is not necessary,
* so it will be left out blank, to allow the hardware key do its job. * so it will be left out blank, to allow the hardware key do its job.
* When the on-screen keyboard is on, "Back" is also not associated, because it will cause weird user * When the on-screen keyboard is on, "Back" is also not associated, because it will cause weird user
* experience. Instead the on-screen "Backspace" key can be used. * experience. Instead the on-screen "Backspace" key can be used.
*
* Arrow keys for manipulating suggestions are also assigned only if available.
*/ */
public static void setDefault(SettingsStore settings) { public static void setDefault(SettingsStore settings) {
int backspaceKeyCode = KeyEvent.KEYCODE_BACK; int backspace = KeyEvent.KEYCODE_BACK;
if ( if (
KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_CLEAR) KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_CLEAR)
|| KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_DEL) || KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_DEL)
|| settings.getShowSoftNumpad() || settings.getShowSoftNumpad()
) { ) {
backspaceKeyCode = 0; backspace = 0;
} }
int clearFilter = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_DPAD_LEFT) && !settings.getShowSoftNumpad() ? KeyEvent.KEYCODE_DPAD_LEFT : 0;
int filter = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_DPAD_RIGHT) && !settings.getShowSoftNumpad() ? KeyEvent.KEYCODE_DPAD_RIGHT : 0;
int nextSuggestion = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_DPAD_UP) && !settings.getShowSoftNumpad() ? KeyEvent.KEYCODE_DPAD_UP : 0;
int previousSuggestion = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_DPAD_DOWN) && !settings.getShowSoftNumpad() ? KeyEvent.KEYCODE_DPAD_DOWN : 0;
settings.setDefaultKeys( settings.setDefaultKeys(
KeyEvent.KEYCODE_STAR, KeyEvent.KEYCODE_STAR,
backspaceKeyCode, backspace,
clearFilter,
filter,
nextSuggestion,
previousSuggestion,
KeyEvent.KEYCODE_POUND, KeyEvent.KEYCODE_POUND,
-KeyEvent.KEYCODE_POUND, // negative means "hold" -KeyEvent.KEYCODE_POUND, // negative means "hold"
-KeyEvent.KEYCODE_STAR -KeyEvent.KEYCODE_STAR
@ -140,20 +152,27 @@ public class Hotkeys {
addIfDeviceHasKey(KeyEvent.KEYCODE_F2, "F2", true); addIfDeviceHasKey(KeyEvent.KEYCODE_F2, "F2", true);
addIfDeviceHasKey(KeyEvent.KEYCODE_F3, "F3", true); addIfDeviceHasKey(KeyEvent.KEYCODE_F3, "F3", true);
addIfDeviceHasKey(KeyEvent.KEYCODE_F4, "F4", true); addIfDeviceHasKey(KeyEvent.KEYCODE_F4, "F4", true);
addIfDeviceHasKey(KeyEvent.KEYCODE_MENU, R.string.key_menu, true); addIfDeviceHasKey(KeyEvent.KEYCODE_MENU, R.string.key_menu, true);
addIfDeviceHasKey(KeyEvent.KEYCODE_SOFT_LEFT, R.string.key_soft_left, false); addIfDeviceHasKey(KeyEvent.KEYCODE_SOFT_LEFT, R.string.key_soft_left, false);
addIfDeviceHasKey(KeyEvent.KEYCODE_SOFT_RIGHT, R.string.key_soft_right, false); addIfDeviceHasKey(KeyEvent.KEYCODE_SOFT_RIGHT, R.string.key_soft_right, false);
addIfDeviceHasKey(KeyEvent.KEYCODE_VOLUME_DOWN, R.string.key_volume_down, false);
addIfDeviceHasKey(KeyEvent.KEYCODE_VOLUME_UP, R.string.key_volume_up, false);
add(KeyEvent.KEYCODE_POUND, "#", true); add(KeyEvent.KEYCODE_POUND, "#", true);
add(KeyEvent.KEYCODE_STAR, "", true); add(KeyEvent.KEYCODE_STAR, "", true);
addIfDeviceHasKey(KeyEvent.KEYCODE_DPAD_UP, R.string.key_dpad_up, false);
addIfDeviceHasKey(KeyEvent.KEYCODE_DPAD_DOWN, R.string.key_dpad_down, false);
addIfDeviceHasKey(KeyEvent.KEYCODE_DPAD_LEFT, R.string.key_dpad_left, false);
addIfDeviceHasKey(KeyEvent.KEYCODE_DPAD_RIGHT, R.string.key_dpad_right, false);
addIfDeviceHasKey(KeyEvent.KEYCODE_NUMPAD_ADD, "Num +", true); addIfDeviceHasKey(KeyEvent.KEYCODE_NUMPAD_ADD, "Num +", true);
addIfDeviceHasKey(KeyEvent.KEYCODE_NUMPAD_SUBTRACT, "Num -", true); addIfDeviceHasKey(KeyEvent.KEYCODE_NUMPAD_SUBTRACT, "Num -", true);
addIfDeviceHasKey(KeyEvent.KEYCODE_NUMPAD_MULTIPLY, "Num *", true); addIfDeviceHasKey(KeyEvent.KEYCODE_NUMPAD_MULTIPLY, "Num *", true);
addIfDeviceHasKey(KeyEvent.KEYCODE_NUMPAD_DIVIDE, "Num /", true); addIfDeviceHasKey(KeyEvent.KEYCODE_NUMPAD_DIVIDE, "Num /", true);
addIfDeviceHasKey(KeyEvent.KEYCODE_NUMPAD_DOT, "Num .", true); addIfDeviceHasKey(KeyEvent.KEYCODE_NUMPAD_DOT, "Num .", true);
addIfDeviceHasKey(KeyEvent.KEYCODE_VOLUME_DOWN, R.string.key_volume_down, false);
addIfDeviceHasKey(KeyEvent.KEYCODE_VOLUME_UP, R.string.key_volume_up, false);
} }
} }

View file

@ -15,6 +15,10 @@ import io.github.sspanak.tt9.preferences.helpers.Hotkeys;
public class SectionKeymap { public class SectionKeymap {
public static final String ITEM_ADD_WORD = "key_add_word"; public static final String ITEM_ADD_WORD = "key_add_word";
public static final String ITEM_BACKSPACE = "key_backspace"; public static final String ITEM_BACKSPACE = "key_backspace";
public static final String ITEM_FILTER_CLEAR = "key_filter_clear";
public static final String ITEM_FILTER_SUGGESTIONS = "key_filter_suggestions";
public static final String ITEM_PREVIOUS_SUGGESTION = "key_previous_suggestion";
public static final String ITEM_NEXT_SUGGESTION = "key_next_suggestion";
public static final String ITEM_NEXT_INPUT_MODE = "key_next_input_mode"; public static final String ITEM_NEXT_INPUT_MODE = "key_next_input_mode";
public static final String ITEM_NEXT_LANGUAGE = "key_next_language"; public static final String ITEM_NEXT_LANGUAGE = "key_next_language";
public static final String ITEM_SHOW_SETTINGS = "key_show_settings"; public static final String ITEM_SHOW_SETTINGS = "key_show_settings";

View file

@ -21,6 +21,10 @@ public class HotkeysScreen extends BaseScreenFragment {
DropDownPreference[] dropDowns = { DropDownPreference[] dropDowns = {
findPreference(SectionKeymap.ITEM_ADD_WORD), findPreference(SectionKeymap.ITEM_ADD_WORD),
findPreference(SectionKeymap.ITEM_BACKSPACE), findPreference(SectionKeymap.ITEM_BACKSPACE),
findPreference(SectionKeymap.ITEM_FILTER_CLEAR),
findPreference(SectionKeymap.ITEM_FILTER_SUGGESTIONS),
findPreference(SectionKeymap.ITEM_PREVIOUS_SUGGESTION),
findPreference(SectionKeymap.ITEM_NEXT_SUGGESTION),
findPreference(SectionKeymap.ITEM_NEXT_INPUT_MODE), findPreference(SectionKeymap.ITEM_NEXT_INPUT_MODE),
findPreference(SectionKeymap.ITEM_NEXT_LANGUAGE), findPreference(SectionKeymap.ITEM_NEXT_LANGUAGE),
findPreference(SectionKeymap.ITEM_SHOW_SETTINGS), findPreference(SectionKeymap.ITEM_SHOW_SETTINGS),

View file

@ -78,6 +78,7 @@ class MainLayoutNumpad extends BaseMainLayout {
protected ArrayList<View> getSeparators() { protected ArrayList<View> getSeparators() {
// it's fine... it's shorter, faster and easier to read than searching with 3 nested loops // it's fine... it's shorter, faster and easier to read than searching with 3 nested loops
return new ArrayList<>(Arrays.asList( return new ArrayList<>(Arrays.asList(
view.findViewById(R.id.separator_0),
view.findViewById(R.id.separator_1_1), view.findViewById(R.id.separator_1_1),
view.findViewById(R.id.separator_1_2), view.findViewById(R.id.separator_1_2),
view.findViewById(R.id.separator_2_1), view.findViewById(R.id.separator_2_1),

View file

@ -136,6 +136,10 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement
int keyId = getId(); int keyId = getId();
if (keyId == R.id.soft_key_add_word) return tt9.onKeyAddWord(); if (keyId == R.id.soft_key_add_word) return tt9.onKeyAddWord();
if (keyId == R.id.soft_key_clear_filter) return tt9.onKeyFilterClear();
if (keyId == R.id.soft_key_filter_suggestions) return tt9.onKeyFilterSuggestions(repeat);
if (keyId == R.id.soft_key_left_arrow) return tt9.onKeyPreviousSuggestion();
if (keyId == R.id.soft_key_right_arrow) return tt9.onKeyNextSuggestion();
if (keyId == R.id.soft_key_input_mode) return tt9.onKeyNextInputMode(); if (keyId == R.id.soft_key_input_mode) return tt9.onKeyNextInputMode();
if (keyId == R.id.soft_key_language) return tt9.onKeyNextLanguage(); if (keyId == R.id.soft_key_language) return tt9.onKeyNextLanguage();
if (keyId == R.id.soft_key_ok) return tt9.onOK(); if (keyId == R.id.soft_key_ok) return tt9.onOK();