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