Skip to content

Commit 77c5f14

Browse files
authored
Merge pull request #224 from esensar/fix/emoji-deletion
Use BreakIterator to count characters to delete
2 parents 4f926ea + ded7159 commit 77c5f14

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
@@ -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

Comments
 (0)