fixed special characters missing in email fields when an East Asian language is selected
This commit is contained in:
parent
a7b4c44913
commit
3dc06e7061
10 changed files with 50 additions and 66 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue