1
0
Fork 0

fixed invalid special characters being suggestested in email fields

This commit is contained in:
sspanak 2024-07-16 17:42:33 +03:00 committed by Dimo Karaivanov
parent 768efb6ada
commit a955cbcb54
5 changed files with 87 additions and 37 deletions

View file

@ -39,9 +39,9 @@ abstract public class InputMode {
public static InputMode getInstance(SettingsStore settings, Language language, InputType inputType, int mode) { public static InputMode getInstance(SettingsStore settings, Language language, InputType inputType, int mode) {
switch (mode) { switch (mode) {
case MODE_PREDICTIVE: case MODE_PREDICTIVE:
return new ModePredictive(settings, language); return new ModePredictive(settings, inputType, language);
case MODE_ABC: case MODE_ABC:
return new ModeABC(settings, language); return new ModeABC(settings, inputType, language);
case MODE_PASSTHROUGH: case MODE_PASSTHROUGH:
return new ModePassthrough(); return new ModePassthrough();
default: default:

View file

@ -3,7 +3,6 @@ package io.github.sspanak.tt9.ime.modes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import io.github.sspanak.tt9.hacks.InputType; import io.github.sspanak.tt9.hacks.InputType;
@ -21,50 +20,39 @@ public class Mode123 extends ModePassthrough {
@Override public boolean shouldAcceptPreviousSuggestion(int nextKey) { return true; } @Override public boolean shouldAcceptPreviousSuggestion(int nextKey) { return true; }
private final ArrayList<ArrayList<String>> KEY_CHARACTERS = new ArrayList<>(); private final ArrayList<ArrayList<String>> KEY_CHARACTERS = new ArrayList<>();
private final boolean isEmailMode;
public Mode123(InputType inputType, Language language) { public Mode123(InputType inputType, Language language) {
this.language = language; this.language = language;
isEmailMode = inputType.isEmail();
if (inputType.isPhoneNumber()) { if (inputType.isPhoneNumber()) {
getPhoneSpecialCharacters(); setSpecificSpecialCharacters(Characters.Phone);
} else if (inputType.isNumeric()) { } else if (inputType.isNumeric()) {
getNumberSpecialCharacters(inputType.isDecimal(), inputType.isSignedNumber()); setSpecificSpecialCharacters(Characters.getNumberSpecialCharacters(inputType.isDecimal(), inputType.isSignedNumber()));
} else if (inputType.isEmail()) {
setSpecificSpecialCharacters(Characters.Email);
} else { } else {
getDefaultSpecialCharacters(); setDefaultSpecialCharacters();
}
}
private void setSpecificSpecialCharacters(ArrayList<ArrayList<String>> chars) {
for (ArrayList<String> group : chars) {
KEY_CHARACTERS.add(new ArrayList<>(group));
} }
} }
/** /**
* getPhoneSpecialCharacters * setDefaultSpecialCharacters
* Special characters for phone number fields, including both characters for conveniently typing a phone number: "()-",
* as well as command characters such as "," = "slight pause" and ";" = "wait" used in Japan and some other countries.
*/
private void getPhoneSpecialCharacters() {
KEY_CHARACTERS.add(new ArrayList<>(Arrays.asList("+", " ")));
KEY_CHARACTERS.add(new ArrayList<>(Arrays.asList("-", "(", ")", ".", ";", ",")));
}
/**
* getNumberSpecialCharacters
* Special characters for all kinds of numeric fields: integer, decimal with +/- included as necessary.
*/
private void getNumberSpecialCharacters(boolean decimal, boolean signed) {
KEY_CHARACTERS.add(signed ? new ArrayList<>(Arrays.asList("-", "+")) : new ArrayList<>());
if (decimal) {
KEY_CHARACTERS.add(new ArrayList<>(Arrays.asList(".", ",")));
}
}
/**
* getDefaultSpecialCharacters
* Special characters for when the user has selected 123 mode in a text field. In this case, we just * Special characters for when the user has selected 123 mode in a text field. In this case, we just
* use the default list, but reorder it a bit for convenience. * use the default list, but reorder it a bit for convenience.
*/ */
private void getDefaultSpecialCharacters() { private void setDefaultSpecialCharacters() {
// 0-key // 0-key
KEY_CHARACTERS.add(new ArrayList<>(Collections.singletonList("+"))); KEY_CHARACTERS.add(new ArrayList<>(Collections.singletonList("+")));
for (String character : Characters.Special) { for (String character : Characters.Special) {
@ -82,8 +70,9 @@ public class Mode123 extends ModePassthrough {
} }
} }
@Override protected boolean nextSpecialCharacters() { @Override protected boolean nextSpecialCharacters() {
return digitSequence.equals(NaturalLanguage.SPECIAL_CHARS_KEY) && super.nextSpecialCharacters(); return !isEmailMode && digitSequence.equals(NaturalLanguage.SPECIAL_CHARS_KEY) && super.nextSpecialCharacters();
} }

View file

@ -2,20 +2,31 @@ package io.github.sspanak.tt9.ime.modes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import java.util.ArrayList;
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.LanguageKind; import io.github.sspanak.tt9.languages.LanguageKind;
import io.github.sspanak.tt9.languages.NaturalLanguage; import io.github.sspanak.tt9.languages.NaturalLanguage;
import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.preferences.settings.SettingsStore;
import io.github.sspanak.tt9.util.Characters;
public class ModeABC extends InputMode { public class ModeABC extends InputMode {
private final ArrayList<ArrayList<String>> KEY_CHARACTERS = new ArrayList<>();
private final SettingsStore settings; private final SettingsStore settings;
private boolean shouldSelectNextLetter = false; private boolean shouldSelectNextLetter = false;
@Override public int getId() { return MODE_ABC; } @Override public int getId() { return MODE_ABC; }
ModeABC(SettingsStore settings, Language lang) { ModeABC(SettingsStore settings, InputType inputType, Language lang) {
this.settings = settings; this.settings = settings;
changeLanguage(lang); changeLanguage(lang);
if (inputType.isEmail()) {
KEY_CHARACTERS.add(new ArrayList<>(Characters.Email.get(0)));
KEY_CHARACTERS.add(new ArrayList<>(Characters.Email.get(1)));
}
} }
@Override @Override
@ -44,7 +55,7 @@ public class ModeABC extends InputMode {
autoAcceptTimeout = settings.getAbcAutoAcceptTimeout(); autoAcceptTimeout = settings.getAbcAutoAcceptTimeout();
digitSequence = String.valueOf(number); digitSequence = String.valueOf(number);
shouldSelectNextLetter = false; shouldSelectNextLetter = false;
suggestions.addAll(language.getKeyCharacters(number)); suggestions.addAll(KEY_CHARACTERS.size() > number ? KEY_CHARACTERS.get(number) : language.getKeyCharacters(number));
suggestions.add(language.getKeyNumber(number)); suggestions.add(language.getKeyNumber(number));
} }
@ -66,7 +77,7 @@ public class ModeABC extends InputMode {
@Override @Override
protected boolean nextSpecialCharacters() { protected boolean nextSpecialCharacters() {
if (digitSequence.equals(NaturalLanguage.SPECIAL_CHARS_KEY) && super.nextSpecialCharacters()) { if (KEY_CHARACTERS.isEmpty() && digitSequence.equals(NaturalLanguage.SPECIAL_CHARS_KEY) && super.nextSpecialCharacters()) {
suggestions.add(language.getKeyNumber(digitSequence.charAt(0) - '0')); suggestions.add(language.getKeyNumber(digitSequence.charAt(0) - '0'));
return true; return true;
} }

View file

@ -15,12 +15,15 @@ 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.languages.NaturalLanguage; import io.github.sspanak.tt9.languages.NaturalLanguage;
import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.preferences.settings.SettingsStore;
import io.github.sspanak.tt9.util.Characters;
import io.github.sspanak.tt9.util.Logger; import io.github.sspanak.tt9.util.Logger;
import io.github.sspanak.tt9.util.Text; import io.github.sspanak.tt9.util.Text;
public class ModePredictive extends InputMode { public class ModePredictive extends InputMode {
private final String LOG_TAG = getClass().getSimpleName(); private final String LOG_TAG = getClass().getSimpleName();
private final ArrayList<ArrayList<String>> KEY_CHARACTERS = new ArrayList<>();
private final SettingsStore settings; private final SettingsStore settings;
public int getId() { return MODE_PREDICTIVE; } public int getId() { return MODE_PREDICTIVE; }
@ -42,7 +45,7 @@ public class ModePredictive extends InputMode {
private boolean isCursorDirectionForward = false; private boolean isCursorDirectionForward = false;
ModePredictive(SettingsStore settings, Language lang) { ModePredictive(SettingsStore settings, InputType inputType, Language lang) {
changeLanguage(lang); changeLanguage(lang);
defaultTextCase(); defaultTextCase();
@ -53,6 +56,11 @@ public class ModePredictive extends InputMode {
this.settings = settings; this.settings = settings;
digitSequence = ""; digitSequence = "";
if (inputType.isEmail()) {
KEY_CHARACTERS.add(new ArrayList<>(Characters.Email.get(0)));
KEY_CHARACTERS.add(new ArrayList<>(Characters.Email.get(1)));
}
} }
@ -250,7 +258,7 @@ public class ModePredictive extends InputMode {
*/ */
private boolean loadStaticSuggestions(Runnable onLoad) { private boolean loadStaticSuggestions(Runnable onLoad) {
if (digitSequence.equals(NaturalLanguage.PUNCTUATION_KEY) || digitSequence.equals(NaturalLanguage.SPECIAL_CHARS_KEY)) { if (digitSequence.equals(NaturalLanguage.PUNCTUATION_KEY) || digitSequence.equals(NaturalLanguage.SPECIAL_CHARS_KEY)) {
super.loadSpecialCharacters(language); loadSpecialCharacters(language);
onLoad.run(); onLoad.run();
return true; return true;
} else if (!digitSequence.equals(EmojiLanguage.CUSTOM_EMOJI_SEQUENCE) && digitSequence.startsWith(EmojiLanguage.EMOJI_SEQUENCE)) { } else if (!digitSequence.equals(EmojiLanguage.CUSTOM_EMOJI_SEQUENCE) && digitSequence.startsWith(EmojiLanguage.EMOJI_SEQUENCE)) {
@ -269,6 +277,19 @@ public class ModePredictive extends InputMode {
} }
@Override
protected boolean loadSpecialCharacters(Language altLanguage) {
int number = digitSequence.charAt(0) - '0';
if (KEY_CHARACTERS.size() > number) {
suggestions.clear();
suggestions.addAll(KEY_CHARACTERS.get(number));
return true;
} else {
return super.loadSpecialCharacters(language);
}
}
/** /**
* onPredictions * onPredictions
* Gets the currently available Predictions and sends them over to the external caller. * Gets the currently available Predictions and sends them over to the external caller.

View file

@ -39,6 +39,35 @@ public class Characters {
" ", "\n", "@", "_", "#", "%", "[", "]", "{", "}", "§", "|", "^", "<", ">", "\\", "/", "=", "*", "+" " ", "\n", "@", "_", "#", "%", "[", "]", "{", "}", "§", "|", "^", "<", ">", "\\", "/", "=", "*", "+"
)); ));
/**
* The English punctuation filtered to contain only valid email characters.
*/
final public static ArrayList<ArrayList<String>> Email = new ArrayList<>(Arrays.asList(
new ArrayList<>(Arrays.asList("@", "_", "#", "%", "{", "}", "|", "^", "/", "=", "*", "+")),
new ArrayList<>(Arrays.asList(".", "-", "&", "~", "`", "'", "!", "?"))
));
/**
* Special characters for phone number fields, including both characters for conveniently typing a phone number: "()-",
* as well as command characters such as "," = "slight pause" and ";" = "wait" used in Japan and some other countries.
*/
final public static ArrayList<ArrayList<String>> Phone = new ArrayList<>(Arrays.asList(
new ArrayList<>(Arrays.asList("+", " ")),
new ArrayList<>(Arrays.asList("-", "(", ")", ".", ";", ","))
));
/**
* Special characters for all kinds of numeric fields: integer, decimal with +/- included as necessary.
*/
public static ArrayList<ArrayList<String>> getNumberSpecialCharacters(boolean decimal, boolean signed) {
ArrayList<ArrayList<String>> keyCharacters = new ArrayList<>();
keyCharacters.add(signed ? new ArrayList<>(Arrays.asList("-", "+")) : new ArrayList<>());
if (decimal) {
keyCharacters.add(new ArrayList<>(Arrays.asList(".", ",")));
}
return keyCharacters;
}
final private static ArrayList<String> TextEmoticons = new ArrayList<>(Arrays.asList( final private static ArrayList<String> TextEmoticons = new ArrayList<>(Arrays.asList(
":)", ":D", ":P", ";)", "\\m/", ":-O", ":|", ":(" ":)", ":D", ":P", ";)", "\\m/", ":-O", ":|", ":("
)); ));