From bd73918f6a58e498207faf25cfe42f6fe62cf3ee Mon Sep 17 00:00:00 2001 From: sspanak Date: Sat, 26 Nov 2022 09:02:01 +0200 Subject: [PATCH] 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 --- res/values-bg/strings.xml | 4 ++- res/values-de/strings.xml | 3 +- res/values-fr/strings.xml | 10 ++++-- res/values-it/strings.xml | 4 ++- res/values-nl/strings.xml | 3 +- res/values-ru/strings.xml | 4 ++- res/values-uk/strings.xml | 4 ++- res/values/strings.xml | 4 ++- .../sspanak/tt9/db/DictionaryLoader.java | 16 +++++----- .../tt9/preferences/ItemClickable.java | 31 ++++++++++++++++++- .../tt9/preferences/ItemLoadDictionary.java | 12 ++++--- .../tt9/preferences/ItemResetKeys.java | 2 +- .../preferences/ItemTruncateDictionary.java | 2 +- .../tt9/preferences/PreferencesActivity.java | 8 ++--- .../tt9/preferences/SectionKeymap.java | 6 ++-- .../sspanak/tt9/ui/DictionaryLoadingBar.java | 13 +++++++- .../sspanak/tt9/ui/SuggestionsView.java | 2 +- 17 files changed, 93 insertions(+), 35 deletions(-) diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 34b8a0d2..879da011 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -1,6 +1,6 @@ - Настройки на Traditional T9 + Настройки на TT9 Затвори Завършено Възникна неочаквана грешка. @@ -41,5 +41,7 @@ Възстанови стандартните бутони Възстановени са стандартните \"бързи\" бутони. (задръж) + Зареждане на речник + Зареждането е отменено. diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index cace4c40..1acf336b 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -1,6 +1,6 @@ - Traditional T9 Einstellungen + TT9 Einstellungen Schließen Unerwarteter Fehler aufgetreten. @@ -20,4 +20,5 @@ Lade Wörterbuch (%1$s)… Wörterbuch laden Wird nicht geladen. Wörterbuch für \"%1$s\" nicht gefunden. + Lade Wörterbuch diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index ee8b8396..82e698bd 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -1,6 +1,6 @@ - Configuration Traditional T9 + Configuration TT9 Fermer Fini Une erreur inattendue s\'est produite. @@ -16,7 +16,7 @@ Aide Thème sombre Choisir langues - Supprimer le dictionaire + Vider le dictionaire Dictionnaires Annuler le chargement @@ -27,4 +27,10 @@ Charger le dictionnaire Echec du chargement. Dictionnaire «%1$s» introuvable. Raccourcis clavier + Apparance + Echec du chargement. Mot inadmissible \"%1$s\" à la ligne %2$d de langue \"%3$s\". + Le dictionaire est vidé avec succès. + Boutons à l\'écran + Chargement du dictionnaire + Chargement est annulé. diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 8acdff28..e26a8d2e 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -1,6 +1,6 @@ - Traditional T9 Impostazioni + TT9 Impostazioni Chiudi Completato Si è verificato un errore imprevisto. @@ -25,5 +25,7 @@ Carica il dizionario Impossibile caricare. Dizionario per “%1$s” non trovato. Scorciatoie da tastiera + Caricamento del dizionario + Caricamento annullato. diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 9db95499..d1e6e4c2 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -1,6 +1,6 @@ - Traditional T9 Opties + TT9 Opties Sluiten Er is een onverwachte fout opgetreden. @@ -20,4 +20,5 @@ Woordenboek laden Laden mislukt. Woordenboek voor %1$s niet gevonden. Woordenboek succesvol gewist. + Woordenboek laden diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 373817cc..9b9bc9cd 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -1,6 +1,6 @@ - Traditional T9 настройки + TT9 настройки Закрыть Выполнено Произошла непредвиденная ошибка. @@ -27,4 +27,6 @@ Загрузить словарь Ошибка загрузки. Словарь «%1$s» не найден. Словарь успешно очищен. + Загрузка словаря + Загрузка отменена. diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 8f2a0338..3422b3c3 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -1,6 +1,6 @@ - Налаштування Traditional T9 + Налаштування TT9 Закрити Зроблено Сталася неочікувана помилка. @@ -25,4 +25,6 @@ Завантаження словника (%1$s)… Завантажити словник Помилка завантаження. Словник «%1$s» не знайдено. + Завантаження словника + Завантаження скасовано. diff --git a/res/values/strings.xml b/res/values/strings.xml index 9d4a6721..94ea2fdc 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2,7 +2,7 @@ https://github.com/sspanak/tt9/blob/master/docs/user-manual.md Traditional T9 - Traditional T9 Settings + TT9 Settings Close Completed Unexpected error occurred. @@ -28,8 +28,10 @@ Loading failed. Invalid word \"%1$s\" on line %2$d of language \"%3$s\". Failed loading the dictionary for language \"%1$s\" (%2$s). Dictionary load failed. + Dictionary load cancelled. Dictionary load completed. Loading dictionary (%1$s)… + Loading dictionary Load dictionary Loading failed. Dictionary for \"%1$s\" not found. Clear dictionary diff --git a/src/io/github/sspanak/tt9/db/DictionaryLoader.java b/src/io/github/sspanak/tt9/db/DictionaryLoader.java index 5b9d291a..dc690d81 100644 --- a/src/io/github/sspanak/tt9/db/DictionaryLoader.java +++ b/src/io/github/sspanak/tt9/db/DictionaryLoader.java @@ -106,14 +106,14 @@ public class DictionaryLoader { } DictionaryDb.runInTransaction(() -> { - long start = System.currentTimeMillis(); - importLetters(language); - Logger.i( - logTag, - "Loaded letters for '" + language.getName() + "' language in: " + (System.currentTimeMillis() - start) + " ms" - ); - try { + long start = System.currentTimeMillis(); + importLetters(language); + Logger.i( + logTag, + "Loaded letters for '" + language.getName() + "' language in: " + (System.currentTimeMillis() - start) + " ms" + ); + 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()); diff --git a/src/io/github/sspanak/tt9/preferences/ItemClickable.java b/src/io/github/sspanak/tt9/preferences/ItemClickable.java index 403c6123..c1afa905 100644 --- a/src/io/github/sspanak/tt9/preferences/ItemClickable.java +++ b/src/io/github/sspanak/tt9/preferences/ItemClickable.java @@ -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); } diff --git a/src/io/github/sspanak/tt9/preferences/ItemLoadDictionary.java b/src/io/github/sspanak/tt9/preferences/ItemLoadDictionary.java index 2b563dbf..f8d2c4cc 100644 --- a/src/io/github/sspanak/tt9/preferences/ItemLoadDictionary.java +++ b/src/io/github/sspanak/tt9/preferences/ItemLoadDictionary.java @@ -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() : ""); } } diff --git a/src/io/github/sspanak/tt9/preferences/ItemResetKeys.java b/src/io/github/sspanak/tt9/preferences/ItemResetKeys.java index 78492dc3..7b473312 100644 --- a/src/io/github/sspanak/tt9/preferences/ItemResetKeys.java +++ b/src/io/github/sspanak/tt9/preferences/ItemResetKeys.java @@ -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; } } diff --git a/src/io/github/sspanak/tt9/preferences/ItemTruncateDictionary.java b/src/io/github/sspanak/tt9/preferences/ItemTruncateDictionary.java index 9c34bff8..dd5a4c1c 100644 --- a/src/io/github/sspanak/tt9/preferences/ItemTruncateDictionary.java +++ b/src/io/github/sspanak/tt9/preferences/ItemTruncateDictionary.java @@ -44,6 +44,6 @@ public class ItemTruncateDictionary extends ItemClickable { DictionaryDb.truncateWords(onDictionaryTruncated); - return false; + return true; } } diff --git a/src/io/github/sspanak/tt9/preferences/PreferencesActivity.java b/src/io/github/sspanak/tt9/preferences/PreferencesActivity.java index 7317a846..67e91c6c 100644 --- a/src/io/github/sspanak/tt9/preferences/PreferencesActivity.java +++ b/src/io/github/sspanak/tt9/preferences/PreferencesActivity.java @@ -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(); } diff --git a/src/io/github/sspanak/tt9/preferences/SectionKeymap.java b/src/io/github/sspanak/tt9/preferences/SectionKeymap.java index c49909f6..edd13181 100644 --- a/src/io/github/sspanak/tt9/preferences/SectionKeymap.java +++ b/src/io/github/sspanak/tt9/preferences/SectionKeymap.java @@ -100,10 +100,8 @@ 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); - } + dropDown.setValue(String.valueOf(keypadKey)); + previewCurrentKey(dropDown); } } diff --git a/src/io/github/sspanak/tt9/ui/DictionaryLoadingBar.java b/src/io/github/sspanak/tt9/ui/DictionaryLoadingBar.java index 49add68b..660a53bd 100644 --- a/src/io/github/sspanak/tt9/ui/DictionaryLoadingBar.java +++ b/src/io/github/sspanak/tt9/ui/DictionaryLoadingBar.java @@ -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) { diff --git a/src/io/github/sspanak/tt9/ui/SuggestionsView.java b/src/io/github/sspanak/tt9/ui/SuggestionsView.java index 0419b0f8..d2fcd144 100644 --- a/src/io/github/sspanak/tt9/ui/SuggestionsView.java +++ b/src/io/github/sspanak/tt9/ui/SuggestionsView.java @@ -64,7 +64,7 @@ public class SuggestionsView { ); mView.setAdapter(mSuggestionsAdapter); - setDarkTheme(true); // just use some default colors + setDarkTheme(settings.getDarkTheme()); }