1
0
Fork 0

fixed special characters missing in email fields when an East Asian language is selected

This commit is contained in:
sspanak 2025-05-15 16:54:59 +03:00 committed by Dimo Karaivanov
parent a7b4c44913
commit 3dc06e7061
10 changed files with 50 additions and 66 deletions

View file

@ -188,11 +188,9 @@ abstract public class CommandHandler extends TextEditingHandler {
settings.setDefaultCharOrder(mLanguage, false); settings.setDefaultCharOrder(mLanguage, false);
// for languages that do not have ABC or Predictive, make sure we remain in valid state // for languages that do not have ABC or Predictive, make sure we remain in valid state
if (mInputMode.changeLanguage(mLanguage)) { final String digits = mInputMode.getSequence();
mInputMode.clearWordStem(); mInputMode = InputMode.getInstance(settings, mLanguage, inputType, textField, determineInputModeId());
} else { if (InputModeKind.isPredictive(mInputMode)) {
final String digits = mInputMode.getSequence();
mInputMode = InputMode.getInstance(settings, mLanguage, inputType, textField, determineInputModeId());
mInputMode.setSequence(digits); mInputMode.setSequence(digits);
} }

View file

@ -145,13 +145,9 @@ abstract public class InputMode {
* The default implementation is to switch to the new language (including NullLanguage) and * The default implementation is to switch to the new language (including NullLanguage) and
* return "true". * return "true".
*/ */
public boolean changeLanguage(@Nullable Language newLanguage) { protected boolean setLanguage(@Nullable Language newLanguage) {
setLanguage(newLanguage);
return true;
}
protected void setLanguage(@Nullable Language newLanguage) {
language = newLanguage != null ? newLanguage : new NullLanguage(); language = newLanguage != null ? newLanguage : new NullLanguage();
return true;
} }

View file

@ -24,7 +24,7 @@ class Mode123 extends ModePassthrough {
protected Mode123(SettingsStore settings, Language language, InputType inputType) { protected Mode123(SettingsStore settings, Language language, InputType inputType) {
super(settings, inputType); super(settings, inputType);
changeLanguage(language); setLanguage(language);
if (inputType.isPhoneNumber()) { if (inputType.isPhoneNumber()) {
setSpecificSpecialCharacters(Characters.Phone, false); setSpecificSpecialCharacters(Characters.Phone, false);

View file

@ -7,6 +7,7 @@ import java.util.ArrayList;
import io.github.sspanak.tt9.hacks.InputType; import io.github.sspanak.tt9.hacks.InputType;
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.LanguageKind; import io.github.sspanak.tt9.languages.LanguageKind;
import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.preferences.settings.SettingsStore;
import io.github.sspanak.tt9.util.chars.Characters; import io.github.sspanak.tt9.util.chars.Characters;
@ -20,7 +21,7 @@ class ModeABC extends InputMode {
protected ModeABC(SettingsStore settings, Language lang, InputType inputType) { protected ModeABC(SettingsStore settings, Language lang, InputType inputType) {
super(settings, inputType); super(settings, inputType);
changeLanguage(lang); setLanguage(lang);
} }
@Override @Override
@ -70,12 +71,12 @@ class ModeABC extends InputMode {
} }
@Override @Override
public boolean changeLanguage(@Nullable Language newLanguage) { public boolean setLanguage(@Nullable Language newLanguage) {
if (newLanguage != null && !newLanguage.hasABC()) { if (newLanguage != null && !newLanguage.hasABC()) {
return false; return false;
} }
setLanguage(newLanguage); super.setLanguage(newLanguage);
allowedTextCases.clear(); allowedTextCases.clear();
allowedTextCases.add(CASE_LOWER); allowedTextCases.add(CASE_LOWER);
@ -85,8 +86,10 @@ class ModeABC extends InputMode {
KEY_CHARACTERS.clear(); KEY_CHARACTERS.clear();
if (isEmailMode) { if (isEmailMode) {
KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(0), settings.getOrderedKeyChars(language, 0), true)); // Asian punctuation can not be used in email addresses, so we need to use the English locale.
KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(1), settings.getOrderedKeyChars(language, 1), true)); Language lang = LanguageKind.isCJK(language) ? LanguageCollection.getByLocale("en") : language;
KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(0), settings.getOrderedKeyChars(lang, 0), true));
KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(1), settings.getOrderedKeyChars(lang, 1), true));
} }
refreshSuggestions(); refreshSuggestions();

View file

@ -21,13 +21,8 @@ public class ModeBopomofo extends ModePinyin {
@Override @Override
public boolean changeLanguage(@Nullable Language newLanguage) { public boolean validateLanguage(@Nullable Language newLanguage) {
if (LanguageKind.isChineseBopomofo(newLanguage)) { return LanguageKind.isChineseBopomofo(newLanguage);
setLanguage(newLanguage);
return true;
}
return false;
} }

View file

@ -73,18 +73,31 @@ class ModeCheonjiin extends InputMode {
@Override @Override
protected void setLanguage(@Nullable Language newLanguage) { protected boolean setLanguage(@Nullable Language newLanguage) {
if (!validateLanguage(newLanguage)) {
return false;
}
super.setLanguage(newLanguage); super.setLanguage(newLanguage);
autoSpace.setLanguage(language); autoSpace.setLanguage(language);
KEY_CHARACTERS.clear(); KEY_CHARACTERS.clear();
if (isEmailMode) { if (isEmailMode) {
KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(0), settings.getOrderedKeyChars(language, 0), true)); // Asian punctuation can not be used in email addresses, so we need to use the English locale.
KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(1), settings.getOrderedKeyChars(language, 1), true)); Language lang = LanguageKind.isCJK(language) ? LanguageCollection.getByLocale("en") : language;
KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(0), settings.getOrderedKeyChars(lang, 0), true));
KEY_CHARACTERS.add(Characters.orderByList(Characters.Email.get(1), settings.getOrderedKeyChars(lang, 1), true));
} else { } else {
setCustomSpecialCharacters(); setCustomSpecialCharacters();
} }
return true;
}
protected boolean validateLanguage(Language newLanguage) {
return LanguageKind.isKorean(newLanguage);
} }
@ -179,12 +192,6 @@ class ModeCheonjiin extends InputMode {
} }
@Override
public boolean changeLanguage(@Nullable Language newLanguage) {
return LanguageKind.isKorean(newLanguage);
}
@Override @Override
public void reset() { public void reset() {
basicReset(); basicReset();

View file

@ -34,13 +34,8 @@ public class ModeIdeograms extends ModeWords {
@Override @Override
public boolean changeLanguage(@Nullable Language newLanguage) { public boolean validateLanguage(@Nullable Language newLanguage) {
if (newLanguage != null && !newLanguage.isTranscribed() || LanguageKind.isKorean(newLanguage)) { return newLanguage != null && newLanguage.isTranscribed() && !LanguageKind.isKorean(newLanguage);
return false;
}
setLanguage(newLanguage);
return true;
} }

View file

@ -15,13 +15,8 @@ public class ModeKanji extends ModePinyin {
} }
@Override @Override
public boolean changeLanguage(@Nullable Language newLanguage) { public boolean validateLanguage(@Nullable Language newLanguage) {
if (LanguageKind.isJapanese(newLanguage)) { return LanguageKind.isJapanese(newLanguage);
setLanguage(newLanguage);
return true;
}
return false;
} }
@Override @Override

View file

@ -20,13 +20,8 @@ public class ModePinyin extends ModeIdeograms {
@Override @Override
public boolean changeLanguage(@Nullable Language newLanguage) { public boolean validateLanguage(@Nullable Language newLanguage) {
if (LanguageKind.isChinesePinyin(newLanguage)) { return LanguageKind.isChinesePinyin(newLanguage);
setLanguage(newLanguage);
return true;
}
return false;
} }

View file

@ -42,7 +42,7 @@ class ModeWords extends ModeCheonjiin {
autoTextCase = new AutoTextCase(settings, inputType); autoTextCase = new AutoTextCase(settings, inputType);
seq = new Sequences(); seq = new Sequences();
changeLanguage(lang); setLanguage(lang);
defaultTextCase(); defaultTextCase();
determineTextFieldTextCase(); determineTextFieldTextCase();
} }
@ -99,28 +99,28 @@ class ModeWords extends ModeCheonjiin {
@Override @Override
public boolean changeLanguage(@Nullable Language newLanguage) { protected boolean setLanguage(@Nullable Language newLanguage) {
if (newLanguage != null && newLanguage.isTranscribed()) { if (!super.setLanguage(newLanguage)) {
return false; return false;
} }
setLanguage(newLanguage);
return true;
}
@Override
protected void setLanguage(@Nullable Language newLanguage) {
super.setLanguage(newLanguage);
allowedTextCases.clear(); allowedTextCases.clear();
allowedTextCases.add(CASE_LOWER); allowedTextCases.add(CASE_LOWER);
if (language.hasUpperCase()) { if (language.hasUpperCase()) {
allowedTextCases.add(CASE_CAPITALIZE); allowedTextCases.add(CASE_CAPITALIZE);
allowedTextCases.add(CASE_UPPER); allowedTextCases.add(CASE_UPPER);
} }
return true;
} }
@Override
public boolean validateLanguage(@Nullable Language newLanguage) {
return newLanguage != null && !newLanguage.isTranscribed();
}
@Override @Override
public String recompose() { public String recompose() {
if (!language.hasSpaceBetweenWords() || language.isTranscribed()) { if (!language.hasSpaceBetweenWords() || language.isTranscribed()) {