diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index e21cd68ac..f507abb96 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -96,6 +96,7 @@ object Defaults { const val PREF_BACKSPACE_REVERTS_AUTOCORRECT = true const val PREF_CENTER_SUGGESTION_TEXT_TO_ENTER = false const val PREF_CENTER_TYPED_WORD = false + const val PREF_AUTOCORRECTION_RIGHT_OF_TYPED_WORD = false const val PREF_SHOW_SUGGESTIONS = true const val PREF_ALWAYS_SHOW_SUGGESTIONS = false const val PREF_ALWAYS_SHOW_SUGGESTIONS_EXCEPT_WEB_TEXT = true diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.kt b/app/src/main/java/helium314/keyboard/latin/settings/Settings.kt index b28526dcb..9a4304d99 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.kt @@ -345,6 +345,7 @@ class Settings private constructor() : SharedPreferences.OnSharedPreferenceChang const val PREF_BACKSPACE_REVERTS_AUTOCORRECT = "backspace_reverts_autocorrect" const val PREF_CENTER_SUGGESTION_TEXT_TO_ENTER = "center_suggestion_text_to_enter" const val PREF_CENTER_TYPED_WORD = "center_typed_word" + const val PREF_AUTOCORRECTION_RIGHT_OF_TYPED_WORD = "autocorrection_right_of_typed_word" const val PREF_SHOW_SUGGESTIONS = "show_suggestions" const val PREF_ALWAYS_SHOW_SUGGESTIONS = "always_show_suggestions" const val PREF_ALWAYS_SHOW_SUGGESTIONS_EXCEPT_WEB_TEXT = "always_show_suggestions_except_web_text" diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.kt b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.kt index decdbbdb0..cbd78310b 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.kt @@ -137,6 +137,7 @@ open class SettingsValues( val mSuggestPunctuation: Boolean val mCenterSuggestionTextToEnter: Boolean val mCenterTypedWord: Boolean + val mAutoCorrectionRightOfTypedWord: Boolean val mGestureMethod: String val mFullKeyboardSwipe: Int val mGestureInputEnabled: Boolean @@ -349,6 +350,7 @@ open class SettingsValues( mAutoCorrectEnabled = mAutoCorrectionEnabledPerUserSettings && shouldAutoCorrectForField mCenterSuggestionTextToEnter = prefs.getBoolean(Settings.PREF_CENTER_SUGGESTION_TEXT_TO_ENTER, Defaults.PREF_CENTER_SUGGESTION_TEXT_TO_ENTER) mCenterTypedWord = prefs.getBoolean(Settings.PREF_CENTER_TYPED_WORD, Defaults.PREF_CENTER_TYPED_WORD) + mAutoCorrectionRightOfTypedWord = prefs.getBoolean(Settings.PREF_AUTOCORRECTION_RIGHT_OF_TYPED_WORD, Defaults.PREF_AUTOCORRECTION_RIGHT_OF_TYPED_WORD) mAutoCorrectionThreshold = if (mAutoCorrectEnabled) prefs.getFloat(Settings.PREF_AUTO_CORRECT_THRESHOLD, Defaults.PREF_AUTO_CORRECT_THRESHOLD) else Float.MAX_VALUE mScoreLimitForAutocorrect = if (mAutoCorrectionThreshold < 0) 600000 else (if (mAutoCorrectionThreshold < 0.07f) 800000 else 950000) mAutoCorrectShortcuts = prefs.getBoolean(Settings.PREF_AUTOCORRECT_SHORTCUTS, Defaults.PREF_AUTOCORRECT_SHORTCUTS) diff --git a/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripLayoutHelper.kt b/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripLayoutHelper.kt index a467fd891..2fcad7bf1 100644 --- a/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripLayoutHelper.kt +++ b/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripLayoutHelper.kt @@ -202,7 +202,9 @@ internal class SuggestionStripLayoutHelper( ) return getPositionInSuggestionStrip( indexInSuggestedWords, suggestedWords.mWillAutoCorrect, - shouldOmitTypedWord, mCenterPositionInStrip, mTypedWordPositionWhenAutocorrect, mCenterTypedWord + shouldOmitTypedWord, mCenterPositionInStrip, mTypedWordPositionWhenAutocorrect, mCenterTypedWord, + mCenterTypedWord && settingsValues.mAutoCorrectionRightOfTypedWord + && mSuggestionsCountInStrip > mCenterPositionInStrip + 1 // there must be a position on the right ) } @@ -543,7 +545,7 @@ internal class SuggestionStripLayoutHelper( indexInSuggestedWords: Int, willAutoCorrect: Boolean, omitTypedWord: Boolean, centerPositionInStrip: Int, typedWordPositionWhenAutoCorrect: Int, - centerTypedWord: Boolean = false + centerTypedWord: Boolean = false, autoCorrectionRight: Boolean = false ): Int { if (omitTypedWord) { if (indexInSuggestedWords == SuggestedWords.INDEX_OF_TYPED_WORD) { @@ -555,6 +557,10 @@ internal class SuggestionStripLayoutHelper( return centerPositionInStrip } if (indexInSuggestedWords == SuggestedWords.INDEX_OF_AUTO_CORRECTION) { + return if (autoCorrectionRight) centerPositionInStrip + 1 else typedWordPositionWhenAutoCorrect + } + // the suggestion that is usually right of the center goes to the left instead + if (autoCorrectionRight && indexInSuggestedWords == INDEX_OF_TYPED_WORD_WHEN_AUTOCORRECT + 1) { return typedWordPositionWhenAutoCorrect } } diff --git a/app/src/main/java/helium314/keyboard/settings/screens/SuggestionsScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/SuggestionsScreen.kt index cdbab0a32..39ce9e102 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/SuggestionsScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/SuggestionsScreen.kt @@ -80,6 +80,7 @@ fun SuggestionsScreen( if (suggestionsEnabled) Settings.PREF_SUGGESTIONS_COUNT_IN_STRIP else null, if (suggestionsEnabled) Settings.PREF_CENTER_SUGGESTION_TEXT_TO_ENTER else null, if (suggestionsEnabled) Settings.PREF_CENTER_TYPED_WORD else null, + if (suggestionsEnabled) Settings.PREF_AUTOCORRECTION_RIGHT_OF_TYPED_WORD else null, Settings.PREF_SUGGEST_PUNCTUATION, // Prediction & learning @@ -256,6 +257,13 @@ fun createSuggestionsSettings(context: Context) = listOf( ) { SwitchPreference(it, Defaults.PREF_CENTER_TYPED_WORD) }, + Setting(context, Settings.PREF_AUTOCORRECTION_RIGHT_OF_TYPED_WORD, + R.string.autocorrection_right_of_typed_word, R.string.autocorrection_right_of_typed_word_summary + ) { + val prefs = LocalContext.current.prefs() + SwitchPreference(it, Defaults.PREF_AUTOCORRECTION_RIGHT_OF_TYPED_WORD, + enabled = prefs.getBoolean(Settings.PREF_CENTER_TYPED_WORD, Defaults.PREF_CENTER_TYPED_WORD)) + }, Setting(context, Settings.PREF_SUGGEST_CLIPBOARD_CONTENT, R.string.suggest_clipboard_content, R.string.suggest_clipboard_content_summary ) { diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index aedc47bcc..cd2daeab9 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1734,4 +1734,6 @@ Ermöglicht lokale GGUF / llama.cpp-Inferenz für Korrekturlesen und Umschreiben API-Schlüssel einschließen Holen Sie sich den API-Schlüssel Deaktiviert + Autokorrektur rechts vom getippten Wort + Wenn das getippte Wort in der Mitte steht, erscheint die Autokorrektur rechts daneben statt links diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7921e25d2..a014a7b99 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2418,4 +2418,6 @@ New dictionary: No recent items Manage Local Media Get API key + Auto-correction right of the typed word + When the typed word is in the middle, show the auto-correction on its right instead of its left diff --git a/app/src/test/java/helium314/keyboard/latin/suggestions/SuggestionStripLayoutHelperTest.kt b/app/src/test/java/helium314/keyboard/latin/suggestions/SuggestionStripLayoutHelperTest.kt index 293b57f8c..46504eeca 100644 --- a/app/src/test/java/helium314/keyboard/latin/suggestions/SuggestionStripLayoutHelperTest.kt +++ b/app/src/test/java/helium314/keyboard/latin/suggestions/SuggestionStripLayoutHelperTest.kt @@ -42,6 +42,13 @@ class SuggestionStripLayoutHelperTest { } } + @Test fun autoCorrectionCanBeRightOfTypedWord() { + fun right(index: Int, center: Int = 1, left: Int = 0) = + getPositionInSuggestionStrip(index, true, true, center, left, centerTypedWord = true, autoCorrectionRight = true) + assertEquals(listOf(2, 1, 0), (1..3).map { right(it) }) + assertEquals(listOf(3, 2, 1, 0, 4), (1..5).map { right(it, center = 2, left = 1) }) + } + @Test fun typedWordIsInCenterWithFiveSuggestions() { val positions = (1..5).map { position(it, willAutoCorrect = true, centerTypedWord = true, center = 2, left = 1) } assertEquals(listOf(1, 2, 3, 0, 4), positions)