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 26ad2bb0..987f008c 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 @@ -217,27 +217,26 @@ abstract public class CommandHandler extends TextEditingHandler { return false; } - // When there are no suggestions, there is no need to execute the code below for adjusting their text case. - if (mInputMode.getSuggestions().isEmpty()) { + // if there are no suggestions or they are special chars, we don't need to adjust their text case + final String before = suggestionOps.getCurrent(); + boolean beforeStartsWithLetter = !before.isEmpty() && Character.isAlphabetic(before.charAt(0)); + if (!beforeStartsWithLetter) { settings.saveTextCase(mInputMode.getTextCase()); return true; } // When we are in AUTO mode and current dictionary word is in uppercase, // the mode would switch to UPPERCASE, but visually, the word would not change. - // This is why we retry, until there is a visual change. - String before = suggestionOps.get(0); - boolean beforeStartsWithLetter = !before.isEmpty() && Character.isAlphabetic(before.charAt(0)); - for (int retries = 0; beforeStartsWithLetter && retries < 2 && mInputMode.nextTextCase(); retries++) { - String after = mInputMode.getSuggestions().get(0); - if (!after.equals(before)) { + // This is why we retry using the code below, until there is a visual change. + int currentSuggestionIndex = suggestionOps.getCurrentIndex(); + currentSuggestionIndex = suggestionOps.containsStem() ? currentSuggestionIndex - 1 : currentSuggestionIndex; + + for (int retries = 0; retries <= 2; retries++) { + if (!before.equals(mInputMode.getSuggestions().get(currentSuggestionIndex)) || !mInputMode.nextTextCase()) { break; } } - int currentSuggestionIndex = suggestionOps.getCurrentIndex(); - currentSuggestionIndex = suggestionOps.containsStem() ? currentSuggestionIndex - 1 : currentSuggestionIndex; - suggestionOps.set(mInputMode.getSuggestions(), currentSuggestionIndex, mInputMode.containsGeneratedSuggestions()); textField.setComposingText(suggestionOps.getCurrent()); diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java index 1c10af29..622eb014 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java @@ -150,11 +150,14 @@ public abstract class TypingHandler extends KeyPadHandler { mInputMode.reset(); } + setStatusIcon(mInputMode, mLanguage); + if (!mainView.isTextEditingPaletteShown() && !mainView.isCommandPaletteShown()) { statusBar.setText(mInputMode); } } + // this updates Shift and Filter, so we can't do it only when recomposing if (settings.isMainLayoutNumpad()) { mainView.renderKeys(); } @@ -190,14 +193,11 @@ public abstract class TypingHandler extends KeyPadHandler { String lastWord = suggestionOps.acceptIncompleteAndKeepList(); mInputMode.onAcceptSuggestion(lastWord); autoCorrectSpace(lastWord, false, key); - if (settings.isMainLayoutNumpad()) { - mainView.renderKeys(); - } } // Auto-adjust the text case before each word, if the InputMode supports it. if (mInputMode.getSuggestions().isEmpty()) { - mInputMode.determineNextWordTextCase(); + mInputMode.determineNextWordTextCase(key); } if (!mInputMode.onNumber(key, hold, repeat)) { @@ -379,7 +379,7 @@ public abstract class TypingHandler extends KeyPadHandler { protected void onAcceptSuggestionAutomatically(String word) { mInputMode.onAcceptSuggestion(word, true); autoCorrectSpace(word, false, mInputMode.getSequence().isEmpty() ? -1 : mInputMode.getSequence().charAt(0) - '0'); - mInputMode.determineNextWordTextCase(); + mInputMode.determineNextWordTextCase(-1); if (settings.isMainLayoutNumpad()) { mainView.renderKeys(); } @@ -444,6 +444,11 @@ public abstract class TypingHandler extends KeyPadHandler { String trimmedWord = suggestionOps.getCurrent(mLanguage, mInputMode.getSequenceLength()); appHacks.setComposingTextWithHighlightedStem(trimmedWord, mInputMode); + setStatusIcon(mInputMode, mLanguage); + if (settings.isMainLayoutNumpad()) { + mainView.renderKeys(); + } + forceShowWindow(); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/UiHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/UiHandler.java index 1ae729c5..20cdaf01 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/UiHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/UiHandler.java @@ -8,6 +8,7 @@ import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.ui.StatusIcon; import io.github.sspanak.tt9.ui.main.ResizableMainView; import io.github.sspanak.tt9.ui.tray.StatusBar; +import io.github.sspanak.tt9.util.Text; import io.github.sspanak.tt9.util.sys.DeviceInfo; import io.github.sspanak.tt9.util.sys.SystemSettings; @@ -55,8 +56,23 @@ abstract class UiHandler extends AbstractHandler { } + public int getDisplayTextCase(Language language, int modeTextCase) { + boolean hasUpperCase = language != null && language.hasUpperCase(); + if (!hasUpperCase) { + return InputMode.CASE_UNDEFINED; + } + + if (modeTextCase == InputMode.CASE_UPPER) { + return InputMode.CASE_UPPER; + } + + int wordTextCase = new Text(language, getSuggestionOps().getCurrent()).getTextCase(); + return wordTextCase == InputMode.CASE_UPPER ? InputMode.CASE_CAPITALIZE : wordTextCase; + } + + protected void setStatusIcon(InputMode mode, Language language) { - int resId = new StatusIcon(settings, mode, language).resourceId; + int resId = new StatusIcon(settings, mode, language, getDisplayTextCase(language, mode.getTextCase())).resourceId; if (resId == 0) { hideStatusIcon(); } else { 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 6f7a8e61..8d5e2601 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 @@ -198,7 +198,7 @@ abstract public class InputMode { return true; } - public void determineNextWordTextCase() {} + public void determineNextWordTextCase(int nextDigit) {} // Based on the internal logic of the mode (punctuation or grammar rules), re-adjust the text case for when getSuggestions() is called. protected String adjustSuggestionTextCase(String word, int newTextCase) { return word; } 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 6dd7f8bb..269238b5 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 @@ -29,7 +29,7 @@ public class ModeIdeograms extends ModeWords { @Override protected String adjustSuggestionTextCase(String word, int newTextCase) { return word; } - @Override public void determineNextWordTextCase() {} + @Override public void determineNextWordTextCase(int nextDigit) {} @Override public boolean nextTextCase() { return false; } 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 c13d8081..72664b1a 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 @@ -39,8 +39,8 @@ class ModeWords extends ModeCheonjiin { protected ModeWords(SettingsStore settings, Language lang, InputType inputType, TextField textField) { super(settings, inputType, textField); - autoTextCase = new AutoTextCase(settings, inputType); seq = new Sequences(); + autoTextCase = new AutoTextCase(settings, seq, inputType); setLanguage(lang); defaultTextCase(); @@ -343,8 +343,8 @@ class ModeWords extends ModeCheonjiin { } @Override - public void determineNextWordTextCase() { - textCase = autoTextCase.determineNextWordTextCase(textCase, textFieldTextCase, textField.getStringBeforeCursor(), digitSequence); + public void determineNextWordTextCase(int nextDigit) { + textCase = autoTextCase.determineNextWordTextCase(language, textCase, textFieldTextCase, textField.getStringBeforeCursor(), digitSequence + nextDigit); } private void determineTextFieldTextCase() { diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/AutoTextCase.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/AutoTextCase.java index 7dc9476a..96cd297a 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/AutoTextCase.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/AutoTextCase.java @@ -5,15 +5,18 @@ import androidx.annotation.Nullable; import io.github.sspanak.tt9.hacks.InputType; import io.github.sspanak.tt9.ime.modes.InputMode; +import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.util.Text; public class AutoTextCase { + @NonNull private final Sequences sequences; @NonNull private final SettingsStore settings; private final boolean isUs; - public AutoTextCase(@NonNull SettingsStore settingsStore, @Nullable InputType inputType) { + public AutoTextCase(@NonNull SettingsStore settingsStore, @NonNull Sequences sequences, @Nullable InputType inputType) { + this.sequences = sequences; settings = settingsStore; isUs = inputType != null && inputType.isUs(); } @@ -44,7 +47,7 @@ public class AutoTextCase { * For example, this function will return CASE_LOWER by default, but CASE_UPPER at the beginning * of a sentence. */ - public int determineNextWordTextCase(int currentTextCase, int textFieldTextCase, String beforeCursor, String digitSequence) { + public int determineNextWordTextCase(Language language, int currentTextCase, int textFieldTextCase, String beforeCursor, String digitSequence) { if ( // When the setting is off, don't do any changes. !settings.getAutoTextCase() @@ -56,7 +59,6 @@ public class AutoTextCase { return currentTextCase; } - if (textFieldTextCase != InputMode.CASE_UNDEFINED) { return textFieldTextCase; } @@ -77,10 +79,8 @@ public class AutoTextCase { return InputMode.CASE_CAPITALIZE; } - // This is mostly for English "I", inserted in the middle of a word. However, we don't want to - // enforce lowercase for words like "-ROM" in "CD-ROM". We have to use the digitSequence here, - // because the composing text is not yet set in some cases, when this is called. - if (Text.isNextToWord(beforeCursor) && !digitSequence.startsWith("1")) { + // Prevent English "I", inserted in the middle of a word, from being uppercase. + if (sequences.isEnglishI(language, digitSequence) && Text.isNextToWord(beforeCursor)) { return InputMode.CASE_LOWER; } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/Sequences.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/Sequences.java index 9aaca878..4109cabf 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/Sequences.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/helpers/Sequences.java @@ -3,6 +3,9 @@ package io.github.sspanak.tt9.ime.modes.helpers; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import io.github.sspanak.tt9.languages.Language; +import io.github.sspanak.tt9.languages.LanguageKind; + public class Sequences { public static final int CHARS_0_KEY = 0; public static final int CHARS_0_CODE = CHARS_0_KEY + '0'; @@ -73,4 +76,8 @@ public class Sequences { || sequence.startsWith(CHARS_GROUP_0_SEQUENCE) || sequence.startsWith(CHARS_GROUP_1_SEQUENCE); } + + public boolean isEnglishI(@Nullable Language language, @NonNull String digitSequence) { + return LanguageKind.isEnglish(language) && digitSequence.equals("4"); + } } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/StatusIcon.java b/app/src/main/java/io/github/sspanak/tt9/ui/StatusIcon.java index fc34cea4..aa31ff49 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/StatusIcon.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/StatusIcon.java @@ -15,11 +15,11 @@ public class StatusIcon { public final int resourceId; - public StatusIcon(@Nullable SettingsStore settings, @Nullable InputMode mode, @Nullable Language language) { + public StatusIcon(@Nullable SettingsStore settings, @Nullable InputMode mode, @Nullable Language language, int textCase) { if (ICONS.isEmpty()) { generateIconsCache(); } - resourceId = resolveResourcePerMode(settings, mode, language); + resourceId = resolveResourcePerMode(settings, mode, language, textCase); } @@ -31,7 +31,7 @@ public class StatusIcon { private void generateIconsCache() { ICONS.put("ic_lang_alefbet", R.drawable.ic_lang_alefbet);ICONS.put("ic_lang_alfabeta_lo", R.drawable.ic_lang_alfabeta_lo);ICONS.put("ic_lang_alfabeta_up", R.drawable.ic_lang_alfabeta_up);ICONS.put("ic_lang_alifba", R.drawable.ic_lang_alifba);ICONS.put("ic_lang_ar", R.drawable.ic_lang_ar);ICONS.put("ic_lang_bg_cp", R.drawable.ic_lang_bg_cp);ICONS.put("ic_lang_bg_lo", R.drawable.ic_lang_bg_lo);ICONS.put("ic_lang_bg_up", R.drawable.ic_lang_bg_up);ICONS.put("ic_lang_br_cp", R.drawable.ic_lang_br_cp);ICONS.put("ic_lang_br_lo", R.drawable.ic_lang_br_lo);ICONS.put("ic_lang_br_up", R.drawable.ic_lang_br_up);ICONS.put("ic_lang_ca_cp", R.drawable.ic_lang_ca_cp);ICONS.put("ic_lang_ca_lo", R.drawable.ic_lang_ca_lo);ICONS.put("ic_lang_ca_up", R.drawable.ic_lang_ca_up);ICONS.put("ic_lang_cyrillic_lo", R.drawable.ic_lang_cyrillic_lo);ICONS.put("ic_lang_cyrillic_up", R.drawable.ic_lang_cyrillic_up);ICONS.put("ic_lang_cz_cp", R.drawable.ic_lang_cz_cp);ICONS.put("ic_lang_cz_lo", R.drawable.ic_lang_cz_lo);ICONS.put("ic_lang_cz_up", R.drawable.ic_lang_cz_up);ICONS.put("ic_lang_da_cp", R.drawable.ic_lang_da_cp);ICONS.put("ic_lang_da_lo", R.drawable.ic_lang_da_lo);ICONS.put("ic_lang_da_up", R.drawable.ic_lang_da_up);ICONS.put("ic_lang_de_cp", R.drawable.ic_lang_de_cp);ICONS.put("ic_lang_de_lo", R.drawable.ic_lang_de_lo);ICONS.put("ic_lang_de_up", R.drawable.ic_lang_de_up);ICONS.put("ic_lang_el_cp", R.drawable.ic_lang_el_cp);ICONS.put("ic_lang_el_lo", R.drawable.ic_lang_el_lo);ICONS.put("ic_lang_el_up", R.drawable.ic_lang_el_up);ICONS.put("ic_lang_en_cp", R.drawable.ic_lang_en_cp);ICONS.put("ic_lang_en_lo", R.drawable.ic_lang_en_lo);ICONS.put("ic_lang_en_up", R.drawable.ic_lang_en_up);ICONS.put("ic_lang_es_cp", R.drawable.ic_lang_es_cp);ICONS.put("ic_lang_es_lo", R.drawable.ic_lang_es_lo);ICONS.put("ic_lang_es_up", R.drawable.ic_lang_es_up);ICONS.put("ic_lang_et_cp", R.drawable.ic_lang_et_cp);ICONS.put("ic_lang_et_lo", R.drawable.ic_lang_et_lo);ICONS.put("ic_lang_et_up", R.drawable.ic_lang_et_up);ICONS.put("ic_lang_fa", R.drawable.ic_lang_fa);ICONS.put("ic_lang_fr_cp", R.drawable.ic_lang_fr_cp);ICONS.put("ic_lang_fr_lo", R.drawable.ic_lang_fr_lo);ICONS.put("ic_lang_fr_up", R.drawable.ic_lang_fr_up);ICONS.put("ic_lang_ga_cp", R.drawable.ic_lang_ga_cp);ICONS.put("ic_lang_ga_lo", R.drawable.ic_lang_ga_lo);ICONS.put("ic_lang_ga_up", R.drawable.ic_lang_ga_up);ICONS.put("ic_lang_gu", R.drawable.ic_lang_gu);ICONS.put("ic_lang_gu_abc", R.drawable.ic_lang_gu_abc);ICONS.put("ic_lang_he", R.drawable.ic_lang_he);ICONS.put("ic_lang_hi", R.drawable.ic_lang_hi);ICONS.put("ic_lang_hi_abc", R.drawable.ic_lang_hi_abc);ICONS.put("ic_lang_hn_cp", R.drawable.ic_lang_hn_cp);ICONS.put("ic_lang_hn_lo", R.drawable.ic_lang_hn_lo);ICONS.put("ic_lang_hn_up", R.drawable.ic_lang_hn_up);ICONS.put("ic_lang_hr_cp", R.drawable.ic_lang_hr_cp);ICONS.put("ic_lang_hr_lo", R.drawable.ic_lang_hr_lo);ICONS.put("ic_lang_hr_up", R.drawable.ic_lang_hr_up);ICONS.put("ic_lang_id_cp", R.drawable.ic_lang_id_cp);ICONS.put("ic_lang_id_lo", R.drawable.ic_lang_id_lo);ICONS.put("ic_lang_id_up", R.drawable.ic_lang_id_up);ICONS.put("ic_lang_it_cp", R.drawable.ic_lang_it_cp);ICONS.put("ic_lang_it_lo", R.drawable.ic_lang_it_lo);ICONS.put("ic_lang_it_up", R.drawable.ic_lang_it_up);ICONS.put("ic_lang_ji", R.drawable.ic_lang_ji);ICONS.put("ic_lang_kanji", R.drawable.ic_lang_kanji);ICONS.put("ic_lang_ko", R.drawable.ic_lang_ko);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_lt_cp", R.drawable.ic_lang_lt_cp);ICONS.put("ic_lang_lt_lo", R.drawable.ic_lang_lt_lo);ICONS.put("ic_lang_lt_up", R.drawable.ic_lang_lt_up);ICONS.put("ic_lang_lv_cp", R.drawable.ic_lang_lv_cp);ICONS.put("ic_lang_lv_lo", R.drawable.ic_lang_lv_lo);ICONS.put("ic_lang_lv_up", R.drawable.ic_lang_lv_up);ICONS.put("ic_lang_mg_cp", R.drawable.ic_lang_mg_cp);ICONS.put("ic_lang_mg_lo", R.drawable.ic_lang_mg_lo);ICONS.put("ic_lang_mg_up", R.drawable.ic_lang_mg_up);ICONS.put("ic_lang_nl_cp", R.drawable.ic_lang_nl_cp);ICONS.put("ic_lang_nl_lo", R.drawable.ic_lang_nl_lo);ICONS.put("ic_lang_nl_up", R.drawable.ic_lang_nl_up);ICONS.put("ic_lang_no_cp", R.drawable.ic_lang_no_cp);ICONS.put("ic_lang_no_lo", R.drawable.ic_lang_no_lo);ICONS.put("ic_lang_no_up", R.drawable.ic_lang_no_up);ICONS.put("ic_lang_pl_cp", R.drawable.ic_lang_pl_cp);ICONS.put("ic_lang_pl_lo", R.drawable.ic_lang_pl_lo);ICONS.put("ic_lang_pl_up", R.drawable.ic_lang_pl_up);ICONS.put("ic_lang_pt_cp", R.drawable.ic_lang_pt_cp);ICONS.put("ic_lang_pt_lo", R.drawable.ic_lang_pt_lo);ICONS.put("ic_lang_pt_up", R.drawable.ic_lang_pt_up);ICONS.put("ic_lang_ro_cp", R.drawable.ic_lang_ro_cp);ICONS.put("ic_lang_ro_lo", R.drawable.ic_lang_ro_lo);ICONS.put("ic_lang_ro_up", R.drawable.ic_lang_ro_up);ICONS.put("ic_lang_ru_cp", R.drawable.ic_lang_ru_cp);ICONS.put("ic_lang_ru_lo", R.drawable.ic_lang_ru_lo);ICONS.put("ic_lang_ru_up", R.drawable.ic_lang_ru_up);ICONS.put("ic_lang_sl_cp", R.drawable.ic_lang_sl_cp);ICONS.put("ic_lang_sl_lo", R.drawable.ic_lang_sl_lo);ICONS.put("ic_lang_sl_up", R.drawable.ic_lang_sl_up);ICONS.put("ic_lang_su_cp", R.drawable.ic_lang_su_cp);ICONS.put("ic_lang_su_lo", R.drawable.ic_lang_su_lo);ICONS.put("ic_lang_su_up", R.drawable.ic_lang_su_up);ICONS.put("ic_lang_sv_cp", R.drawable.ic_lang_sv_cp);ICONS.put("ic_lang_sv_lo", R.drawable.ic_lang_sv_lo);ICONS.put("ic_lang_sv_up", R.drawable.ic_lang_sv_up);ICONS.put("ic_lang_sw_cp", R.drawable.ic_lang_sw_cp);ICONS.put("ic_lang_sw_lo", R.drawable.ic_lang_sw_lo);ICONS.put("ic_lang_sw_up", R.drawable.ic_lang_sw_up);ICONS.put("ic_lang_th", R.drawable.ic_lang_th);ICONS.put("ic_lang_th_abc", R.drawable.ic_lang_th_abc);ICONS.put("ic_lang_tifinagh", R.drawable.ic_lang_tifinagh);ICONS.put("ic_lang_tm_cp", R.drawable.ic_lang_tm_cp);ICONS.put("ic_lang_tm_lo", R.drawable.ic_lang_tm_lo);ICONS.put("ic_lang_tm_tifinagh", R.drawable.ic_lang_tm_tifinagh);ICONS.put("ic_lang_tm_up", R.drawable.ic_lang_tm_up);ICONS.put("ic_lang_tr_cp", R.drawable.ic_lang_tr_cp);ICONS.put("ic_lang_tr_lo", R.drawable.ic_lang_tr_lo);ICONS.put("ic_lang_tr_up", R.drawable.ic_lang_tr_up);ICONS.put("ic_lang_uk_cp", R.drawable.ic_lang_uk_cp);ICONS.put("ic_lang_uk_lo", R.drawable.ic_lang_uk_lo);ICONS.put("ic_lang_uk_up", R.drawable.ic_lang_uk_up);ICONS.put("ic_lang_vi_cp", R.drawable.ic_lang_vi_cp);ICONS.put("ic_lang_vi_lo", R.drawable.ic_lang_vi_lo);ICONS.put("ic_lang_vi_up", R.drawable.ic_lang_vi_up);ICONS.put("ic_lang_zh_pinyin", R.drawable.ic_lang_zh_pinyin); } - private int resolveResourcePerMode(@Nullable SettingsStore settings, @Nullable InputMode mode, @Nullable Language language) { + private int resolveResourcePerMode(@Nullable SettingsStore settings, @Nullable InputMode mode, @Nullable Language language, int textCase) { if (language == null || mode == null || settings == null || InputModeKind.isPassthrough(mode) || !settings.isStatusIconEnabled()) { return 0; } @@ -43,9 +43,9 @@ public class StatusIcon { } else if (InputModeKind.is123(mode)) { return R.drawable.ic_lang_123; } else if (InputModeKind.isABC(mode)) { - return getResourceId(getResourceName(mode, language), R.drawable.ic_keyboard); + return getResourceId(getResourceName(mode, language, textCase), R.drawable.ic_keyboard); } else if (InputModeKind.isPredictive(mode)) { - return getResourceId(getResourceName(mode, language), R.drawable.ic_keyboard); + return getResourceId(getResourceName(mode, language, textCase), R.drawable.ic_keyboard); } return R.drawable.ic_keyboard; @@ -53,7 +53,7 @@ public class StatusIcon { @Nullable - private String getResourceName(@Nullable InputMode mode, @Nullable Language language) { + private String getResourceName(@Nullable InputMode mode, @Nullable Language language, int textCase) { if (mode == null || language == null) { return null; } @@ -61,7 +61,6 @@ public class StatusIcon { final StringBuilder key = new StringBuilder(); key.append(InputModeKind.isABC(mode) ? language.getIconABC() : language.getIconT9()); - int textCase = language.hasUpperCase() ? mode.getTextCase() : InputMode.CASE_UNDEFINED; switch (textCase) { case InputMode.CASE_UPPER: key.append("_up"); diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyShift.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyShift.java index df0cf58f..cadf0016 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyShift.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyShift.java @@ -20,7 +20,7 @@ public class SoftKeyShift extends BaseSoftKeyWithIcons { } @Override protected int getCentralIcon() { - final int textCase = tt9 != null ? tt9.getTextCase() : InputMode.CASE_UNDEFINED; + final int textCase = tt9 != null ? tt9.getDisplayTextCase(tt9.getLanguage(), tt9.getTextCase()) : InputMode.CASE_UNDEFINED; return switch (textCase) { case InputMode.CASE_CAPITALIZE -> R.drawable.ic_fn_shift_caps; case InputMode.CASE_UPPER -> R.drawable.ic_fn_shift_up;