From da3a7dd854c9c6ac2eb1e913aa2e27dfe495422c Mon Sep 17 00:00:00 2001 From: Helium314 Date: Thu, 2 May 2024 16:17:46 +0200 Subject: [PATCH] move decapitalize into a separate function --- .../keyboard/latin/DictionaryFacilitatorImpl.java | 5 +++-- .../java/helium314/keyboard/latin/common/StringUtils.kt | 7 +++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java index c4a939a4d..9e71ef21f 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java @@ -11,6 +11,7 @@ import android.content.Context; import android.provider.UserDictionary; import android.text.TextUtils; +import helium314.keyboard.latin.common.StringUtilsKt; import helium314.keyboard.latin.settings.SettingsValues; import helium314.keyboard.latin.utils.DeviceProtectedUtils; import helium314.keyboard.latin.utils.Log; @@ -588,7 +589,7 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator { // if suggestion was auto-capitalized, check against both the suggestion and the de-capitalized suggestion final String decapitalizedSuggestion; if (wasAutoCapitalized) - decapitalizedSuggestion = word.substring(0, 1).toLowerCase() + word.substring(1); + decapitalizedSuggestion = StringUtilsKt.decapitalize(word, getCurrentLocale()); else decapitalizedSuggestion = word; for (int i = 0; i < mDictionaryGroups.size(); i ++) { @@ -667,7 +668,7 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator { if (wasAutoCapitalized) { // used word with lower-case first letter instead of all lower-case, as auto-capitalize // does not affect the other letters - final String decapitalizedWord = word.substring(0, 1).toLowerCase(dictionaryGroup.mLocale) + word.substring(1); + final String decapitalizedWord = StringUtilsKt.decapitalize(word, dictionaryGroup.mLocale); if (isValidWord(word, ALL_DICTIONARY_TYPES, dictionaryGroup) && !isValidWord(decapitalizedWord, ALL_DICTIONARY_TYPES, dictionaryGroup)) { // If the word was auto-capitalized and exists only as a capitalized word in the // dictionary, then we must not downcase it before registering it. For example, diff --git a/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt b/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt index 355eb5510..a12220387 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt @@ -6,6 +6,7 @@ import helium314.keyboard.keyboard.internal.keyboard_parser.floris.KeyCode import helium314.keyboard.latin.common.StringUtils.mightBeEmoji import helium314.keyboard.latin.common.StringUtils.newSingleCodePointString import helium314.keyboard.latin.settings.SpacingAndPunctuations +import java.util.Locale fun loopOverCodePoints(s: CharSequence, run: (Int) -> Boolean) { val text = if (s is String) s else s.toString() @@ -100,6 +101,12 @@ fun String.splitOnFirstSpacesOnly(): List { return out } +fun String.decapitalize(locale: Locale): String { + if (isEmpty() || !this[0].isUpperCase()) + return this + return replaceFirstChar { it.lowercase(locale) } +} + fun isEmoji(c: Int): Boolean = mightBeEmoji(c) && isEmoji(newSingleCodePointString(c)) fun isEmoji(s: String): Boolean = mightBeEmoji(s) && s.matches(emoRegex)