From aecc350b9117598c444eadf3487fcdee97e8d3f4 Mon Sep 17 00:00:00 2001 From: sspanak Date: Thu, 8 May 2025 16:03:07 +0300 Subject: [PATCH] removed all remaining code related to alternative character groups per key --- .../sspanak/tt9/ime/modes/InputMode.java | 53 +------------------ .../github/sspanak/tt9/ime/modes/Mode123.java | 9 ++-- .../github/sspanak/tt9/ime/modes/ModeABC.java | 18 +++---- .../sspanak/tt9/ime/modes/ModeBopomofo.java | 2 +- .../sspanak/tt9/ime/modes/ModeCheonjiin.java | 21 ++------ .../sspanak/tt9/languages/EmojiLanguage.java | 7 ++- .../sspanak/tt9/languages/Language.java | 7 +-- .../tt9/languages/NaturalLanguage.java | 3 +- .../sspanak/tt9/languages/NullLanguage.java | 12 ++--- .../settings/SettingsPunctuation.java | 10 ---- .../sspanak/tt9/util/chars/Characters.java | 31 +++++++++++ 11 files changed, 66 insertions(+), 107 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 3472e377..1f2f0b24 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 @@ -42,7 +42,6 @@ abstract public class InputMode { protected final SettingsStore settings; @NonNull protected final ArrayList suggestions = new ArrayList<>(); @NonNull protected Runnable onSuggestionsUpdated = () -> {}; - protected int specialCharSelectedGroup = 0; @NonNull protected Sequences seq = new Sequences(); @@ -165,7 +164,6 @@ abstract public class InputMode { public void reset() { autoAcceptTimeout = -1; - specialCharSelectedGroup = 0; suggestions.clear(); } @@ -211,62 +209,13 @@ abstract public class InputMode { protected boolean loadSpecialCharacters() { - int key = digitSequence.charAt(0) - '0'; - ArrayList chars = settings.getOrderedKeyChars(language, key, specialCharSelectedGroup); - - if (chars.isEmpty() && specialCharSelectedGroup == 1) { - specialCharSelectedGroup = 0; - return false; - } else if (chars.isEmpty()) { - specialCharSelectedGroup = 0; - chars = settings.getOrderedKeyChars(language, key, specialCharSelectedGroup); - } - suggestions.clear(); - suggestions.addAll(chars); + suggestions.addAll(settings.getOrderedKeyChars(language, digitSequence.charAt(0) - '0')); return true; } - /** - * Applies the punctuation order when we don't want to display the entire - * list of characters, for example in email, numeric or other specialized fields. - */ - protected ArrayList applyPunctuationOrder(ArrayList unordered, int key) { - if (specialCharSelectedGroup != 0 || key > 1) { - return new ArrayList<>(unordered); - } - - return orderSpecialChars(unordered, settings.getOrderedKeyChars(language, key)); - } - - - public ArrayList orderSpecialChars(@NonNull ArrayList unordered, @Nullable ArrayList order) { - ArrayList ordered = new ArrayList<>(); - if (unordered.isEmpty() || order == null || order.isEmpty()) { - return ordered; - } - - if (isEmailMode) { - if (unordered.contains("@")) ordered.add("@"); - if (unordered.contains("_")) ordered.add("_"); - } - - for (String ch : order) { - if (isEmailMode && (ch.charAt(0) == '@' || ch.charAt(0) == '_')) { - continue; - } - - if (unordered.contains(ch)) { - ordered.add(ch); - } - } - - return ordered; - } - - // Stem filtering. // Where applicable, return "true" if the mode supports it and the operation was possible. public boolean clearWordStem() { return setWordStem("", 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 061d157d..f03e1102 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 @@ -40,7 +40,9 @@ class Mode123 extends ModePassthrough { private void setSpecificSpecialCharacters(ArrayList> chars, boolean sort) { for (int group = 0; group < chars.size(); group++) { - KEY_CHARACTERS.add(sort ? applyPunctuationOrder(chars.get(group), group) : new ArrayList<>(chars.get(group))); + KEY_CHARACTERS.add( + sort ? Characters.orderByList(chars.get(group), settings.getOrderedKeyChars(language, group), isEmailMode) : new ArrayList<>(chars.get(group)) + ); } } @@ -55,13 +57,12 @@ class Mode123 extends ModePassthrough { Language english = LanguageCollection.getByLocale("en"); KEY_CHARACTERS.add(getAbbreviatedSpecialChars()); KEY_CHARACTERS.add( - TextTools.removeLettersFromList(orderSpecialChars(settings.getOrderedKeyChars(english, 1), null)) + TextTools.removeLettersFromList(orderCharsForNumericField(settings.getOrderedKeyChars(english, 1), null)) ); } - @Override - public ArrayList orderSpecialChars(@NonNull ArrayList unordered, @Nullable ArrayList o) { + private ArrayList orderCharsForNumericField(@NonNull ArrayList unordered, @Nullable ArrayList o) { ArrayList ordered = new ArrayList<>(); if (unordered.contains(".")) { 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 11ca8aec..fe999c70 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 @@ -21,14 +21,6 @@ class ModeABC extends InputMode { protected ModeABC(SettingsStore settings, Language lang, InputType inputType) { super(settings, inputType); changeLanguage(lang); - - if (isEmailMode) { - KEY_CHARACTERS.add(applyPunctuationOrder(Characters.Email.get(0), 0)); - KEY_CHARACTERS.add(applyPunctuationOrder(Characters.Email.get(1), 1)); - } else { - KEY_CHARACTERS.add(getAbbreviatedSpecialChars()); - KEY_CHARACTERS.add(settings.getOrderedKeyChars(language, 1)); - } } @Override @@ -57,7 +49,7 @@ class ModeABC extends InputMode { autoAcceptTimeout = settings.getAbcAutoAcceptTimeout(); digitSequence = String.valueOf(number); shouldSelectNextLetter = false; - suggestions.addAll(KEY_CHARACTERS.size() > number ? KEY_CHARACTERS.get(number) : new ArrayList<>()); + suggestions.addAll(KEY_CHARACTERS.size() > number ? KEY_CHARACTERS.get(number) : settings.getOrderedKeyChars(language, number)); suggestions.add(language.getKeyNumeral(number)); } @@ -91,6 +83,14 @@ class ModeABC extends InputMode { allowedTextCases.add(CASE_UPPER); } + KEY_CHARACTERS.clear(); + if (isEmailMode) { + KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(0), settings.getOrderedKeyChars(language, 0), true)); + KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(1), settings.getOrderedKeyChars(language, 1), true)); + } else { + KEY_CHARACTERS.add(getAbbreviatedSpecialChars()); + } + refreshSuggestions(); shouldSelectNextLetter = true; // do not accept any previous suggestions after loading the new ones diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeBopomofo.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeBopomofo.java index ee699174..3725f4c8 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeBopomofo.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeBopomofo.java @@ -51,7 +51,7 @@ public class ModeBopomofo extends ModePinyin { // punctuation KEY_CHARACTERS.add( - TextTools.removeLettersFromList(applyPunctuationOrder(Characters.PunctuationChineseBopomofo, 1)) + TextTools.removeLettersFromList(Characters.orderByList(Characters.PunctuationChineseBopomofo, settings.getOrderedKeyChars(language, 1), false)) ); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeCheonjiin.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeCheonjiin.java index 1fafa7f4..ea267744 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeCheonjiin.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeCheonjiin.java @@ -67,7 +67,7 @@ class ModeCheonjiin extends InputMode { // punctuation KEY_CHARACTERS.add( - TextTools.removeLettersFromList(applyPunctuationOrder(Characters.PunctuationKorean, 1)) + TextTools.removeLettersFromList(Characters.orderByList(Characters.PunctuationKorean, settings.getOrderedKeyChars(language, 1), false)) ); } @@ -80,8 +80,8 @@ class ModeCheonjiin extends InputMode { KEY_CHARACTERS.clear(); if (isEmailMode) { - KEY_CHARACTERS.add(applyPunctuationOrder(Characters.Email.get(0), 0)); - KEY_CHARACTERS.add(applyPunctuationOrder(Characters.Email.get(1), 1)); + KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(0), settings.getOrderedKeyChars(language, 0), true)); + KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(1), settings.getOrderedKeyChars(language, 1), true)); } else { setCustomSpecialCharacters(); } @@ -246,18 +246,6 @@ class ModeCheonjiin extends InputMode { return false; } - // KEY_CHARACTERS contains chars for group 0 only. If it turns out we are at group > 0 - // we must allow super to do its job. - boolean callSuper = true; - if (specialCharSelectedGroup > 0) { - super.loadSpecialCharacters(); // this increments specialCharSelectedGroup or resets it to 0, if no more groups are available - callSuper = false; - if (specialCharSelectedGroup > 0) { - return true; - } - } - - // ... otherwise display our custom first groups, if available int number = digitSequence.isEmpty() ? Integer.MAX_VALUE : digitSequence.charAt(digitSequence.length() - 1) - '0'; if (KEY_CHARACTERS.size() > number) { suggestions.clear(); @@ -265,8 +253,7 @@ class ModeCheonjiin extends InputMode { return true; } - // if we never asked super to advance the group and load the respective chars, do it now - return callSuper && super.loadSpecialCharacters(); + return super.loadSpecialCharacters(); } diff --git a/app/src/main/java/io/github/sspanak/tt9/languages/EmojiLanguage.java b/app/src/main/java/io/github/sspanak/tt9/languages/EmojiLanguage.java index 9aa9c84a..28d2ce83 100644 --- a/app/src/main/java/io/github/sspanak/tt9/languages/EmojiLanguage.java +++ b/app/src/main/java/io/github/sspanak/tt9/languages/EmojiLanguage.java @@ -33,11 +33,16 @@ public class EmojiLanguage extends Language { } @NonNull - @Override public ArrayList getKeyCharacters(int key, int characterGroup) { return key == 1 && characterGroup >= 0 ? Characters.getEmoji(characterGroup) : new ArrayList<>(); } + @NonNull + @Override + public ArrayList getKeyCharacters(int key) { + return getKeyCharacters(key, 0); + } + @Override public boolean isValidWord(String word) { return TextTools.isGraphic(word); diff --git a/app/src/main/java/io/github/sspanak/tt9/languages/Language.java b/app/src/main/java/io/github/sspanak/tt9/languages/Language.java index d70f4fbf..d81e7f36 100644 --- a/app/src/main/java/io/github/sspanak/tt9/languages/Language.java +++ b/app/src/main/java/io/github/sspanak/tt9/languages/Language.java @@ -53,13 +53,8 @@ abstract public class Language { /** * Returns the characters that the key would type in ABC or Predictive mode. For example, * the key 2 in English would return A-B-C. - * Keys that have special characters assigned, may have more than one group assigned. The specific - * group is selected by the characterGroup parameter. By default, group 0 is returned. */ - @NonNull abstract public ArrayList getKeyCharacters(int key, int characterGroup); - @NonNull public ArrayList getKeyCharacters(int key) { - return getKeyCharacters(key, 0); - } + @NonNull abstract public ArrayList getKeyCharacters(int key); @NonNull public String getKeyNumeral(int key) { return String.valueOf(key); 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 65b64bf3..30510a3e 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 @@ -212,7 +212,8 @@ public class NaturalLanguage extends TranscribedLanguage { @NonNull - public ArrayList getKeyCharacters(int key, int characterGroup) { + @Override + public ArrayList getKeyCharacters(int key) { if (key < 0 || key >= layout.size()) { return new ArrayList<>(); } 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 39208fc9..8e98a532 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 @@ -16,17 +16,17 @@ public class NullLanguage extends Language { name = "Nulla Lingua"; } - @NonNull - @Override - public ArrayList getKeyCharacters(int key, int characterGroup) { - return new ArrayList<>(); - } - @Override public boolean isValidWord(String word) { return false; } + @NonNull + @Override + public ArrayList getKeyCharacters(int key) { + return new ArrayList<>(); + } + @NonNull @Override public String getDigitSequenceForWord(String word) { diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsPunctuation.java b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsPunctuation.java index 0ca51e81..2b2999b0 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsPunctuation.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsPunctuation.java @@ -95,16 +95,6 @@ class SettingsPunctuation extends SettingsInput { } - @NonNull - public ArrayList getOrderedKeyChars(Language language, int number, int group) { - if (group > 0 && language != null) { - return language.getKeyCharacters(number, group); - } - - return getOrderedKeyChars(language, number); - } - - private ArrayList getCharsAsList(String chars, ArrayList defaultValue) { if (chars == null) { return defaultValue; diff --git a/app/src/main/java/io/github/sspanak/tt9/util/chars/Characters.java b/app/src/main/java/io/github/sspanak/tt9/util/chars/Characters.java index 0f510d21..ef0268a2 100644 --- a/app/src/main/java/io/github/sspanak/tt9/util/chars/Characters.java +++ b/app/src/main/java/io/github/sspanak/tt9/util/chars/Characters.java @@ -1,5 +1,6 @@ package io.github.sspanak.tt9.util.chars; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.util.ArrayList; @@ -107,4 +108,34 @@ public class Characters extends Emoji { ch == 0x0950 // Devanagari || ch == 0x0AD0; // Gujarati } + + + /** + * Orders a list of characters according according to the order of another list. Any characters + * from "unordered" list that are not present in the "order" list will be ignored. In email mode, + * email-specific characters will be moved to the beginning of the list. + */ + public static ArrayList orderByList(@NonNull ArrayList unordered, @Nullable ArrayList order, boolean isEmailMode) { + ArrayList ordered = new ArrayList<>(); + if (unordered.isEmpty() || order == null || order.isEmpty()) { + return ordered; + } + + if (isEmailMode) { + if (unordered.contains("@")) ordered.add("@"); + if (unordered.contains("_")) ordered.add("_"); + } + + for (String ch : order) { + if (isEmailMode && (ch.charAt(0) == '@' || ch.charAt(0) == '_')) { + continue; + } + + if (unordered.contains(ch)) { + ordered.add(ch); + } + } + + return ordered; + } }