From d8c2f7fc150284fb7b5b2b4236d6c79c3b9f09f1 Mon Sep 17 00:00:00 2001 From: sspanak Date: Mon, 14 Aug 2023 15:26:42 +0300 Subject: [PATCH] simplified word adding --- res/layout/addwordview.xml | 20 +---- res/values-bg/strings.xml | 4 +- res/values-de/strings.xml | 1 + res/values-es/strings.xml | 2 +- res/values-fr/strings.xml | 4 +- res/values-it/strings.xml | 1 + res/values-iw/strings.xml | 1 - res/values-nl/strings.xml | 1 + res/values-pt-rBR/strings.xml | 2 +- res/values-ru/strings.xml | 4 +- res/values-uk/strings.xml | 4 +- res/values/strings.xml | 4 +- .../github/sspanak/tt9/db/DictionaryDb.java | 7 +- .../github/sspanak/tt9/ime/TraditionalT9.java | 69 +++++++--------- .../sspanak/tt9/ime/helpers/TextField.java | 4 +- .../tt9/preferences/SettingsStore.java | 18 ----- src/io/github/sspanak/tt9/ui/AddWordAct.java | 81 ++++++++++++------- 17 files changed, 110 insertions(+), 117 deletions(-) diff --git a/res/layout/addwordview.xml b/res/layout/addwordview.xml index 54faa908..d3083d41 100644 --- a/res/layout/addwordview.xml +++ b/res/layout/addwordview.xml @@ -5,24 +5,12 @@ android:paddingHorizontal="6dp" android:orientation="vertical" > - - - - + android:layout_margin="10dp"> + Възникна неочаквана грешка. Не може да се заредят езиковите дефиниции. Добави + Преместете показалеца върху дума, за да я добавите към речника. Не може да се въведе празна дума. Думата „%1$s“ е вече речника. + „%1$s“ е добавена. Добавяне на дума За приложението Помощ @@ -62,7 +64,6 @@ Символ при двойно натисната \"0\" Нов ред Интервал - Напишете дума… Бутони в обратен ред Включете настройката, ако на първият ред са 7–8–9, вместо 1–2–3. Изтрий неизбраните @@ -75,4 +76,5 @@ Да Не Автоматично + Да се добави ли „%1$s“ към %2$s? diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index f3b09fe4..cfc43608 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -7,6 +7,7 @@ Hinzufügen Leeres Wort nicht hinzugefügt. Das Wort \"%1$s\" ist bereits in Wörterbuch. + \"%1$s\" hinzugefügt. Wort hinzufügen Über die Anwendung diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 54f03527..269556ff 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -9,6 +9,7 @@ Sin idioma Ocurrió un error inesperado. La palabra \"%1$s\" ya esta en el diccionario. + \"%1$s\" añadida. Agregar palabra Modo ABC Compatibilidad @@ -28,7 +29,6 @@ Cargar diccionario Cargando diccionario Cargando diccionario (%1$s)… - Escriba una palabra… Acerca de esta aplicación No hay diccionario para el idioma \"%1$s\". Vaya a Configuración para cargarlo. Falló al cargar. No se encontró el diccionario para \"%1$s\". diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 418d06d1..ad81fd05 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -6,8 +6,10 @@ Une erreur inattendue s\'est produite. Impossible de charger aucune définition de langue Ajouter + Déplacez le curseur dans un mot pour l\'ajouter. Mot vide non ajouté. Le mot «%1$s» est déjà dans le dictionnaire. + « %1$s » est ajouté Ajouter un mot À propos de l\'application Aide @@ -58,7 +60,6 @@ Cliquez ici pour activer TT9 dans les paramètres Android. Nouvelle ligne Caractère lorsque «0» est appuyé deux fois - Tapez un mot… Inverser l\'ordre des clés Activez le paramètre s\'il y a 7–8–9 sur le premier rang, au lieu de 1–2–3. Supprimer les non sélectionnés @@ -69,4 +70,5 @@ Oui Non Automatique + Ajouter mot « %1$s » à %2$s? diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 3d7153f2..a1c52e0d 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -8,6 +8,7 @@ Aggiungere Nessuna parola da aggiungere. Parola “%1$s” già nel dizionario. + \"%1$s\" aggiunta. Aggiungi parola Sull\'applicazione diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 992ceb9d..d414f6c5 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -9,7 +9,6 @@ מילה ריקה לא נוספה המילה \"%1$s\" כבר קיימת במילון. הוסף מילה - הקלד מילה… אודות הגדרות תאימות diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 2a4e7dd9..4560123f 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -7,6 +7,7 @@ Toevoegen Leeg woord niet toegevoegd. Woord \"%1$s\" staat al in het woordenboek. + \"%1$s\" toegevoegd. Woord toevoegen Over de applicatie Helpen diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 76e3ee1b..daf5067e 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -8,8 +8,8 @@ Adicionar Palavra em branco, impossível adicionar. Palavra \"%1$s\" já está registrada. + \"%1$s\" adicionada. Adicionar Palavra - Escreva uma palavra… Sobre Compatibilidade diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index b7907878..db8b307d 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -6,8 +6,10 @@ Произошла непредвиденная ошибка. Не удалось загрузить какое-либо определение языка. Добавить + Переместите курсор внутрь слова, чтобы добавить его. Невозможно добавить слово. Слово «%1$s» уже есть в словаре. + « %1$s » добавлено Добавить слово О приложении Помощь @@ -62,7 +64,6 @@ (зажать) Назад Позвонить - Введите слово… Перевернутая клавиатура Используйте настройку, если в первом ряду 7–8–9 вместо 1–2–3. Удалить невыбранные @@ -75,4 +76,5 @@ Да Нет Автоматически + Добавить слово «%1$s» в %2$s? diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 36299ab7..d9184979 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -6,8 +6,10 @@ Сталася неочікувана помилка. Не вдалося завантажити всі визначення мови. Додати + Перемістіть курсор у слово, щоб додати його. Неможливо додати слово. Слово «%1$s» вже є в словнику. + « %1$s » додано Додати слово Про додаток Допомога @@ -62,7 +64,6 @@ Словник успішно видалено. Немає словника для мови «%1$s». Перейдіть до Налаштувань, щоб завантажити його. Помилка завантаження. Недійсне слово «%1$s» в рядку %2$d мови «%3$s». - Введіть слово… Зворотна клавіатура Використовуйте налаштування, якщо 7–8–9 у першому рядку замість 1–2–3. Видалити невибрані @@ -75,4 +76,5 @@ Так Ні Автоматично + Додати слово «%1$s» до %2$s? diff --git a/res/values/strings.xml b/res/values/strings.xml index e078ef59..baa4a497 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -12,11 +12,13 @@ Failed loading all language definitions. Add + Add word \"%1$s\" to %2$s? + Move the cursor inside a word to add it. Blank word not added. Word \"%1$s\" is already in the dictionary. Cannot add a word when no language is selected. + \"%1$s\" added. Add Word - Type a word… About ABC Mode diff --git a/src/io/github/sspanak/tt9/db/DictionaryDb.java b/src/io/github/sspanak/tt9/db/DictionaryDb.java index 4424d6dc..f223564a 100644 --- a/src/io/github/sspanak/tt9/db/DictionaryDb.java +++ b/src/io/github/sspanak/tt9/db/DictionaryDb.java @@ -4,6 +4,7 @@ import android.content.Context; import android.database.sqlite.SQLiteConstraintException; import android.os.Handler; +import androidx.annotation.NonNull; import androidx.sqlite.db.SimpleSQLiteQuery; import java.util.ArrayList; @@ -118,11 +119,7 @@ public class DictionaryDb { } - public static void insertWord(ConsumerCompat statusHandler, Language language, String word) throws Exception { - if (language == null) { - throw new InvalidLanguageException(); - } - + public static void insertWord(ConsumerCompat statusHandler, @NonNull Language language, String word) throws Exception { if (word == null || word.length() == 0) { throw new InsertBlankWordException(); } diff --git a/src/io/github/sspanak/tt9/ime/TraditionalT9.java b/src/io/github/sspanak/tt9/ime/TraditionalT9.java index 43408805..26504025 100644 --- a/src/io/github/sspanak/tt9/ime/TraditionalT9.java +++ b/src/io/github/sspanak/tt9/ime/TraditionalT9.java @@ -1,6 +1,7 @@ package io.github.sspanak.tt9.ime; import android.content.Context; +import android.content.Intent; import android.os.Build; import android.os.Handler; import android.os.Looper; @@ -9,12 +10,13 @@ import android.view.View; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; -import org.jetbrains.annotations.NotNull; +import androidx.annotation.NonNull; import java.util.ArrayList; import java.util.List; import io.github.sspanak.tt9.Logger; +import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.db.DictionaryDb; import io.github.sspanak.tt9.ime.helpers.InputModeValidator; import io.github.sspanak.tt9.ime.helpers.InputType; @@ -24,6 +26,7 @@ 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.preferences.helpers.Hotkeys; +import io.github.sspanak.tt9.ui.AddWordAct; import io.github.sspanak.tt9.ui.UI; import io.github.sspanak.tt9.ui.main.MainView; import io.github.sspanak.tt9.ui.tray.StatusBar; @@ -32,9 +35,9 @@ import io.github.sspanak.tt9.ui.tray.SuggestionsBar; public class TraditionalT9 extends KeyPadHandler { // internal settings/data private boolean isActive = false; - @NotNull private TextField textField = new TextField(null, null); - @NotNull private InputType inputType = new InputType(null, null); - @NotNull private final Handler autoAcceptHandler = new Handler(Looper.getMainLooper()); + @NonNull private TextField textField = new TextField(null, null); + @NonNull private InputType inputType = new InputType(null, null); + @NonNull private final Handler autoAcceptHandler = new Handler(Looper.getMainLooper()); // input mode private ArrayList allowedInputModes = new ArrayList<>(); @@ -49,7 +52,6 @@ public class TraditionalT9 extends KeyPadHandler { private StatusBar statusBar = null; private SuggestionsBar suggestionBar = null; - private static TraditionalT9 self; public static Context getMainContext() { return self.getApplicationContext(); @@ -120,6 +122,20 @@ public class TraditionalT9 extends KeyPadHandler { } + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + int result = super.onStartCommand(intent, flags, startId); + + String message = intent.getStringExtra(AddWordAct.INTENT_FILTER); + if (message != null && !message.isEmpty()) { + forceShowWindowIfHidden(); + UI.toastLong(self, message); + } + + return result; + } + + protected void onInit() { self = this; @@ -133,7 +149,6 @@ public class TraditionalT9 extends KeyPadHandler { loadSettings(); validateFunctionKeys(); - settings.clearLastWord(); } @@ -185,7 +200,6 @@ public class TraditionalT9 extends KeyPadHandler { initTyping(); initUi(); - restoreAddedWordIfAny(); isActive = true; } @@ -333,7 +347,16 @@ public class TraditionalT9 extends KeyPadHandler { } cancelAutoAccept(); - showAddWord(); + textField.finishComposingText(); + clearSuggestions(); + + String word = textField.getSurroundingWord(); + if (word.isEmpty()) { + UI.toastLong(this, R.string.add_word_no_selection); + } else { + UI.showAddWordDialog(this, mLanguage.getId(), word); + } + return true; } @@ -726,36 +749,6 @@ public class TraditionalT9 extends KeyPadHandler { } - private void showAddWord() { - textField.finishComposingText(); - clearSuggestions(); - - UI.showAddWordDialog(this, mLanguage.getId(), textField.getSurroundingWord()); - } - - - /** - * restoreAddedWordIfAny - * If a new word was added to the dictionary, this function will append add it to the current input field. - */ - private void restoreAddedWordIfAny() { - String word = settings.getLastWord(); - settings.clearLastWord(); - - if (word.length() == 0 || word.equals(textField.getSurroundingWord())) { - return; - } - - try { - Logger.d("restoreAddedWordIfAny", "Restoring word: '" + word + "'..."); - textField.setText(word); - mInputMode.reset(); - } catch (Exception e) { - Logger.w("restoreLastWord", "Could not restore the last added word. " + e.getMessage()); - } - } - - /** * createSoftKeyView * Generates the actual UI of TT9. diff --git a/src/io/github/sspanak/tt9/ime/helpers/TextField.java b/src/io/github/sspanak/tt9/ime/helpers/TextField.java index 2d2ab23e..4a39caad 100644 --- a/src/io/github/sspanak/tt9/ime/helpers/TextField.java +++ b/src/io/github/sspanak/tt9/ime/helpers/TextField.java @@ -10,6 +10,8 @@ import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputConnection; +import androidx.annotation.NonNull; + import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -189,7 +191,7 @@ public class TextField { * getSurroundingWord * Returns the word next or around the cursor. Scanning length is up to 50 chars in each direction. */ - public String getSurroundingWord() { + @NonNull public String getSurroundingWord() { Matcher before = beforeCursorWordRegex.matcher(getTextBeforeCursor()); Matcher after = afterCursorWordRegex.matcher(getTextAfterCursor()); diff --git a/src/io/github/sspanak/tt9/preferences/SettingsStore.java b/src/io/github/sspanak/tt9/preferences/SettingsStore.java index 91458f50..561b800a 100644 --- a/src/io/github/sspanak/tt9/preferences/SettingsStore.java +++ b/src/io/github/sspanak/tt9/preferences/SettingsStore.java @@ -284,22 +284,4 @@ public class SettingsStore { public int getWordFrequencyMax() { return 25500; } public int getWordFrequencyNormalizationDivider() { return 100; } // normalized frequency = getWordFrequencyMax() / getWordFrequencyNormalizationDivider() - - - /************* add word, last word *************/ - - public String getLastWord() { - return prefs.getString("last_word", ""); - } - - public void saveLastWord(String lastWord) { - // "last_word" was part of the original Settings implementation. - // It is weird, but it is simple and it works, so I decided to keep it. - prefsEditor.putString("last_word", lastWord); - prefsEditor.apply(); - } - - public void clearLastWord() { - this.saveLastWord(""); - } } diff --git a/src/io/github/sspanak/tt9/ui/AddWordAct.java b/src/io/github/sspanak/tt9/ui/AddWordAct.java index 386f08be..91b9565b 100644 --- a/src/io/github/sspanak/tt9/ui/AddWordAct.java +++ b/src/io/github/sspanak/tt9/ui/AddWordAct.java @@ -3,90 +3,109 @@ package io.github.sspanak.tt9.ui; import android.content.Intent; import android.os.Bundle; import android.view.View; -import android.widget.EditText; +import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.app.AppCompatDelegate; import io.github.sspanak.tt9.Logger; import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.db.DictionaryDb; import io.github.sspanak.tt9.db.exceptions.InsertBlankWordException; +import io.github.sspanak.tt9.ime.TraditionalT9; import io.github.sspanak.tt9.languages.InvalidLanguageException; +import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.LanguageCollection; -import io.github.sspanak.tt9.preferences.SettingsStore; public class AddWordAct extends AppCompatActivity { + public static final String INTENT_FILTER = "tt9.add_word"; - private View main; - private int lang; - private SettingsStore settings; + private Language language; private String word; @Override protected void onCreate(Bundle savedData) { - settings = new SettingsStore(this); - - AppCompatDelegate.setDefaultNightMode(settings.getTheme()); - super.onCreate(savedData); + readInput(); + render(getMessage()); + } + + private void readInput() { Intent i = getIntent(); word = i.getStringExtra("io.github.sspanak.tt9.word"); - lang = i.getIntExtra("io.github.sspanak.tt9.lang", -1); + language = LanguageCollection.getLanguage(this, i.getIntExtra("io.github.sspanak.tt9.lang", -1)); + } - main = View.inflate(this, R.layout.addwordview, null); + private String getMessage() { + if (language == null) { + Logger.e("WordManager.confirmAddWord", "Cannot insert a word for NULL language"); + UI.toastLong(getApplicationContext(), R.string.add_word_invalid_language); + return null; + } - EditText et = main.findViewById(R.id.add_word_text); - et.setOnClickListener(this::addWord); - et.setText(word); - et.setSelection(word.length()); + return getString(R.string.add_word_confirm, word, language.getName()); + } + + private void render(String message) { + if (message == null || word == null || word.isEmpty()) { + finish(); + return; + } + + View main = View.inflate(this, R.layout.addwordview, null); + ((TextView) main.findViewById(R.id.add_word_dialog_text)).append(message); setContentView(main); } private void onAddedWord(int statusCode) { + String message; switch (statusCode) { case 0: - Logger.d("onAddedWord", "Successfully added word: '" + word + '"'); - settings.saveLastWord(word); + message = getString(R.string.add_word_success, word); break; case 1: - UI.toastLongFromAsync( - main.getContext(), - getResources().getString(R.string.add_word_exist, word) - ); + message = getResources().getString(R.string.add_word_exist, word); break; default: - UI.toastLongFromAsync(main.getContext(), R.string.error_unexpected); + message = getString(R.string.error_unexpected); break; } finish(); + sendMessageToMain(message); } + public void addWord(View v) { try { - // re-fetch the word, in case the user has changed it after the initialization - word = ((EditText) main.findViewById(R.id.add_word_text)).getText().toString(); Logger.d("addWord", "Attempting to add word: '" + word + "'..."); - - DictionaryDb.insertWord(this::onAddedWord, LanguageCollection.getLanguage(this, lang), word); + DictionaryDb.insertWord(this::onAddedWord, language, word); } catch (InsertBlankWordException e) { Logger.e("AddWordAct.addWord", e.getMessage()); - UI.toastLong(this, R.string.add_word_blank); + finish(); + sendMessageToMain(getString(R.string.add_word_blank)); } catch (InvalidLanguageException e) { - Logger.e("AddWordAct.addWord", "Cannot insert a word for language with ID: '" + lang + "'. " + e.getMessage()); - UI.toastLong(this, R.string.add_word_invalid_language); + Logger.e("AddWordAct.addWord", "Cannot insert a word for language: '" + language.getName() + "'. " + e.getMessage()); + finish(); + sendMessageToMain(getString(R.string.add_word_invalid_language)); } catch (Exception e) { Logger.e("AddWordAct.addWord", e.getMessage()); - UI.toastLong(this, e.getMessage()); + finish(); + sendMessageToMain(e.getMessage()); } } + private void sendMessageToMain(String message) { + Intent intent = new Intent(this, TraditionalT9.class); + intent.putExtra(INTENT_FILTER, message); + startService(intent); + } + + public void cancelAddingWord(View v) { finish(); }