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)