From 50e3855fa8e82b94cd62df01d4907b03a06c48f3 Mon Sep 17 00:00:00 2001 From: Prince Yadav <66916296+prince-0408@users.noreply.github.com> Date: Fri, 14 Aug 2026 19:52:18 +0530 Subject: [PATCH] refactor: introduce ScribeLanguage Enum to replace raw string comparisons (#426) --- .../be/scri/services/EnglishKeyboardIME.kt | 3 +- .../be/scri/services/FrenchKeyboardIME.kt | 3 +- .../be/scri/services/GeneralKeyboardIME.kt | 21 +++++--- .../be/scri/services/GermanKeyboardIME.kt | 3 +- .../be/scri/services/ItalianKeyboardIME.kt | 3 +- .../be/scri/services/PortugueseKeyboardIME.kt | 3 +- .../be/scri/services/RussianKeyboardIME.kt | 3 +- .../be/scri/services/SpanishKeyboardIME.kt | 3 +- .../be/scri/services/SwedishKeyboardIME.kt | 3 +- .../scri/helpers/LanguageMappingConstants.kt | 20 +++---- .../java/be/scri/models/ScribeLanguage.kt | 53 +++++++++++++++++++ 11 files changed, 90 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/be/scri/models/ScribeLanguage.kt diff --git a/app/src/keyboards/java/be/scri/services/EnglishKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/EnglishKeyboardIME.kt index 8818bdb9..ba6be846 100644 --- a/app/src/keyboards/java/be/scri/services/EnglishKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/EnglishKeyboardIME.kt @@ -6,11 +6,12 @@ import android.text.InputType import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler +import be.scri.models.ScribeLanguage /** * The EnglishKeyboardIME class provides the input method for the English language keyboard. */ -class EnglishKeyboardIME : GeneralKeyboardIME("English") { +class EnglishKeyboardIME : GeneralKeyboardIME(ScribeLanguage.ENGLISH) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_english_tablet diff --git a/app/src/keyboards/java/be/scri/services/FrenchKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/FrenchKeyboardIME.kt index fdd26509..bf077ebd 100644 --- a/app/src/keyboards/java/be/scri/services/FrenchKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/FrenchKeyboardIME.kt @@ -6,11 +6,12 @@ import android.text.InputType import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler +import be.scri.models.ScribeLanguage /** * The FrenchKeyboardIME class provides the input method for the French language keyboard. */ -class FrenchKeyboardIME : GeneralKeyboardIME("French") { +class FrenchKeyboardIME : GeneralKeyboardIME(ScribeLanguage.FRENCH) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_french_tablet diff --git a/app/src/keyboards/java/be/scri/services/GeneralKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/GeneralKeyboardIME.kt index fafcebc2..9afa47de 100644 --- a/app/src/keyboards/java/be/scri/services/GeneralKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/GeneralKeyboardIME.kt @@ -68,6 +68,7 @@ import be.scri.helpers.clipboard.ClipboardHandler import be.scri.helpers.data.AutocompletionDataManager import be.scri.helpers.english.ENInterfaceVariables.ALREADY_PLURAL_MSG import be.scri.helpers.ui.KeyboardUIManager +import be.scri.models.ScribeLanguage import be.scri.models.ScribeState import be.scri.views.KeyboardView import java.util.Locale @@ -77,11 +78,16 @@ private const val DATA_CONSTANT_3 = 3 @Suppress("TooManyFunctions", "LargeClass") abstract class GeneralKeyboardIME( - override var language: String, + val scribeLanguage: ScribeLanguage, ) : InputMethodService(), KeyboardView.OnKeyboardActionListener, KeyboardUIManager.KeyboardUIListener, KeyboardBase.KeyboardContextProvider { + constructor(languageName: String) : this(ScribeLanguage.fromDisplayName(languageName)) + + override val language: String + get() = scribeLanguage.displayName + // Abstract members required by subclasses (like EnglishKeyboardIME). abstract override fun getKeyboardLayoutXML(): Int @@ -762,10 +768,9 @@ abstract class GeneralKeyboardIME( val sharedPref = applicationContext.getSharedPreferences("keyboard_preferences", MODE_PRIVATE) val mode = if (!isSubsequentArea) { - when (language) { - "English", "Russian", "Swedish" -> "2x2" - "German", "French", "Italian", "Portuguese", "Spanish" -> "3x2" - else -> "none" + when (scribeLanguage) { + ScribeLanguage.ENGLISH, ScribeLanguage.RUSSIAN, ScribeLanguage.SWEDISH -> "2x2" + ScribeLanguage.GERMAN, ScribeLanguage.FRENCH, ScribeLanguage.ITALIAN, ScribeLanguage.PORTUGUESE, ScribeLanguage.SPANISH -> "3x2" } } else { "none" @@ -853,7 +858,7 @@ abstract class GeneralKeyboardIME( override fun onPluralClicked() { currentState = ScribeState.PLURAL saveConjugateModeType("none") - if (language == "German") keyboard?.mShiftState = SHIFT_ON_ONE_CHAR + if (scribeLanguage == ScribeLanguage.GERMAN) keyboard?.mShiftState = SHIFT_ON_ONE_CHAR refreshUI() } @@ -2077,8 +2082,8 @@ abstract class GeneralKeyboardIME( ScribeState.SELECT_VERB_CONJUNCTION -> { saveConjugateModeType(language) if (!isSubsequentArea && dataSize == 0) { - when (language) { - "English", "Russian", "Swedish" -> R.xml.conjugate_view_2x2 + when (scribeLanguage) { + ScribeLanguage.ENGLISH, ScribeLanguage.RUSSIAN, ScribeLanguage.SWEDISH -> R.xml.conjugate_view_2x2 else -> R.xml.conjugate_view_3x2 } } else { diff --git a/app/src/keyboards/java/be/scri/services/GermanKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/GermanKeyboardIME.kt index da401d38..f3f2543d 100644 --- a/app/src/keyboards/java/be/scri/services/GermanKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/GermanKeyboardIME.kt @@ -7,11 +7,12 @@ import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler import be.scri.helpers.PreferencesHelper.getIsAccentCharacterDisabled +import be.scri.models.ScribeLanguage /** * The GermanKeyboardIME class provides the input method for the German language keyboard. */ -class GermanKeyboardIME : GeneralKeyboardIME("German") { +class GermanKeyboardIME : GeneralKeyboardIME(ScribeLanguage.GERMAN) { override fun getKeyboardLayoutXML(): Int = if (isTablet()) { R.xml.keys_letters_german_tablet diff --git a/app/src/keyboards/java/be/scri/services/ItalianKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/ItalianKeyboardIME.kt index 2579944f..a83eac3e 100644 --- a/app/src/keyboards/java/be/scri/services/ItalianKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/ItalianKeyboardIME.kt @@ -6,11 +6,12 @@ import android.text.InputType import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler +import be.scri.models.ScribeLanguage /** * The ItalianKeyboardIME class provides the input method for the Italian language keyboard. */ -class ItalianKeyboardIME : GeneralKeyboardIME("Italian") { +class ItalianKeyboardIME : GeneralKeyboardIME(ScribeLanguage.ITALIAN) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_italian_tablet diff --git a/app/src/keyboards/java/be/scri/services/PortugueseKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/PortugueseKeyboardIME.kt index ecad059d..af3cbb4d 100644 --- a/app/src/keyboards/java/be/scri/services/PortugueseKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/PortugueseKeyboardIME.kt @@ -6,11 +6,12 @@ import android.text.InputType import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler +import be.scri.models.ScribeLanguage /** * The PortugueseKeyboardIME class provides the input method for the Portuguese language keyboard. */ -class PortugueseKeyboardIME : GeneralKeyboardIME("Portuguese") { +class PortugueseKeyboardIME : GeneralKeyboardIME(ScribeLanguage.PORTUGUESE) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_portuguese_tablet diff --git a/app/src/keyboards/java/be/scri/services/RussianKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/RussianKeyboardIME.kt index f0f228ad..075e3873 100644 --- a/app/src/keyboards/java/be/scri/services/RussianKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/RussianKeyboardIME.kt @@ -6,11 +6,12 @@ import android.text.InputType import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler +import be.scri.models.ScribeLanguage /** * The RussianKeyboardIME class provides the input method for the Russian language keyboard. */ -class RussianKeyboardIME : GeneralKeyboardIME("Russian") { +class RussianKeyboardIME : GeneralKeyboardIME(ScribeLanguage.RUSSIAN) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_russian_tablet diff --git a/app/src/keyboards/java/be/scri/services/SpanishKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/SpanishKeyboardIME.kt index 3227b348..7535de6d 100644 --- a/app/src/keyboards/java/be/scri/services/SpanishKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/SpanishKeyboardIME.kt @@ -7,11 +7,12 @@ import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler import be.scri.helpers.PreferencesHelper.getIsAccentCharacterDisabled +import be.scri.models.ScribeLanguage /** * The SpanishKeyboardIME class provides the input method for the Spanish language keyboard. */ -class SpanishKeyboardIME : GeneralKeyboardIME("Spanish") { +class SpanishKeyboardIME : GeneralKeyboardIME(ScribeLanguage.SPANISH) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_spanish_tablet diff --git a/app/src/keyboards/java/be/scri/services/SwedishKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/SwedishKeyboardIME.kt index 2772ff7f..a2485a13 100644 --- a/app/src/keyboards/java/be/scri/services/SwedishKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/SwedishKeyboardIME.kt @@ -7,11 +7,12 @@ import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler import be.scri.helpers.PreferencesHelper.getIsAccentCharacterDisabled +import be.scri.models.ScribeLanguage /** * The SwedishKeyboardIME class provides the input method for the Swedish language keyboard. */ -class SwedishKeyboardIME : GeneralKeyboardIME("Swedish") { +class SwedishKeyboardIME : GeneralKeyboardIME(ScribeLanguage.SWEDISH) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_swedish_tablet diff --git a/app/src/main/java/be/scri/helpers/LanguageMappingConstants.kt b/app/src/main/java/be/scri/helpers/LanguageMappingConstants.kt index 9e9d2108..6a11a2b3 100644 --- a/app/src/main/java/be/scri/helpers/LanguageMappingConstants.kt +++ b/app/src/main/java/be/scri/helpers/LanguageMappingConstants.kt @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later package be.scri.helpers +import be.scri.models.ScribeLanguage + /** * Object containing constant mappings related to language-specific data. * This includes conversions for grammatical annotations. @@ -27,6 +29,11 @@ object LanguageMappingConstants { "Russian" to mapOf("F" to "Ж", "M" to "М", "N" to "Н"), ) + /** + * Converts a [ScribeLanguage] to its two-letter ISO alias (e.g., "EN"). + */ + fun getLanguageAlias(language: ScribeLanguage): String = language.isoCode + /** * Converts a full language name (e.g., "English") to its two-letter ISO alias (e.g., "EN"). * @@ -34,16 +41,5 @@ object LanguageMappingConstants { * * @return The two-letter alias. */ - fun getLanguageAlias(language: String): String = - when (language) { - "English" -> "EN" - "French" -> "FR" - "German" -> "DE" - "Italian" -> "IT" - "Portuguese" -> "PT" - "Russian" -> "RU" - "Spanish" -> "ES" - "Swedish" -> "SV" - else -> "" - } + fun getLanguageAlias(language: String): String = ScribeLanguage.fromDisplayName(language).isoCode } diff --git a/app/src/main/java/be/scri/models/ScribeLanguage.kt b/app/src/main/java/be/scri/models/ScribeLanguage.kt new file mode 100644 index 00000000..448181a7 --- /dev/null +++ b/app/src/main/java/be/scri/models/ScribeLanguage.kt @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package be.scri.models + +/** + * Represents the supported languages in Scribe. + * + * @property displayName The human-readable name of the language (e.g., "English"). + * @property isoCode The two-letter ISO code for the language (e.g., "EN"). + */ +enum class ScribeLanguage( + val displayName: String, + val isoCode: String, +) { + ENGLISH("English", "EN"), + FRENCH("French", "FR"), + GERMAN("German", "DE"), + ITALIAN("Italian", "IT"), + PORTUGUESE("Portuguese", "PT"), + RUSSIAN("Russian", "RU"), + SPANISH("Spanish", "ES"), + SWEDISH("Swedish", "SV"), + ; + + companion object { + /** + * Resolves a [ScribeLanguage] from a display name, ISO code, or string representation. + * Case-insensitive matching. Defaults to [ENGLISH] if not found. + * + * @param value The string name or code to parse. + * @return The matching [ScribeLanguage], or [ENGLISH] as fallback. + */ + fun fromString(value: String?): ScribeLanguage { + if (value.isNullOrBlank()) return ENGLISH + val trimmed = value.trim() + return entries.firstOrNull { lang -> + lang.displayName.equals(trimmed, ignoreCase = true) || + lang.isoCode.equals(trimmed, ignoreCase = true) || + lang.name.equals(trimmed, ignoreCase = true) + } ?: ENGLISH + } + + /** + * Resolves a [ScribeLanguage] from a display name (e.g., "English", "French"). + */ + fun fromDisplayName(displayName: String?): ScribeLanguage = fromString(displayName) + + /** + * Resolves a [ScribeLanguage] from a two-letter ISO code (e.g., "EN", "FR"). + */ + fun fromIsoCode(isoCode: String?): ScribeLanguage = fromString(isoCode) + } +}