diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt b/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt
index de842b538..bcf017950 100644
--- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt
+++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt
@@ -20,6 +20,7 @@ import helium314.keyboard.latin.common.Constants
import helium314.keyboard.latin.common.InputPointers
import helium314.keyboard.latin.common.combiningRange
import helium314.keyboard.latin.common.moveStepsToCharCount
+import helium314.keyboard.latin.common.moveWordStepsToCharCount
import helium314.keyboard.latin.define.ProductionFlags
import helium314.keyboard.latin.inputlogic.InputLogic
import helium314.keyboard.latin.settings.Settings
@@ -198,7 +199,7 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp
override fun onMoveDeletePointer(steps: Int) {
inputLogic.finishInput()
val end = connection.expectedSelectionEnd
- val actualSteps = actualSteps(steps)
+ val actualSteps = if (Settings.getValues().mSwipeDeleteByWord) wordSteps(steps) else actualSteps(steps)
val start = connection.expectedSelectionStart + actualSteps
if (start > end) return
gestureMoveBackHaptics()
@@ -211,6 +212,12 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp
return moveStepsToCharCount(text, steps)
}
+ private fun wordSteps(steps: Int): Int {
+ val text = if (steps > 0) connection.getSelectedText(0) ?: return steps
+ else connection.getTextBeforeCursor(maxOf(50, -steps * 20), 0) ?: return steps
+ return moveWordStepsToCharCount(text, steps)
+ }
+
override fun onUpWithDeletePointerActive() {
if (!connection.hasSelection()) return
inputLogic.finishInput()
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 73c737cc6..08493ebde 100644
--- a/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt
+++ b/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt
@@ -303,6 +303,42 @@ fun moveStepsToCharCount(text: CharSequence, steps: Int): Int {
}
}
+/** translates a move of [steps] words in [text] to character count, skipping whitespace/punctuation tokens */
+fun moveWordStepsToCharCount(text: CharSequence, steps: Int): Int {
+ if (steps == 0) return 0
+ val str = text.toString()
+ val iterator = BreakIterator.getWordInstance(Locale.ROOT)
+ iterator.setText(str)
+ if (steps > 0) {
+ var wordsLeft = steps
+ var segStart = 0
+ var segEnd = iterator.next()
+ while (segEnd != BreakIterator.DONE) {
+ if (str.substring(segStart, segEnd).any { it.isLetterOrDigit() }) {
+ wordsLeft--
+ if (wordsLeft <= 0) return segEnd
+ }
+ segStart = segEnd
+ segEnd = iterator.next()
+ }
+ return str.length
+ } else {
+ var wordsLeft = -steps
+ var segEnd = str.length
+ iterator.last()
+ var segStart = iterator.previous()
+ while (segStart != BreakIterator.DONE) {
+ if (str.substring(segStart, segEnd).any { it.isLetterOrDigit() }) {
+ wordsLeft--
+ if (wordsLeft <= 0) return segStart - str.length
+ }
+ segEnd = segStart
+ segStart = iterator.previous()
+ }
+ return -str.length
+ }
+}
+
fun String.splitOnWhitespace() = SpacedTokens(this).toList()
fun stripTrailingSeparatorsAndConnectors(word: String, spacingAndPunctuations: SpacingAndPunctuations): String {
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 4795cda98..a814838f8 100644
--- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt
+++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt
@@ -102,6 +102,7 @@ object Defaults {
@JvmField
val PREF_SPACE_VERTICAL_SWIPE = KeyboardActionListener.SwipeAction.NONE.name
const val PREF_DELETE_SWIPE = true
+ const val PREF_SWIPE_DELETE_BY_WORD = false
const val PREF_AUTOSPACE_AFTER_PUNCTUATION = false
const val PREF_AUTOSPACE_AFTER_SUGGESTION = true
const val PREF_AUTOSPACE_AFTER_GESTURE_TYPING = true
diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java
index 21e485258..0cf97d2b2 100644
--- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java
+++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java
@@ -111,6 +111,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
public static final String PREF_SPACE_HORIZONTAL_SWIPE = "horizontal_space_swipe";
public static final String PREF_SPACE_VERTICAL_SWIPE = "vertical_space_swipe";
public static final String PREF_DELETE_SWIPE = "delete_swipe";
+ public static final String PREF_SWIPE_DELETE_BY_WORD = "swipe_delete_by_word";
public static final String PREF_AUTOSPACE_AFTER_PUNCTUATION = "autospace_after_punctuation";
public static final String PREF_AUTOSPACE_AFTER_SUGGESTION = "autospace_after_suggestion";
public static final String PREF_AUTOSPACE_AFTER_GESTURE_TYPING = "autospace_after_gesture_typing";
diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java
index c44c70d9b..9c4891d50 100644
--- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java
+++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java
@@ -85,6 +85,7 @@ public class SettingsValues {
public final int mTouchpadSensitivity;
public final boolean mTouchpadEdgeScroll;
public final boolean mDeleteSwipeEnabled;
+ public final boolean mSwipeDeleteByWord;
public final boolean mAutospaceAfterPunctuation;
public final boolean mAutospaceAfterSuggestion;
public final boolean mAutospaceAfterGestureTyping;
@@ -272,6 +273,7 @@ public SettingsValues(final Context context, final SharedPreferences prefs, fina
Defaults.PREF_TOUCHPAD_SENSITIVITY);
mTouchpadEdgeScroll = prefs.getBoolean(Settings.PREF_TOUCHPAD_EDGE_SCROLL, Defaults.PREF_TOUCHPAD_EDGE_SCROLL);
mDeleteSwipeEnabled = prefs.getBoolean(Settings.PREF_DELETE_SWIPE, Defaults.PREF_DELETE_SWIPE);
+ mSwipeDeleteByWord = prefs.getBoolean(Settings.PREF_SWIPE_DELETE_BY_WORD, Defaults.PREF_SWIPE_DELETE_BY_WORD);
mAutospaceAfterPunctuation = prefs.getBoolean(Settings.PREF_AUTOSPACE_AFTER_PUNCTUATION, Defaults.PREF_AUTOSPACE_AFTER_PUNCTUATION);
mAutospaceAfterSuggestion = prefs.getBoolean(Settings.PREF_AUTOSPACE_AFTER_SUGGESTION, Defaults.PREF_AUTOSPACE_AFTER_SUGGESTION);
mAutospaceAfterGestureTyping = prefs.getBoolean(Settings.PREF_AUTOSPACE_AFTER_GESTURE_TYPING, Defaults.PREF_AUTOSPACE_AFTER_GESTURE_TYPING);
diff --git a/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt
index e0ecfc57a..7ed30805f 100644
--- a/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt
+++ b/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt
@@ -75,6 +75,8 @@ fun AdvancedSettingsScreen(
if (Settings.readVerticalSpaceSwipe(prefs) == KeyboardActionListener.SwipeAction.TOUCHPAD_MODE)
Settings.PREF_TOUCHPAD_EDGE_SCROLL else null,
Settings.PREF_DELETE_SWIPE,
+ if (prefs.getBoolean(Settings.PREF_DELETE_SWIPE, Defaults.PREF_DELETE_SWIPE))
+ Settings.PREF_SWIPE_DELETE_BY_WORD else null,
Settings.PREF_SPACE_TO_CHANGE_LANG,
Settings.PREFS_LONG_PRESS_SYMBOLS_FOR_NUMPAD,
Settings.PREF_ENABLE_EMOJI_ALT_PHYSICAL_KEY,
@@ -161,6 +163,9 @@ fun createAdvancedSettings(context: Context) = listOf(
Setting(context, Settings.PREF_DELETE_SWIPE, R.string.delete_swipe, R.string.delete_swipe_summary) {
SwitchPreference(it, Defaults.PREF_DELETE_SWIPE)
},
+ Setting(context, Settings.PREF_SWIPE_DELETE_BY_WORD, R.string.swipe_delete_by_word, R.string.swipe_delete_by_word_summary) {
+ SwitchPreference(it, Defaults.PREF_SWIPE_DELETE_BY_WORD)
+ },
Setting(context, Settings.PREF_SPACE_TO_CHANGE_LANG,
R.string.prefs_long_press_keyboard_to_change_lang,
R.string.prefs_long_press_keyboard_to_change_lang_summary)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c4aa335f8..f99eb8991 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -210,6 +210,10 @@
Delete swipe
Perform a swipe from the delete key to select and remove bigger portions of text at once
+
+ Swipe backspace deletes words
+
+ When swiping from the backspace key, select and delete whole words instead of individual characters
Backup and restore