Merge branch 'master' into dev

This commit is contained in:
2026-04-16 03:36:17 +05:00
4 changed files with 26 additions and 13 deletions

View File

@@ -23,8 +23,8 @@ val gitShortSha = safeGitOutput("rev-parse", "--short", "HEAD") ?: "unknown"
// ═══════════════════════════════════════════════════════════
// Rosetta versioning — bump here on each release
// ═══════════════════════════════════════════════════════════
val rosettaVersionName = "1.5.0"
val rosettaVersionCode = 52 // Increment on each release
val rosettaVersionName = "1.5.1"
val rosettaVersionCode = 53 // Increment on each release
val customWebRtcAar = file("libs/libwebrtc-custom.aar")
android {

View File

@@ -17,12 +17,22 @@ object ReleaseNotes {
val RELEASE_NOTICE = """
Update v$VERSION_PLACEHOLDER
- Исправлена расшифровка фото в группах (совместимость с Desktop v1.2.1)
- Исправлен статус доставки: галочки больше не откатываются на часики
- Исправлен просмотр фото из медиа-галереи профиля
- Зашифрованные ключи больше не отображаются как подпись к фото
- Анимация удаления сообщений (плавное сжатие + fade)
- Фильтрация пустых push-уведомлений
- Полностью переработан UX записи голосовых: удержание для записи, отправка по отпусканию, Slide to cancel
- Пересобрана панель записи ГС в Telegram-style с новым layout, волнами и анимациями
- Добавлена и доработана анимация удаления ГС (корзина), устранены рывки и визуальные артефакты
- Исправлены зависания/ANR при записи и отмене голосовых (race-condition, stuck-состояния, watchdog-сценарии)
- Исправлены скачки и наложения input-панели во время записи (включая Type message/overlay конфликты)
- Добавлены улучшения плеера голосовых: мини-плеер, интеграция в чат, корректная работа скоростей
- В чат-листе улучшено отображение и поведение активного воспроизведения голосовых
- Добавлена и отшлифована система выделения текста: handles, magnifier, toolbar (Copy/Select All), haptic
- Исправлены координаты и стабильность выделения текста в сложных сценариях
- Исправлена обработка reply в группах с Desktop (fallback на hex-ключ для reply blob)
- Оптимизированы тяжелые UI-сценарии: prewarm для circular reveal, ускорена анимация онбординга
- Улучшены миниатюры медиа через BlurHash и стабильность загрузки вложений
- Доработан экран звонков и related UI (включая пустой экран с Lottie-анимацией)
- Доработаны элементы профиля и сайдбара (включая обновления аккаунт-блока и действий)
- Добавлена смена иконки приложения (калькулятор, погода, заметки) через настройки
- Выполнен большой пакет фиксов по чатам/звонкам/коннекту и визуальному паритету с Telegram
""".trimIndent()
fun getNotice(version: String): String =

View File

@@ -1098,8 +1098,8 @@ fun ChatsListScreen(
exit = shrinkVertically(animationSpec = tween(250)) + fadeOut(animationSpec = tween(200))
) {
Column(modifier = Modifier.fillMaxWidth()) {
// All accounts list (max 5 like Telegram sidebar behavior)
allAccounts.take(5).forEach { account ->
// All accounts list (limit to 3 in expanded sidebar)
allAccounts.take(3).forEach { account ->
val isCurrentAccount =
account.publicKey ==
effectiveCurrentPublicKey

View File

@@ -2285,6 +2285,7 @@ fun MessageInputBar(
}
}
androidx.compose.animation.AnimatedVisibility(
modifier = Modifier.graphicsLayer { clip = false },
visibleState = recordingPanelTransitionState,
// Telegram-like smooth dissolve without any vertical resize.
enter = fadeIn(tween(durationMillis = 170, easing = LinearOutSlowInEasing)),
@@ -2300,9 +2301,11 @@ fun MessageInputBar(
// Telegram-like proportions: large button that does not dominate the panel.
val recordingActionVisualScale = 1.42f // 40dp -> ~57dp visual size
val recordingActionInset = 34.dp
// Keep the scaled circle fully on-screen (no right-edge clipping).
val recordingActionOverflowX = 0.dp
val recordingActionOverflowY = 0.dp
// Keep scaled circle safely inside screen bounds (right/bottom).
val recordingActionVisualOverflow =
(recordingActionButtonBaseSize * (recordingActionVisualScale - 1f)) / 2f
val recordingActionOverflowX = -recordingActionVisualOverflow + 2.dp
val recordingActionOverflowY = -recordingActionVisualOverflow + 2.dp
val voiceLevel = remember(voiceWaves) { voiceWaves.lastOrNull() ?: 0f }
val cancelAnimProgress by animateFloatAsState(
targetValue = if (isVoiceCancelAnimating || holdCancelVisualUntilHidden) 1f else 0f,