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:
parent
ea1cc663d4
commit
09e5e1b2ca
17 changed files with 285 additions and 110 deletions
|
|
@ -34,9 +34,52 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:paddingTop="@dimen/numpad_padding_top"
|
||||
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
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/numpad_key_height"
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@
|
|||
<string name="key_call">Зелена слушалка</string>
|
||||
<string name="function_add_word_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_mode_key">Режим на писане</string>
|
||||
<string name="function_show_settings_key">Настройки</string>
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
<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="pref_category_about">À propos de l\'application</string>
|
||||
<string name="pref_help">Aide</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_not_found">Echec du chargement. Dictionnaire «%1$s» introuvable.</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="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>
|
||||
|
|
@ -30,6 +30,8 @@
|
|||
<string name="dictionary_loading_indeterminate">Chargement du dictionnaire</string>
|
||||
<string name="dictionary_load_cancelled">Chargement est annulé.</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_text_case">Majuscules automatiques</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="pref_category_keypad">Clavier</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_default_keyboard">Sélectionnez le clavier par défaut</string>
|
||||
<string name="setup_tt9_on">Traditional T9 est activé</string>
|
||||
|
|
|
|||
|
|
@ -43,6 +43,10 @@
|
|||
<string name="dictionary_missing_go_load_it">Отсутствует словарь для языка «%1$s». Вы можете загрузить его в Настройках.</string>
|
||||
<string name="function_add_word_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_mode_key">Режим ввода</string>
|
||||
<string name="function_show_settings_key">Настройки</string>
|
||||
|
|
|
|||
|
|
@ -48,7 +48,11 @@
|
|||
<string name="key_hold_key">(затиснути)</string>
|
||||
<string name="function_add_word_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_show_settings_key">Налаштування</string>
|
||||
<string name="function_reset_keys_done">Налаштування кнопок за замовчуванням відновлено</string>
|
||||
|
|
|
|||
|
|
@ -15,9 +15,9 @@
|
|||
<dimen name="pref_summary_size">19sp</dimen>
|
||||
|
||||
<!-- Numpad -->
|
||||
<dimen name="numpad_padding_top">5dp</dimen>
|
||||
<dimen name="numpad_padding_bottom">15dp</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_height">32dp</dimen>
|
||||
|
|
|
|||
|
|
@ -56,6 +56,10 @@
|
|||
|
||||
<string name="function_add_word_key">Add Word 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_mode_key">Input Mode 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_back">Back</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_soft_left" translatable="false">Left Func</string>
|
||||
<string name="key_soft_right" translatable="false">Right Func</string>
|
||||
|
|
|
|||
|
|
@ -11,4 +11,12 @@
|
|||
<item name="android:layout_height">match_parent</item>
|
||||
<item name="android:layout_width">1dp</item>
|
||||
</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>
|
||||
|
|
|
|||
|
|
@ -14,6 +14,30 @@
|
|||
app:layout="@layout/pref_dropdown"
|
||||
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
|
||||
app:iconSpaceReserved="false"
|
||||
app:key="key_next_language"
|
||||
|
|
|
|||
|
|
@ -227,10 +227,10 @@ abstract class KeyPadHandler extends InputMethodService {
|
|||
}
|
||||
|
||||
switch (keyCode) {
|
||||
case KeyEvent.KEYCODE_DPAD_UP: return onUp();
|
||||
case KeyEvent.KEYCODE_DPAD_DOWN: return onDown();
|
||||
case KeyEvent.KEYCODE_DPAD_LEFT: return onLeft();
|
||||
case KeyEvent.KEYCODE_DPAD_RIGHT: return onRight(keyRepeatCounter > 0);
|
||||
case KeyEvent.KEYCODE_DPAD_UP:
|
||||
case KeyEvent.KEYCODE_DPAD_DOWN:
|
||||
case KeyEvent.KEYCODE_DPAD_LEFT:
|
||||
case KeyEvent.KEYCODE_DPAD_RIGHT: return onArrow(keyCode, keyRepeatCounter > 0);
|
||||
case KeyEvent.KEYCODE_STAR:
|
||||
case KeyEvent.KEYCODE_POUND: return onOtherKey(keyCode);
|
||||
}
|
||||
|
|
@ -273,14 +273,11 @@ abstract class KeyPadHandler extends InputMethodService {
|
|||
abstract protected boolean shouldTrackLeftRight();
|
||||
|
||||
// default hardware key handlers
|
||||
abstract protected boolean onArrow(int key, boolean repeat);
|
||||
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 onOtherKey(int keyCode);
|
||||
abstract public boolean onOK();
|
||||
abstract protected boolean onOtherKey(int key);
|
||||
|
||||
// customized key handlers
|
||||
abstract protected boolean onKeyAddWord();
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
// 1. Dialer fields seem to handle backspace on their own and we must ignore it,
|
||||
// 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
|
||||
*
|
||||
|
|
@ -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) {
|
||||
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() {
|
||||
if (nextLang()) {
|
||||
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) {
|
||||
if (mInputMode.shouldDeletePrecedingSpace(inputType)) {
|
||||
textField.deletePrecedingSpace(currentWord);
|
||||
|
|
|
|||
|
|
@ -160,10 +160,24 @@ public class SettingsStore {
|
|||
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
|
||||
.putString(SectionKeymap.ITEM_ADD_WORD, String.valueOf(addWord))
|
||||
.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_LANGUAGE, String.valueOf(nextLanguage))
|
||||
.putString(SectionKeymap.ITEM_SHOW_SETTINGS, String.valueOf(showSettings))
|
||||
|
|
@ -185,6 +199,18 @@ public class SettingsStore {
|
|||
public int getKeyBackspace() {
|
||||
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() {
|
||||
return getFunctionKey(SectionKeymap.ITEM_NEXT_INPUT_MODE);
|
||||
}
|
||||
|
|
@ -195,6 +221,7 @@ public class SettingsStore {
|
|||
return getFunctionKey(SectionKeymap.ITEM_SHOW_SETTINGS);
|
||||
}
|
||||
|
||||
|
||||
/************* UI settings *************/
|
||||
|
||||
public boolean getDarkTheme() { return prefs.getBoolean("pref_dark_theme", true); }
|
||||
|
|
|
|||
|
|
@ -43,24 +43,36 @@ public class Hotkeys {
|
|||
/**
|
||||
* setDefault
|
||||
* Applies the default hotkey scheme.
|
||||
*
|
||||
* 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.
|
||||
* 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.
|
||||
*
|
||||
* Arrow keys for manipulating suggestions are also assigned only if available.
|
||||
*/
|
||||
public static void setDefault(SettingsStore settings) {
|
||||
int backspaceKeyCode = KeyEvent.KEYCODE_BACK;
|
||||
int backspace = KeyEvent.KEYCODE_BACK;
|
||||
if (
|
||||
KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_CLEAR)
|
||||
|| KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_DEL)
|
||||
|| 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(
|
||||
KeyEvent.KEYCODE_STAR,
|
||||
backspaceKeyCode,
|
||||
backspace,
|
||||
clearFilter,
|
||||
filter,
|
||||
nextSuggestion,
|
||||
previousSuggestion,
|
||||
KeyEvent.KEYCODE_POUND,
|
||||
-KeyEvent.KEYCODE_POUND, // negative means "hold"
|
||||
-KeyEvent.KEYCODE_STAR
|
||||
|
|
@ -140,20 +152,27 @@ public class Hotkeys {
|
|||
addIfDeviceHasKey(KeyEvent.KEYCODE_F2, "F2", true);
|
||||
addIfDeviceHasKey(KeyEvent.KEYCODE_F3, "F3", true);
|
||||
addIfDeviceHasKey(KeyEvent.KEYCODE_F4, "F4", 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_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_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_SUBTRACT, "Num -", true);
|
||||
addIfDeviceHasKey(KeyEvent.KEYCODE_NUMPAD_MULTIPLY, "Num *", true);
|
||||
addIfDeviceHasKey(KeyEvent.KEYCODE_NUMPAD_DIVIDE, "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);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,6 +15,10 @@ import io.github.sspanak.tt9.preferences.helpers.Hotkeys;
|
|||
public class SectionKeymap {
|
||||
public static final String ITEM_ADD_WORD = "key_add_word";
|
||||
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_LANGUAGE = "key_next_language";
|
||||
public static final String ITEM_SHOW_SETTINGS = "key_show_settings";
|
||||
|
|
|
|||
|
|
@ -21,6 +21,10 @@ public class HotkeysScreen extends BaseScreenFragment {
|
|||
DropDownPreference[] dropDowns = {
|
||||
findPreference(SectionKeymap.ITEM_ADD_WORD),
|
||||
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_LANGUAGE),
|
||||
findPreference(SectionKeymap.ITEM_SHOW_SETTINGS),
|
||||
|
|
|
|||
|
|
@ -78,6 +78,7 @@ class MainLayoutNumpad extends BaseMainLayout {
|
|||
protected ArrayList<View> getSeparators() {
|
||||
// it's fine... it's shorter, faster and easier to read than searching with 3 nested loops
|
||||
return new ArrayList<>(Arrays.asList(
|
||||
view.findViewById(R.id.separator_0),
|
||||
view.findViewById(R.id.separator_1_1),
|
||||
view.findViewById(R.id.separator_1_2),
|
||||
view.findViewById(R.id.separator_2_1),
|
||||
|
|
|
|||
|
|
@ -136,6 +136,10 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement
|
|||
int keyId = getId();
|
||||
|
||||
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_language) return tt9.onKeyNextLanguage();
|
||||
if (keyId == R.id.soft_key_ok) return tt9.onOK();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue