From 464e2001be52c24491dd83c353d811bcd8389922 Mon Sep 17 00:00:00 2001 From: sspanak Date: Fri, 28 Mar 2025 14:44:57 +0200 Subject: [PATCH] textField.getWordBeforeCursor() is no longer called when recomposing is not supported or on every key press (when searching for word pairs) --- .../github/sspanak/tt9/ime/TypingHandler.java | 4 ++-- .../sspanak/tt9/ime/helpers/TextField.java | 2 +- .../sspanak/tt9/ime/modes/InputMode.java | 2 +- .../sspanak/tt9/ime/modes/ModeWords.java | 21 ++++++++++--------- .../predictions/IdeogramPredictions.java | 4 ++-- .../ime/modes/predictions/Predictions.java | 2 +- .../modes/predictions/WordPredictions.java | 18 +++++++++++++--- 7 files changed, 33 insertions(+), 20 deletions(-) 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 6a129e41..78849384 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 @@ -147,8 +147,8 @@ public abstract class TypingHandler extends KeyPadHandler { } if (settings.getBackspaceRecomposing() && repeat == 0 && suggestionOps.isEmpty() && !DictionaryLoader.getInstance(this).isRunning()) { - final String previousWord = textField.getWordBeforeCursor(mLanguage, 0, false); - if (mInputMode.recompose(previousWord) && textField.recompose(previousWord)) { + final String previousWord = mInputMode.recompose(); + if (textField.recompose(previousWord)) { getSuggestions(previousWord); } else { mInputMode.reset(); diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/helpers/TextField.java b/app/src/main/java/io/github/sspanak/tt9/ime/helpers/TextField.java index 555eda6c..846eda00 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/helpers/TextField.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/helpers/TextField.java @@ -252,7 +252,7 @@ public class TextField extends InputField { * the given "text". Returns "true" if the operation was successful, "false" otherwise. */ public boolean recompose(String text) { - if (connection == null || !isComposingSupported) { + if (text == null || connection == null || !isComposingSupported) { return false; } 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 cc38d677..3f4e0001 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 @@ -135,7 +135,7 @@ abstract public class InputMode { public boolean shouldReplaceLastLetter(int nextKey, boolean hold) { return false; } public boolean shouldSelectNextSuggestion() { return false; } - public boolean recompose(String word) { return false; } + public String recompose() { return null; } public void replaceLastLetter() {} public void reset() { 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 2bffd71a..84ecb1be 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 @@ -133,27 +133,28 @@ class ModeWords extends ModeCheonjiin { } @Override - public boolean recompose(String word) { + public String recompose() { if (!language.hasSpaceBetweenWords() || language.isTranscribed()) { - return false; + return null; } - if (word == null || word.length() < 2 || word.contains(" ")) { - Logger.d(LOG_TAG, "Not recomposing invalid word: '" + word + "'"); + String previousWord = textField.getWordBeforeCursor(language, 0, false); + if (previousWord.length() < 2 || previousWord.contains(" ")) { + Logger.d(LOG_TAG, "Not recomposing invalid word: '" + previousWord + "'"); textCase = settings.getTextCase(); - return false; + return null; } try { reset(); - digitSequence = language.getDigitSequenceForWord(word); - textCase = new Text(language, word).getTextCase(); + digitSequence = language.getDigitSequenceForWord(previousWord); + textCase = new Text(language, previousWord).getTextCase(); } catch (InvalidLanguageCharactersException e) { - Logger.d(LOG_TAG, "Not recomposing word: '" + word + "'. " + e.getMessage()); - return false; + Logger.d(LOG_TAG, "Not recomposing word: '" + previousWord + "'. " + e.getMessage()); + return null; } - return true; + return previousWord; } @Override diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/predictions/IdeogramPredictions.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/predictions/IdeogramPredictions.java index b0b2b22b..24442e53 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/predictions/IdeogramPredictions.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/predictions/IdeogramPredictions.java @@ -56,7 +56,7 @@ public class IdeogramPredictions extends WordPredictions { @Override @NonNull - protected String getWordBeforeCursor(@NonNull String currentWord) { + protected String getPenultimateWord(@NonNull String currentWord) { int currentWordLength = currentWord.length(); int lastWordLength = lastTypedWord.length(); int requiredTextLength = currentWordLength + lastWordLength; @@ -97,7 +97,7 @@ public class IdeogramPredictions extends WordPredictions { return; } - String previousWord = getWordBeforeCursor(nativeWord); + String previousWord = getPenultimateWord(nativeWord); if (previousWord.equals(lastTypedWord)) { // Logger.d("LOG_TAG", "====+> Pairing words: " + previousWord + " + " + nativeWord); DataStore.addWordPair(language, previousWord, nativeWord, sequence); diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/predictions/Predictions.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/predictions/Predictions.java index 1f2514e0..3ab50e5a 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/predictions/Predictions.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/predictions/Predictions.java @@ -34,7 +34,7 @@ abstract public class Predictions { } - public Predictions setDigitSequence(String digitSequence) { + public Predictions setDigitSequence(@NonNull String digitSequence) { this.digitSequence = digitSequence; return this; } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/predictions/WordPredictions.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/predictions/WordPredictions.java index 3b255406..134d4eeb 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/predictions/WordPredictions.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/predictions/WordPredictions.java @@ -20,17 +20,27 @@ public class WordPredictions extends Predictions { private boolean isStemFuzzy; private String lastEnforcedTopWord; + protected String penultimateWord; public WordPredictions(SettingsStore settings, TextField textField) { super(settings); lastEnforcedTopWord = ""; localeWordsSorter = new LocaleWordsSorter(null); + penultimateWord = ""; stem = ""; this.textField = textField; } + @Override + public Predictions setDigitSequence(@NonNull String digitSequence) { + if (digitSequence.length() == 1 || digitSequence.equals(this.digitSequence)) { + penultimateWord = ""; // enforce reloading the penultimate word + } + return super.setDigitSequence(digitSequence); + } + @Override public Predictions setLanguage(@NonNull Language language) { super.setLanguage(language); @@ -296,7 +306,9 @@ public class WordPredictions extends Predictions { } ArrayList rearrangedWords = new ArrayList<>(); - String penultimateWord = getWordBeforeCursor(words.get(0)); + if (penultimateWord.isEmpty()) { + penultimateWord = getPenultimateWord(words.get(0)); + } String pairWord = DataStore.getWord2(language, penultimateWord, digitSequence); int morePopularIndex = TextTools.indexOfIgnoreCase(words, pairWord); @@ -324,7 +336,7 @@ public class WordPredictions extends Predictions { */ protected void pairWithPreviousWord(@NonNull String word, @NonNull String sequence) { if (settings.getPredictWordPairs() && sequence.length() == digitSequence.length()) { - DataStore.addWordPair(language, getWordBeforeCursor(word), word, sequence); + DataStore.addWordPair(language, getPenultimateWord(word), word, sequence); } } @@ -334,7 +346,7 @@ public class WordPredictions extends Predictions { * we have a separate method for that. */ @NonNull - protected String getWordBeforeCursor(@NonNull String currentWord) { + protected String getPenultimateWord(@NonNull String currentWord) { return textField.getWordBeforeCursor(language, 1, true); } }