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);
// for languages that do not have ABC or Predictive, make sure we remain in valid state
if (mInputMode.changeLanguage(mLanguage)) {
mInputMode.clearWordStem();
} else {
final String digits = mInputMode.getSequence();
mInputMode = InputMode.getInstance(settings, mLanguage, inputType, textField, determineInputModeId());
final String digits = mInputMode.getSequence();
mInputMode = InputMode.getInstance(settings, mLanguage, inputType, textField, determineInputModeId());
if (InputModeKind.isPredictive(mInputMode)) {
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
* return "true".
*/
public boolean changeLanguage(@Nullable Language newLanguage) {
setLanguage(newLanguage);
return true;
}
protected void setLanguage(@Nullable Language newLanguage) {
protected boolean setLanguage(@Nullable Language newLanguage) {
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) {
super(settings, inputType);
changeLanguage(language);
setLanguage(language);
if (inputType.isPhoneNumber()) {
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.languages.Language;
import io.github.sspanak.tt9.languages.LanguageCollection;
import io.github.sspanak.tt9.languages.LanguageKind;
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
import io.github.sspanak.tt9.util.chars.Characters;
@ -20,7 +21,7 @@ class ModeABC extends InputMode {
protected ModeABC(SettingsStore settings, Language lang, InputType inputType) {
super(settings, inputType);
changeLanguage(lang);
setLanguage(lang);
}
@Override
@ -70,12 +71,12 @@ class ModeABC extends InputMode {
}
@Override
public boolean changeLanguage(@Nullable Language newLanguage) {
public boolean setLanguage(@Nullable Language newLanguage) {
if (newLanguage != null && !newLanguage.hasABC()) {
return false;
}
setLanguage(newLanguage);
super.setLanguage(newLanguage);
allowedTextCases.clear();
allowedTextCases.add(CASE_LOWER);
@ -85,8 +86,10 @@ class ModeABC extends InputMode {
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));
// Asian punctuation can not be used in email addresses, so we need to use the English locale.
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();

View file

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

View file

@ -73,18 +73,31 @@ class ModeCheonjiin extends InputMode {
@Override
protected void setLanguage(@Nullable Language newLanguage) {
protected boolean setLanguage(@Nullable Language newLanguage) {
if (!validateLanguage(newLanguage)) {
return false;
}
super.setLanguage(newLanguage);
autoSpace.setLanguage(language);
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));
// Asian punctuation can not be used in email addresses, so we need to use the English locale.
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 {
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
public void reset() {
basicReset();

View file

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

View file

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

View file

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

View file

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