Emoticons.java

 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}