1
0
Fork 0

Add words without confirmation (#583)

This commit is contained in:
Dimo Karaivanov 2024-07-31 11:40:00 +03:00 committed by GitHub
parent ded66244bd
commit b9c4d71968
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 112 additions and 42 deletions

View file

@ -6,6 +6,7 @@ import androidx.annotation.NonNull;
import java.util.ArrayList;
import io.github.sspanak.tt9.db.entities.AddWordResult;
import io.github.sspanak.tt9.db.entities.NormalizationList;
import io.github.sspanak.tt9.db.entities.Word;
import io.github.sspanak.tt9.db.entities.WordList;
@ -18,7 +19,6 @@ import io.github.sspanak.tt9.languages.EmojiLanguage;
import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.NullLanguage;
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
import io.github.sspanak.tt9.ui.dialogs.AddWordDialog;
import io.github.sspanak.tt9.util.Logger;
import io.github.sspanak.tt9.util.Text;
import io.github.sspanak.tt9.util.Timer;
@ -142,25 +142,24 @@ public class WordStore {
}
public int put(Language language, String word) {
@NonNull public AddWordResult put(Language language, String word) {
if (word == null || word.isEmpty()) {
return AddWordDialog.CODE_BLANK_WORD;
return new AddWordResult(AddWordResult.CODE_BLANK_WORD, word);
}
if (language == null || language instanceof NullLanguage) {
return AddWordDialog.CODE_INVALID_LANGUAGE;
return new AddWordResult(AddWordResult.CODE_INVALID_LANGUAGE, word);
}
if (!checkOrNotify()) {
return AddWordDialog.CODE_GENERAL_ERROR;
return new AddWordResult(AddWordResult.CODE_GENERAL_ERROR, word);
}
language = Text.isGraphic(word) ? new EmojiLanguage() : language;
try {
if (readOps.exists(sqlite.getDb(), language, word)) {
return AddWordDialog.CODE_WORD_EXISTS;
return new AddWordResult(AddWordResult.CODE_WORD_EXISTS, word);
}
String sequence = language.getDigitSequenceForWord(word);
@ -173,10 +172,10 @@ public class WordStore {
} catch (Exception e) {
String msg = "Failed inserting word: '" + word + "' for language: " + language.getId() + ". " + e.getMessage();
Logger.e("insertWord", msg);
return AddWordDialog.CODE_GENERAL_ERROR;
return new AddWordResult(AddWordResult.CODE_GENERAL_ERROR, word);
}
return AddWordDialog.CODE_SUCCESS;
return new AddWordResult(AddWordResult.CODE_SUCCESS, word);
}

View file

@ -7,8 +7,9 @@ import androidx.annotation.NonNull;
import java.util.ArrayList;
import io.github.sspanak.tt9.util.ConsumerCompat;
import io.github.sspanak.tt9.db.entities.AddWordResult;
import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.util.ConsumerCompat;
public class WordStoreAsync {
private static WordStore store;
@ -56,7 +57,7 @@ public class WordStoreAsync {
}
public static void put(ConsumerCompat<Integer> statusHandler, Language language, String word) {
public static void put(ConsumerCompat<AddWordResult> statusHandler, Language language, String word) {
new Thread(() -> statusHandler.accept(getStore().put(language, word))).start();
}

View file

@ -0,0 +1,67 @@
package io.github.sspanak.tt9.db.entities;
import android.content.Context;
import androidx.annotation.NonNull;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.languages.Language;
public class AddWordResult {
public static final int CODE_SUCCESS = 0;
public static final int CODE_BLANK_WORD = 1;
public static final int CODE_INVALID_LANGUAGE = 2;
public static final int CODE_WORD_EXISTS = 3;
public static final int CODE_GENERAL_ERROR = 666;
private final int statusCode;
private final String word;
public AddWordResult(int statusCode, String word) {
this.statusCode = statusCode;
this.word = word;
}
public String toHumanFriendlyString(Context context) {
switch (statusCode) {
case CODE_SUCCESS:
return context.getString(R.string.add_word_success, word);
case CODE_WORD_EXISTS:
return context.getResources().getString(R.string.add_word_exist, word);
case CODE_BLANK_WORD:
return context.getString(R.string.add_word_blank);
case CODE_INVALID_LANGUAGE:
return context.getResources().getString(R.string.add_word_invalid_language);
default:
return context.getString(R.string.error_unexpected);
}
}
@NonNull
@Override
public String toString() {
switch (statusCode) {
case CODE_SUCCESS:
return "Success";
case CODE_BLANK_WORD:
return "Blank word";
case CODE_INVALID_LANGUAGE:
return "Invalid language";
case CODE_WORD_EXISTS:
return "Word '" + word + "' exists";
case CODE_GENERAL_ERROR:
return "General error";
default:
return "Unknown error";
}
}
}

View file

@ -2,6 +2,7 @@ package io.github.sspanak.tt9.ime;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.db.DictionaryLoader;
import io.github.sspanak.tt9.db.WordStoreAsync;
import io.github.sspanak.tt9.ime.modes.InputMode;
import io.github.sspanak.tt9.ime.modes.ModeABC;
import io.github.sspanak.tt9.languages.LanguageCollection;
@ -93,6 +94,8 @@ abstract public class CommandHandler extends TextEditingHandler {
String word = textField.getSurroundingWord(mLanguage);
if (word.isEmpty()) {
UI.toastLong(this, R.string.add_word_no_selection);
} else if (settings.getAddWordsNoConfirmation()) {
WordStoreAsync.put((res) -> UI.toastLongFromAsync(this, res.toHumanFriendlyString(this)), mLanguage, word);
} else {
AddWordDialog.show(this, mLanguage.getId(), word);
}

View file

@ -22,6 +22,10 @@ public class SettingsUI extends SettingsTyping {
SettingsUI(Context context) { super(context); }
public boolean getAddWordsNoConfirmation() {
return prefs.getBoolean("add_word_no_confirmation", false);
}
public boolean isStatusIconEnabled() {
return prefs.getBoolean("pref_status_icon", DeviceInfo.isQinF21());
}

View file

@ -80,6 +80,13 @@ public class UI {
Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
}
public static void toastLongFromAsync(Context context, CharSequence msg) {
if (Looper.myLooper() == null) {
Looper.prepare();
}
toastLong(context, msg);
}
public static void toastShortSingle(@NonNull Context context, @NonNull String uniqueId, @NonNull String message) {
Toast toast = singleToasts.get(uniqueId);

View file

@ -8,17 +8,12 @@ import androidx.annotation.NonNull;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.db.WordStoreAsync;
import io.github.sspanak.tt9.db.entities.AddWordResult;
import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.LanguageCollection;
import io.github.sspanak.tt9.util.ConsumerCompat;
public class AddWordDialog extends PopupDialog {
public static final int CODE_SUCCESS = 0;
public static final int CODE_BLANK_WORD = 1;
public static final int CODE_INVALID_LANGUAGE = 2;
public static final int CODE_WORD_EXISTS = 3;
public static final int CODE_GENERAL_ERROR = 666;
public static final String TYPE = "tt9.popup_dialog.add_word";
public static final String PARAMETER_LANGUAGE = "lang";
public static final String PARAMETER_WORD = "word";
@ -57,31 +52,8 @@ public class AddWordDialog extends PopupDialog {
}
private void onAddingFinished(int statusCode) {
String response;
switch (statusCode) {
case CODE_SUCCESS:
response = context.getString(R.string.add_word_success, word);
break;
case CODE_WORD_EXISTS:
response = context.getResources().getString(R.string.add_word_exist, word);
break;
case CODE_BLANK_WORD:
response = context.getString(R.string.add_word_blank);
break;
case CODE_INVALID_LANGUAGE:
response = context.getResources().getString(R.string.add_word_invalid_language);
break;
default:
response = context.getString(R.string.error_unexpected);
break;
}
activityFinisher.accept(response);
private void onAddingFinished(AddWordResult addingResult) {
activityFinisher.accept(addingResult.toHumanFriendlyString(context));
}

View file

@ -153,4 +153,5 @@
<string name="virtual_numpad_alignment_right">Вдясно</string>
<string name="function_select_keyboard">Избор на клавиатура</string>
<string name="function_voice_input">Гласово въвеждане</string>
<string name="add_word_no_confirmation">Добавяне без потвърждение</string>
</resources>

View file

@ -142,4 +142,5 @@
<string name="virtual_numpad_alignment_left">Links</string>
<string name="virtual_numpad_alignment_right">Rechts</string>
<string name="function_select_keyboard">Tastaturauswahl</string>
<string name="add_word_no_confirmation">Ohne Bestätigung hinzufügen</string>
</resources>

View file

@ -151,4 +151,5 @@
<string name="virtual_numpad_alignment_left">A la izquierda</string>
<string name="virtual_numpad_alignment_right">A la derecha</string>
<string name="function_select_keyboard">Cambiar el teclado</string>
<string name="add_word_no_confirmation">Añadir sin confirmación</string>
</resources>

View file

@ -149,4 +149,5 @@
<string name="virtual_numpad_alignment_left">À gauche</string>
<string name="virtual_numpad_alignment_right">À droite</string>
<string name="function_select_keyboard">Choisir le clavier</string>
<string name="add_word_no_confirmation">Ajouter sans confirmation</string>
</resources>

View file

@ -141,5 +141,6 @@
<string name="virtual_numpad_alignment_center">Al centro</string>
<string name="virtual_numpad_alignment_left">A sinistra</string>
<string name="virtual_numpad_alignment_right">A destra</string>
<string name="add_word_no_confirmation">Aggiungere senza conferma</string>
</resources>

View file

@ -154,4 +154,5 @@
<string name="virtual_numpad_alignment_left">שמאלה</string>
<string name="virtual_numpad_alignment_right">ימינה</string>
<string name="function_select_keyboard">בחירת מקלדת</string>
<string name="add_word_no_confirmation">להוסיף ללא אישור</string>
</resources>

View file

@ -160,4 +160,5 @@
<string name="virtual_numpad_alignment_left">Kairėje</string>
<string name="virtual_numpad_alignment_right">Dešinėje</string>
<string name="function_select_keyboard">Keisti klaviatūrą</string>
<string name="add_word_no_confirmation">Pridėti be patvirtinimo</string>
</resources>

View file

@ -140,4 +140,5 @@
<string name="virtual_numpad_alignment_left">Links</string>
<string name="virtual_numpad_alignment_right">Rechts</string>
<string name="function_select_keyboard">Toetsenbordkeuze</string>
<string name="add_word_no_confirmation">Toevoegen zonder bevestiging</string>
</resources>

View file

@ -154,4 +154,5 @@
<string name="virtual_numpad_alignment_left">À esquerda</string>
<string name="virtual_numpad_alignment_right">À direita</string>
<string name="function_select_keyboard">Mude o teclado</string>
<string name="add_word_no_confirmation">Adicionar sem confirmação</string>
</resources>

View file

@ -151,4 +151,5 @@
<string name="virtual_numpad_alignment_left">Налево</string>
<string name="virtual_numpad_alignment_right">Направо</string>
<string name="function_select_keyboard">Выбор клавиатуры</string>
<string name="add_word_no_confirmation">Добавить без подтверждения</string>
</resources>

View file

@ -154,4 +154,5 @@
<string name="virtual_numpad_alignment_left">Sola</string>
<string name="virtual_numpad_alignment_right">Sağa</string>
<string name="function_select_keyboard">Klavye Seçimi</string>
<string name="add_word_no_confirmation">Onay olmadan ekle</string>
</resources>

View file

@ -162,4 +162,5 @@
<string name="virtual_numpad_alignment_left">Ліворуч</string>
<string name="virtual_numpad_alignment_right">Праворуч</string>
<string name="function_select_keyboard">Змінити клавіатуру</string>
<string name="add_word_no_confirmation">Додати без підтвердження</string>
</resources>

View file

@ -15,6 +15,7 @@
<string name="add_word_add">Add</string>
<string name="add_word_confirm">Add word \"%1$s\" to %2$s?</string>
<string name="add_word_no_confirmation">Add Without Confirmation</string>
<string name="add_word_no_selection">Move the cursor inside a word to add it.</string>
<string name="add_word_blank">Blank word not added.</string>
<string name="add_word_exist">Word \"%1$s\" is already in the dictionary.</string>

View file

@ -32,6 +32,10 @@
app:title="@string/pref_category_custom_words"
app:singleLineTitle="true">
<SwitchPreferenceCompat
app:key="add_word_no_confirmation"
app:title="@string/add_word_no_confirmation" />
<Preference
app:key="dictionary_export_custom"
app:title="@string/dictionary_export_custom_words" />