fix: update message logging format for consistency and clarity
This commit is contained in:
@@ -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 при клике
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user