From a622aa0d70467033930baa92540f281baf08cd16 Mon Sep 17 00:00:00 2001 From: sspanak Date: Mon, 14 Apr 2025 13:09:33 +0300 Subject: [PATCH] the Korean Space key is now just Space key with the correct behavior in all languages --- .../github/sspanak/tt9/ime/HotkeyHandler.java | 25 +++++++++++-------- .../sspanak/tt9/ime/MainViewHandler.java | 6 ----- .../sspanak/tt9/ime/modes/ModePinyin.java | 4 ++- .../sspanak/tt9/languages/Language.java | 25 +++++++++++++++++++ .../sspanak/tt9/ui/main/MainLayoutNumpad.java | 5 +++- .../sspanak/tt9/ui/main/keys/SoftKey.java | 2 +- app/src/main/res/values-bg/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-iw/strings.xml | 2 +- app/src/main/res/values-lt/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 19 files changed, 61 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java index 25a9e39d..e6f602a4 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java @@ -7,6 +7,7 @@ import io.github.sspanak.tt9.db.words.DictionaryLoader; import io.github.sspanak.tt9.ime.helpers.TextField; import io.github.sspanak.tt9.ime.modes.InputMode; import io.github.sspanak.tt9.ime.modes.InputModeKind; +import io.github.sspanak.tt9.languages.LanguageKind; import io.github.sspanak.tt9.ui.UI; import io.github.sspanak.tt9.util.Ternary; @@ -121,7 +122,7 @@ public abstract class HotkeyHandler extends CommandHandler { } if (keyCode == settings.getKeySpaceKorean()) { - return onText(" ", validateOnly); + return onKeySpaceKorean(validateOnly); } if (keyCode == settings.getKeyShowSettings()) { @@ -391,22 +392,26 @@ public abstract class HotkeyHandler extends CommandHandler { } + /** + * For CJK languages: when there are suggestions, accept the current one, otherwise type a space. + * For Non-CJK languages: accept the current suggestion (if any) AND type a space. + * The name is kept for historical reasons, because Korean was the first to introduce this behavior. + */ public boolean onKeySpaceKorean(boolean validateOnly) { - if (shouldBeOff() || !InputModeKind.isCheonjiin(mInputMode)) { - return false; - } - - // type a space when there is nothing to accept - if (suggestionOps.isEmpty() && !onText(" ", validateOnly)) { + if (shouldBeOff()) { return false; } // simulate accept with OK when there are suggestions - if (!suggestionOps.isEmpty()) { - onAcceptSuggestionManually(suggestionOps.acceptCurrent(), KeyEvent.KEYCODE_ENTER); + if (!suggestionOps.isEmpty() && LanguageKind.isCJK(mLanguage)) { + if (!validateOnly) { + onAcceptSuggestionManually(suggestionOps.acceptCurrent(), KeyEvent.KEYCODE_ENTER); + } + return true; } - return true; + // type a space when there is nothing to accept + return onText(" ", validateOnly); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/MainViewHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/MainViewHandler.java index db682b1f..8b9a9fbd 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/MainViewHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/MainViewHandler.java @@ -10,7 +10,6 @@ import io.github.sspanak.tt9.ime.helpers.OrientationListener; import io.github.sspanak.tt9.ime.modes.InputModeKind; import io.github.sspanak.tt9.ime.voice.VoiceInputOps; import io.github.sspanak.tt9.languages.Language; -import io.github.sspanak.tt9.languages.LanguageKind; import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.ui.main.ResizableMainView; @@ -192,11 +191,6 @@ abstract public class MainViewHandler extends HotkeyHandler { } - public boolean hasLettersOnAllKeys() { - return LanguageKind.isKorean(mLanguage) || LanguageKind.isChineseBopomofo(mLanguage); - } - - private void resetNormalizedDimensions() { normalizedWidth = -1; normalizedHeight = -1; 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 1065d12f..d5130687 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 @@ -63,7 +63,9 @@ public class ModePinyin extends ModeIdeograms { @Override public boolean shouldAcceptPreviousSuggestion(int nextKey, boolean hold) { - // In East Asian languages, 0-key must accept the current word, or type a space when there is no word. + // In East Asian languages, Space must accept the current word, or type a space when there is no word. + // Here, we handle the case when 0-key is Space, unlike the Space hotkey in HotkeyHandler, + // which could be a different key, assigned by the user. if (!digitSequence.isEmpty() && !digitSequence.endsWith(SPECIAL_CHAR_SEQUENCE) && nextKey == SPECIAL_CHAR_KEY) { ignoreNextSpace = true; } diff --git a/app/src/main/java/io/github/sspanak/tt9/languages/Language.java b/app/src/main/java/io/github/sspanak/tt9/languages/Language.java index d0e3b906..af4f74f0 100644 --- a/app/src/main/java/io/github/sspanak/tt9/languages/Language.java +++ b/app/src/main/java/io/github/sspanak/tt9/languages/Language.java @@ -14,6 +14,7 @@ abstract public class Language { protected String currency; protected String dictionaryFile; protected boolean hasABC = true; + private Boolean hasLettersOnAllKeys = null; protected boolean hasSpaceBetweenWords = true; protected boolean hasUpperCase = true; protected boolean hasTranscriptionsEmbedded = false; @@ -69,6 +70,30 @@ abstract public class Language { return hasABC; } + final public boolean hasLettersOnAllKeys() { + if (hasLettersOnAllKeys != null) { + return hasLettersOnAllKeys; + } + + boolean hasCharsOn0 = false; + for (String ch : getKeyCharacters(0)) { + if (Character.isAlphabetic(ch.charAt(0))) { + hasCharsOn0 = true; + break; + } + } + + boolean hasCharsOn1 = false; + for (String ch : getKeyCharacters(1)) { + if (Character.isAlphabetic(ch.charAt(0))) { + hasCharsOn1 = true; + break; + } + } + + return hasLettersOnAllKeys = hasCharsOn0 && hasCharsOn1; + } + final public boolean hasSpaceBetweenWords() { return hasSpaceBetweenWords; } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java index 139904a8..2847832f 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java @@ -281,10 +281,13 @@ class MainLayoutNumpad extends BaseMainLayout { setWidth(tt9.getSettings().getWidthPercent(), tt9.getSettings().getAlignment()); setKeyColumnWidth(tt9.getSettings().getNumpadFnKeyScale()); setBackgroundBlending(); + + boolean hasLettersOnAllKeys = tt9.getLanguage() != null && tt9.getLanguage().hasLettersOnAllKeys(); showLongSpace( - tt9.getSettings().isNumpadShapeLongSpace() && !tt9.isInputModeNumeric() && !tt9.hasLettersOnAllKeys(), + tt9.getSettings().isNumpadShapeLongSpace() && !tt9.isInputModeNumeric() && !hasLettersOnAllKeys, defaultKeyHeight ); + for (SoftKey key : getKeys()) { key.render(); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java index 4f167850..1e23625e 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java @@ -41,7 +41,7 @@ public class SoftKey extends BaseClickableKey { protected boolean hasLettersOnAllKeys() { - return tt9 != null && tt9.hasLettersOnAllKeys(); + return tt9 != null && tt9.getLanguage() != null && tt9.getLanguage().hasLettersOnAllKeys(); } diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index cf71349c..9103f721 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -158,7 +158,7 @@ Жълт бутон Син бутон Заглушаване на звук - Интервал (корейски) + Интервал Говорете Трябва да разрешите достъпа до микрофона, за да използвате гласовото въвеждане. Несъвместим гласов асистент diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6c267907..dc44f3c5 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -147,7 +147,7 @@ Gelber Knopf Blauer Knopf Stummschalttaste - Leertaste (Koreanisch) + Leertaste Sprechen Sie müssen dem Mikrofon die Erlaubnis erteilen, die Spracheingabe zu verwenden. Inkompatibler Sprachassistent diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index a99fe921..0e331d38 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -160,7 +160,7 @@ Botón amarillo Botón azul Botón de silencio - Espacio (coreano) + Espacio Hable Debe otorgar permiso al micrófono para usar la entrada de voz. Asistente de voz incompatible diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a853c29a..564d0ffb 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -158,7 +158,7 @@ Bouton jaune Bouton bleu Muet - Espace (coréen) + Espace Parlez Vous devez accorder l\'autorisation au microphone pour utiliser la saisie vocale. Assistant vocal incompatible diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a38380e5..b977fae8 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -148,7 +148,7 @@ Pulsante giallo Pulsante blu Muto - Spazio (coreano) + Spazio Parli Devi concedere l\'autorizzazione al microfono per utilizzare l\'input vocale. Assistente vocale incompatibile diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 569e63c5..2f75d51e 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -161,7 +161,7 @@ כפתור צהוב כפתור כחול כפתור השתק - רווח (קוריאנית) + רווח האזנה עליך להעניק למיקרופון הרשאה להשתמש בקלט קולי. עוזר קולי לא תואם diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index ef540e31..30992b0f 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -169,7 +169,7 @@ Geltonas mygtukas Mėlynas mygtukas Nutildymo mygt. - Tarpas (korėjiečių) + Tarpas Kalbėkite Turite suteikti mikrofonui leidimą naudoti balso įvestį. Nesuderinamas balso asistentas diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index fc0f6c39..184e54ff 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -148,7 +148,7 @@ Gele knop Blauwe knop Stilteknop - Spatie (Koreaans) + Spatie Spreek U moet de microfoon toestemming geven om spraakopvoer te gebruiken. Onverenigbare spraakassistent diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 339b2699..7dab06f6 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -162,7 +162,7 @@ Botão amarelo Botão azul Mudo - Espaço (coreano) + Espaço Fale Você deve conceder permissão ao microfone para usar a entrada de voz. Assistente de voz incompatível diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b1c86c05..4e40885e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -160,7 +160,7 @@ Жёлтая кнопка Синяя кнопка Выключения звука - Пробел (корейский) + Пробел Говорите Вы должны предоставить микрофону разрешение на использование голосового ввода. Несовместимый голосовой ассистент diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 6cc1102d..19b81a6b 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -162,7 +162,7 @@ Sarı düğme Mavi düğme Sessiz tuşu - Boşluk (Korece) + Boşluk Konuşun Sesli giriş kullanmak için mikrofona izin vermelisiniz. Uyumsuz sesli asistan diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 3abd8a6f..c98721a4 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -171,7 +171,7 @@ Жовта кнопка Синя кнопка Вимкнення звуку - Пробіл (корейська) + Пробіл Диктуйте Ви повинні надати мікрофону дозвіл на використання голосового введення. Несумісний голосовий асистент diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 541dd084..0d4a3f05 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -239,7 +239,7 @@ Del Mode Shift - Space (Korean) + Space Speak Turning off the microphone…