From cd7215b6fcf65a2042247472d5247667b6730c78 Mon Sep 17 00:00:00 2001 From: Dimo Karaivanov Date: Tue, 27 Feb 2024 10:59:19 +0200 Subject: [PATCH] fixed character case switching issues (#443) * fixed issues with switching the text case * fixed not possible to type currency characters in RTL languages --- app/src/main/AndroidManifest.xml | 2 +- .../github/sspanak/tt9/ime/TraditionalT9.java | 5 ++-- .../sspanak/tt9/ime/modes/InputMode.java | 28 +++++++++++-------- .../github/sspanak/tt9/ime/modes/Mode123.java | 7 ++--- .../sspanak/tt9/ime/modes/ModePredictive.java | 10 +++---- 5 files changed, 27 insertions(+), 25 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 044fcb12..94971533 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java b/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java index e813ef86..92563a45 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java @@ -720,8 +720,7 @@ public class TraditionalT9 extends KeyPadHandler { // When we are in AUTO mode and the dictionary word is in uppercase, // the mode would switch to UPPERCASE, but visually, the word would not change. // This is why we retry, until there is a visual change. - for (int retries = 0; retries < 2 && mLanguage.hasUpperCase(); retries++) { - mInputMode.nextTextCase(); + for (int retries = 0; retries < 2 && mInputMode.nextTextCase(); retries++) { setSuggestions(mInputMode.getSuggestions(), suggestionBar.getCurrentIndex()); textField.setComposingText(suggestionBar.getCurrentSuggestion()); @@ -731,7 +730,7 @@ public class TraditionalT9 extends KeyPadHandler { } } // make "abc" and "ABC" separate modes from user perspective - else if (mInputMode instanceof ModeABC && mInputMode.getTextCase() == InputMode.CASE_LOWER && mLanguage.hasUpperCase()) { + else if (mInputMode instanceof ModeABC && mLanguage.hasUpperCase() && mInputMode.getTextCase() == InputMode.CASE_LOWER) { mInputMode.nextTextCase(); } else { int nextModeIndex = (allowedInputModes.indexOf(mInputMode.getId()) + 1) % allowedInputModes.size(); 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 3c609de7..e91ebf72 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 @@ -129,16 +129,6 @@ abstract public class InputMode { textCase = allowedTextCases.get(0); } - public boolean nextTextCase() { - if (nextSpecialCharacters()) { - return false; - } - - int nextIndex = (allowedTextCases.indexOf(textCase) + 1) % allowedTextCases.size(); - textCase = allowedTextCases.get(nextIndex); - return true; - } - /** * This is used in nextTextCase() for switching to the next set of characters. Obviously, * special chars do not have a text case, but we use this trick to alternate the char groups. @@ -148,9 +138,10 @@ abstract public class InputMode { return false; } + int previousGroup = specialCharSelectedGroup; int key = digitSequence.charAt(0) - '0'; - ArrayList chars = language.getKeyCharacters(key, ++specialCharSelectedGroup); + if (chars.isEmpty() && specialCharSelectedGroup == 1) { specialCharSelectedGroup = 0; return false; @@ -162,6 +153,21 @@ abstract public class InputMode { suggestions.clear(); suggestions.addAll(chars); + return previousGroup != specialCharSelectedGroup; + } + + public boolean nextTextCase() { + if (nextSpecialCharacters()) { + return true; + } + + if (!language.hasUpperCase() || digitSequence.startsWith(Language.PUNCTUATION_KEY) || digitSequence.startsWith(Language.SPECIAL_CHARS_KEY)) { + return false; + } + + int nextIndex = (allowedTextCases.indexOf(textCase) + 1) % allowedTextCases.size(); + textCase = allowedTextCases.get(nextIndex); + return true; } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/Mode123.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/Mode123.java index 114a82ad..c33924e1 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/Mode123.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/Mode123.java @@ -81,9 +81,7 @@ public class Mode123 extends ModePassthrough { } } - - @Override - protected boolean nextSpecialCharacters() { + @Override protected boolean nextSpecialCharacters() { return digitSequence.equals(Language.SPECIAL_CHARS_KEY) && super.nextSpecialCharacters(); } @@ -122,8 +120,7 @@ public class Mode123 extends ModePassthrough { } - @Override - public void reset() { + @Override public void reset() { super.reset(); digitSequence = ""; } 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 e75a0699..2e0db091 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 @@ -314,11 +314,6 @@ public class ModePredictive extends InputMode { return autoTextCase.adjustSuggestionTextCase(new Text(language, word), newTextCase); } - @Override - protected boolean nextSpecialCharacters() { - return digitSequence.equals(Language.SPECIAL_CHARS_KEY) && super.nextSpecialCharacters(); - } - @Override public void determineNextWordTextCase(Text textBeforeCursor) { textCase = autoTextCase.determineNextWordTextCase(textCase, textFieldTextCase, textBeforeCursor); @@ -330,6 +325,11 @@ public class ModePredictive extends InputMode { return (textCase == CASE_UPPER || textCase == CASE_LOWER) ? textCase : CASE_CAPITALIZE; } + @Override + protected boolean nextSpecialCharacters() { + return digitSequence.equals(Language.SPECIAL_CHARS_KEY) && super.nextSpecialCharacters(); + } + @Override public boolean nextTextCase() { boolean changed = super.nextTextCase();