Accelerated backspace measures the wrong code point and can split an emoji
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 65/100
Direção de pesquisa
Leia app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java por volta das linhas 2019–2026, começando pela lógica de backspace acelerado e pela forma como ela lê o ponto de código antes do cursor. Verifique o comprimento da exclusão tanto para um caractere comum seguido de um emoji quanto para um emoji seguido de um caractere comum; está concluído quando a segunda exclusão usa o ponto de código lido novamente e não divide um emoji nem exclui um caractere comum a mais.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Summary
In InputLogic.handleBackspaceEvent, the accelerated (held-backspace) second deletion measures its length from the first code point instead of the one it is actually about to delete. When the second character back is a multi-code-point emoji, this deletes the wrong number of chars and can split the emoji, leaving an orphaned surrogate or a stray variation selector / ZWJ.
Present at tag v4.1.2 (f0ff166ae).
Location
app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java, around lines 2019–2026:
final int codePointBeforeCursorToDeleteAgain = mConnection.getCodePointBeforeCursor();
if (codePointBeforeCursorToDeleteAgain != Constants.NOT_A_CODE) {
final int lengthToDeleteAgain = codePointBeforeCursor > 0xFE00 // <-- first code point
|| StringUtils.mightBeEmoji(codePointBeforeCursor) // <-- first code point
? mConnection.getCharCountToDeleteBeforeCursor()
: 1;
mConnection.deleteTextBeforeCursor(lengthToDeleteAgain);
totalDeletedLength += lengthToDeleteAgain;
}
The guard correctly re-reads the cursor into codePointBeforeCursorToDeleteAgain, but the ternary that decides the delete length still tests codePointBeforeCursor — the value from before the first deletion.
Consequences
Both directions are wrong:
- First char plain, second an emoji → the branch evaluates
false, solengthToDeleteAgainis1. A singlecharis removed from a multi-charemoji, splitting it. - First char an emoji, second plain → the branch evaluates
true, sogetCharCountToDeleteBeforeCursor()is used against a plain character and may remove more than intended.
Only reachable once mDeleteCount > Constants.DELETE_ACCELERATE_AT, i.e. while holding backspace, which is probably why it has gone unnoticed.
Suggested fix
Use the re-read value in the condition, so it describes the character actually being deleted:
final int lengthToDeleteAgain = codePointBeforeCursorToDeleteAgain > 0xFE00
|| StringUtils.mightBeEmoji(codePointBeforeCursorToDeleteAgain)
? mConnection.getCharCountToDeleteBeforeCursor()
: 1;
Notes
Found while merging v4.1.2 into a downstream fork. This almost certainly predates LeanType — the surrounding accelerated-delete code comes from the HeliBoard/AOSP lineage — so it may be worth forwarding to Helium314/HeliBoard as well.
I have no reproduction on a physical device; this is from reading the code, so please sanity-check the emoji-splitting claim against real input before acting on it.
- Linguagem predominante
- Kotlin
- Estrelas
- 1k
- Forks
- 59
- Merge médio
- 13h 11min
- PRs com merge (30d)
- 47
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de LeanBitLab/LeanType
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
LeanBitLab/LeanType#713 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Crush ReportAberta
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 20/100
LeanBitLab/LeanType#715 ·
Mantenedores costumam responder em até 1 dia
-
Text Expander/cursor-handling bugTalvez já em andamento @LeanBitLab assumiu há 2 dias. Abertabug
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 62/100
LeanBitLab/LeanType#703 · 1 comentário · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
enhancement
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 45/100
LeanBitLab/LeanType#699 ·
Mantenedores costumam responder em até 1 dia
-
support minicpmAbertaenhancement
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 30/100
LeanBitLab/LeanType#698 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de LeanBitLab/LeanType
Issues semelhantes
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
lugassawan/swe-workbench#823 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 80/100
Droid-Deck/DroidDeck#1355 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
IronCoreLabs/ironcore-alloy#351 ·
-
Lovelace refine Taak
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
MinBZK/MijnOverheidZakelijk#1383 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
world-federation-of-advertisers/cross-media-measurement#4739 ·
Mantenedores costumam responder em até 1 dia