Created
December 4, 2020 08:42
-
-
Save brskzr/89dd623140e18ee65526f06cc902cf1c to your computer and use it in GitHub Desktop.
Emoji Utils
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package com.example.trainings | |
| import android.content.Context | |
| import android.util.Log | |
| import androidx.emoji.bundled.BundledEmojiCompatConfig | |
| import androidx.emoji.text.EmojiCompat | |
| import java.util.regex.Pattern | |
| object EmojiCompatUtils { | |
| private const val EMPTY_STRING = "" | |
| private const val REGEX_FOR_EMOJI = "\\\\u([0-9A-Fa-f]{4,5})\\b" | |
| private var isInitialized = false | |
| private var emojiCompatInitCallback : EmojiCompat.InitCallback = object: EmojiCompat.InitCallback() { | |
| override fun onInitialized() { | |
| super.onInitialized() | |
| setAsInitiliazed() | |
| } | |
| override fun onFailed(throwable: Throwable?) { | |
| super.onFailed(throwable) | |
| Log.e("EmojiCompatInit", "Failed to init EmojiCompat", throwable) | |
| } | |
| } | |
| @Synchronized | |
| private fun setAsInitiliazed() { isInitialized = true } | |
| fun init(context: Context){ | |
| if(isInitialized) return | |
| val config: EmojiCompat.Config = BundledEmojiCompatConfig(context) | |
| EmojiCompat.init(config).registerInitCallback(emojiCompatInitCallback) | |
| } | |
| fun processSafely(sequence: CharSequence?): CharSequence { | |
| return sequence?.let { | |
| if (isInitialized) { | |
| try { | |
| return EmojiCompat.get().process(getUnicodeSupportedText(sequence.toString())) | |
| } catch (ex: Exception) { | |
| Log.e("EmojiCompatInit", "Failed to init EmojiCompat", ex) | |
| return sequence | |
| } | |
| } else { | |
| return removeEmojis(sequence.toString()) | |
| } | |
| } ?: EMPTY_STRING | |
| } | |
| private fun getUnicodeSupportedText(text: String): String { | |
| return try { | |
| val pattern = Pattern.compile(REGEX_FOR_EMOJI) | |
| val sb = StringBuffer() | |
| val m = pattern.matcher(text) | |
| while (m.find()) { | |
| val cp = m.group(1).toInt(16) | |
| val added: String = if (cp < 0x10000) (cp as Char).toString() else String(intArrayOf(cp), 0, 1) | |
| m.appendReplacement(sb, added) | |
| } | |
| m.appendTail(sb) | |
| sb.toString() | |
| } catch (e: java.lang.Exception) { | |
| text | |
| } | |
| } | |
| private fun removeEmojis(text: String): CharSequence { | |
| return try { | |
| val pattern = Pattern.compile(REGEX_FOR_EMOJI) | |
| val sb = StringBuffer() | |
| val m = pattern.matcher(text) | |
| while (m.find()) { m.appendReplacement(sb, EMPTY_STRING) } | |
| m.appendTail(sb) | |
| sb.toString() | |
| } catch (e: java.lang.Exception) { | |
| text | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment