1
0
Fork 0

new way of special char grouping

This commit is contained in:
sspanak 2025-05-14 15:39:13 +03:00 committed by Dimo Karaivanov
parent d7004a1a1e
commit 0164e951cd
25 changed files with 251 additions and 127 deletions

View file

@ -87,13 +87,12 @@ abstract public class InputMode {
public void onAcceptSuggestion(@NonNull String word, boolean preserveWordList) {} public void onAcceptSuggestion(@NonNull String word, boolean preserveWordList) {}
public void onCursorMove(@NonNull String word) { if (!digitSequence.isEmpty()) onAcceptSuggestion(word); } public void onCursorMove(@NonNull String word) { if (!digitSequence.isEmpty()) onAcceptSuggestion(word); }
public boolean onReplaceSuggestion(@NonNull String rawWord) { public boolean onReplaceSuggestion(@NonNull String rawWord) {
String newSequence = switch(rawWord) { String newSequence;
case SuggestionsBar.SHOW_SPECIAL_CHARS_SUGGESTION -> seq.CHARS_GROUP_0_SEQUENCE; if (SuggestionsBar.SHOW_GROUP_0_SUGGESTION.equalsIgnoreCase(rawWord)) {
case SuggestionsBar.SHOW_CURRENCIES_SUGGESTION -> seq.CURRENCY_SEQUENCE; newSequence = seq.CHARS_GROUP_0_SEQUENCE;
default -> null; } else if (SuggestionsBar.SHOW_GROUP_1_SUGGESTION.equalsIgnoreCase(rawWord)) {
}; newSequence = seq.CHARS_GROUP_1_SEQUENCE;
} else {
if (newSequence == null) {
return false; return false;
} }
@ -209,18 +208,6 @@ abstract public class InputMode {
protected String adjustSuggestionTextCase(String word, int newTextCase) { return word; } protected String adjustSuggestionTextCase(String word, int newTextCase) { return word; }
protected ArrayList<String> getAbbreviatedSpecialChars() {
ArrayList<String> 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) * 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. * special character list, or the whitespace list.
@ -228,12 +215,12 @@ abstract public class InputMode {
protected boolean loadSpecialCharacters() { protected boolean loadSpecialCharacters() {
suggestions.clear(); 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')); suggestions.addAll(settings.getOrderedKeyChars(language, digitSequence.charAt(0) - '0'));
} else if (digitSequence.equals(seq.CURRENCY_SEQUENCE)) { } else if (digitSequence.equals(seq.CHARS_GROUP_0_SEQUENCE)) {
suggestions.addAll(Characters.getCurrencies(language)); suggestions.addAll(settings.getCharsExtraAsList(language, SettingsStore.CHARS_GROUP_0));
} else { } else if (digitSequence.equals(seq.CHARS_GROUP_1_SEQUENCE)) {
suggestions.addAll(getAbbreviatedSpecialChars()); suggestions.addAll(settings.getCharsExtraAsList(language, SettingsStore.CHARS_GROUP_1));
} }
return true; return true;

View file

@ -55,7 +55,9 @@ class Mode123 extends ModePassthrough {
*/ */
private void setDefaultSpecialCharacters() { private void setDefaultSpecialCharacters() {
Language english = LanguageCollection.getByLocale("en"); Language english = LanguageCollection.getByLocale("en");
KEY_CHARACTERS.add(getAbbreviatedSpecialChars()); KEY_CHARACTERS.add(
TextTools.removeLettersFromList(orderCharsForNumericField(settings.getOrderedKeyChars(english, 0), null))
);
KEY_CHARACTERS.add( KEY_CHARACTERS.add(
TextTools.removeLettersFromList(orderCharsForNumericField(settings.getOrderedKeyChars(english, 1), null)) TextTools.removeLettersFromList(orderCharsForNumericField(settings.getOrderedKeyChars(english, 1), null))
); );

View file

@ -87,8 +87,6 @@ class ModeABC extends InputMode {
if (isEmailMode) { if (isEmailMode) {
KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(0), settings.getOrderedKeyChars(language, 0), true)); 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)); KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(1), settings.getOrderedKeyChars(language, 1), true));
} else {
KEY_CHARACTERS.add(getAbbreviatedSpecialChars());
} }
refreshSuggestions(); refreshSuggestions();

View file

@ -46,7 +46,7 @@ public class ModeBopomofo extends ModePinyin {
*/ */
protected void setCustomSpecialCharacters() { protected void setCustomSpecialCharacters() {
// special // 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"); KEY_CHARACTERS.get(0).add(0, "0");
// punctuation // punctuation
@ -72,7 +72,7 @@ public class ModeBopomofo extends ModePinyin {
protected void onNumberPress(int nextNumber) { protected void onNumberPress(int nextNumber) {
if (seq.startsWithEmojiSequence(digitSequence)) { if (seq.startsWithEmojiSequence(digitSequence)) {
digitSequence = EmojiLanguage.validateEmojiSequence(seq, digitSequence, nextNumber); 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); digitSequence += String.valueOf(nextNumber);
} }
} }

View file

@ -62,12 +62,12 @@ class ModeCheonjiin extends InputMode {
*/ */
protected void setCustomSpecialCharacters() { protected void setCustomSpecialCharacters() {
// special // special
KEY_CHARACTERS.add(getAbbreviatedSpecialChars()); KEY_CHARACTERS.add(TextTools.removeLettersFromList(settings.getOrderedKeyChars(language, 0)));
KEY_CHARACTERS.get(0).add(0, "0"); KEY_CHARACTERS.get(0).add(0, "0");
// punctuation // punctuation
KEY_CHARACTERS.add( 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 @Override
public boolean onBackspace() { 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; digitSequence = seq.CHARS_0_SEQUENCE;
} else if (digitSequence.equals(seq.CHARS_1_SEQUENCE)) { } 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.equals(seq.CHARS_0_SEQUENCE) || (!digitSequence.startsWith(seq.CHARS_1_SEQUENCE) && Cheonjiin.isSingleJamo(digitSequence))) {
digitSequence = ""; digitSequence = "";
} else if (!digitSequence.isEmpty()) { } else if (!digitSequence.isEmpty()) {
digitSequence = digitSequence.substring(0, digitSequence.length() - 1); digitSequence = digitSequence.substring(0, digitSequence.length() - 1);
@ -152,7 +152,7 @@ class ModeCheonjiin extends InputMode {
if (seq.startsWithEmojiSequence(digitSequence)) { if (seq.startsWithEmojiSequence(digitSequence)) {
digitSequence = EmojiLanguage.validateEmojiSequence(seq, digitSequence, nextNumber); 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); digitSequence += String.valueOf(nextNumber);
} }
@ -269,7 +269,7 @@ class ModeCheonjiin extends InputMode {
return return
digitSequence.equals(seq.CHARS_1_SEQUENCE) digitSequence.equals(seq.CHARS_1_SEQUENCE)
|| digitSequence.equals(seq.CHARS_0_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); || digitSequence.equals(seq.CHARS_GROUP_0_SEQUENCE);
} }

View file

@ -47,10 +47,7 @@ class ModeWords extends ModeCheonjiin {
determineTextFieldTextCase(); determineTextFieldTextCase();
} }
@Override protected void setCustomSpecialCharacters() {} // use defaults
@Override protected void setCustomSpecialCharacters() {
KEY_CHARACTERS.add(getAbbreviatedSpecialChars()); // special
}
@Override @Override
@ -69,7 +66,9 @@ class ModeWords extends ModeCheonjiin {
return false; 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; digitSequence = seq.CHARS_0_SEQUENCE;
} else { } else {
digitSequence = digitSequence.substring(0, digitSequence.length() - 1); 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. // 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 // For example, it makes more sense to allow typing "+ " with 0 + scroll + 0, instead of clearing
// the "+" and replacing it with the preferred character. // 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(); boolean isWhitespaceAndScrolled = digitSequence.equals(seq.CHARS_0_SEQUENCE) && !stem.isEmpty();
if (nextKey == Sequences.CHARS_0_KEY && (isWhitespaceAndScrolled || specialOrCurrency)) { if (nextKey == Sequences.CHARS_0_KEY && (isWhitespaceAndScrolled || specialOrCurrency)) {
return true; return true;

View file

@ -14,11 +14,11 @@ public class Sequences {
@NonNull public final String CHARS_1_SEQUENCE; @NonNull public final String CHARS_1_SEQUENCE;
@NonNull public final String EMOJI_SEQUENCE; @NonNull public final String EMOJI_SEQUENCE;
@NonNull public final String CUSTOM_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 PREFERRED_CHAR_SEQUENCE;
@NonNull public final String CHARS_GROUP_0_SEQUENCE; @NonNull public final String CHARS_GROUP_0_SEQUENCE;
@NonNull public final String CHARS_0_SEQUENCE;
public Sequences() { public Sequences() {
this(null, null); this(null, null);
@ -33,11 +33,11 @@ public class Sequences {
EMOJI_SEQUENCE = CHARS_1_SEQUENCE + CHARS_1_KEY; EMOJI_SEQUENCE = CHARS_1_SEQUENCE + CHARS_1_KEY;
CUSTOM_EMOJI_SEQUENCE = EMOJI_SEQUENCE + CUSTOM_EMOJI_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; CHARS_0_SEQUENCE = CHARS_0_PREFIX + CHARS_0_KEY;
PREFERRED_CHAR_SEQUENCE = CHARS_0_SEQUENCE + 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; CHARS_GROUP_0_SEQUENCE = CHARS_0_SEQUENCE + 'G' + CHARS_0_KEY;
CURRENCY_SEQUENCE = CHARS_GROUP_0_SEQUENCE + CHARS_0_KEY;
} }
public boolean startsWithEmojiSequence(String sequence) { public boolean startsWithEmojiSequence(String sequence) {
@ -57,7 +57,7 @@ public class Sequences {
|| sequence.equals(EMOJI_SEQUENCE) || sequence.equals(EMOJI_SEQUENCE)
|| sequence.equals(PREFERRED_CHAR_SEQUENCE) || sequence.equals(PREFERRED_CHAR_SEQUENCE)
|| sequence.equals(CHARS_GROUP_0_SEQUENCE) || sequence.equals(CHARS_GROUP_0_SEQUENCE)
|| sequence.equals(CURRENCY_SEQUENCE); || sequence.equals(CHARS_GROUP_1_SEQUENCE);
} }
public boolean startsWithAnySpecialCharSequence(String sequence) { public boolean startsWithAnySpecialCharSequence(String sequence) {
@ -71,6 +71,6 @@ public class Sequences {
|| sequence.startsWith(EMOJI_SEQUENCE) || sequence.startsWith(EMOJI_SEQUENCE)
|| sequence.startsWith(PREFERRED_CHAR_SEQUENCE) || sequence.startsWith(PREFERRED_CHAR_SEQUENCE)
|| sequence.startsWith(CHARS_GROUP_0_SEQUENCE) || sequence.startsWith(CHARS_GROUP_0_SEQUENCE)
|| sequence.startsWith(CURRENCY_SEQUENCE); || sequence.startsWith(CHARS_GROUP_1_SEQUENCE);
} }
} }

View file

@ -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);
}
}

View file

@ -3,6 +3,8 @@ package io.github.sspanak.tt9.preferences.screens.punctuation;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.preference.Preference; import androidx.preference.Preference;
import java.util.ArrayList;
import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.LanguageCollection; import io.github.sspanak.tt9.languages.LanguageCollection;
@ -14,8 +16,7 @@ public class PunctuationScreen extends BaseScreenFragment {
public static final String NAME = "Punctuation"; public static final String NAME = "Punctuation";
private ItemPunctuationOrderLanguage languageList; private ItemPunctuationOrderLanguage languageList;
private ItemRestoreDefaultPunctuation restoreDefaults; private ItemRestoreDefaultPunctuation restoreDefaults;
private PreferenceChars0 charList0; private final ArrayList<AbstractPreferenceCharList> charLists = new ArrayList<>();
private PreferenceChars1 charList1;
public PunctuationScreen() { init(); } public PunctuationScreen() { init(); }
public PunctuationScreen(PreferencesActivity activity) { init(activity); } public PunctuationScreen(PreferencesActivity activity) { init(activity); }
@ -44,8 +45,11 @@ public class PunctuationScreen extends BaseScreenFragment {
@Override @Override
protected void onCreate() { protected void onCreate() {
charList0 = findPreference(PreferenceChars0.NAME); charLists.add(findPreference(PreferenceChars0.NAME));
charList1 = findPreference(PreferenceChars1.NAME); charLists.add(findPreference(PreferenceChars1.NAME));
for (int i = 0; i < PreferenceCharsExtra.NAMES.length; i++) {
charLists.add(findPreference(PreferenceCharsExtra.NAMES[i]));
}
initLanguageList(); initLanguageList();
initResetDefaults(); initResetDefaults();
@ -87,11 +91,15 @@ public class PunctuationScreen extends BaseScreenFragment {
private void onSaveOrdering() { private void onSaveOrdering() {
if (charList0 == null || !charList0.validateCurrentChars() || charList1 == null || !charList1.validateCurrentChars()) { for (AbstractPreferenceCharList charList : charLists) {
UI.toastShortSingle(activity, R.string.punctuation_order_save_error); if (charList == null || !charList.validateCurrentChars()) {
} else { UI.toastShortSingle(activity, R.string.punctuation_order_save_error);
charList0.saveCurrentChars(); return;
charList1.saveCurrentChars(); }
}
for (AbstractPreferenceCharList charList : charLists) {
charList.saveCurrentChars();
} }
} }
@ -101,30 +109,23 @@ public class PunctuationScreen extends BaseScreenFragment {
restoreDefaults.setLanguage(language); restoreDefaults.setLanguage(language);
if (charList0 != null) { for (AbstractPreferenceCharList list : charLists) {
charList0.onLanguageChange(language); if (list != null) {
} list.onLanguageChange(language);
}
if (charList1 != null) {
charList1.onLanguageChange(language);
} }
} }
private void loadCharLists() { private void loadCharLists() {
loadCharList(findPreference(PreferenceChars0.NAME)); for (AbstractPreferenceCharList list : charLists) {
loadCharList(findPreference(PreferenceChars1.NAME)); if (list == null) {
} continue;
}
list.setOnRender(() -> {
private void loadCharList(AbstractPreferenceCharList list) { list.setOnRender(null);
if (list == null) { onLanguageChanged(languageList.getValue());
return; });
} }
list.setOnRender(() -> {
list.setOnRender(null);
onLanguageChanged(languageList.getValue());
});
} }
} }

View file

@ -8,11 +8,18 @@ import java.util.ArrayList;
import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.LanguageKind; import io.github.sspanak.tt9.languages.LanguageKind;
import io.github.sspanak.tt9.ui.tray.SuggestionsBar;
import io.github.sspanak.tt9.util.chars.Characters; import io.github.sspanak.tt9.util.chars.Characters;
class SettingsPunctuation extends SettingsInput { class SettingsPunctuation extends SettingsInput {
private final static String CHARS_1_PREFIX = "pref_punctuation_"; 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_"; 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[] {'\'', '"', '-'}; private final static char[] MANDATORY_CHARS_1_EU = new char[] {'\'', '"', '-'};
public final static char[] FORBIDDEN_CHARS_0 = new char[] {' ', '\n', '\t'}; 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) { public void saveChars1(@NonNull Language language, @NonNull String chars) {
prefsEditor.putString(CHARS_1_PREFIX + language.getId(), punctuation); prefsEditor.putString(CHARS_1_PREFIX + language.getId(), chars);
prefsEditor.apply(); prefsEditor.apply();
} }
public void saveChars0(@NonNull Language language, @NonNull String specialChars) { public void saveChars0(@NonNull Language language, @NonNull String chars) {
String safeChars = specialChars String safeChars = chars
.replace("\n", "") .replace("\n", "")
.replace("\t", Characters.TAB); .replace("\t", Characters.TAB);
prefsEditor.putString(CHARS_0_PREFIX + language.getId(), safeChars); 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) { @NonNull public String getChars1(Language language) {
return String.join("", getChars1AsList(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 @NonNull
public ArrayList<String> getChars1AsList(Language language) { public ArrayList<String> getChars1AsList(Language language) {
if (language == null) { if (language == null) {
@ -80,13 +98,40 @@ class SettingsPunctuation extends SettingsInput {
} }
public ArrayList<String> getCharsExtraAsList(Language language, String listKey) {
return getCharsAsList(getCharsExtra(language, listKey), new ArrayList<>());
}
@NonNull @NonNull
public ArrayList<String> getOrderedKeyChars(Language language, int number) { public ArrayList<String> getOrderedKeyChars(Language language, int number) {
return switch (number) { if (language == null) {
case 0 -> getChars0AsList(language); return new ArrayList<>();
case 1 -> getChars1AsList(language); }
default -> language != null ? language.getKeyCharacters(number) : new ArrayList<>();
}; ArrayList<String> 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;
} }

View file

@ -27,8 +27,8 @@ import io.github.sspanak.tt9.util.TextTools;
import io.github.sspanak.tt9.util.chars.Characters; import io.github.sspanak.tt9.util.chars.Characters;
public class SuggestionsBar { public class SuggestionsBar {
public static final String SHOW_SPECIAL_CHARS_SUGGESTION = "#%…"; public static final String SHOW_GROUP_0_SUGGESTION = "(…\u200A)";
public static final String SHOW_CURRENCIES_SUGGESTION = "$€…"; public static final String SHOW_GROUP_1_SUGGESTION = "(…\u200B)";
private final String SHOW_MORE_SUGGESTION = "(...)"; private final String SHOW_MORE_SUGGESTION = "(...)";
private final String STEM_SUFFIX = "… +"; private final String STEM_SUFFIX = "… +";
@ -146,7 +146,7 @@ public class SuggestionsBar {
String suggestion = getRaw(id); String suggestion = getRaw(id);
// show more... // 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; return Characters.PLACEHOLDER;
} }

View file

@ -200,8 +200,8 @@
<string name="punctuation_order_mandatory_char_missing">Липсва задължителен символ:%1$s</string> <string name="punctuation_order_mandatory_char_missing">Липсва задължителен символ:%1$s</string>
<string name="punctuation_order_mandatory_chars_missing">Липсват задължителни символи:%1$s</string> <string name="punctuation_order_mandatory_chars_missing">Липсват задължителни символи:%1$s</string>
<string name="punctuation_order_save_error">Неуспешно запазване на реда на знаците.</string> <string name="punctuation_order_save_error">Неуспешно запазване на реда на знаците.</string>
<string name="punctuation_order_sentence">Ред на символите на клавиш 1</string> <string name="punctuation_order_key_1">Ред на символите на клавиш 1</string>
<string name="punctuation_order_special">Ред на символите на клавиш 0</string> <string name="punctuation_order_key_0">Ред на символите на клавиш 0</string>
<string name="restore_default_order">Възстанови реда по подразбиране</string> <string name="restore_default_order">Възстанови реда по подразбиране</string>
<string name="language">Език</string> <string name="language">Език</string>
<string name="punctuation_order_save">Запази подредбата</string> <string name="punctuation_order_save">Запази подредбата</string>

View file

@ -188,8 +188,8 @@
<string name="punctuation_order_mandatory_char_missing">Fehlendes erforderliches Zeichen:%1$s</string> <string name="punctuation_order_mandatory_char_missing">Fehlendes erforderliches Zeichen:%1$s</string>
<string name="punctuation_order_mandatory_chars_missing">Fehlende erforderliche Zeichen:%1$s</string> <string name="punctuation_order_mandatory_chars_missing">Fehlende erforderliche Zeichen:%1$s</string>
<string name="punctuation_order_save_error">Zeichenreihenfolge konnte nicht gespeichert werden.</string> <string name="punctuation_order_save_error">Zeichenreihenfolge konnte nicht gespeichert werden.</string>
<string name="punctuation_order_sentence">Zeichenreihenfolge der 1-Taste</string> <string name="punctuation_order_key_1">Zeichenreihenfolge der 1-Taste</string>
<string name="punctuation_order_special">Zeichenreihenfolge der 0-Taste</string> <string name="punctuation_order_key_0">Zeichenreihenfolge der 0-Taste</string>
<string name="restore_default_order">Standardreihenfolge wiederherstellen</string> <string name="restore_default_order">Standardreihenfolge wiederherstellen</string>
<string name="language">Sprache</string> <string name="language">Sprache</string>
<string name="punctuation_order_save">Reihenfolge speichern</string> <string name="punctuation_order_save">Reihenfolge speichern</string>

View file

@ -199,8 +199,8 @@
<string name="punctuation_order_mandatory_char_missing">Falta carácter obligatorio:%1$s</string> <string name="punctuation_order_mandatory_char_missing">Falta carácter obligatorio:%1$s</string>
<string name="punctuation_order_mandatory_chars_missing">Faltan caracteres obligatorios:%1$s</string> <string name="punctuation_order_mandatory_chars_missing">Faltan caracteres obligatorios:%1$s</string>
<string name="punctuation_order_save_error">Error al guardar el orden de los caracteres.</string> <string name="punctuation_order_save_error">Error al guardar el orden de los caracteres.</string>
<string name="punctuation_order_sentence">Orden de caracteres de la tecla 1</string> <string name="punctuation_order_key_1">Orden de caracteres de la tecla 1</string>
<string name="punctuation_order_special">Orden de caracteres de la tecla 0</string> <string name="punctuation_order_key_0">Orden de caracteres de la tecla 0</string>
<string name="restore_default_order">Restaurar el orden predeterminado</string> <string name="restore_default_order">Restaurar el orden predeterminado</string>
<string name="language">Idioma</string> <string name="language">Idioma</string>
<string name="punctuation_order_save">Guardar orden</string> <string name="punctuation_order_save">Guardar orden</string>

View file

@ -197,8 +197,8 @@
<string name="punctuation_order_mandatory_char_missing">Caractère obligatoire manquant :%1$s</string> <string name="punctuation_order_mandatory_char_missing">Caractère obligatoire manquant :%1$s</string>
<string name="punctuation_order_mandatory_chars_missing">Caractères obligatoires manquants :%1$s</string> <string name="punctuation_order_mandatory_chars_missing">Caractères obligatoires manquants :%1$s</string>
<string name="punctuation_order_save_error">Échec de lenregistrement de lordre des caractères.</string> <string name="punctuation_order_save_error">Échec de lenregistrement de lordre des caractères.</string>
<string name="punctuation_order_sentence">Ordre des caractères de la touche 1</string> <string name="punctuation_order_key_1">Ordre des caractères de la touche 1</string>
<string name="punctuation_order_special">Ordre des caractères de la touche 0</string> <string name="punctuation_order_key_0">Ordre des caractères de la touche 0</string>
<string name="restore_default_order">Restaurer lordre par défaut</string> <string name="restore_default_order">Restaurer lordre par défaut</string>
<string name="language">Langue</string> <string name="language">Langue</string>
<string name="punctuation_order_save">Enregistrer lordre</string> <string name="punctuation_order_save">Enregistrer lordre</string>

View file

@ -186,8 +186,8 @@
<string name="punctuation_order_mandatory_char_missing">Carattere obbligatorio mancante:%1$s</string> <string name="punctuation_order_mandatory_char_missing">Carattere obbligatorio mancante:%1$s</string>
<string name="punctuation_order_mandatory_chars_missing">Caratteri obbligatori mancanti:%1$s</string> <string name="punctuation_order_mandatory_chars_missing">Caratteri obbligatori mancanti:%1$s</string>
<string name="punctuation_order_save_error">Salvataggio dellordine dei caratteri non riuscito.</string> <string name="punctuation_order_save_error">Salvataggio dellordine dei caratteri non riuscito.</string>
<string name="punctuation_order_sentence">Ordine dei caratteri del tasto 1</string> <string name="punctuation_order_key_1">Ordine dei caratteri del tasto 1</string>
<string name="punctuation_order_special">Ordine dei caratteri del tasto 0</string> <string name="punctuation_order_key_0">Ordine dei caratteri del tasto 0</string>
<string name="restore_default_order">Ripristina ordine predefinito</string> <string name="restore_default_order">Ripristina ordine predefinito</string>
<string name="language">Lingua</string> <string name="language">Lingua</string>
<string name="punctuation_order_save">Salvare l\'ordine</string> <string name="punctuation_order_save">Salvare l\'ordine</string>

View file

@ -200,8 +200,8 @@
<string name="punctuation_order_mandatory_char_missing">תו חובה חסר: %1$s</string> <string name="punctuation_order_mandatory_char_missing">תו חובה חסר: %1$s</string>
<string name="punctuation_order_mandatory_chars_missing">תווי חובה חסרים:%1$s</string> <string name="punctuation_order_mandatory_chars_missing">תווי חובה חסרים:%1$s</string>
<string name="punctuation_order_save_error">שמירת סדר התווים נכשלה.</string> <string name="punctuation_order_save_error">שמירת סדר התווים נכשלה.</string>
<string name="punctuation_order_sentence">סדר התווים של מקש 1</string> <string name="punctuation_order_key_1">סדר התווים של מקש 1</string>
<string name="punctuation_order_special">סדר התווים של מקש 0</string> <string name="punctuation_order_key_0">סדר התווים של מקש 0</string>
<string name="restore_default_order">שחזר את הסדר המוגדר כברירת מחדל</string> <string name="restore_default_order">שחזר את הסדר המוגדר כברירת מחדל</string>
<string name="language">שפה</string> <string name="language">שפה</string>
<string name="punctuation_order_save">שמור את הסדר</string> <string name="punctuation_order_save">שמור את הסדר</string>

View file

@ -208,8 +208,8 @@
<string name="punctuation_order_mandatory_char_missing">Trūksta privalomo simbolio:%1$s</string> <string name="punctuation_order_mandatory_char_missing">Trūksta privalomo simbolio:%1$s</string>
<string name="punctuation_order_mandatory_chars_missing">Trūksta privalomų simbolių:%1$s</string> <string name="punctuation_order_mandatory_chars_missing">Trūksta privalomų simbolių:%1$s</string>
<string name="punctuation_order_save_error">Nepavyko išsaugoti simbolių tvarkos.</string> <string name="punctuation_order_save_error">Nepavyko išsaugoti simbolių tvarkos.</string>
<string name="punctuation_order_sentence">Simbolių tvarka ant klavišo 1</string> <string name="punctuation_order_key_1">Simbolių tvarka ant klavišo 1</string>
<string name="punctuation_order_special">Simbolių tvarka ant klavišo 0</string> <string name="punctuation_order_key_0">Simbolių tvarka ant klavišo 0</string>
<string name="restore_default_order">Atkurti numatytąją tvarką</string> <string name="restore_default_order">Atkurti numatytąją tvarką</string>
<string name="language">Kalba</string> <string name="language">Kalba</string>
<string name="punctuation_order_save">Išsaugoti tvarką</string> <string name="punctuation_order_save">Išsaugoti tvarką</string>

View file

@ -188,8 +188,8 @@
<string name="punctuation_order_mandatory_char_missing">Ontbrekend verplicht teken:%1$s</string> <string name="punctuation_order_mandatory_char_missing">Ontbrekend verplicht teken:%1$s</string>
<string name="punctuation_order_mandatory_chars_missing">Ontbrekende verplichte tekens:%1$s</string> <string name="punctuation_order_mandatory_chars_missing">Ontbrekende verplichte tekens:%1$s</string>
<string name="punctuation_order_save_error">Opslaan van de tekenvolgorde mislukt.</string> <string name="punctuation_order_save_error">Opslaan van de tekenvolgorde mislukt.</string>
<string name="punctuation_order_sentence">Tekenvolgorde van de 1-toets</string> <string name="punctuation_order_key_1">Tekenvolgorde van de 1-toets</string>
<string name="punctuation_order_special">Tekenvolgorde van de 0-toets</string> <string name="punctuation_order_key_0">Tekenvolgorde van de 0-toets</string>
<string name="restore_default_order">Standaardvolgorde herstellen</string> <string name="restore_default_order">Standaardvolgorde herstellen</string>
<string name="language">Taal</string> <string name="language">Taal</string>
<string name="punctuation_order_save">Volgorde opslaan</string> <string name="punctuation_order_save">Volgorde opslaan</string>

View file

@ -201,8 +201,8 @@
<string name="punctuation_order_mandatory_char_missing">Caractere obrigatório ausente:%1$s</string> <string name="punctuation_order_mandatory_char_missing">Caractere obrigatório ausente:%1$s</string>
<string name="punctuation_order_mandatory_chars_missing">Caracteres obrigatórios ausentes:%1$s</string> <string name="punctuation_order_mandatory_chars_missing">Caracteres obrigatórios ausentes:%1$s</string>
<string name="punctuation_order_save_error">Falha ao salvar a ordem dos caracteres.</string> <string name="punctuation_order_save_error">Falha ao salvar a ordem dos caracteres.</string>
<string name="punctuation_order_sentence">Ordem de caracteres da tecla 1</string> <string name="punctuation_order_key_1">Ordem de caracteres da tecla 1</string>
<string name="punctuation_order_special">Ordem de caracteres da tecla 0</string> <string name="punctuation_order_key_0">Ordem de caracteres da tecla 0</string>
<string name="restore_default_order">Restaurar ordem padrão</string> <string name="restore_default_order">Restaurar ordem padrão</string>
<string name="language">Idioma</string> <string name="language">Idioma</string>
<string name="punctuation_order_save">Salvar ordem</string> <string name="punctuation_order_save">Salvar ordem</string>

View file

@ -199,8 +199,8 @@
<string name="punctuation_order_mandatory_char_missing">Отсутствует обязательный символ:%1$s</string> <string name="punctuation_order_mandatory_char_missing">Отсутствует обязательный символ:%1$s</string>
<string name="punctuation_order_mandatory_chars_missing">Отсутствуют обязательные символы:%1$s</string> <string name="punctuation_order_mandatory_chars_missing">Отсутствуют обязательные символы:%1$s</string>
<string name="punctuation_order_save_error">е удалось сохранить порядок символов.</string> <string name="punctuation_order_save_error">е удалось сохранить порядок символов.</string>
<string name="punctuation_order_sentence">Порядок символов на клавише 1</string> <string name="punctuation_order_key_1">Порядок символов на клавише 1</string>
<string name="punctuation_order_special">Порядок символов на клавише 0</string> <string name="punctuation_order_key_0">Порядок символов на клавише 0</string>
<string name="restore_default_order">Восстановить порядок по умолчанию</string> <string name="restore_default_order">Восстановить порядок по умолчанию</string>
<string name="language">Язык</string> <string name="language">Язык</string>
<string name="punctuation_order_save">Сохранить порядок</string> <string name="punctuation_order_save">Сохранить порядок</string>

View file

@ -201,8 +201,8 @@
<string name="punctuation_order_mandatory_char_missing">Zorunlu karakter eksik:%1$s</string> <string name="punctuation_order_mandatory_char_missing">Zorunlu karakter eksik:%1$s</string>
<string name="punctuation_order_mandatory_chars_missing">Zorunlu karakterler eksik:%1$s</string> <string name="punctuation_order_mandatory_chars_missing">Zorunlu karakterler eksik:%1$s</string>
<string name="punctuation_order_save_error">Karakter sırası kaydedilemedi.</string> <string name="punctuation_order_save_error">Karakter sırası kaydedilemedi.</string>
<string name="punctuation_order_sentence">1 tuşunun karakter sırası</string> <string name="punctuation_order_key_1">1 tuşunun karakter sırası</string>
<string name="punctuation_order_special">0 tuşunun karakter sırası</string> <string name="punctuation_order_key_0">0 tuşunun karakter sırası</string>
<string name="restore_default_order">Varsayılan sırayı geri yükle</string> <string name="restore_default_order">Varsayılan sırayı geri yükle</string>
<string name="language">Dil</string> <string name="language">Dil</string>
<string name="punctuation_order_save">Sıralamayı kaydet</string> <string name="punctuation_order_save">Sıralamayı kaydet</string>

View file

@ -210,8 +210,8 @@
<string name="punctuation_order_mandatory_char_missing">Відсутній обов’язковий символ:%1$s</string> <string name="punctuation_order_mandatory_char_missing">Відсутній обов’язковий символ:%1$s</string>
<string name="punctuation_order_mandatory_chars_missing">Відсутні обов’язкові символи:%1$s</string> <string name="punctuation_order_mandatory_chars_missing">Відсутні обов’язкові символи:%1$s</string>
<string name="punctuation_order_save_error">Не вдалося зберегти порядок символів.</string> <string name="punctuation_order_save_error">Не вдалося зберегти порядок символів.</string>
<string name="punctuation_order_sentence">Порядок символів на клавіші 1</string> <string name="punctuation_order_key_1">Порядок символів на клавіші 1</string>
<string name="punctuation_order_special">Порядок символів на клавіші 0</string> <string name="punctuation_order_key_0">Порядок символів на клавіші 0</string>
<string name="restore_default_order">Відновити початковий порядок</string> <string name="restore_default_order">Відновити початковий порядок</string>
<string name="language">Мова</string> <string name="language">Мова</string>
<string name="punctuation_order_save">Зберегти порядок</string> <string name="punctuation_order_save">Зберегти порядок</string>

View file

@ -211,8 +211,11 @@
<string name="punctuation_order_forbidden_chars">Forbidden characters:%1$s</string> <string name="punctuation_order_forbidden_chars">Forbidden characters:%1$s</string>
<string name="punctuation_order_save">Save Order</string> <string name="punctuation_order_save">Save Order</string>
<string name="punctuation_order_save_error">Failed saving the character order.</string> <string name="punctuation_order_save_error">Failed saving the character order.</string>
<string name="punctuation_order_sentence">1-key Character Order</string> <string name="punctuation_order_key_1">1-key Character Order</string>
<string name="punctuation_order_special">0-key Character Order</string> <string name="punctuation_order_key_0">0-key Character Order</string>
<string name="punctuation_order_initial">Initial characters</string>
<string name="punctuation_order_group">Grouped characters (optional)</string>
<string name="punctuation_order_after_group">After the group (optional)</string>
<string name="setup_keyboard_status">Status</string> <string name="setup_keyboard_status">Status</string>
<string name="setup_default_keyboard">Select Default Keyboard</string> <string name="setup_default_keyboard">Select Default Keyboard</string>

View file

@ -5,20 +5,45 @@
android:key="punctuation_order_language" android:key="punctuation_order_language"
android:title="@string/language" /> android:title="@string/language" />
<io.github.sspanak.tt9.preferences.screens.punctuation.PreferenceChars1 <PreferenceCategory
android:key="punctuation_order_sentence" android:title="@string/punctuation_order_key_1">
android:title="@string/punctuation_order_sentence" /> <io.github.sspanak.tt9.preferences.screens.punctuation.PreferenceChars1
android:key="punctuation_order_sentence"
android:title="@string/punctuation_order_initial" />
<io.github.sspanak.tt9.preferences.screens.punctuation.PreferenceChars0 <io.github.sspanak.tt9.preferences.screens.punctuation.PreferenceCharsExtra
android:key="punctuation_order_special_chars" android:key="punctuation_order_key_1_group"
android:title="@string/punctuation_order_special"/> android:title="@string/punctuation_order_group"/>
<Preference <io.github.sspanak.tt9.preferences.screens.punctuation.PreferenceCharsExtra
android:key="punctuation_order_reset_defaults" android:key="punctuation_order_key_1_after_group"
android:title="@string/restore_default_order" /> android:title="@string/punctuation_order_after_group"/>
</PreferenceCategory>
<Preference
android:key="punctuation_order_save" <PreferenceCategory
android:title="@string/punctuation_order_save" /> android:title="@string/punctuation_order_key_0">
<io.github.sspanak.tt9.preferences.screens.punctuation.PreferenceChars0
android:key="punctuation_order_special_chars"
android:title="@string/punctuation_order_initial"/>
<io.github.sspanak.tt9.preferences.screens.punctuation.PreferenceCharsExtra
android:key="punctuation_order_key_0_group"
android:title="@string/punctuation_order_group"/>
<io.github.sspanak.tt9.preferences.screens.punctuation.PreferenceCharsExtra
android:key="punctuation_order_key_0_after_group"
android:title="@string/punctuation_order_after_group"/>
</PreferenceCategory>
<PreferenceCategory>
<Preference
android:key="punctuation_order_reset_defaults"
android:title="@string/restore_default_order" />
<Preference
android:key="punctuation_order_save"
android:title="@string/punctuation_order_save" />
</PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>