From 433d5f401ab5cee5e6e4ca45fc9f7036b7aec104 Mon Sep 17 00:00:00 2001 From: sspanak Date: Wed, 16 Oct 2024 13:00:14 +0300 Subject: [PATCH] fixed a potential NullPointerException when trying to type with no language --- .../sspanak/tt9/ime/modes/InputMode.java | 18 +++++++++--------- .../github/sspanak/tt9/ime/modes/ModeABC.java | 9 +++------ .../sspanak/tt9/ime/modes/ModePredictive.java | 9 +++------ .../tt9/ime/modes/helpers/Predictions.java | 4 ++-- .../tt9/languages/LanguageCollection.java | 2 +- .../sspanak/tt9/languages/NullLanguage.java | 8 ++------ app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-iw/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values/strings.xml | 2 -- 19 files changed, 20 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/InputMode.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/InputMode.java index 5428b4bd..3b51d2b6 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/InputMode.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/InputMode.java @@ -1,6 +1,7 @@ package io.github.sspanak.tt9.ime.modes; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; 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.languages.Language; 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.util.Logger; @@ -31,9 +33,9 @@ abstract public class InputMode { // data protected int autoAcceptTimeout = -1; @NonNull protected String digitSequence = ""; - protected Language language; + @NonNull protected Language language = new NullLanguage(); protected final SettingsStore settings; - protected final ArrayList suggestions = new ArrayList<>(); + @NonNull protected final ArrayList suggestions = new ArrayList<>(); @NonNull protected Runnable onSuggestionsUpdated = () -> {}; 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) { case MODE_PREDICTIVE: return new ModePredictive(settings, inputType, textField, language); @@ -103,10 +105,8 @@ abstract public class InputMode { public int getAutoAcceptTimeout() { return autoAcceptTimeout; } - public void changeLanguage(Language newLanguage) { - if (newLanguage != null) { - language = newLanguage; - } + public void changeLanguage(@Nullable Language newLanguage) { + language = newLanguage != null ? newLanguage : new NullLanguage(); } // Interaction with the IME. Return "true" if it should perform the respective action. @@ -181,7 +181,7 @@ abstract public class InputMode { protected boolean loadSpecialCharacters() { - if (language == null || digitSequence.isEmpty()) { + if (digitSequence.isEmpty()) { return false; } @@ -208,7 +208,7 @@ abstract public class InputMode { * list of characters, for example in email, numeric or other specialized fields. */ protected ArrayList applyPunctuationOrder(ArrayList unordered, int key) { - if (language == null || specialCharSelectedGroup != 0 || key > 1) { + if (specialCharSelectedGroup != 0 || key > 1) { return new ArrayList<>(unordered); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeABC.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeABC.java index 0d3f0540..efc075eb 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeABC.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeABC.java @@ -1,6 +1,7 @@ package io.github.sspanak.tt9.ime.modes; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import java.util.ArrayList; @@ -85,8 +86,8 @@ public class ModeABC extends InputMode { } @Override - public void changeLanguage(Language language) { - super.changeLanguage(language); + public void changeLanguage(@Nullable Language newLanguage) { + super.changeLanguage(newLanguage); allowedTextCases.clear(); allowedTextCases.add(CASE_LOWER); @@ -112,10 +113,6 @@ public class ModeABC extends InputMode { @NonNull @Override public String toString() { - if (language == null) { - return textCase == CASE_LOWER ? "abc" : "ABC"; - } - String modeString = language.getAbcString(); // There are many languages written using the same alphabet, so if the user has diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModePredictive.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModePredictive.java index 2b525459..9542c8bd 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModePredictive.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModePredictive.java @@ -1,6 +1,7 @@ package io.github.sspanak.tt9.ime.modes; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import java.util.ArrayList; @@ -107,8 +108,8 @@ public class ModePredictive extends InputMode { @Override - public void changeLanguage(Language language) { - super.changeLanguage(language); + public void changeLanguage(@Nullable Language newLanguage) { + super.changeLanguage(newLanguage); autoSpace.setLanguage(language); @@ -509,10 +510,6 @@ public class ModePredictive extends InputMode { @NonNull @Override public String toString() { - if (language == null) { - return "Predictive"; - } - String modeString = language.getName(); if (textCase == CASE_UPPER) { return modeString.toUpperCase(language.getLocale()); diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/Predictions.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/Predictions.java index cec9eac2..edb13bfd 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/Predictions.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/Predictions.java @@ -108,8 +108,8 @@ public class Predictions { private void loadWithoutLeadingPunctuation() { DataStore.getWords( (dbWords) -> { - char firstChar = inputWord.charAt(0); - for (int i = 0; i < dbWords.size(); i++) { + char firstChar = inputWord.isEmpty() ? 0 : inputWord.charAt(0); + for (int i = 0; firstChar > 0 && i < dbWords.size(); i++) { dbWords.set(i, firstChar + dbWords.get(i)); } onDbWords(dbWords, false); diff --git a/app/src/main/java/io/github/sspanak/tt9/languages/LanguageCollection.java b/app/src/main/java/io/github/sspanak/tt9/languages/LanguageCollection.java index 7f399841..67c3f8df 100644 --- a/app/src/main/java/io/github/sspanak/tt9/languages/LanguageCollection.java +++ b/app/src/main/java/io/github/sspanak/tt9/languages/LanguageCollection.java @@ -61,7 +61,7 @@ public class LanguageCollection { @NonNull public static Language getDefault(Context context) { Language language = getByLocale(context, SystemSettings.getLocale()); language = language == null ? getByLocale(context, "en") : language; - return language == null ? new NullLanguage(context) : language; + return language == null ? new NullLanguage() : language; } @Nullable diff --git a/app/src/main/java/io/github/sspanak/tt9/languages/NullLanguage.java b/app/src/main/java/io/github/sspanak/tt9/languages/NullLanguage.java index 2cb6cfef..2b1419a4 100644 --- a/app/src/main/java/io/github/sspanak/tt9/languages/NullLanguage.java +++ b/app/src/main/java/io/github/sspanak/tt9/languages/NullLanguage.java @@ -1,18 +1,14 @@ package io.github.sspanak.tt9.languages; -import android.content.Context; - import androidx.annotation.NonNull; import java.util.ArrayList; import java.util.Locale; -import io.github.sspanak.tt9.R; - public class NullLanguage extends Language { - public NullLanguage(Context context) { + public NullLanguage() { locale = Locale.ROOT; - name = context.getString(R.string.no_language); + name = "Nulla Lingua"; abcString = "ABC"; code = ""; dictionaryFile = ""; diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index a05dd145..5adc1aac 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -4,7 +4,6 @@ Голям Завършено Зареждане… - Няма език Възникна неочаквана грешка. Добави Преместете показалеца върху дума, за да я добавите към речника. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 96c92d3b..54d71ecf 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -2,7 +2,6 @@ TT9 Einstellungen Laden… - Keine Sprache Unerwarteter Fehler aufgetreten. Hinzufügen diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 6a5c922d..c0d79882 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -14,7 +14,6 @@ Grande Terminado Cargando… - Sin idioma Ocurrió un error inesperado. La palabra \"%1$s\" ya esta en el diccionario. No se puede agregar una palabra. Idioma desconocido: \"%1$d\". diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5369403f..dbefa1a3 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -4,7 +4,6 @@ Grande Fini Chargement… - Aucun langue Une erreur inattendue s\'est produite. Ajouter Déplacez le curseur dans un mot pour l\'ajouter. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index e064306a..1f2c93aa 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -4,7 +4,6 @@ Grande Completato Caricamento… - Nessuna lingua Si è verificato un errore imprevisto. Aggiungere diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index bbf12298..320f5ac2 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -4,7 +4,6 @@ גדול הסתיים טוען… - אין שפה אירעה שגיאה לא צפויה. הוסף diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index bbc8a2c8..d06feac5 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -4,7 +4,6 @@ Didelis Baigta Įkeliama… - Kalbos nėra Įvyko netikėta klaida. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 92ca88c8..e692e18c 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -2,7 +2,6 @@ TT9 Opties Laden… - Geen taal Er is een onverwachte fout opgetreden. Toevoegen diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 8f310e88..7d833e66 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -4,7 +4,6 @@ Grande Concluído Carregando… - Sem idioma Um erro inesperado aconteceu. Adicionar diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4ecd1185..4e6813af 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -4,7 +4,6 @@ Крупный Выполнено Загрузка… - Нет языка Произошла непредвиденная ошибка. Добавить Переместите курсор внутрь слова, чтобы добавить его. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 11e49d54..e7351021 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -2,7 +2,6 @@ TT9 Ayarlar Yükleniyor… - Yüklü Dil Yok Beklenmeyen bir hata ile karşılaşıldı. Ekle diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a2474824..3469aee4 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -4,7 +4,6 @@ Великий Виконано Завантаження… - Немає мови Сталася неочікувана помилка. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 145ba58a..74a22ca5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,7 +7,6 @@ Completed Loading… Language - No Language Search Results No results. @@ -24,7 +23,6 @@ \"%1$s\" added. Add Word - Select a Command About