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());
}