1
0
Fork 0

fixed a potential NullPointerException when trying to type with no language

This commit is contained in:
sspanak 2024-10-16 13:00:14 +03:00 committed by Dimo Karaivanov
parent d1f8a773f8
commit 433d5f401a
19 changed files with 20 additions and 44 deletions

View file

@ -1,6 +1,7 @@
package io.github.sspanak.tt9.ime.modes; package io.github.sspanak.tt9.ime.modes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
@ -8,6 +9,7 @@ import io.github.sspanak.tt9.hacks.InputType;
import io.github.sspanak.tt9.ime.helpers.TextField; import io.github.sspanak.tt9.ime.helpers.TextField;
import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.NaturalLanguage; import io.github.sspanak.tt9.languages.NaturalLanguage;
import io.github.sspanak.tt9.languages.NullLanguage;
import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.preferences.settings.SettingsStore;
import io.github.sspanak.tt9.util.Logger; import io.github.sspanak.tt9.util.Logger;
@ -31,9 +33,9 @@ abstract public class InputMode {
// data // data
protected int autoAcceptTimeout = -1; protected int autoAcceptTimeout = -1;
@NonNull protected String digitSequence = ""; @NonNull protected String digitSequence = "";
protected Language language; @NonNull protected Language language = new NullLanguage();
protected final SettingsStore settings; protected final SettingsStore settings;
protected final ArrayList<String> suggestions = new ArrayList<>(); @NonNull protected final ArrayList<String> suggestions = new ArrayList<>();
@NonNull protected Runnable onSuggestionsUpdated = () -> {}; @NonNull protected Runnable onSuggestionsUpdated = () -> {};
protected int specialCharSelectedGroup = 0; protected int specialCharSelectedGroup = 0;
@ -43,7 +45,7 @@ abstract public class InputMode {
} }
public static InputMode getInstance(SettingsStore settings, Language language, InputType inputType, TextField textField, int mode) { public static InputMode getInstance(SettingsStore settings, @Nullable Language language, InputType inputType, TextField textField, int mode) {
switch (mode) { switch (mode) {
case MODE_PREDICTIVE: case MODE_PREDICTIVE:
return new ModePredictive(settings, inputType, textField, language); return new ModePredictive(settings, inputType, textField, language);
@ -103,10 +105,8 @@ abstract public class InputMode {
public int getAutoAcceptTimeout() { public int getAutoAcceptTimeout() {
return autoAcceptTimeout; return autoAcceptTimeout;
} }
public void changeLanguage(Language newLanguage) { public void changeLanguage(@Nullable Language newLanguage) {
if (newLanguage != null) { language = newLanguage != null ? newLanguage : new NullLanguage();
language = newLanguage;
}
} }
// Interaction with the IME. Return "true" if it should perform the respective action. // Interaction with the IME. Return "true" if it should perform the respective action.
@ -181,7 +181,7 @@ abstract public class InputMode {
protected boolean loadSpecialCharacters() { protected boolean loadSpecialCharacters() {
if (language == null || digitSequence.isEmpty()) { if (digitSequence.isEmpty()) {
return false; return false;
} }
@ -208,7 +208,7 @@ abstract public class InputMode {
* list of characters, for example in email, numeric or other specialized fields. * list of characters, for example in email, numeric or other specialized fields.
*/ */
protected ArrayList<String> applyPunctuationOrder(ArrayList<String> unordered, int key) { protected ArrayList<String> applyPunctuationOrder(ArrayList<String> unordered, int key) {
if (language == null || specialCharSelectedGroup != 0 || key > 1) { if (specialCharSelectedGroup != 0 || key > 1) {
return new ArrayList<>(unordered); return new ArrayList<>(unordered);
} }

View file

@ -1,6 +1,7 @@
package io.github.sspanak.tt9.ime.modes; package io.github.sspanak.tt9.ime.modes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
@ -85,8 +86,8 @@ public class ModeABC extends InputMode {
} }
@Override @Override
public void changeLanguage(Language language) { public void changeLanguage(@Nullable Language newLanguage) {
super.changeLanguage(language); super.changeLanguage(newLanguage);
allowedTextCases.clear(); allowedTextCases.clear();
allowedTextCases.add(CASE_LOWER); allowedTextCases.add(CASE_LOWER);
@ -112,10 +113,6 @@ public class ModeABC extends InputMode {
@NonNull @NonNull
@Override @Override
public String toString() { public String toString() {
if (language == null) {
return textCase == CASE_LOWER ? "abc" : "ABC";
}
String modeString = language.getAbcString(); String modeString = language.getAbcString();
// There are many languages written using the same alphabet, so if the user has // There are many languages written using the same alphabet, so if the user has

View file

@ -1,6 +1,7 @@
package io.github.sspanak.tt9.ime.modes; package io.github.sspanak.tt9.ime.modes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
@ -107,8 +108,8 @@ public class ModePredictive extends InputMode {
@Override @Override
public void changeLanguage(Language language) { public void changeLanguage(@Nullable Language newLanguage) {
super.changeLanguage(language); super.changeLanguage(newLanguage);
autoSpace.setLanguage(language); autoSpace.setLanguage(language);
@ -509,10 +510,6 @@ public class ModePredictive extends InputMode {
@NonNull @NonNull
@Override @Override
public String toString() { public String toString() {
if (language == null) {
return "Predictive";
}
String modeString = language.getName(); String modeString = language.getName();
if (textCase == CASE_UPPER) { if (textCase == CASE_UPPER) {
return modeString.toUpperCase(language.getLocale()); return modeString.toUpperCase(language.getLocale());

View file

@ -108,8 +108,8 @@ public class Predictions {
private void loadWithoutLeadingPunctuation() { private void loadWithoutLeadingPunctuation() {
DataStore.getWords( DataStore.getWords(
(dbWords) -> { (dbWords) -> {
char firstChar = inputWord.charAt(0); char firstChar = inputWord.isEmpty() ? 0 : inputWord.charAt(0);
for (int i = 0; i < dbWords.size(); i++) { for (int i = 0; firstChar > 0 && i < dbWords.size(); i++) {
dbWords.set(i, firstChar + dbWords.get(i)); dbWords.set(i, firstChar + dbWords.get(i));
} }
onDbWords(dbWords, false); onDbWords(dbWords, false);

View file

@ -61,7 +61,7 @@ public class LanguageCollection {
@NonNull public static Language getDefault(Context context) { @NonNull public static Language getDefault(Context context) {
Language language = getByLocale(context, SystemSettings.getLocale()); Language language = getByLocale(context, SystemSettings.getLocale());
language = language == null ? getByLocale(context, "en") : language; language = language == null ? getByLocale(context, "en") : language;
return language == null ? new NullLanguage(context) : language; return language == null ? new NullLanguage() : language;
} }
@Nullable @Nullable

View file

@ -1,18 +1,14 @@
package io.github.sspanak.tt9.languages; package io.github.sspanak.tt9.languages;
import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Locale; import java.util.Locale;
import io.github.sspanak.tt9.R;
public class NullLanguage extends Language { public class NullLanguage extends Language {
public NullLanguage(Context context) { public NullLanguage() {
locale = Locale.ROOT; locale = Locale.ROOT;
name = context.getString(R.string.no_language); name = "Nulla Lingua";
abcString = "ABC"; abcString = "ABC";
code = ""; code = "";
dictionaryFile = ""; dictionaryFile = "";

View file

@ -4,7 +4,6 @@
<string name="pref_font_size_large">Голям</string> <string name="pref_font_size_large">Голям</string>
<string name="completed">Завършено</string> <string name="completed">Завършено</string>
<string name="loading">Зареждане…</string> <string name="loading">Зареждане…</string>
<string name="no_language">Няма език</string>
<string name="error_unexpected">Възникна неочаквана грешка.</string> <string name="error_unexpected">Възникна неочаквана грешка.</string>
<string name="add_word_add">Добави</string> <string name="add_word_add">Добави</string>
<string name="add_word_no_selection">Преместете показалеца върху дума, за да я добавите към речника.</string> <string name="add_word_no_selection">Преместете показалеца върху дума, за да я добавите към речника.</string>

View file

@ -2,7 +2,6 @@
<resources> <resources>
<string name="app_settings">TT9 Einstellungen</string> <string name="app_settings">TT9 Einstellungen</string>
<string name="loading">Laden…</string> <string name="loading">Laden…</string>
<string name="no_language">Keine Sprache</string>
<string name="error_unexpected">Unerwarteter Fehler aufgetreten.</string> <string name="error_unexpected">Unerwarteter Fehler aufgetreten.</string>
<string name="add_word_add">Hinzufügen</string> <string name="add_word_add">Hinzufügen</string>

View file

@ -14,7 +14,6 @@
<string name="pref_font_size_large">Grande</string> <string name="pref_font_size_large">Grande</string>
<string name="completed">Terminado</string> <string name="completed">Terminado</string>
<string name="loading">Cargando…</string> <string name="loading">Cargando…</string>
<string name="no_language">Sin idioma</string>
<string name="error_unexpected">Ocurrió un error inesperado.</string> <string name="error_unexpected">Ocurrió un error inesperado.</string>
<string name="add_word_exist">La palabra \"%1$s\" ya esta en el diccionario.</string> <string name="add_word_exist">La palabra \"%1$s\" ya esta en el diccionario.</string>
<string name="add_word_invalid_language_x">No se puede agregar una palabra. Idioma desconocido: \"%1$d\".</string> <string name="add_word_invalid_language_x">No se puede agregar una palabra. Idioma desconocido: \"%1$d\".</string>

View file

@ -4,7 +4,6 @@
<string name="pref_font_size_large">Grande</string> <string name="pref_font_size_large">Grande</string>
<string name="completed">Fini</string> <string name="completed">Fini</string>
<string name="loading">Chargement…</string> <string name="loading">Chargement…</string>
<string name="no_language">Aucun langue</string>
<string name="error_unexpected">Une erreur inattendue s\'est produite.</string> <string name="error_unexpected">Une erreur inattendue s\'est produite.</string>
<string name="add_word_add">Ajouter</string> <string name="add_word_add">Ajouter</string>
<string name="add_word_no_selection">Déplacez le curseur dans un mot pour l\'ajouter.</string> <string name="add_word_no_selection">Déplacez le curseur dans un mot pour l\'ajouter.</string>

View file

@ -4,7 +4,6 @@
<string name="pref_font_size_large">Grande</string> <string name="pref_font_size_large">Grande</string>
<string name="completed">Completato</string> <string name="completed">Completato</string>
<string name="loading">Caricamento…</string> <string name="loading">Caricamento…</string>
<string name="no_language">Nessuna lingua</string>
<string name="error_unexpected">Si è verificato un errore imprevisto.</string> <string name="error_unexpected">Si è verificato un errore imprevisto.</string>
<string name="add_word_add">Aggiungere</string> <string name="add_word_add">Aggiungere</string>

View file

@ -4,7 +4,6 @@
<string name="pref_font_size_large">גדול</string> <string name="pref_font_size_large">גדול</string>
<string name="completed">הסתיים</string> <string name="completed">הסתיים</string>
<string name="loading">טוען…</string> <string name="loading">טוען…</string>
<string name="no_language">אין שפה</string>
<string name="error_unexpected">אירעה שגיאה לא צפויה.</string> <string name="error_unexpected">אירעה שגיאה לא צפויה.</string>
<string name="add_word_add">הוסף</string> <string name="add_word_add">הוסף</string>

View file

@ -4,7 +4,6 @@
<string name="pref_font_size_large">Didelis</string> <string name="pref_font_size_large">Didelis</string>
<string name="completed">Baigta</string> <string name="completed">Baigta</string>
<string name="loading">Įkeliama…</string> <string name="loading">Įkeliama…</string>
<string name="no_language">Kalbos nėra</string>
<string name="error_unexpected">Įvyko netikėta klaida.</string> <string name="error_unexpected">Įvyko netikėta klaida.</string>

View file

@ -2,7 +2,6 @@
<resources> <resources>
<string name="app_settings">TT9 Opties</string> <string name="app_settings">TT9 Opties</string>
<string name="loading">Laden…</string> <string name="loading">Laden…</string>
<string name="no_language">Geen taal</string>
<string name="error_unexpected">Er is een onverwachte fout opgetreden.</string> <string name="error_unexpected">Er is een onverwachte fout opgetreden.</string>
<string name="add_word_add">Toevoegen</string> <string name="add_word_add">Toevoegen</string>

View file

@ -4,7 +4,6 @@
<string name="pref_font_size_large">Grande</string> <string name="pref_font_size_large">Grande</string>
<string name="completed">Concluído</string> <string name="completed">Concluído</string>
<string name="loading">Carregando…</string> <string name="loading">Carregando…</string>
<string name="no_language">Sem idioma</string>
<string name="error_unexpected">Um erro inesperado aconteceu.</string> <string name="error_unexpected">Um erro inesperado aconteceu.</string>
<string name="add_word_add">Adicionar</string> <string name="add_word_add">Adicionar</string>

View file

@ -4,7 +4,6 @@
<string name="pref_font_size_large">Крупный</string> <string name="pref_font_size_large">Крупный</string>
<string name="completed">Выполнено</string> <string name="completed">Выполнено</string>
<string name="loading">Загрузка…</string> <string name="loading">Загрузка…</string>
<string name="no_language">Нет языка</string>
<string name="error_unexpected">Произошла непредвиденная ошибка.</string> <string name="error_unexpected">Произошла непредвиденная ошибка.</string>
<string name="add_word_add">Добавить</string> <string name="add_word_add">Добавить</string>
<string name="add_word_no_selection">Переместите курсор внутрь слова, чтобы добавить его.</string> <string name="add_word_no_selection">Переместите курсор внутрь слова, чтобы добавить его.</string>

View file

@ -2,7 +2,6 @@
<resources> <resources>
<string name="app_settings">TT9 Ayarlar</string> <string name="app_settings">TT9 Ayarlar</string>
<string name="loading">Yükleniyor…</string> <string name="loading">Yükleniyor…</string>
<string name="no_language">Yüklü Dil Yok</string>
<string name="error_unexpected">Beklenmeyen bir hata ile karşılaşıldı.</string> <string name="error_unexpected">Beklenmeyen bir hata ile karşılaşıldı.</string>
<string name="add_word_add">Ekle</string> <string name="add_word_add">Ekle</string>

View file

@ -4,7 +4,6 @@
<string name="pref_font_size_large">Великий</string> <string name="pref_font_size_large">Великий</string>
<string name="completed">Виконано</string> <string name="completed">Виконано</string>
<string name="loading">Завантаження…</string> <string name="loading">Завантаження…</string>
<string name="no_language">Немає мови</string>
<string name="error_unexpected">Сталася неочікувана помилка.</string> <string name="error_unexpected">Сталася неочікувана помилка.</string>

View file

@ -7,7 +7,6 @@
<string name="completed">Completed</string> <string name="completed">Completed</string>
<string name="loading">Loading…</string> <string name="loading">Loading…</string>
<string name="language">Language</string> <string name="language">Language</string>
<string name="no_language">No Language</string>
<string name="search_results">Search Results</string> <string name="search_results">Search Results</string>
<string name="search_results_void">No results.</string> <string name="search_results_void">No results.</string>
@ -24,7 +23,6 @@
<string name="add_word_success">\"%1$s\" added.</string> <string name="add_word_success">\"%1$s\" added.</string>
<string name="add_word_title">Add Word</string> <string name="add_word_title">Add Word</string>
<string name="commands_select_command">Select a Command</string> <string name="commands_select_command">Select a Command</string>
<string name="pref_category_about">About</string> <string name="pref_category_about">About</string>