From 5f524d69a6adbb65a75b0db2d1a3647e6829c0a6 Mon Sep 17 00:00:00 2001 From: "Joshua A. Horton" Date: Wed, 28 Feb 2024 12:51:56 +0700 Subject: [PATCH 1/2] fix(android): fixes context-change detection for repeated-char cases --- .../main/java/com/keyman/engine/KMKeyboardJSHandler.java | 5 +++-- .../main/java/com/keyman/engine/util/CharSequenceUtil.java | 2 +- .../java/com/keyman/engine/util/CharSequenceUtilTest.java | 7 +++++++ 3 files changed, 11 insertions(+), 3 deletions(-) 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..43b8d04379 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,7 @@ 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 (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 } From e83ff96efb5fbb19a882701f8cc83fa2daba0f44 Mon Sep 17 00:00:00 2001 From: "Joshua A. Horton" Date: Thu, 29 Feb 2024 09:24:16 +0700 Subject: [PATCH 2/2] fix(android): context-initial handling with repeated-char rotation --- .../src/main/java/com/keyman/engine/util/CharSequenceUtil.java | 3 +++ 1 file changed, 3 insertions(+) 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 43b8d04379..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 @@ -49,6 +49,9 @@ public final class CharSequenceUtil { String expectedCharsString = expectedChars.toString(); String currentContextString = currentContext.toString(); 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());