Skip to content

Commit ded7159

Browse files
committed
Use BreakIterator to count characters to delete
Since emoji characters take up multiple characters, this uses BreakIterator from android.icu to correctly determine length of a single Unicode character. This also fixes behavior for other Unicode characters that may be made up of multiple characters.
1 parent 0489f9a commit ded7159

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

app/src/main/kotlin/com/simplemobiletools/keyboard/services/SimpleKeyboardIME.kt

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import android.content.SharedPreferences
55
import android.graphics.drawable.Icon
66
import android.graphics.drawable.LayerDrawable
77
import android.graphics.drawable.RippleDrawable
8+
import android.icu.text.BreakIterator
9+
import android.icu.util.ULocale
810
import android.inputmethodservice.InputMethodService
911
import android.os.Build
1012
import android.os.Bundle
@@ -27,6 +29,7 @@ import androidx.autofill.inline.common.ViewStyle
2729
import androidx.autofill.inline.v1.InlineSuggestionUi
2830
import androidx.core.graphics.drawable.toBitmap
2931
import com.simplemobiletools.commons.extensions.*
32+
import com.simplemobiletools.commons.helpers.isNougatPlus
3033
import com.simplemobiletools.keyboard.R
3134
import com.simplemobiletools.keyboard.extensions.config
3235
import 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

Comments
 (0)