package com.moez.QKSMS.common.emoji; import android.text.TextUtils; import com.vdurmont.emoji.EmojiParser; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; public class EmojiRegistry { public static Map<String, String> EMOJIS_MAP = new HashMap<>(); static { EMOJIS_MAP.put(":)", Emojis.SMILE); EMOJIS_MAP.put(":-)", Emojis.SMILE); EMOJIS_MAP.put("=)", Emojis.SMILEY); EMOJIS_MAP.put(";)", Emojis.WINK); EMOJIS_MAP.put(";-)", Emojis.WINK); EMOJIS_MAP.put(":D", Emojis.GRINNING); EMOJIS_MAP.put("=D", Emojis.GRIN); EMOJIS_MAP.put("({})", Emojis.HUGGING); // EMOJIS_MAP.put("=))", Emojis.ROLLING_ON_THE_FLOOR_LAUGHING); //Unicode 9.0 EMOJIS_MAP.put(":\")", Emojis.BLUSH); EMOJIS_MAP.put(":(", Emojis.FROWNING); EMOJIS_MAP.put(":-(", Emojis.FROWNING); EMOJIS_MAP.put(":')", Emojis.JOY); EMOJIS_MAP.put(":'-)", Emojis.JOY); EMOJIS_MAP.put(":'(", Emojis.CRY); EMOJIS_MAP.put(":'-(", Emojis.CRY); EMOJIS_MAP.put(":P", Emojis.STUCK_OUT_TONGUE); EMOJIS_MAP.put(":-P", Emojis.STUCK_OUT_TONGUE); EMOJIS_MAP.put(":p", Emojis.STUCK_OUT_TONGUE); EMOJIS_MAP.put(":-p", Emojis.STUCK_OUT_TONGUE); EMOJIS_MAP.put(";P", Emojis.STUCK_OUT_TONGUE_WINKING_EYE); EMOJIS_MAP.put(";-P", Emojis.STUCK_OUT_TONGUE_WINKING_EYE); EMOJIS_MAP.put(";p", Emojis.STUCK_OUT_TONGUE_WINKING_EYE); EMOJIS_MAP.put(";-p", Emojis.STUCK_OUT_TONGUE_WINKING_EYE); // EMOJIS_MAP.put("=P~", Emojis.DROOLING); EMOJIS_MAP.put("<3", Emojis.HEART); EMOJIS_MAP.put("<3<3", Emojis.HEART_EYES); EMOJIS_MAP.put(":*", Emojis.KISSING); EMOJIS_MAP.put(":-*", Emojis.KISSING); EMOJIS_MAP.put(":|", Emojis.NEUTRAL_FACE); EMOJIS_MAP.put(":-|", Emojis.NEUTRAL_FACE); // EMOJIS_MAP.put("/:)", Emojis.RAISED_EYEBROWS); // EMOJIS_MAP.put(":>", Emojis.SMUG); EMOJIS_MAP.put("=\\", Emojis.DISAPPOINTED); EMOJIS_MAP.put("=-\\", Emojis.DISAPPOINTED); EMOJIS_MAP.put(":-\\", Emojis.DISAPPOINTED); EMOJIS_MAP.put("3-|", Emojis.DISAPPOINTED_RELIEVED); EMOJIS_MAP.put(":]x", Emojis.UNAMUSED); EMOJIS_MAP.put(":-||", Emojis.RAGE); EMOJIS_MAP.put(":$", Emojis.FLUSHED); EMOJIS_MAP.put(":o", Emojis.HUSHED); EMOJIS_MAP.put(":-o", Emojis.HUSHED); EMOJIS_MAP.put(":0", Emojis.HUSHED); EMOJIS_MAP.put(":-0", Emojis.HUSHED); EMOJIS_MAP.put(":O", Emojis.ASTONISHED); EMOJIS_MAP.put(":-O", Emojis.ASTONISHED); EMOJIS_MAP.put(";)", Emojis.WINK); EMOJIS_MAP.put(";-)", Emojis.WINK); EMOJIS_MAP.put(":/", Emojis.CONFUSED); EMOJIS_MAP.put(">:(", Emojis.ANGRY); EMOJIS_MAP.put(">:-(", Emojis.ANGRY); EMOJIS_MAP.put("%-}", Emojis.DIZZY_FACE); EMOJIS_MAP.put("O:)", Emojis.INNOCENT); EMOJIS_MAP.put("O:-)", Emojis.INNOCENT); EMOJIS_MAP.put("O-)", Emojis.INNOCENT); EMOJIS_MAP.put("0=)", Emojis.INNOCENT); EMOJIS_MAP.put("0:-)", Emojis.INNOCENT); EMOJIS_MAP.put(">=)", Emojis.SMILING_IMP); EMOJIS_MAP.put(">:)", Emojis.SMILING_IMP); EMOJIS_MAP.put(">:-)", Emojis.SMILING_IMP); EMOJIS_MAP.put(":x", Emojis.ZIPPER_MOUTH); EMOJIS_MAP.put(":-x", Emojis.ZIPPER_MOUTH); EMOJIS_MAP.put("*nerd*", Emojis.NERD); EMOJIS_MAP.put("8-|", Emojis.NERD); EMOJIS_MAP.put(":-B", Emojis.NERD); EMOJIS_MAP.put("B-)", Emojis.SUNGLASSES); EMOJIS_MAP.put("8-)", Emojis.SUNGLASSES); EMOJIS_MAP.put("~o)", Emojis.COFFEE); EMOJIS_MAP.put("C(_)", Emojis.COFFEE); EMOJIS_MAP.put("|_P", Emojis.COFFEE); EMOJIS_MAP.put("*beer*", Emojis.BEER); EMOJIS_MAP.put("*wine*", Emojis.WINE_GLASS); EMOJIS_MAP.put("())=(", Emojis.WINE_GLASS); EMOJIS_MAP.put("*dine*", Emojis.FORK_KNIFE_PLATE); EMOJIS_MAP.put("@>--", Emojis.ROSE); EMOJIS_MAP.put("@>-;--", Emojis.ROSE); EMOJIS_MAP.put("*gift*", Emojis.GIFT); EMOJIS_MAP.put("*bday*", Emojis.BIRTHDAY); EMOJIS_MAP.put("(*)", Emojis.STAR); EMOJIS_MAP.put(":poop:", Emojis.HANKEY); EMOJIS_MAP.put("*poop*", Emojis.HANKEY); // EMOJIS_MAP.put(":&", Emojis.NAUSEATED); } /** * Replaces emoji codes within the text with unicode emojis. * * Note that an emoji code must be surrounded on both sides by one of: * * - whitespace (i.e. ' ' or '\t') * - punctuation (one of [.,;:"'?!]) * - the beginning or end of the string */ public static String parseEmojis(String body) { if (TextUtils.isEmpty(body)) { return body; } // whitespace and punctuation characters String ACCEPTED_CHARS = "[\\s.,?:;'\"!]"; // explanation: we want to match: // 1) either an accepted char or the beginning of the text (i.e. ^) // 2) the actual emoji code (to be inserted in the loop) // 3) either an accepted char or the end of the text (i.e. $) String REGEX_TEMPLATE = String.format("(^|%s)%s(%s|$)", ACCEPTED_CHARS, "%s", ACCEPTED_CHARS); // iterate over all the entries for (Map.Entry<String, String> entry : EmojiRegistry.EMOJIS_MAP.entrySet()) { // quote the emoji code because some characters like ) are protected in regex land String quoted = Pattern.quote(entry.getKey()); String regex = String.format(REGEX_TEMPLATE, quoted); // the $1 and $2 represent the character* that came before the emoji and the // character* that came after the emoji // * - or beginning / end of text body = body.replaceAll(regex, "$1:" + entry.getValue() + ":$2"); } return EmojiParser.parseToUnicode(body); } }