feat: Add delivery confirmation for incoming messages in ProtocolManager

This commit is contained in:
k1ngsterr1
2026-01-12 14:47:36 +05:00
parent a7976c7cf3
commit 99121ce996
11 changed files with 413 additions and 153 deletions

View File

@@ -0,0 +1,105 @@
package com.rosetta.messenger.ui.components
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.airbnb.lottie.compose.*
/**
* Компонент для отображения анимированных эмодзи Telegram в формате TGS
*
* TGS - это Lottie анимации (JSON), сжатые через gzip.
* Библиотека Lottie автоматически распаковывает и проигрывает их.
*
* @param tgsFileName Имя файла из папки assets/emoji (например: "5431456783947234.tgs")
* @param modifier Модификатор для кастомизации размера и других параметров
* @param size Размер эмодзи (по умолчанию 32.dp)
* @param iterations Количество повторений анимации (LottieConstants.IterateForever для бесконечного)
* @param speed Скорость воспроизведения анимации (1.0f = нормальная скорость)
*/
@Composable
fun TelegramAnimatedEmoji(
tgsFileName: String,
modifier: Modifier = Modifier,
size: Dp = 32.dp,
iterations: Int = LottieConstants.IterateForever,
speed: Float = 1.0f
) {
// Путь к файлу в assets/emoji/
val animationPath = "emoji/$tgsFileName"
// Загружаем анимацию из assets
val composition by rememberLottieComposition(
LottieCompositionSpec.Asset(animationPath)
)
// Настраиваем воспроизведение
val progress by animateLottieCompositionAsState(
composition = composition,
iterations = iterations,
speed = speed,
restartOnPlay = true
)
// Отображаем Lottie анимацию
LottieAnimation(
composition = composition,
progress = { progress },
modifier = modifier.size(size)
)
}
/**
* Упрощенный вариант для быстрого использования с ID документа
*
* @param documentId ID документа из Telegram (например: 5431456783947234)
*/
@Composable
fun TelegramAnimatedEmojiById(
documentId: Long,
modifier: Modifier = Modifier,
size: Dp = 32.dp
) {
TelegramAnimatedEmoji(
tgsFileName = "$documentId.tgs",
modifier = modifier,
size = size
)
}
/**
* Вариант с возможностью остановки/запуска анимации
*
* @param isPlaying Управление воспроизведением анимации
*/
@Composable
fun TelegramAnimatedEmojiPlayable(
tgsFileName: String,
isPlaying: Boolean = true,
modifier: Modifier = Modifier,
size: Dp = 32.dp,
speed: Float = 1.0f
) {
val animationPath = "emoji/$tgsFileName"
val composition by rememberLottieComposition(
LottieCompositionSpec.Asset(animationPath)
)
val progress by animateLottieCompositionAsState(
composition = composition,
isPlaying = isPlaying,
iterations = LottieConstants.IterateForever,
speed = speed,
restartOnPlay = true
)
LottieAnimation(
composition = composition,
progress = { progress },
modifier = modifier.size(size)
)
}