1package eu.siacs.conversations.utils;
 2
 3import net.fellbaum.jemoji.EmojiManager;
 4import com.google.common.collect.ImmutableSet;
 5import java.util.Set;
 6
 7public class Emoticons {
 8
 9    private static final int VARIATION_16 = 0xFE0F;
10    private static final int VARIATION_15 = 0xFE0E;
11    private static final String VARIATION_16_STRING = new String(new char[] {VARIATION_16});
12    private static final String VARIATION_15_STRING = new String(new char[] {VARIATION_15});
13
14    private static final Set<String> TEXT_DEFAULT_TO_VS16 =
15            ImmutableSet.of(
16                    "❤",
17                    "✔",
18                    "✖",
19                    "➕",
20                    "➖",
21                    "➗",
22                    "⭐",
23                    "⚡",
24                    "\uD83C\uDF96",
25                    "\uD83C\uDFC6",
26                    "\uD83E\uDD47",
27                    "\uD83E\uDD48",
28                    "\uD83E\uDD49",
29                    "\uD83D\uDC51",
30                    "⚓",
31                    "⛵",
32                    "✈",
33                    "⚖",
34                    "⛑",
35                    "⚒",
36                    "⛏",
37                    "☎",
38                    "⛄",
39                    "⛅",
40                    "⚠",
41                    "⚛",
42                    "✡",
43                    "☮",
44                    "☯",
45                    "☀",
46                    "⬅",
47                    "➡",
48                    "⬆",
49                    "⬇");
50
51    public static String normalizeToVS16(final String input) {
52        return TEXT_DEFAULT_TO_VS16.contains(input) && !input.endsWith(VARIATION_15_STRING)
53                ? input + VARIATION_16_STRING
54                : input;
55    }
56
57    public static String existingVariant(final String original, final Set<String> existing) {
58        if (existing.contains(original) || original.endsWith(VARIATION_15_STRING)) {
59            return original;
60        }
61        final var variant =
62                original.endsWith(VARIATION_16_STRING)
63                        ? original.substring(0, original.length() - 1)
64                        : original + VARIATION_16_STRING;
65        return existing.contains(variant) ? variant : original;
66    }
67
68    public static boolean isEmoji(String input) {
69        return EmojiManager.isEmoji(input);
70    }
71
72    public static boolean isOnlyEmoji(String input) {
73        if (input.trim().length() == 0) return false; // Vaccuously true but not useful
74
75        return EmojiManager.removeAllEmojis(input).replaceAll("\uFE0F", "").trim().length() == 0;
76    }
77}