@@ -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
@@ -55,6 +58,7 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared
5558 private var inputTypeClassVariation = TYPE_CLASS_TEXT
5659 private var enterKeyType = IME_ACTION_NONE
5760 private var switchToLetters = false
61+ private var breakIterator: BreakIterator ? = null
5862
5963 override fun onInitializeInterface () {
6064 super .onInitializeInterface()
@@ -85,6 +89,9 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared
8589 keyboard = createNewKeyboard()
8690 keyboardView?.setKeyboard(keyboard!! )
8791 keyboardView?.setEditorInfo(attribute)
92+ if (isNougatPlus()) {
93+ breakIterator = BreakIterator .getCharacterInstance(ULocale .getDefault())
94+ }
8895 updateShiftKeyState()
8996 }
9097
@@ -151,7 +158,8 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared
151158 MyKeyboard .KEYCODE_DELETE -> {
152159 val selectedText = inputConnection.getSelectedText(0 )
153160 if (TextUtils .isEmpty(selectedText)) {
154- inputConnection.deleteSurroundingText(1 , 0 )
161+ val count = getCountToDelete(inputConnection)
162+ inputConnection.deleteSurroundingText(count, 0 )
155163 } else {
156164 inputConnection.commitText(" " , 1 )
157165 }
@@ -265,6 +273,26 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared
265273 }
266274 }
267275
276+ private fun getCountToDelete (inputConnection : InputConnection ): Int {
277+ if (breakIterator == null || ! isNougatPlus()) {
278+ return 1
279+ }
280+
281+ val prevText = inputConnection.getTextBeforeCursor(8 , 0 )
282+
283+
284+ if (! TextUtils .isEmpty(prevText)) {
285+ return breakIterator?.let {
286+ it.setText(prevText.toString())
287+ val end = it.last()
288+ val start = it.previous()
289+ (end - (if (start == BreakIterator .DONE ) 0 else start)).coerceIn(0 , prevText?.length)
290+ } ? : 1
291+ }
292+
293+ return 1
294+ }
295+
268296 override fun onActionUp () {
269297 if (switchToLetters) {
270298 // TODO: Change keyboardMode to enum class
0 commit comments