New Settings Screen more bugfixes
* proper error messages are displayed when dictionary loading fails or is cancelled * debounced the clicking on ItemClickable to avoid weird side effects, caused by faulty devices, sending multiple click events * a couple of French translations on the Settings screen * fixed Settings screen blinking in some cases * fixed default hotkey value cannot be 'no key' * fixed SuggestionsView having the incorrect theme forced at startup
This commit is contained in:
parent
a6fa129984
commit
bd73918f6a
17 changed files with 93 additions and 35 deletions
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_settings">Настройки на Traditional T9</string>
|
||||
<string name="app_settings">Настройки на TT9</string>
|
||||
<string name="close">Затвори</string>
|
||||
<string name="completed">Завършено</string>
|
||||
<string name="error_unexpected">Възникна неочаквана грешка.</string>
|
||||
|
|
@ -41,5 +41,7 @@
|
|||
<string name="function_reset_keys_title">Възстанови стандартните бутони</string>
|
||||
<string name="function_reset_keys_done">Възстановени са стандартните \"бързи\" бутони.</string>
|
||||
<string name="key_hold_key">(задръж)</string>
|
||||
<string name="dictionary_loading_indeterminate">Зареждане на речник</string>
|
||||
<string name="dictionary_load_cancelled">Зареждането е отменено.</string>
|
||||
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_settings">Traditional T9 Einstellungen</string>
|
||||
<string name="app_settings">TT9 Einstellungen</string>
|
||||
<string name="close">Schließen</string>
|
||||
<string name="error_unexpected">Unerwarteter Fehler aufgetreten.</string>
|
||||
|
||||
|
|
@ -20,4 +20,5 @@
|
|||
<string name="dictionary_loading">Lade Wörterbuch (%1$s)…</string>
|
||||
<string name="dictionary_load_title">Wörterbuch laden</string>
|
||||
<string name="dictionary_not_found">Wird nicht geladen. Wörterbuch für \"%1$s\" nicht gefunden.</string>
|
||||
<string name="dictionary_loading_indeterminate">Lade Wörterbuch</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_settings">Configuration Traditional T9 </string>
|
||||
<string name="app_settings">Configuration TT9</string>
|
||||
<string name="close">Fermer</string>
|
||||
<string name="completed">Fini</string>
|
||||
<string name="error_unexpected">Une erreur inattendue s\'est produite.</string>
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
<string name="pref_help">Aide</string>
|
||||
<string name="pref_dark_theme">Thème sombre</string>
|
||||
<string name="pref_choose_languages">Choisir langues</string>
|
||||
<string name="dictionary_truncate_title">Supprimer le dictionaire</string>
|
||||
<string name="dictionary_truncate_title">Vider le dictionaire</string>
|
||||
|
||||
<string name="pref_category_dictionaries">Dictionnaires</string>
|
||||
<string name="dictionary_cancel_load">Annuler le chargement</string>
|
||||
|
|
@ -27,4 +27,10 @@
|
|||
<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_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 vidé avec succès.</string>
|
||||
<string name="pref_show_soft_function_keys">Boutons à l\'écran</string>
|
||||
<string name="dictionary_loading_indeterminate">Chargement du dictionnaire</string>
|
||||
<string name="dictionary_load_cancelled">Chargement est annulé.</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_settings">Traditional T9 Impostazioni</string>
|
||||
<string name="app_settings">TT9 Impostazioni</string>
|
||||
<string name="close">Chiudi</string>
|
||||
<string name="completed">Completato</string>
|
||||
<string name="error_unexpected">Si è verificato un errore imprevisto.</string>
|
||||
|
|
@ -25,5 +25,7 @@
|
|||
<string name="dictionary_load_title">Carica il dizionario</string>
|
||||
<string name="dictionary_not_found">Impossibile caricare. Dizionario per “%1$s” non trovato.</string>
|
||||
<string name="pref_category_function_keys">Scorciatoie da tastiera</string>
|
||||
<string name="dictionary_loading_indeterminate">Caricamento del dizionario</string>
|
||||
<string name="dictionary_load_cancelled">Caricamento annullato.</string>
|
||||
</resources>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_settings">Traditional T9 Opties</string>
|
||||
<string name="app_settings">TT9 Opties</string>
|
||||
<string name="close">Sluiten</string>
|
||||
<string name="error_unexpected">Er is een onverwachte fout opgetreden.</string>
|
||||
|
||||
|
|
@ -20,4 +20,5 @@
|
|||
<string name="dictionary_load_title">Woordenboek laden</string>
|
||||
<string name="dictionary_not_found">Laden mislukt. Woordenboek voor %1$s niet gevonden.</string>
|
||||
<string name="dictionary_truncated">Woordenboek succesvol gewist.</string>
|
||||
<string name="dictionary_loading_indeterminate">Woordenboek laden</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_settings">Traditional T9 настройки</string>
|
||||
<string name="app_settings">TT9 настройки</string>
|
||||
<string name="close">Закрыть</string>
|
||||
<string name="completed">Выполнено</string>
|
||||
<string name="error_unexpected">Произошла непредвиденная ошибка.</string>
|
||||
|
|
@ -27,4 +27,6 @@
|
|||
<string name="dictionary_load_title">Загрузить словарь</string>
|
||||
<string name="dictionary_not_found">Ошибка загрузки. Словарь «%1$s» не найден.</string>
|
||||
<string name="dictionary_truncated">Словарь успешно очищен.</string>
|
||||
<string name="dictionary_loading_indeterminate">Загрузка словаря</string>
|
||||
<string name="dictionary_load_cancelled">Загрузка отменена.</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_settings">Налаштування Traditional T9</string>
|
||||
<string name="app_settings">Налаштування TT9</string>
|
||||
<string name="close">Закрити</string>
|
||||
<string name="completed">Зроблено</string>
|
||||
<string name="error_unexpected">Сталася неочікувана помилка.</string>
|
||||
|
|
@ -25,4 +25,6 @@
|
|||
<string name="dictionary_loading">Завантаження словника (%1$s)…</string>
|
||||
<string name="dictionary_load_title">Завантажити словник</string>
|
||||
<string name="dictionary_not_found">Помилка завантаження. Словник «%1$s» не знайдено.</string>
|
||||
<string name="dictionary_loading_indeterminate">Завантаження словника</string>
|
||||
<string name="dictionary_load_cancelled">Завантаження скасовано.</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<resources>
|
||||
<string translatable="false" name="help_url">https://github.com/sspanak/tt9/blob/master/docs/user-manual.md</string>
|
||||
<string name="app_name" translatable="false">Traditional T9</string>
|
||||
<string name="app_settings">Traditional T9 Settings</string>
|
||||
<string name="app_settings">TT9 Settings</string>
|
||||
<string name="close">Close</string>
|
||||
<string name="completed">Completed</string>
|
||||
<string name="error_unexpected">Unexpected error occurred.</string>
|
||||
|
|
@ -28,8 +28,10 @@
|
|||
<string name="dictionary_load_bad_char">Loading failed. Invalid word \"%1$s\" on line %2$d of language \"%3$s\".</string>
|
||||
<string name="dictionary_load_error">Failed loading the dictionary for language \"%1$s\" (%2$s).</string>
|
||||
<string name="dictionary_load_failed">Dictionary load failed.</string>
|
||||
<string name="dictionary_load_cancelled">Dictionary load cancelled.</string>
|
||||
<string name="dictionary_loaded">Dictionary load completed.</string>
|
||||
<string name="dictionary_loading">Loading dictionary (%1$s)…</string>
|
||||
<string name="dictionary_loading_indeterminate">Loading dictionary</string>
|
||||
<string name="dictionary_load_title">Load dictionary</string>
|
||||
<string name="dictionary_not_found">Loading failed. Dictionary for \"%1$s\" not found.</string>
|
||||
<string name="dictionary_truncate_title">Clear dictionary</string>
|
||||
|
|
|
|||
|
|
@ -106,6 +106,7 @@ public class DictionaryLoader {
|
|||
}
|
||||
|
||||
DictionaryDb.runInTransaction(() -> {
|
||||
try {
|
||||
long start = System.currentTimeMillis();
|
||||
importLetters(language);
|
||||
Logger.i(
|
||||
|
|
@ -113,7 +114,6 @@ public class DictionaryLoader {
|
|||
"Loaded letters for '" + language.getName() + "' language in: " + (System.currentTimeMillis() - start) + " ms"
|
||||
);
|
||||
|
||||
try {
|
||||
start = System.currentTimeMillis();
|
||||
importWords(language);
|
||||
Logger.i(
|
||||
|
|
@ -140,7 +140,7 @@ public class DictionaryLoader {
|
|||
+ " of language '" + language.getName() + "'. "
|
||||
+ e.getMessage()
|
||||
);
|
||||
} catch (Exception e) {
|
||||
} catch (Exception | Error e) {
|
||||
stop();
|
||||
sendError(e.getClass().getSimpleName(), language.getId());
|
||||
|
||||
|
|
|
|||
|
|
@ -2,16 +2,45 @@ package io.github.sspanak.tt9.preferences;
|
|||
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import io.github.sspanak.tt9.Logger;
|
||||
|
||||
public abstract class ItemClickable {
|
||||
protected final int CLICK_DEBOUNCE_TIME = 250;
|
||||
private long lastClickTime = 0;
|
||||
|
||||
protected final Preference item;
|
||||
|
||||
|
||||
ItemClickable(Preference item) {
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
|
||||
public void enableClickHandler() {
|
||||
item.setOnPreferenceClickListener(this::onClick);
|
||||
item.setOnPreferenceClickListener(this::debounceClick);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* debounceClick
|
||||
* Protection against faulty devices, that sometimes send two (or more) click events
|
||||
* per a single key press.
|
||||
*
|
||||
* My smashed Qin F21 Pro+ occasionally does this, if I press the keys hard.
|
||||
* There were reports the same happens on Kyocera KYF31, causing absolutely undesirable side effects.
|
||||
* @see: https://github.com/sspanak/tt9/issues/117
|
||||
*/
|
||||
protected boolean debounceClick(Preference p) {
|
||||
long now = System.currentTimeMillis();
|
||||
if (now - lastClickTime < CLICK_DEBOUNCE_TIME) {
|
||||
Logger.d("debounceClick", "Preference click debounced.");
|
||||
return true;
|
||||
}
|
||||
lastClickTime = now;
|
||||
|
||||
return onClick(p);
|
||||
}
|
||||
|
||||
|
||||
abstract protected boolean onClick(Preference p);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,12 +51,14 @@ public class ItemLoadDictionary extends ItemClickable {
|
|||
progressBar.show(msg.getData());
|
||||
item.setSummary(progressBar.getTitle() + " " + progressBar.getMessage());
|
||||
|
||||
if (progressBar.isCompleted()) {
|
||||
if (progressBar.isCancelled()) {
|
||||
changeToLoadButton();
|
||||
UI.toast(context, R.string.dictionary_loaded);
|
||||
} else if (progressBar.isFailed()) {
|
||||
changeToLoadButton();
|
||||
UI.toast(context, R.string.dictionary_load_failed);
|
||||
UI.toast(context, progressBar.getMessage());
|
||||
} else if (progressBar.isCompleted()) {
|
||||
changeToLoadButton();
|
||||
UI.toast(context, R.string.dictionary_loaded);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
@ -75,7 +77,7 @@ public class ItemLoadDictionary extends ItemClickable {
|
|||
changeToLoadButton();
|
||||
}
|
||||
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -86,6 +88,6 @@ public class ItemLoadDictionary extends ItemClickable {
|
|||
|
||||
public void changeToLoadButton() {
|
||||
item.setTitle(context.getString(R.string.dictionary_load_title));
|
||||
item.setSummary(progressBar.isFailed() ? progressBar.getMessage() : "");
|
||||
item.setSummary(progressBar.isFailed() || progressBar.isCancelled() ? progressBar.getMessage() : "");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,6 @@ public class ItemResetKeys extends ItemClickable {
|
|||
settings.setDefaultKeys();
|
||||
dropdowns.reloadSettings();
|
||||
UI.toast(context, R.string.function_reset_keys_done);
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,6 +44,6 @@ public class ItemTruncateDictionary extends ItemClickable {
|
|||
|
||||
DictionaryDb.truncateWords(onDictionaryTruncated);
|
||||
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,13 +15,13 @@ public class PreferencesActivity extends AppCompatActivity {
|
|||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
settings = new SettingsStore(this);
|
||||
DictionaryDb.init(this);
|
||||
|
||||
validateFunctionKeys();
|
||||
settings = new SettingsStore(this);
|
||||
applyTheme();
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
validateFunctionKeys();
|
||||
buildScreen();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -100,12 +100,10 @@ public class SectionKeymap {
|
|||
public void reloadSettings() {
|
||||
for (DropDownPreference dropDown : items) {
|
||||
int keypadKey = settings.getFunctionKey(dropDown.getKey());
|
||||
if (keypadKey != 0) {
|
||||
dropDown.setValue(String.valueOf(keypadKey));
|
||||
previewCurrentKey(dropDown);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public SectionKeymap populate() {
|
||||
|
|
|
|||
|
|
@ -31,7 +31,9 @@ public class DictionaryLoadingBar {
|
|||
private final NotificationCompat.Builder notificationBuilder;
|
||||
private final Resources resources;
|
||||
|
||||
private boolean isStopped = false;
|
||||
private boolean hasFailed = false;
|
||||
|
||||
private int maxProgress = 0;
|
||||
private int progress = 0;
|
||||
private String title = "";
|
||||
|
|
@ -76,6 +78,11 @@ public class DictionaryLoadingBar {
|
|||
}
|
||||
|
||||
|
||||
public boolean isCancelled() {
|
||||
return isStopped;
|
||||
}
|
||||
|
||||
|
||||
public boolean isCompleted() {
|
||||
return progress >= maxProgress;
|
||||
}
|
||||
|
|
@ -126,16 +133,20 @@ public class DictionaryLoadingBar {
|
|||
return resources.getString(R.string.dictionary_loading, lang.getName());
|
||||
}
|
||||
|
||||
return resources.getString(R.string.dictionary_load_title);
|
||||
return resources.getString(R.string.dictionary_loading_indeterminate);
|
||||
}
|
||||
|
||||
|
||||
private void showProgress(long time, int currentFile, int currentFileProgress, int languageId) {
|
||||
if (currentFileProgress < 0) {
|
||||
hide();
|
||||
isStopped = true;
|
||||
title = "";
|
||||
message = resources.getString(R.string.dictionary_load_cancelled);
|
||||
return;
|
||||
}
|
||||
|
||||
isStopped = false;
|
||||
progress = 100 * currentFile + currentFileProgress;
|
||||
|
||||
if (progress >= maxProgress) {
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ public class SuggestionsView {
|
|||
);
|
||||
mView.setAdapter(mSuggestionsAdapter);
|
||||
|
||||
setDarkTheme(true); // just use some default colors
|
||||
setDarkTheme(settings.getDarkTheme());
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue