@@ -5,6 +5,8 @@ import android.content.SharedPreferences
55import android.graphics.drawable.Icon
66import android.graphics.drawable.LayerDrawable
77import android.graphics.drawable.RippleDrawable
8+ import android.icu.text.BreakIterator
9+ import android.icu.util.ULocale
810import android.inputmethodservice.InputMethodService
911import android.os.Build
1012import android.os.Bundle
@@ -27,6 +29,7 @@ import androidx.autofill.inline.common.ViewStyle
2729import androidx.autofill.inline.v1.InlineSuggestionUi
2830import androidx.core.graphics.drawable.toBitmap
2931import com.simplemobiletools.commons.extensions.*
32+ import com.simplemobiletools.commons.helpers.isNougatPlus
3033import com.simplemobiletools.keyboard.R
3134import com.simplemobiletools.keyboard.extensions.config
3235import com.simplemobiletools.keyboard.extensions.getStrokeColor
@@ -54,6 +57,7 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared
5457 private var inputTypeClassVariation = TYPE_CLASS_TEXT
5558 private var enterKeyType = IME_ACTION_NONE
5659 private var switchToLetters = false
60+ private var breakIterator: BreakIterator ? = null
5761
5862 override fun onInitializeInterface () {
5963 super .onInitializeInterface()
@@ -84,6 +88,9 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared
8488 keyboard = createNewKeyboard()
8589 keyboardView?.setKeyboard(keyboard!! )
8690 keyboardView?.setEditorInfo(attribute)
91+ if (isNougatPlus()) {
92+ breakIterator = BreakIterator .getCharacterInstance(ULocale .getDefault())
93+ }
8794 updateShiftKeyState()
8895 }
8996
@@ -150,7 +157,8 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared
150157 MyKeyboard .KEYCODE_DELETE -> {
151158 val selectedText = inputConnection.getSelectedText(0 )
152159 if (TextUtils .isEmpty(selectedText)) {
153- inputConnection.deleteSurroundingText(1 , 0 )
160+ val count = getCountToDelete(inputConnection)
161+ inputConnection.deleteSurroundingText(count, 0 )
154162 } else {
155163 inputConnection.commitText(" " , 1 )
156164 }
@@ -260,6 +268,26 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared
260268 }
261269 }
262270
271+ private fun getCountToDelete (inputConnection : InputConnection ): Int {
272+ if (breakIterator == null || ! isNougatPlus()) {
273+ return 1
274+ }
275+
276+ val prevText = inputConnection.getTextBeforeCursor(8 , 0 )
277+
278+
279+ if (! TextUtils .isEmpty(prevText)) {
280+ return breakIterator?.let {
281+ it.setText(prevText.toString())
282+ val end = it.last()
283+ val start = it.previous()
284+ (end - (if (start == BreakIterator .DONE ) 0 else start)).coerceIn(0 , prevText?.length)
285+ } ? : 1
286+ }
287+
288+ return 1
289+ }
290+
263291 override fun onActionUp () {
264292 if (switchToLetters) {
265293 // TODO: Change keyboardMode to enum class
0 commit comments