diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/CommandHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/CommandHandler.java index d4808503..d44e148b 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/CommandHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/CommandHandler.java @@ -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); } 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 a2c68ace..1361becf 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 @@ -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; } 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 0fd4b983..76fa91cb 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 @@ -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); 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 11b15d27..5786a56f 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 @@ -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(); 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 6a6d00ab..9d7b86d8 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 @@ -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); } 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 5468fc76..a51edfbe 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 @@ -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(); diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeIdeograms.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeIdeograms.java index 518372a2..f6c41e04 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeIdeograms.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeIdeograms.java @@ -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); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeKanji.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeKanji.java index 781c5d47..5316f8f1 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeKanji.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModeKanji.java @@ -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 diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModePinyin.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModePinyin.java index d0f0b38f..744e84af 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModePinyin.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModePinyin.java @@ -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); } 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 6c534041..5c11879a 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 @@ -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()) {