feat: Update authorization logic for compatibility with crypto_new; enhance key generation and public key format
This commit is contained in:
@@ -81,6 +81,9 @@ class AppleEmojiEditTextView @JvmOverloads constructor(
|
||||
"[\\x{3030}]|[\\x{303D}]|" +
|
||||
"[\\x{3297}]|[\\x{3299}]"
|
||||
)
|
||||
|
||||
// 🔥 Паттерн для :emoji_XXXX: формата (как в десктопе)
|
||||
val EMOJI_CODE_PATTERN: Pattern = Pattern.compile(":emoji_([a-fA-F0-9_-]+):")
|
||||
|
||||
// Кэш для bitmap и drawable
|
||||
private val bitmapCache = LruCache<String, Bitmap>(500)
|
||||
@@ -128,19 +131,46 @@ class AppleEmojiEditTextView @JvmOverloads constructor(
|
||||
|
||||
try {
|
||||
val textStr = editable.toString()
|
||||
val matcher = EMOJI_PATTERN.matcher(textStr)
|
||||
val cursorPosition = selectionStart
|
||||
|
||||
|
||||
// 🔥 Собираем все позиции эмодзи (и Unicode, и :emoji_code:)
|
||||
data class EmojiMatch(val start: Int, val end: Int, val unified: String, val isCodeFormat: Boolean)
|
||||
val emojiMatches = mutableListOf<EmojiMatch>()
|
||||
|
||||
// 1. Ищем :emoji_XXXX: формат
|
||||
val codeMatcher = EMOJI_CODE_PATTERN.matcher(textStr)
|
||||
while (codeMatcher.find()) {
|
||||
val unified = codeMatcher.group(1) ?: continue
|
||||
emojiMatches.add(EmojiMatch(codeMatcher.start(), codeMatcher.end(), unified, true))
|
||||
}
|
||||
|
||||
// 2. Ищем реальные Unicode эмодзи
|
||||
val matcher = EMOJI_PATTERN.matcher(textStr)
|
||||
while (matcher.find()) {
|
||||
val emoji = matcher.group()
|
||||
val start = matcher.start()
|
||||
val end = matcher.end()
|
||||
|
||||
// Проверяем что этот диапазон не перекрывается с :emoji_XXXX:
|
||||
val overlaps = emojiMatches.any {
|
||||
(start >= it.start && start < it.end) ||
|
||||
(end > it.start && end <= it.end)
|
||||
}
|
||||
if (!overlaps) {
|
||||
emojiMatches.add(EmojiMatch(start, end, emojiToUnified(emoji), false))
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Обрабатываем все найденные эмодзи
|
||||
for (match in emojiMatches) {
|
||||
val start = match.start
|
||||
val end = match.end
|
||||
|
||||
// Проверяем, есть ли уже ImageSpan
|
||||
val existingSpans = editable.getSpans(start, end, ImageSpan::class.java)
|
||||
if (existingSpans.isNotEmpty()) continue
|
||||
|
||||
val unified = emojiToUnified(emoji)
|
||||
val unified = match.unified
|
||||
var drawable = drawableCache.get(unified)
|
||||
|
||||
if (drawable == null) {
|
||||
|
||||
@@ -522,7 +522,8 @@ fun EmojiButton(
|
||||
interactionSource = interactionSource,
|
||||
indication = null
|
||||
) {
|
||||
onClick(unifiedToEmoji(unified))
|
||||
// 🔥 Отправляем эмодзи в формате :emoji_code: как в десктопе
|
||||
onClick(":emoji_$unified:")
|
||||
},
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
|
||||
@@ -391,7 +391,8 @@ private fun OptimizedEmojiButton(
|
||||
indication = null, // 🚀 Убираем ripple
|
||||
onClickLabel = "Select emoji"
|
||||
) {
|
||||
onClick(unifiedToEmoji(unified))
|
||||
// 🔥 Отправляем эмодзи в формате :emoji_code: как в десктопе
|
||||
onClick(":emoji_$unified:")
|
||||
},
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
|
||||
Reference in New Issue
Block a user