Predictive Mode: when there is no dictionary for the current language, a toast message will appear asking the user to load it from Settings
This commit is contained in:
parent
55211b9cd9
commit
ff74e55cf8
8 changed files with 101 additions and 9 deletions
|
|
@ -9,7 +9,7 @@
|
||||||
<string name="add_word_blank">Не може да се въведе празна дума.</string>
|
<string name="add_word_blank">Не може да се въведе празна дума.</string>
|
||||||
<string name="add_word_badchar">Не може да се въведе дума с непозволени символи за %1$s (%2$s).</string>
|
<string name="add_word_badchar">Не може да се въведе дума с непозволени символи за %1$s (%2$s).</string>
|
||||||
<string name="add_word_exist">Думата „%1$s“ е вече речника.</string>
|
<string name="add_word_exist">Думата „%1$s“ е вече речника.</string>
|
||||||
<string name="add_word_invalid_language">За да добавите нова дума, първо изберете език.</string>
|
<string name="add_word_invalid_language">Не може да добавяте думи без да е избран език.</string>
|
||||||
<string name="add_word_title">Добавяне на дума</string>
|
<string name="add_word_title">Добавяне на дума</string>
|
||||||
|
|
||||||
<string name="pref_category_about">За приложението</string>
|
<string name="pref_category_about">За приложението</string>
|
||||||
|
|
@ -20,13 +20,13 @@
|
||||||
|
|
||||||
<string name="pref_category_dictionaries">Речници</string>
|
<string name="pref_category_dictionaries">Речници</string>
|
||||||
<string name="dictionary_cancel_load">Отмени зареждането</string>
|
<string name="dictionary_cancel_load">Отмени зареждането</string>
|
||||||
<string name="dictionary_load_bad_char">Неуспешно зареждане. Невалидна дума \"%1$s\" на ред %2$d за език \"%3$s\".</string>
|
<string name="dictionary_load_bad_char">Неуспешно зареждане. Невалидна дума „%1$s“ на ред %2$d за език „%3$s“.</string>
|
||||||
<string name="dictionary_load_error">Несупешно зареждане на речник за език \"%1$s\" (%2$s).</string>
|
<string name="dictionary_load_error">Несупешно зареждане на речник за език „%1$s“ (%2$s).</string>
|
||||||
<string name="dictionary_load_failed">Неуспешно зареждане на речник.</string>
|
<string name="dictionary_load_failed">Неуспешно зареждане на речник.</string>
|
||||||
<string name="dictionary_loaded">Зареждането на речник приключи.</string>
|
<string name="dictionary_loaded">Зареждането на речник приключи.</string>
|
||||||
<string name="dictionary_loading">Зареждане на речник (%1$s)…</string>
|
<string name="dictionary_loading">Зареждане на речник (%1$s)…</string>
|
||||||
<string name="dictionary_load_title">Зареди речник</string>
|
<string name="dictionary_load_title">Зареди речник</string>
|
||||||
<string name="dictionary_not_found">Неуспешно зареждане. Липсва речник за \"%1$s\".</string>
|
<string name="dictionary_not_found">Неуспешно зареждане. Липсва речник за „%1$s“.</string>
|
||||||
<string name="dictionary_truncated">Речникът е изтрит успешно.</string>
|
<string name="dictionary_truncated">Речникът е изтрит успешно.</string>
|
||||||
<string name="pref_category_appearance">Облик</string>
|
<string name="pref_category_appearance">Облик</string>
|
||||||
<string name="pref_category_function_keys">Бутони за бърз достъп</string>
|
<string name="pref_category_function_keys">Бутони за бърз достъп</string>
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
<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_title">Възстанови стандартните бутони</string>
|
<string name="function_reset_keys_title">Възстанови стандартните бутони</string>
|
||||||
<string name="function_reset_keys_done">Възстановени са стандартните \"бързи\" бутони.</string>
|
<string name="function_reset_keys_done">Възстановени са стандартните „бързи“ бутони.</string>
|
||||||
<string name="key_hold_key">(задръж)</string>
|
<string name="key_hold_key">(задръж)</string>
|
||||||
<string name="dictionary_loading_indeterminate">Зареждане на речник</string>
|
<string name="dictionary_loading_indeterminate">Зареждане на речник</string>
|
||||||
<string name="dictionary_load_cancelled">Зареждането е отменено.</string>
|
<string name="dictionary_load_cancelled">Зареждането е отменено.</string>
|
||||||
|
|
@ -48,4 +48,5 @@
|
||||||
<string name="pref_auto_text_case">Автоматични главни букви</string>
|
<string name="pref_auto_text_case">Автоматични главни букви</string>
|
||||||
<string name="pref_auto_text_case_summary">Започвай автоматично изреченията с главни букви.</string>
|
<string name="pref_auto_text_case_summary">Започвай автоматично изреченията с главни букви.</string>
|
||||||
<string name="pref_category_predictive_mode">Подсказващ режим</string>
|
<string name="pref_category_predictive_mode">Подсказващ режим</string>
|
||||||
|
<string name="dictionary_missing_go_load_it">Няма речник за език „%1$s“. Заредете го в Настройки.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_settings">Configuration TT9</string>
|
<string name="app_settings">Paramètres de TT9</string>
|
||||||
<string name="close">Fermer</string>
|
<string name="close">Fermer</string>
|
||||||
<string name="completed">Fini</string>
|
<string name="completed">Fini</string>
|
||||||
<string name="error_unexpected">Une erreur inattendue s\'est produite.</string>
|
<string name="error_unexpected">Une erreur inattendue s\'est produite.</string>
|
||||||
|
|
@ -28,7 +28,7 @@
|
||||||
<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_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 vidé avec succè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="pref_show_soft_function_keys">Boutons à l\'écran</string>
|
||||||
<string name="dictionary_loading_indeterminate">Chargement du dictionnaire</string>
|
<string name="dictionary_loading_indeterminate">Chargement du dictionnaire</string>
|
||||||
|
|
@ -38,4 +38,6 @@
|
||||||
<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>
|
||||||
<string name="pref_auto_text_case_summary">Commencer automatiquement les phrases avec une majuscule.</string>
|
<string name="pref_auto_text_case_summary">Commencer automatiquement les phrases avec une majuscule.</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="add_word_invalid_language">Impossible d\'ajouter un mot, si aucune langue n\'est choisie.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
<string name="add_word_blank">Blank word not added.</string>
|
<string name="add_word_blank">Blank word not added.</string>
|
||||||
<string name="add_word_badchar">Cannot add word with unmappable character for %1$s (%2$s).</string>
|
<string name="add_word_badchar">Cannot add word with unmappable character for %1$s (%2$s).</string>
|
||||||
<string name="add_word_exist">Word \"%1$s\" already in the dictionary.</string>
|
<string name="add_word_exist">Word \"%1$s\" already in the dictionary.</string>
|
||||||
<string name="add_word_invalid_language">Cannot insert a word when no language is selected.</string>
|
<string name="add_word_invalid_language">Cannot add a word when no language is selected.</string>
|
||||||
<string name="add_word_title">Add Word</string>
|
<string name="add_word_title">Add Word</string>
|
||||||
|
|
||||||
<string name="pref_category_about">About</string>
|
<string name="pref_category_about">About</string>
|
||||||
|
|
@ -38,6 +38,7 @@
|
||||||
<string name="dictionary_loading">Loading dictionary (%1$s)…</string>
|
<string name="dictionary_loading">Loading dictionary (%1$s)…</string>
|
||||||
<string name="dictionary_loading_indeterminate">Loading dictionary</string>
|
<string name="dictionary_loading_indeterminate">Loading dictionary</string>
|
||||||
<string name="dictionary_load_title">Load dictionary</string>
|
<string name="dictionary_load_title">Load dictionary</string>
|
||||||
|
<string name="dictionary_missing_go_load_it">No dictionary for language \"%1$s\". Go to Settings to load it.</string>
|
||||||
<string name="dictionary_not_found">Loading failed. Dictionary for \"%1$s\" not found.</string>
|
<string name="dictionary_not_found">Loading failed. Dictionary for \"%1$s\" not found.</string>
|
||||||
<string name="dictionary_truncate_title">Clear dictionary</string>
|
<string name="dictionary_truncate_title">Clear dictionary</string>
|
||||||
<string name="dictionary_truncated">Dictionary successfully cleared.</string>
|
<string name="dictionary_truncated">Dictionary successfully cleared.</string>
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,17 @@ public class DictionaryDb {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void areThereWords(Handler handler, Language language) {
|
||||||
|
new Thread() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
int langId = language != null ? language.getId() : -1;
|
||||||
|
handler.sendEmptyMessage(getInstance().wordsDao().count(langId) > 0 ? 1 : 0);
|
||||||
|
}
|
||||||
|
}.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void truncateWords(Handler handler) {
|
public static void truncateWords(Handler handler) {
|
||||||
new Thread() {
|
new Thread() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,9 @@ import java.util.List;
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
interface WordsDao {
|
interface WordsDao {
|
||||||
|
@Query("SELECT COUNT(id) FROM words WHERE :langId < 0 OR lang = :langId")
|
||||||
|
int count(int langId);
|
||||||
|
|
||||||
@Query(
|
@Query(
|
||||||
"SELECT * " +
|
"SELECT * " +
|
||||||
"FROM words " +
|
"FROM words " +
|
||||||
|
|
|
||||||
67
src/io/github/sspanak/tt9/ime/EmptyDatabaseWarning.java
Normal file
67
src/io/github/sspanak/tt9/ime/EmptyDatabaseWarning.java
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
package io.github.sspanak.tt9.ime;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.os.Message;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import io.github.sspanak.tt9.R;
|
||||||
|
import io.github.sspanak.tt9.db.DictionaryDb;
|
||||||
|
import io.github.sspanak.tt9.languages.Language;
|
||||||
|
import io.github.sspanak.tt9.languages.LanguageCollection;
|
||||||
|
import io.github.sspanak.tt9.preferences.SettingsStore;
|
||||||
|
import io.github.sspanak.tt9.ui.UI;
|
||||||
|
|
||||||
|
public class EmptyDatabaseWarning {
|
||||||
|
final int WARNING_INTERVAL;
|
||||||
|
private static final HashMap<Integer, Long> warningDisplayedTime = new HashMap<>();
|
||||||
|
|
||||||
|
private Language language;
|
||||||
|
|
||||||
|
public EmptyDatabaseWarning(SettingsStore settings) {
|
||||||
|
WARNING_INTERVAL = settings.getDictionaryMissingWarningInterval();
|
||||||
|
|
||||||
|
for (Language lang : LanguageCollection.getAll()) {
|
||||||
|
if (!warningDisplayedTime.containsKey(lang.getId())) {
|
||||||
|
warningDisplayedTime.put(lang.getId(), 0L);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void emitOnce(Language language) {
|
||||||
|
if (language == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.language = language;
|
||||||
|
DictionaryDb.areThereWords(handleWordCount, language);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Handler handleWordCount = new Handler(Looper.getMainLooper()) {
|
||||||
|
@Override
|
||||||
|
public void handleMessage(Message msg) {
|
||||||
|
boolean areThereWords = msg.what == 1;
|
||||||
|
|
||||||
|
if (areThereWords) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Context context = TraditionalT9.getMainContext();
|
||||||
|
if (context == null || !warningDisplayedTime.containsKey(language.getId())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
long now = System.currentTimeMillis();
|
||||||
|
Long lastWarningTime = warningDisplayedTime.get(language.getId());
|
||||||
|
boolean isItWarningTimeAgain = lastWarningTime != null && now - lastWarningTime > WARNING_INTERVAL;
|
||||||
|
|
||||||
|
if (isItWarningTimeAgain) {
|
||||||
|
String message = context.getString(R.string.dictionary_missing_go_load_it, language.getName());
|
||||||
|
UI.toastLong(context, message);
|
||||||
|
warningDisplayedTime.put(language.getId(), now);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -10,12 +10,14 @@ import java.util.regex.Pattern;
|
||||||
|
|
||||||
import io.github.sspanak.tt9.Logger;
|
import io.github.sspanak.tt9.Logger;
|
||||||
import io.github.sspanak.tt9.db.DictionaryDb;
|
import io.github.sspanak.tt9.db.DictionaryDb;
|
||||||
|
import io.github.sspanak.tt9.ime.EmptyDatabaseWarning;
|
||||||
import io.github.sspanak.tt9.ime.InputFieldHelper;
|
import io.github.sspanak.tt9.ime.InputFieldHelper;
|
||||||
import io.github.sspanak.tt9.languages.Language;
|
import io.github.sspanak.tt9.languages.Language;
|
||||||
import io.github.sspanak.tt9.languages.Punctuation;
|
import io.github.sspanak.tt9.languages.Punctuation;
|
||||||
import io.github.sspanak.tt9.preferences.SettingsStore;
|
import io.github.sspanak.tt9.preferences.SettingsStore;
|
||||||
|
|
||||||
public class ModePredictive extends InputMode {
|
public class ModePredictive extends InputMode {
|
||||||
|
private final EmptyDatabaseWarning emptyDbWarning;
|
||||||
private final SettingsStore settings;
|
private final SettingsStore settings;
|
||||||
|
|
||||||
public int getId() { return MODE_PREDICTIVE; }
|
public int getId() { return MODE_PREDICTIVE; }
|
||||||
|
|
@ -42,11 +44,13 @@ public class ModePredictive extends InputMode {
|
||||||
|
|
||||||
|
|
||||||
ModePredictive(SettingsStore settings) {
|
ModePredictive(SettingsStore settings) {
|
||||||
this.settings = settings;
|
|
||||||
allowedTextCases.add(CASE_LOWER);
|
allowedTextCases.add(CASE_LOWER);
|
||||||
allowedTextCases.add(CASE_CAPITALIZE);
|
allowedTextCases.add(CASE_CAPITALIZE);
|
||||||
allowedTextCases.add(CASE_UPPER);
|
allowedTextCases.add(CASE_UPPER);
|
||||||
|
|
||||||
|
emptyDbWarning = new EmptyDatabaseWarning(settings);
|
||||||
|
this.settings = settings;
|
||||||
|
|
||||||
// digitSequence limiter when selecting emoji
|
// digitSequence limiter when selecting emoji
|
||||||
// "11" = Emoji level 0, "111" = Emoji level 1,... up to the maximum amount of 1s
|
// "11" = Emoji level 0, "111" = Emoji level 1,... up to the maximum amount of 1s
|
||||||
StringBuilder maxEmojiSequenceBuilder = new StringBuilder();
|
StringBuilder maxEmojiSequenceBuilder = new StringBuilder();
|
||||||
|
|
@ -344,6 +348,7 @@ public class ModePredictive extends InputMode {
|
||||||
dbSuggestions = dbSuggestions == null ? new ArrayList<>() : dbSuggestions;
|
dbSuggestions = dbSuggestions == null ? new ArrayList<>() : dbSuggestions;
|
||||||
|
|
||||||
if (dbSuggestions.size() == 0 && digitSequence.length() > 0) {
|
if (dbSuggestions.size() == 0 && digitSequence.length() > 0) {
|
||||||
|
emptyDbWarning.emitOnce(currentLanguage);
|
||||||
dbSuggestions = generatePossibleCompletions(currentLanguage, currentInputFieldWord);
|
dbSuggestions = generatePossibleCompletions(currentLanguage, currentInputFieldWord);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -209,6 +209,8 @@ public class SettingsStore {
|
||||||
public int getDictionaryImportProgressUpdateInterval() { return 250; /* ms */ }
|
public int getDictionaryImportProgressUpdateInterval() { return 250; /* ms */ }
|
||||||
public int getDictionaryImportWordChunkSize() { return 1000; /* words */ }
|
public int getDictionaryImportWordChunkSize() { return 1000; /* words */ }
|
||||||
|
|
||||||
|
public int getDictionaryMissingWarningInterval() { return 30000; /* ms */ }
|
||||||
|
|
||||||
public int getSuggestionsMax() { return 20; }
|
public int getSuggestionsMax() { return 20; }
|
||||||
public int getSuggestionsMin() { return 8; }
|
public int getSuggestionsMin() { return 8; }
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue