diff --git a/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardJSHandler.java b/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardJSHandler.java index b85353e2e1..74be658216 100644 --- a/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardJSHandler.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardJSHandler.java @@ -297,12 +297,13 @@ public class KMKeyboardJSHandler { expectedChars = ""; } ic.deleteSurroundingText(dn + numPairs, 0); - CharSequence newContext = getCharacterSequence(ic, originalBufferLength - 2*dn); + // Shorten the retrieved context by exactly as many characters as were just deleted. + CharSequence newContext = getCharacterSequence(ic, originalBufferLength - dn - numPairs); CharSequence charsToRestore = CharSequenceUtil.restoreChars(expectedChars, newContext); if (charsToRestore.length() > 0) { // Restore expectedChars that Chromium deleted. - // Use newCusorPosition 1 so cursor will be after the inserted string + // Use newCursorPosition 1 so cursor will be after the inserted string ic.commitText(charsToRestore, 1); } } diff --git a/android/KMEA/app/src/main/java/com/keyman/engine/util/CharSequenceUtil.java b/android/KMEA/app/src/main/java/com/keyman/engine/util/CharSequenceUtil.java index 45199fe684..d3ad56a227 100644 --- a/android/KMEA/app/src/main/java/com/keyman/engine/util/CharSequenceUtil.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/util/CharSequenceUtil.java @@ -48,7 +48,10 @@ public final class CharSequenceUtil { if (expectedChars.length() != currentContext.length()) { String expectedCharsString = expectedChars.toString(); String currentContextString = currentContext.toString(); - int index = expectedCharsString.indexOf(currentContextString); + int index = expectedCharsString.lastIndexOf(currentContextString); + if (currentContextString.length() == 0) { + index = 0; + } if (index > -1) { // subSequence indices are start(inclusive) to end(exclusive) charsToRestore = expectedChars.subSequence(index + currentContextString.length(), expectedChars.length()); diff --git a/android/KMEA/app/src/test/java/com/keyman/engine/util/CharSequenceUtilTest.java b/android/KMEA/app/src/test/java/com/keyman/engine/util/CharSequenceUtilTest.java index 6feb49feb1..ee1c80ce3c 100644 --- a/android/KMEA/app/src/test/java/com/keyman/engine/util/CharSequenceUtilTest.java +++ b/android/KMEA/app/src/test/java/com/keyman/engine/util/CharSequenceUtilTest.java @@ -151,5 +151,12 @@ public class CharSequenceUtilTest { Assert.assertEquals("p" + COMPOSING_CIRCUMFLEX_ACCENT + "p" + COMPOSING_CIRCUMFLEX_ACCENT, charsToRestore); } + @Test + public void test_repeated_char_backspace() { + CharSequence currentContext = "----------------"; + CharSequence expectedChars = "-----------------"; + CharSequence charsToRestore = CharSequenceUtil.restoreChars(expectedChars, currentContext); + Assert.assertEquals("", charsToRestore); + } //endregion }