diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java index a0fde77e..2f3ba2cd 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java @@ -308,7 +308,9 @@ public abstract class HotkeyHandler extends CommandHandler { if (mInputMode.changeLanguage(mLanguage)) { mInputMode.clearWordStem(); } else { + final String digits = mInputMode.getSequence(); mInputMode = InputMode.getInstance(settings, mLanguage, inputType, textField, determineInputModeId()); + mInputMode.setSequence(digits); } getSuggestions(null); diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java index 584bdcf8..81cf0c87 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java @@ -24,7 +24,6 @@ import io.github.sspanak.tt9.languages.LanguageCollection; import io.github.sspanak.tt9.languages.LanguageKind; import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.ui.UI; -import io.github.sspanak.tt9.util.Text; public abstract class TypingHandler extends KeyPadHandler { // internal settings/data @@ -407,15 +406,6 @@ public abstract class TypingHandler extends KeyPadHandler { // display the word suggestions suggestionOps.set(mInputMode.getSuggestions(), mInputMode.containsGeneratedSuggestions()); - // In case we are here, because the language was changed, and there were words for the old language, - // but there are no words for the new language, we'll get only generated suggestions, consisting - // of the last word of the previous language + endings from the new language. These words are invalid, - // so we discard them. - if (InputModeKind.isPredictive(mInputMode) && !mLanguage.isValidWord(suggestionOps.getCurrent()) && !Text.isGraphic(suggestionOps.getCurrent())) { - mInputMode.reset(); - suggestionOps.set(null); - } - // flush the first suggestion, if the InputMode has requested it if (suggestionOps.scheduleDelayedAccept(mInputMode.getAutoAcceptTimeout())) { return; 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 755949fe..629399f7 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 @@ -114,7 +114,8 @@ abstract public class InputMode { // Utility abstract public int getId(); public boolean containsGeneratedSuggestions() { return false; } - public String getSequence() { return digitSequence; } + @NonNull public String getSequence() { return digitSequence; } + public void setSequence(@NonNull String sequence) { digitSequence = sequence; } public int getSequenceLength() { return digitSequence.length(); } // The number of key presses for the current word. public int getAutoAcceptTimeout() { return autoAcceptTimeout; diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeIdeograms.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeIdeograms.java index 2582bb20..436a63e6 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeIdeograms.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeIdeograms.java @@ -100,9 +100,9 @@ public class ModeIdeograms extends ModeWords { @Override public void onAcceptSuggestion(@NonNull String currentWord, boolean preserveWords) { final Text text = new Text(currentWord); - if (text.isEmpty() || text.startsWithWhitespace() || text.isNumeric()) { + if (text.isEmpty() || text.startsWithWhitespace() || text.isNumeric() || !language.isValidWord(currentWord)) { reset(); - Logger.i(LOG_TAG, "Current word is empty or numeric. Nothing to accept."); + Logger.i(LOG_TAG, "Current word is empty, numeric or invalid. Nothing to accept."); return; } @@ -114,7 +114,7 @@ public class ModeIdeograms extends ModeWords { } final int initialLength = digitSequence.length(); - final boolean lastDigitBelongsToNewWord = preserveWords && initialLength >= 2; + boolean lastDigitBelongsToNewWord = preserveWords && initialLength >= 2; try { if (!digitSequence.equals(SPECIAL_CHAR_SEQUENCE) && !digitSequence.equals(PUNCTUATION_SEQUENCE)) { @@ -125,8 +125,8 @@ public class ModeIdeograms extends ModeWords { ((IdeogramPredictions) predictions).onAcceptIdeogram(currentWord); } } catch (Exception e) { - lastAcceptedSequence = lastAcceptedWord = ""; Logger.e(LOG_TAG, "Failed incrementing priority of word: '" + currentWord + "'. " + e.getMessage()); + lastAcceptedSequence = lastAcceptedWord = ""; } if (lastDigitBelongsToNewWord) { diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeWords.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeWords.java index 622bef91..a5003198 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeWords.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeWords.java @@ -323,8 +323,8 @@ class ModeWords extends ModeCheonjiin { } stem = ""; - if (currentWord.isEmpty()) { - Logger.i(LOG_TAG, "Current word is empty. Nothing to accept."); + if (currentWord.isEmpty() || !language.isValidWord(currentWord)) { + Logger.i(LOG_TAG, "Current word is empty or invalid. Nothing to accept."); return; } diff --git a/app/src/main/java/io/github/sspanak/tt9/languages/NaturalLanguage.java b/app/src/main/java/io/github/sspanak/tt9/languages/NaturalLanguage.java index 8730b45b..49a9416f 100644 --- a/app/src/main/java/io/github/sspanak/tt9/languages/NaturalLanguage.java +++ b/app/src/main/java/io/github/sspanak/tt9/languages/NaturalLanguage.java @@ -264,12 +264,15 @@ public class NaturalLanguage extends TranscribedLanguage { if ( word == null || word.isEmpty() - || (super.isValidWord(word)) || (word.length() == 1 && Character.isDigit(word.charAt(0))) ) { return true; } + if (isTranscribed) { + return super.isValidWord(word); + } + String lowerCaseWord = word.toLowerCase(locale); for (int i = 0; i < lowerCaseWord.length(); i++) {