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 21a2726f..a2c68ace 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 @@ -87,13 +87,12 @@ abstract public class InputMode { public void onAcceptSuggestion(@NonNull String word, boolean preserveWordList) {} public void onCursorMove(@NonNull String word) { if (!digitSequence.isEmpty()) onAcceptSuggestion(word); } public boolean onReplaceSuggestion(@NonNull String rawWord) { - String newSequence = switch(rawWord) { - case SuggestionsBar.SHOW_SPECIAL_CHARS_SUGGESTION -> seq.CHARS_GROUP_0_SEQUENCE; - case SuggestionsBar.SHOW_CURRENCIES_SUGGESTION -> seq.CURRENCY_SEQUENCE; - default -> null; - }; - - if (newSequence == null) { + String newSequence; + if (SuggestionsBar.SHOW_GROUP_0_SUGGESTION.equalsIgnoreCase(rawWord)) { + newSequence = seq.CHARS_GROUP_0_SEQUENCE; + } else if (SuggestionsBar.SHOW_GROUP_1_SUGGESTION.equalsIgnoreCase(rawWord)) { + newSequence = seq.CHARS_GROUP_1_SEQUENCE; + } else { return false; } @@ -209,18 +208,6 @@ abstract public class InputMode { protected String adjustSuggestionTextCase(String word, int newTextCase) { return word; } - protected ArrayList getAbbreviatedSpecialChars() { - ArrayList special = Characters.getWhitespaces(language); - if (!Characters.getCurrencies(language).isEmpty()) { - special.add(SuggestionsBar.SHOW_CURRENCIES_SUGGESTION); - } - if (!settings.getChars0(language).isEmpty()) { - special.add(SuggestionsBar.SHOW_SPECIAL_CHARS_SUGGESTION); - } - return special; - } - - /** * Loads the special characters for 0-key or 1-key. For 0-key, this could be a minimized (show more) * special character list, or the whitespace list. @@ -228,12 +215,12 @@ abstract public class InputMode { protected boolean loadSpecialCharacters() { suggestions.clear(); - if (digitSequence.equals(seq.CHARS_GROUP_0_SEQUENCE) || digitSequence.equals(seq.CHARS_1_SEQUENCE)) { + if (digitSequence.equals(seq.CHARS_0_SEQUENCE) || digitSequence.equals(seq.CHARS_1_SEQUENCE)) { suggestions.addAll(settings.getOrderedKeyChars(language, digitSequence.charAt(0) - '0')); - } else if (digitSequence.equals(seq.CURRENCY_SEQUENCE)) { - suggestions.addAll(Characters.getCurrencies(language)); - } else { - suggestions.addAll(getAbbreviatedSpecialChars()); + } else if (digitSequence.equals(seq.CHARS_GROUP_0_SEQUENCE)) { + suggestions.addAll(settings.getCharsExtraAsList(language, SettingsStore.CHARS_GROUP_0)); + } else if (digitSequence.equals(seq.CHARS_GROUP_1_SEQUENCE)) { + suggestions.addAll(settings.getCharsExtraAsList(language, SettingsStore.CHARS_GROUP_1)); } 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 f03e1102..0fd4b983 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 @@ -55,7 +55,9 @@ class Mode123 extends ModePassthrough { */ private void setDefaultSpecialCharacters() { Language english = LanguageCollection.getByLocale("en"); - KEY_CHARACTERS.add(getAbbreviatedSpecialChars()); + KEY_CHARACTERS.add( + TextTools.removeLettersFromList(orderCharsForNumericField(settings.getOrderedKeyChars(english, 0), null)) + ); KEY_CHARACTERS.add( TextTools.removeLettersFromList(orderCharsForNumericField(settings.getOrderedKeyChars(english, 1), null)) ); 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 fe999c70..11b15d27 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 @@ -87,8 +87,6 @@ class ModeABC extends InputMode { 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(); 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 705c3a7c..6a6d00ab 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 @@ -46,7 +46,7 @@ public class ModeBopomofo extends ModePinyin { */ protected void setCustomSpecialCharacters() { // special - KEY_CHARACTERS.add(getAbbreviatedSpecialChars()); + KEY_CHARACTERS.add(TextTools.removeLettersFromList(Characters.orderByList(Characters.Special, settings.getOrderedKeyChars(language, 0), false))); KEY_CHARACTERS.get(0).add(0, "0"); // punctuation @@ -72,7 +72,7 @@ public class ModeBopomofo extends ModePinyin { protected void onNumberPress(int nextNumber) { if (seq.startsWithEmojiSequence(digitSequence)) { digitSequence = EmojiLanguage.validateEmojiSequence(seq, digitSequence, nextNumber); - } else if (!seq.CHARS_GROUP_0_SEQUENCE.equals(digitSequence) && !seq.CURRENCY_SEQUENCE.equals(digitSequence)) { + } else if (!seq.CHARS_GROUP_0_SEQUENCE.equals(digitSequence) && !seq.CHARS_GROUP_1_SEQUENCE.equals(digitSequence)) { digitSequence += String.valueOf(nextNumber); } } 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 ec3076d5..5468fc76 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 @@ -62,12 +62,12 @@ class ModeCheonjiin extends InputMode { */ protected void setCustomSpecialCharacters() { // special - KEY_CHARACTERS.add(getAbbreviatedSpecialChars()); + KEY_CHARACTERS.add(TextTools.removeLettersFromList(settings.getOrderedKeyChars(language, 0))); KEY_CHARACTERS.get(0).add(0, "0"); // punctuation KEY_CHARACTERS.add( - TextTools.removeLettersFromList(Characters.orderByList(Characters.PunctuationKorean, settings.getOrderedKeyChars(language, 1), false)) + TextTools.removeLettersFromList(settings.getOrderedKeyChars(language, 1)) ); } @@ -99,11 +99,11 @@ class ModeCheonjiin extends InputMode { @Override public boolean onBackspace() { - if (digitSequence.equals(seq.CURRENCY_SEQUENCE) || digitSequence.equals(seq.CHARS_GROUP_0_SEQUENCE)) { + if (digitSequence.equals(seq.CHARS_GROUP_1_SEQUENCE)) { + digitSequence = seq.CHARS_1_SEQUENCE; + } else if (digitSequence.equals(seq.CHARS_GROUP_0_SEQUENCE)) { digitSequence = seq.CHARS_0_SEQUENCE; - } else if (digitSequence.equals(seq.CHARS_1_SEQUENCE)) { - digitSequence = ""; - } else if (digitSequence.equals(seq.CHARS_0_SEQUENCE) || (!digitSequence.startsWith(seq.CHARS_1_SEQUENCE) && Cheonjiin.isSingleJamo(digitSequence))) { + } else if (digitSequence.equals(seq.CHARS_0_SEQUENCE) || digitSequence.equals(seq.CHARS_1_SEQUENCE) || (!digitSequence.startsWith(seq.CHARS_1_SEQUENCE) && Cheonjiin.isSingleJamo(digitSequence))) { digitSequence = ""; } else if (!digitSequence.isEmpty()) { digitSequence = digitSequence.substring(0, digitSequence.length() - 1); @@ -152,7 +152,7 @@ class ModeCheonjiin extends InputMode { if (seq.startsWithEmojiSequence(digitSequence)) { digitSequence = EmojiLanguage.validateEmojiSequence(seq, digitSequence, nextNumber); - } else if (!seq.CHARS_GROUP_0_SEQUENCE.equals(digitSequence) && !seq.CURRENCY_SEQUENCE.equals(digitSequence)) { + } else if (!seq.CHARS_GROUP_0_SEQUENCE.equals(digitSequence) && !seq.CHARS_GROUP_1_SEQUENCE.equals(digitSequence)) { digitSequence += String.valueOf(nextNumber); } @@ -269,7 +269,7 @@ class ModeCheonjiin extends InputMode { return digitSequence.equals(seq.CHARS_1_SEQUENCE) || digitSequence.equals(seq.CHARS_0_SEQUENCE) - || digitSequence.equals(seq.CURRENCY_SEQUENCE) + || digitSequence.equals(seq.CHARS_GROUP_1_SEQUENCE) || digitSequence.equals(seq.CHARS_GROUP_0_SEQUENCE); } 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 367ec403..6c534041 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 @@ -47,10 +47,7 @@ class ModeWords extends ModeCheonjiin { determineTextFieldTextCase(); } - - @Override protected void setCustomSpecialCharacters() { - KEY_CHARACTERS.add(getAbbreviatedSpecialChars()); // special - } + @Override protected void setCustomSpecialCharacters() {} // use defaults @Override @@ -69,7 +66,9 @@ class ModeWords extends ModeCheonjiin { return false; } - if (digitSequence.equals(seq.CURRENCY_SEQUENCE) || digitSequence.equals(seq.CHARS_GROUP_0_SEQUENCE)) { + if (digitSequence.equals(seq.CHARS_GROUP_1_SEQUENCE)) { + digitSequence = seq.CHARS_1_SEQUENCE; + } else if (digitSequence.equals(seq.CHARS_GROUP_0_SEQUENCE)) { digitSequence = seq.CHARS_0_SEQUENCE; } else { digitSequence = digitSequence.substring(0, digitSequence.length() - 1); @@ -404,7 +403,7 @@ class ModeWords extends ModeCheonjiin { // Prevent typing the preferred character when the user has scrolled the special char suggestions. // For example, it makes more sense to allow typing "+ " with 0 + scroll + 0, instead of clearing // the "+" and replacing it with the preferred character. - boolean specialOrCurrency = digitSequence.equals(seq.CHARS_GROUP_0_SEQUENCE) || digitSequence.equals(seq.CURRENCY_SEQUENCE); + boolean specialOrCurrency = digitSequence.equals(seq.CHARS_GROUP_0_SEQUENCE) || digitSequence.equals(seq.CHARS_GROUP_1_SEQUENCE); boolean isWhitespaceAndScrolled = digitSequence.equals(seq.CHARS_0_SEQUENCE) && !stem.isEmpty(); if (nextKey == Sequences.CHARS_0_KEY && (isWhitespaceAndScrolled || specialOrCurrency)) { return true; diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/Sequences.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/Sequences.java index cbc218e3..9aaca878 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/Sequences.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/Sequences.java @@ -14,11 +14,11 @@ public class Sequences { @NonNull public final String CHARS_1_SEQUENCE; @NonNull public final String EMOJI_SEQUENCE; @NonNull public final String CUSTOM_EMOJI_SEQUENCE; + @NonNull public final String CHARS_GROUP_1_SEQUENCE; - @NonNull public final String CURRENCY_SEQUENCE; + @NonNull public final String CHARS_0_SEQUENCE; @NonNull public final String PREFERRED_CHAR_SEQUENCE; @NonNull public final String CHARS_GROUP_0_SEQUENCE; - @NonNull public final String CHARS_0_SEQUENCE; public Sequences() { this(null, null); @@ -33,11 +33,11 @@ public class Sequences { EMOJI_SEQUENCE = CHARS_1_SEQUENCE + CHARS_1_KEY; CUSTOM_EMOJI_SEQUENCE = EMOJI_SEQUENCE + CUSTOM_EMOJI_KEY; + CHARS_GROUP_1_SEQUENCE = CHARS_1_SEQUENCE + 'G' + CHARS_1_KEY; CHARS_0_SEQUENCE = CHARS_0_PREFIX + CHARS_0_KEY; PREFERRED_CHAR_SEQUENCE = CHARS_0_SEQUENCE + CHARS_0_KEY; - CHARS_GROUP_0_SEQUENCE = CHARS_0_PREFIX + CHARS_0_KEY + CHARS_0_KEY + CHARS_0_KEY; - CURRENCY_SEQUENCE = CHARS_GROUP_0_SEQUENCE + CHARS_0_KEY; + CHARS_GROUP_0_SEQUENCE = CHARS_0_SEQUENCE + 'G' + CHARS_0_KEY; } public boolean startsWithEmojiSequence(String sequence) { @@ -57,7 +57,7 @@ public class Sequences { || sequence.equals(EMOJI_SEQUENCE) || sequence.equals(PREFERRED_CHAR_SEQUENCE) || sequence.equals(CHARS_GROUP_0_SEQUENCE) - || sequence.equals(CURRENCY_SEQUENCE); + || sequence.equals(CHARS_GROUP_1_SEQUENCE); } public boolean startsWithAnySpecialCharSequence(String sequence) { @@ -71,6 +71,6 @@ public class Sequences { || sequence.startsWith(EMOJI_SEQUENCE) || sequence.startsWith(PREFERRED_CHAR_SEQUENCE) || sequence.startsWith(CHARS_GROUP_0_SEQUENCE) - || sequence.startsWith(CURRENCY_SEQUENCE); + || sequence.startsWith(CHARS_GROUP_1_SEQUENCE); } } diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/punctuation/PreferenceCharsExtra.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/punctuation/PreferenceCharsExtra.java new file mode 100644 index 00000000..ecb8ef2b --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/punctuation/PreferenceCharsExtra.java @@ -0,0 +1,64 @@ +package io.github.sspanak.tt9.preferences.screens.punctuation; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import io.github.sspanak.tt9.preferences.settings.SettingsStore; + +public class PreferenceCharsExtra extends AbstractPreferenceCharList { + public static final String[] NAMES = { + SettingsStore.CHARS_GROUP_0, + SettingsStore.CHARS_AFTER_GROUP_0, + SettingsStore.CHARS_GROUP_1, + SettingsStore.CHARS_AFTER_GROUP_1 + }; + + + private char[] forbiddenChars; + + public PreferenceCharsExtra(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } + public PreferenceCharsExtra(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } + public PreferenceCharsExtra(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); } + public PreferenceCharsExtra(@NonNull Context context) { super(context); } + + @NonNull + @Override + protected String getChars() { + return getSettings().getCharsExtra(language, getKey()); + } + + @NonNull + @Override + protected char[] getForbiddenChars() { + if (forbiddenChars == null) { + char[] mandatoryChars = getSettings().getMandatoryChars0(language); + + forbiddenChars = new char[mandatoryChars.length + SettingsStore.FORBIDDEN_CHARS_0.length]; + System.arraycopy(mandatoryChars, 0, forbiddenChars, 0, mandatoryChars.length); + System.arraycopy(SettingsStore.FORBIDDEN_CHARS_0, 0, forbiddenChars, mandatoryChars.length, SettingsStore.FORBIDDEN_CHARS_0.length); + } + + return forbiddenChars; + } + + @NonNull + @Override + protected char[] getMandatoryChars() { + return new char[0]; + } + + @Override + public boolean validateCurrentChars() { + String error = validateForbiddenChars(); + setError(error); + return error.isEmpty(); + } + + @Override + public void saveCurrentChars() { + getSettings().saveCharsExtra(language, getKey(), currentChars); + } +} diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/punctuation/PunctuationScreen.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/punctuation/PunctuationScreen.java index dc756ee2..6cfa49e8 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/punctuation/PunctuationScreen.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/punctuation/PunctuationScreen.java @@ -3,6 +3,8 @@ package io.github.sspanak.tt9.preferences.screens.punctuation; import androidx.annotation.Nullable; import androidx.preference.Preference; +import java.util.ArrayList; + import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.LanguageCollection; @@ -14,8 +16,7 @@ public class PunctuationScreen extends BaseScreenFragment { public static final String NAME = "Punctuation"; private ItemPunctuationOrderLanguage languageList; private ItemRestoreDefaultPunctuation restoreDefaults; - private PreferenceChars0 charList0; - private PreferenceChars1 charList1; + private final ArrayList charLists = new ArrayList<>(); public PunctuationScreen() { init(); } public PunctuationScreen(PreferencesActivity activity) { init(activity); } @@ -44,8 +45,11 @@ public class PunctuationScreen extends BaseScreenFragment { @Override protected void onCreate() { - charList0 = findPreference(PreferenceChars0.NAME); - charList1 = findPreference(PreferenceChars1.NAME); + charLists.add(findPreference(PreferenceChars0.NAME)); + charLists.add(findPreference(PreferenceChars1.NAME)); + for (int i = 0; i < PreferenceCharsExtra.NAMES.length; i++) { + charLists.add(findPreference(PreferenceCharsExtra.NAMES[i])); + } initLanguageList(); initResetDefaults(); @@ -87,11 +91,15 @@ public class PunctuationScreen extends BaseScreenFragment { private void onSaveOrdering() { - if (charList0 == null || !charList0.validateCurrentChars() || charList1 == null || !charList1.validateCurrentChars()) { - UI.toastShortSingle(activity, R.string.punctuation_order_save_error); - } else { - charList0.saveCurrentChars(); - charList1.saveCurrentChars(); + for (AbstractPreferenceCharList charList : charLists) { + if (charList == null || !charList.validateCurrentChars()) { + UI.toastShortSingle(activity, R.string.punctuation_order_save_error); + return; + } + } + + for (AbstractPreferenceCharList charList : charLists) { + charList.saveCurrentChars(); } } @@ -101,30 +109,23 @@ public class PunctuationScreen extends BaseScreenFragment { restoreDefaults.setLanguage(language); - if (charList0 != null) { - charList0.onLanguageChange(language); - } - - if (charList1 != null) { - charList1.onLanguageChange(language); + for (AbstractPreferenceCharList list : charLists) { + if (list != null) { + list.onLanguageChange(language); + } } } private void loadCharLists() { - loadCharList(findPreference(PreferenceChars0.NAME)); - loadCharList(findPreference(PreferenceChars1.NAME)); - } - - - private void loadCharList(AbstractPreferenceCharList list) { - if (list == null) { - return; + for (AbstractPreferenceCharList list : charLists) { + if (list == null) { + continue; + } + list.setOnRender(() -> { + list.setOnRender(null); + onLanguageChanged(languageList.getValue()); + }); } - - list.setOnRender(() -> { - list.setOnRender(null); - onLanguageChanged(languageList.getValue()); - }); } } 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 2864f1a3..2e27b3b1 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 @@ -8,11 +8,18 @@ import java.util.ArrayList; import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.LanguageKind; +import io.github.sspanak.tt9.ui.tray.SuggestionsBar; import io.github.sspanak.tt9.util.chars.Characters; class SettingsPunctuation extends SettingsInput { private final static String CHARS_1_PREFIX = "pref_punctuation_"; + public final static String CHARS_GROUP_1 = "punctuation_order_key_1_group"; + public final static String CHARS_AFTER_GROUP_1 = "punctuation_order_key_1_after_group"; + private final static String CHARS_0_PREFIX = "pref_special_chars_"; + public final static String CHARS_GROUP_0 = "punctuation_order_key_0_group"; + public final static String CHARS_AFTER_GROUP_0 = "punctuation_order_key_0_after_group"; + private final static char[] MANDATORY_CHARS_1_EU = new char[] {'\'', '"', '-'}; public final static char[] FORBIDDEN_CHARS_0 = new char[] {' ', '\n', '\t'}; @@ -27,14 +34,14 @@ class SettingsPunctuation extends SettingsInput { } - public void saveChars1(@NonNull Language language, @NonNull String punctuation) { - prefsEditor.putString(CHARS_1_PREFIX + language.getId(), punctuation); + public void saveChars1(@NonNull Language language, @NonNull String chars) { + prefsEditor.putString(CHARS_1_PREFIX + language.getId(), chars); prefsEditor.apply(); } - public void saveChars0(@NonNull Language language, @NonNull String specialChars) { - String safeChars = specialChars + public void saveChars0(@NonNull Language language, @NonNull String chars) { + String safeChars = chars .replace("\n", "⏎") .replace("\t", Characters.TAB); prefsEditor.putString(CHARS_0_PREFIX + language.getId(), safeChars); @@ -42,6 +49,12 @@ class SettingsPunctuation extends SettingsInput { } + public void saveCharsExtra(@NonNull Language language, @NonNull String listKey, @NonNull String chars) { + prefsEditor.putString(listKey + "_" + language.getId(), chars); + prefsEditor.apply(); + } + + @NonNull public String getChars1(Language language) { return String.join("", getChars1AsList(language)); } @@ -52,6 +65,11 @@ class SettingsPunctuation extends SettingsInput { } + @NonNull public String getCharsExtra(Language language, String listKey) { + return prefs.getString(listKey + "_" + language.getId(), ""); + } + + @NonNull public ArrayList getChars1AsList(Language language) { if (language == null) { @@ -80,13 +98,40 @@ class SettingsPunctuation extends SettingsInput { } + public ArrayList getCharsExtraAsList(Language language, String listKey) { + return getCharsAsList(getCharsExtra(language, listKey), new ArrayList<>()); + } + + @NonNull public ArrayList getOrderedKeyChars(Language language, int number) { - return switch (number) { - case 0 -> getChars0AsList(language); - case 1 -> getChars1AsList(language); - default -> language != null ? language.getKeyCharacters(number) : new ArrayList<>(); - }; + if (language == null) { + return new ArrayList<>(); + } + + ArrayList chars; + + switch (number) { + case 0 -> { + chars = getChars0AsList(language); + if (!getCharsExtra(language, CHARS_GROUP_0).isEmpty()) { + chars.add(SuggestionsBar.SHOW_GROUP_0_SUGGESTION); + } + chars.addAll(getCharsExtraAsList(language, CHARS_AFTER_GROUP_0)); + } + case 1 -> { + chars = getChars1AsList(language); + if (!getCharsExtra(language, CHARS_GROUP_1).isEmpty()) { + chars.add(SuggestionsBar.SHOW_GROUP_1_SUGGESTION); + } + chars.addAll(getCharsExtraAsList(language, CHARS_AFTER_GROUP_1)); + } + default -> { + return language.getKeyCharacters(number); + } + } + + return chars; } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/tray/SuggestionsBar.java b/app/src/main/java/io/github/sspanak/tt9/ui/tray/SuggestionsBar.java index 1c408d7a..87d35657 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/tray/SuggestionsBar.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/tray/SuggestionsBar.java @@ -27,8 +27,8 @@ import io.github.sspanak.tt9.util.TextTools; import io.github.sspanak.tt9.util.chars.Characters; public class SuggestionsBar { - public static final String SHOW_SPECIAL_CHARS_SUGGESTION = "#%…"; - public static final String SHOW_CURRENCIES_SUGGESTION = "$€…"; + public static final String SHOW_GROUP_0_SUGGESTION = "(…\u200A)"; + public static final String SHOW_GROUP_1_SUGGESTION = "(…\u200B)"; private final String SHOW_MORE_SUGGESTION = "(...)"; private final String STEM_SUFFIX = "… +"; @@ -146,7 +146,7 @@ public class SuggestionsBar { String suggestion = getRaw(id); // show more... - if (suggestion.equals(SHOW_MORE_SUGGESTION) || suggestion.equals(SHOW_CURRENCIES_SUGGESTION) || suggestion.equals(SHOW_SPECIAL_CHARS_SUGGESTION)) { + if (suggestion.equals(SHOW_MORE_SUGGESTION) || suggestion.equalsIgnoreCase(SHOW_GROUP_1_SUGGESTION) || suggestion.equalsIgnoreCase(SHOW_GROUP_0_SUGGESTION)) { return Characters.PLACEHOLDER; } diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 17a917aa..40fb1a3d 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -200,8 +200,8 @@ Липсва задължителен символ:%1$s Липсват задължителни символи:%1$s Неуспешно запазване на реда на знаците. - Ред на символите на клавиш 1 - Ред на символите на клавиш 0 + Ред на символите на клавиш 1 + Ред на символите на клавиш 0 Възстанови реда по подразбиране Език Запази подредбата diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 0a18e37b..31e5d717 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -188,8 +188,8 @@ Fehlendes erforderliches Zeichen:%1$s Fehlende erforderliche Zeichen:%1$s Zeichenreihenfolge konnte nicht gespeichert werden. - Zeichenreihenfolge der 1-Taste - Zeichenreihenfolge der 0-Taste + Zeichenreihenfolge der 1-Taste + Zeichenreihenfolge der 0-Taste Standardreihenfolge wiederherstellen Sprache Reihenfolge speichern diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index bb0a875e..15395145 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -199,8 +199,8 @@ Falta carácter obligatorio:%1$s Faltan caracteres obligatorios:%1$s Error al guardar el orden de los caracteres. - Orden de caracteres de la tecla 1 - Orden de caracteres de la tecla 0 + Orden de caracteres de la tecla 1 + Orden de caracteres de la tecla 0 Restaurar el orden predeterminado Idioma Guardar orden diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 54cad927..9ce33e8a 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -197,8 +197,8 @@ Caractère obligatoire manquant :%1$s Caractères obligatoires manquants :%1$s Échec de l’enregistrement de l’ordre des caractères. - Ordre des caractères de la touche 1 - Ordre des caractères de la touche 0 + Ordre des caractères de la touche 1 + Ordre des caractères de la touche 0 Restaurer l’ordre par défaut Langue Enregistrer l’ordre diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a494da79..9704d09c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -186,8 +186,8 @@ Carattere obbligatorio mancante:%1$s Caratteri obbligatori mancanti:%1$s Salvataggio dell’ordine dei caratteri non riuscito. - Ordine dei caratteri del tasto 1 - Ordine dei caratteri del tasto 0 + Ordine dei caratteri del tasto 1 + Ordine dei caratteri del tasto 0 Ripristina ordine predefinito Lingua Salvare l\'ordine diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index af10492b..c4f7f035 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -200,8 +200,8 @@ תו חובה חסר: %1$s תווי חובה חסרים:%1$s שמירת סדר התווים נכשלה. - סדר התווים של מקש 1 - סדר התווים של מקש 0 + סדר התווים של מקש 1 + סדר התווים של מקש 0 שחזר את הסדר המוגדר כברירת מחדל שפה שמור את הסדר diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 81d3f629..7371e950 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -208,8 +208,8 @@ Trūksta privalomo simbolio:%1$s Trūksta privalomų simbolių:%1$s Nepavyko išsaugoti simbolių tvarkos. - Simbolių tvarka ant klavišo 1 - Simbolių tvarka ant klavišo 0 + Simbolių tvarka ant klavišo 1 + Simbolių tvarka ant klavišo 0 Atkurti numatytąją tvarką Kalba Išsaugoti tvarką diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 98fff4d5..f499e010 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -188,8 +188,8 @@ Ontbrekend verplicht teken:%1$s Ontbrekende verplichte tekens:%1$s Opslaan van de tekenvolgorde mislukt. - Tekenvolgorde van de 1-toets - Tekenvolgorde van de 0-toets + Tekenvolgorde van de 1-toets + Tekenvolgorde van de 0-toets Standaardvolgorde herstellen Taal Volgorde opslaan diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9b5ee300..f8efd4ae 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -201,8 +201,8 @@ Caractere obrigatório ausente:%1$s Caracteres obrigatórios ausentes:%1$s Falha ao salvar a ordem dos caracteres. - Ordem de caracteres da tecla 1 - Ordem de caracteres da tecla 0 + Ordem de caracteres da tecla 1 + Ordem de caracteres da tecla 0 Restaurar ordem padrão Idioma Salvar ordem diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7904a8a3..51880eb8 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -199,8 +199,8 @@ Отсутствует обязательный символ:%1$s Отсутствуют обязательные символы:%1$s е удалось сохранить порядок символов. - Порядок символов на клавише 1 - Порядок символов на клавише 0 + Порядок символов на клавише 1 + Порядок символов на клавише 0 Восстановить порядок по умолчанию Язык Сохранить порядок diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d39d42c7..14c8691b 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -201,8 +201,8 @@ Zorunlu karakter eksik:%1$s Zorunlu karakterler eksik:%1$s Karakter sırası kaydedilemedi. - 1 tuşunun karakter sırası - 0 tuşunun karakter sırası + 1 tuşunun karakter sırası + 0 tuşunun karakter sırası Varsayılan sırayı geri yükle Dil Sıralamayı kaydet diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 5fbc15ae..5bce4b6e 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -210,8 +210,8 @@ Відсутній обов’язковий символ:%1$s Відсутні обов’язкові символи:%1$s Не вдалося зберегти порядок символів. - Порядок символів на клавіші 1 - Порядок символів на клавіші 0 + Порядок символів на клавіші 1 + Порядок символів на клавіші 0 Відновити початковий порядок Мова Зберегти порядок diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e3b68742..20d0b48b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -211,8 +211,11 @@ Forbidden characters:%1$s Save Order Failed saving the character order. - 1-key Character Order - 0-key Character Order + 1-key Character Order + 0-key Character Order + Initial characters + Grouped characters (optional) + After the group (optional) Status Select Default Keyboard diff --git a/app/src/main/res/xml/prefs_screen_punctuation.xml b/app/src/main/res/xml/prefs_screen_punctuation.xml index 810831f5..33d77129 100644 --- a/app/src/main/res/xml/prefs_screen_punctuation.xml +++ b/app/src/main/res/xml/prefs_screen_punctuation.xml @@ -5,20 +5,45 @@ android:key="punctuation_order_language" android:title="@string/language" /> - + + - + - + + - + + + + + + + + + + + + + +