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 622eb014..8c0641b3 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,18 +150,11 @@ 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(); - } - return true; } 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 20cdaf01..47095176 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 @@ -2,6 +2,8 @@ package io.github.sspanak.tt9.ime; import android.view.inputmethod.InputMethodManager; +import androidx.annotation.Nullable; + import io.github.sspanak.tt9.ime.modes.InputMode; import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.preferences.settings.SettingsStore; @@ -56,7 +58,7 @@ abstract class UiHandler extends AbstractHandler { } - public int getDisplayTextCase(Language language, int modeTextCase) { + public int getDisplayTextCase(@Nullable Language language, int modeTextCase) { boolean hasUpperCase = language != null && language.hasUpperCase(); if (!hasUpperCase) { return InputMode.CASE_UNDEFINED; @@ -66,13 +68,19 @@ abstract class UiHandler extends AbstractHandler { return InputMode.CASE_UPPER; } - int wordTextCase = new Text(language, getSuggestionOps().getCurrent()).getTextCase(); + Text currentWord = new Text(language, getSuggestionOps().getCurrent()); + if (currentWord.isEmpty() || !currentWord.isAlphabetic()) { + return modeTextCase; + } + + int wordTextCase = currentWord.getTextCase(); return wordTextCase == InputMode.CASE_UPPER ? InputMode.CASE_CAPITALIZE : wordTextCase; } - protected void setStatusIcon(InputMode mode, Language language) { - int resId = new StatusIcon(settings, mode, language, getDisplayTextCase(language, mode.getTextCase())).resourceId; + protected void setStatusIcon(@Nullable InputMode mode, @Nullable Language language) { + int displayTextCase = getDisplayTextCase(language, mode != null ? mode.getTextCase() : InputMode.CASE_UNDEFINED); + int resId = new StatusIcon(settings, mode, language, displayTextCase).resourceId; if (resId == 0) { hideStatusIcon(); } else { 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 72664b1a..134d3bd5 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 @@ -355,7 +355,10 @@ class ModeWords extends ModeCheonjiin { @Override public int getTextCase() { // Filter out the internally used text cases. They have no meaning outside this class. - return (textCase == CASE_UPPER || textCase == CASE_LOWER) ? textCase : CASE_CAPITALIZE; + return switch (textCase) { + case CASE_UPPER, CASE_LOWER -> textCase; + default -> seq.isAnySpecialCharSequence(digitSequence) ? CASE_LOWER : CASE_CAPITALIZE; + }; }