fix: update message logging format for consistency and clarity

This commit is contained in:
2026-02-06 02:01:03 +05:00
parent c455994224
commit 3a810d6d61
10 changed files with 393 additions and 125 deletions

View File

@@ -17,7 +17,9 @@ import android.text.style.ImageSpan
import android.util.AttributeSet
import android.util.LruCache
import android.util.Patterns
import android.view.GestureDetector
import android.view.Gravity
import android.view.MotionEvent
import android.view.View
import android.view.inputmethod.EditorInfo
import android.widget.EditText
@@ -325,7 +327,8 @@ fun AppleEmojiText(
maxLines: Int = Int.MAX_VALUE,
overflow: android.text.TextUtils.TruncateAt? = null,
linkColor: androidx.compose.ui.graphics.Color = androidx.compose.ui.graphics.Color(0xFF54A9EB), // Telegram-style blue
enableLinks: Boolean = true // 🔥 Включить кликабельные ссылки
enableLinks: Boolean = true, // 🔥 Включить кликабельные ссылки
onLongClick: (() -> Unit)? = null // 🔥 Callback для long press (selection в MessageBubble)
) {
val fontSizeValue = if (fontSize == androidx.compose.ui.unit.TextUnit.Unspecified) 15f
else fontSize.value
@@ -355,10 +358,13 @@ fun AppleEmojiText(
if (overflow != null) {
ellipsize = overflow
}
// 🔥 Включаем кликабельные ссылки
// 🔥 Включаем кликабельные ссылки с поддержкой long press
if (enableLinks) {
setLinkColor(linkColor.toArgb())
enableClickableLinks(true)
enableClickableLinks(true, onLongClick)
} else {
// 🔥 Даже без ссылок поддерживаем long press
onLongClickCallback = onLongClick
}
}
},
@@ -371,10 +377,13 @@ fun AppleEmojiText(
if (overflow != null) {
view.ellipsize = overflow
}
// 🔥 Обновляем настройки ссылок
// 🔥 Обновляем настройки ссылок с поддержкой long press
if (enableLinks) {
view.setLinkColor(linkColor.toArgb())
view.enableClickableLinks(true)
view.enableClickableLinks(true, onLongClick)
} else {
// 🔥 Даже без ссылок поддерживаем long press
view.onLongClickCallback = onLongClick
}
},
modifier = modifier
@@ -415,11 +424,32 @@ class AppleEmojiTextView @JvmOverloads constructor(
private var linkColorValue: Int = 0xFF54A9EB.toInt() // Default Telegram blue
private var linksEnabled: Boolean = false
// 🔥 Long press callback для selection в MessageBubble
var onLongClickCallback: (() -> Unit)? = null
// 🔥 GestureDetector для обработки long press поверх LinkMovementMethod
private val gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onLongPress(e: MotionEvent) {
onLongClickCallback?.invoke()
}
})
init {
// Отключаем лишние отступы шрифта для корректного отображения emoji
includeFontPadding = false
}
/**
* 🔥 Перехватываем touch события для обработки long press
* GestureDetector обрабатывает long press, затем передаем событие parent для ссылок
*/
override fun dispatchTouchEvent(event: MotionEvent): Boolean {
// Позволяем GestureDetector обработать событие (для long press)
gestureDetector.onTouchEvent(event)
// Передаем событие дальше для обработки ссылок
return super.dispatchTouchEvent(event)
}
/**
* 🔥 Установить цвет для ссылок
*/
@@ -429,9 +459,12 @@ class AppleEmojiTextView @JvmOverloads constructor(
/**
* 🔥 Включить/выключить кликабельные ссылки
* @param enable - включить ссылки
* @param onLongClick - callback для long press (для selection в MessageBubble)
*/
fun enableClickableLinks(enable: Boolean) {
fun enableClickableLinks(enable: Boolean, onLongClick: (() -> Unit)? = null) {
linksEnabled = enable
onLongClickCallback = onLongClick
if (enable) {
movementMethod = LinkMovementMethod.getInstance()
// Убираем highlight при клике

View File

@@ -76,8 +76,8 @@ fun AvatarImage(
var bitmap by remember { mutableStateOf<Bitmap?>(null) }
// 🔥 FIX: Декодируем только когда avatarKey (timestamp) реально изменился
// НЕ сбрасываем bitmap в null - показываем старый пока грузится новый
LaunchedEffect(avatarKey) {
// Сбрасываем bitmap в null ТОЛЬКО когда аватар удалён (avatars пустой)
LaunchedEffect(avatarKey, avatars.isEmpty()) {
val currentAvatars = avatars
if (currentAvatars.isNotEmpty()) {
val newBitmap = withContext(Dispatchers.IO) {
@@ -87,9 +87,10 @@ fun AvatarImage(
if (newBitmap != null) {
bitmap = newBitmap
}
} else {
// 🔥 FIX: Если аватары удалены - сбрасываем bitmap чтобы показался placeholder
bitmap = null
}
// Если avatars пустой - НЕ сбрасываем bitmap в null
// Placeholder покажется через условие bitmap == null ниже
}
Box(