From e20f1df2dbaf60c235897a58ef83312a9e56f69c Mon Sep 17 00:00:00 2001 From: sspanak Date: Sat, 10 May 2025 18:44:19 +0300 Subject: [PATCH] Recomposing in ideographic mode is now possible only after deleting whitespace. It was way too aggressive and confusing when deleting a word and there was no space between it and the previous word --- .../io/github/sspanak/tt9/ime/TypingHandler.java | 2 ++ .../io/github/sspanak/tt9/ime/modes/InputMode.java | 1 + .../github/sspanak/tt9/ime/modes/ModeIdeograms.java | 13 +++++++++++-- 3 files changed, 14 insertions(+), 2 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 fb42220b..1a0967da 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 @@ -129,6 +129,8 @@ public abstract class TypingHandler extends KeyPadHandler { return true; } + mInputMode.beforeDeleteText(); + boolean noTextSelection = textSelection.isEmpty(); // loading words after deleting selected text is confusing if (repeat == 0 && mInputMode.onBackspace() && noTextSelection) { getSuggestions(null); 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 4e29e468..5e5dbb6f 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 @@ -167,6 +167,7 @@ abstract public class InputMode { public boolean shouldReplaceLastLetter(int nextKey, boolean hold) { return false; } public boolean shouldSelectNextSuggestion() { return false; } + public void beforeDeleteText() {} public String recompose() { return null; } public void replaceLastLetter() {} 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 3dbeb4a5..3e51e05b 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 @@ -20,6 +20,7 @@ public class ModeIdeograms extends ModeWords { private boolean isFiltering = false; @NonNull private String lastAcceptedSequence = ""; @NonNull private String lastAcceptedWord = ""; + @NonNull private String lastTextBeforeDelete = ""; protected ModeIdeograms(SettingsStore settings, Language lang, InputType inputType, TextField textField) { @@ -78,6 +79,13 @@ public class ModeIdeograms extends ModeWords { } + @Override + public void beforeDeleteText() { + String textBefore = textField.getComposingText(); + lastTextBeforeDelete = textBefore.isEmpty() ? textField.getStringBeforeCursor(1) : textBefore; + } + + @Override public String recompose() { if (lastAcceptedWord.isEmpty()) { @@ -85,12 +93,13 @@ public class ModeIdeograms extends ModeWords { } String before = textField.getStringBeforeCursor(lastAcceptedWord.length()); - if (lastAcceptedWord.equals(before)) { + char after = lastTextBeforeDelete.isEmpty() ? 0 : lastTextBeforeDelete.charAt(0); + if (lastAcceptedWord.equals(before) && Character.isWhitespace(after)) { reset(); digitSequence = lastAcceptedSequence; return lastAcceptedWord; } else { - Logger.d(LOG_TAG, "Not recomposing word: '" + before + "' != last word: '" + lastAcceptedWord + "'"); + Logger.d(LOG_TAG, "Not recomposing word: '" + before + "' != last word: '" + lastAcceptedWord + "' and followed by: '" + after + "'"); return null; } }