From 6a34f2c832e3b9d7c75dd8887f4f1c5ca0b1cf78 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 12 Jun 2024 23:54:23 +0200 Subject: [PATCH] improve emoji detection when deleting still has issues with hand + skin tone emojis --- .../helium314/keyboard/latin/RichInputConnection.java | 10 ++++++---- .../helium314/keyboard/latin/common/StringUtils.kt | 2 ++ .../keyboard/latin/inputlogic/InputLogic.java | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/RichInputConnection.java b/app/src/main/java/helium314/keyboard/latin/RichInputConnection.java index c1dc91edb..87e699fe6 100644 --- a/app/src/main/java/helium314/keyboard/latin/RichInputConnection.java +++ b/app/src/main/java/helium314/keyboard/latin/RichInputConnection.java @@ -1072,10 +1072,12 @@ public final class RichInputConnection implements PrivateCommandPerformer { public int getCharCountToDeleteBeforeCursor() { final int lastCodePoint = getCodePointBeforeCursor(); - if (!Character.isSupplementaryCodePoint(lastCodePoint)) return 1; - if (!StringUtils.mightBeEmoji(lastCodePoint)) return 2; - final String text = mCommittedTextBeforeComposingText.toString() + mComposingText; - return StringUtilsKt.getFullEmojiAtEnd(text).length(); + if (StringUtils.mightBeEmoji(lastCodePoint)) { + final String text = mCommittedTextBeforeComposingText.toString() + mComposingText; + final int emojiLength = StringUtilsKt.getFullEmojiAtEnd(text).length(); + if (emojiLength > 0) return emojiLength; + } + return Character.isSupplementaryCodePoint(lastCodePoint) ? 2 : 1; } public boolean hasLetterBeforeLastSpaceBeforeCursor() { diff --git a/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt b/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt index 3b53668a1..8f3347129 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt @@ -64,6 +64,8 @@ fun getFullEmojiAtEnd(s: CharSequence): String { // stop if codepoint can't be emoji if (!mightBeEmoji(codepoint)) return "" offset -= Character.charCount(codepoint) + // todo: if codepoint in 0x1F3FB..0x1F3FF -> combine with other emojis in front, but only if they actually combine + // why isn't this done with zwj like everything else? skin tones can be emojis by themselves... if (offset > 0 && text[offset - 1].code == KeyCode.ZWJ) { offset -= 1 continue diff --git a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java index 88f4b9ca1..2c7b2b248 100644 --- a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java @@ -1311,7 +1311,7 @@ public final class InputLogic { // TODO: Add a new StatsUtils method onBackspaceWhenNoText() return; } - final int lengthToDelete = Character.isSupplementaryCodePoint(codePointBeforeCursor) + final int lengthToDelete = codePointBeforeCursor > 0xFE00 ? mConnection.getCharCountToDeleteBeforeCursor() : 1; mConnection.deleteTextBeforeCursor(lengthToDelete); int totalDeletedLength = lengthToDelete; @@ -1324,7 +1324,7 @@ public final class InputLogic { final int codePointBeforeCursorToDeleteAgain = mConnection.getCodePointBeforeCursor(); if (codePointBeforeCursorToDeleteAgain != Constants.NOT_A_CODE) { - final int lengthToDeleteAgain = Character.isSupplementaryCodePoint(codePointBeforeCursorToDeleteAgain) + final int lengthToDeleteAgain = codePointBeforeCursor > 0xFE00 ? mConnection.getCharCountToDeleteBeforeCursor() : 1; mConnection.deleteTextBeforeCursor(lengthToDeleteAgain); totalDeletedLength += lengthToDeleteAgain;