From 2e500e7aaf7930b6a1236652e9596b0719b7c854 Mon Sep 17 00:00:00 2001 From: Rocka Date: Sun, 29 Jun 2025 15:27:18 +0800 Subject: [PATCH] More special cases --- .../android/input/popup/EmojiModifier.kt | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/fcitx/fcitx5/android/input/popup/EmojiModifier.kt b/app/src/main/java/org/fcitx/fcitx5/android/input/popup/EmojiModifier.kt index 644a0fea..600095d0 100644 --- a/app/src/main/java/org/fcitx/fcitx5/android/input/popup/EmojiModifier.kt +++ b/app/src/main/java/org/fcitx/fcitx5/android/input/popup/EmojiModifier.kt @@ -30,13 +30,24 @@ object EmojiModifier { * **Special Case 1:** Drop `U+FE0F` (Variation Selector-16) when combining with skin tone */ private val SpecialCase1 = intArrayOf( - 0x1F590, // đŸ–ī¸ - 0x270C, // âœŒī¸ 0x261D, // â˜ī¸ - 0x26F9 // â›šī¸ + 0x26F9, // â›šī¸ + 0x270C, // âœŒī¸ + 0x1F3CB, // đŸ‹ī¸ + 0x1F3CC, // đŸŒī¸ + 0x1F574, // đŸ•´ī¸ + 0x1F575, // đŸ•ĩī¸ + 0x1F590, // đŸ–ī¸ ) private const val VariationSelector16 = 0xFE0F + /** + * **Special Case 2:** Make `U+1F91D`(🤝 Handshake) in 🧑‍🤝‍🧑 not modifiable + */ + private val SpecialCase2 = intArrayOf( + 0x1F9D1, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, + ) + private val defaultSkinTone by AppPrefs.getInstance().symbols.defaultEmojiSkinTone fun isSupported(): Boolean { @@ -48,7 +59,7 @@ object EmojiModifier { val sum = modifiable.sumOf { if (it) 1 else 0 } // bail if too crowded // eg. https://emojipedia.org/family-man-medium-light-skin-tone-woman-medium-light-skin-tone-girl-medium-light-skin-tone-boy-medium-light-skin-tone - return 0 < sum && sum <= 2 + return sum == 1 || sum == 2 } @RequiresApi(Build.VERSION_CODES.P) @@ -57,6 +68,10 @@ object EmojiModifier { val modifiable = BooleanArray(codePoints.size) { UCharacter.hasBinaryProperty(codePoints[it], UProperty.EMOJI_MODIFIER_BASE) } + // make U+1F91D not modifiable if the whole sequence is special + if (codePoints contentEquals SpecialCase2) { + modifiable[2] = false + } return codePoints to modifiable }