improve emoji detection when deleting

still has issues with hand + skin tone emojis
This commit is contained in:
Helium314 2024-06-12 23:54:23 +02:00
parent d91350524a
commit 6a34f2c832
3 changed files with 10 additions and 6 deletions

View file

@ -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;
if (StringUtils.mightBeEmoji(lastCodePoint)) {
final String text = mCommittedTextBeforeComposingText.toString() + mComposingText;
return StringUtilsKt.getFullEmojiAtEnd(text).length();
final int emojiLength = StringUtilsKt.getFullEmojiAtEnd(text).length();
if (emojiLength > 0) return emojiLength;
}
return Character.isSupplementaryCodePoint(lastCodePoint) ? 2 : 1;
}
public boolean hasLetterBeforeLastSpaceBeforeCursor() {

View file

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

View file

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