Релиз 1.2.9: fullscreen фото edge-to-edge без черных бордеров
Some checks failed
Android Kernel Build / build (push) Failing after 9m58s
Some checks failed
Android Kernel Build / build (push) Failing after 9m58s
This commit is contained in:
@@ -23,8 +23,8 @@ val gitShortSha = safeGitOutput("rev-parse", "--short", "HEAD") ?: "unknown"
|
|||||||
// ═══════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════
|
||||||
// Rosetta versioning — bump here on each release
|
// Rosetta versioning — bump here on each release
|
||||||
// ═══════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════
|
||||||
val rosettaVersionName = "1.2.8"
|
val rosettaVersionName = "1.2.9"
|
||||||
val rosettaVersionCode = 30 // Increment on each release
|
val rosettaVersionCode = 31 // Increment on each release
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "com.rosetta.messenger"
|
namespace = "com.rosetta.messenger"
|
||||||
|
|||||||
@@ -17,20 +17,10 @@ object ReleaseNotes {
|
|||||||
val RELEASE_NOTICE = """
|
val RELEASE_NOTICE = """
|
||||||
Update v$VERSION_PLACEHOLDER
|
Update v$VERSION_PLACEHOLDER
|
||||||
|
|
||||||
Emoji и совместимость iOS
|
|
||||||
- Входящие Unicode-эмодзи теперь стабильно рендерятся как наши Apple Emoji
|
|
||||||
- Поддержаны составные эмодзи (ZWJ), флаги, keycap и тон кожи
|
|
||||||
- Добавлена нормализация и fallback-резолв emoji asset кодов (fe0f/fe0e и вариации unified)
|
|
||||||
|
|
||||||
Стабильность
|
|
||||||
- Исправлен краш при вводе обычного текста/пароля в полях после обновления emoji-резолвера
|
|
||||||
|
|
||||||
Профиль и визуал
|
|
||||||
- Сделан чуть более тёмный blur-фон за аватаркой в экране чужого профиля для лучшей читаемости
|
|
||||||
|
|
||||||
Полноэкранный просмотр фото
|
Полноэкранный просмотр фото
|
||||||
- Добавлено kebab-меню в fullscreen фото с действием Save to Gallery
|
- Убраны лишние искусственные отступы в fullscreen viewer
|
||||||
- Исправлено перекрытие системных чёрных зон: большие фото теперь корректно адаптируются во вьюпорте
|
- Фото (включая большие скриншоты) снова открываются edge-to-edge, как в Telegram
|
||||||
|
- Исправлены большие чёрные бордеры вокруг изображения при открытии
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
|
|
||||||
fun getNotice(version: String): String =
|
fun getNotice(version: String): String =
|
||||||
|
|||||||
@@ -339,14 +339,7 @@ fun ImageViewerScreen(
|
|||||||
|
|
||||||
// Current image info
|
// Current image info
|
||||||
val currentImage = images.getOrNull(pagerState.currentPage)
|
val currentImage = images.getOrNull(pagerState.currentPage)
|
||||||
val currentCaption = currentImage?.caption ?: ""
|
|
||||||
val dateFormat = remember { SimpleDateFormat("d MMMM, HH:mm", Locale.getDefault()) }
|
val dateFormat = remember { SimpleDateFormat("d MMMM, HH:mm", Locale.getDefault()) }
|
||||||
val statusBarsTopInset = WindowInsets.statusBars.asPaddingValues().calculateTopPadding()
|
|
||||||
val navigationBarBottomInset = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()
|
|
||||||
// Reserve space for top controls + bottom area so large images never overlap black UI zones.
|
|
||||||
val imageViewportTopInset = statusBarsTopInset + 64.dp
|
|
||||||
val imageViewportBottomInset =
|
|
||||||
navigationBarBottomInset + if (currentCaption.isNotEmpty()) 84.dp else 16.dp
|
|
||||||
|
|
||||||
// Prefetch ближайших изображений, чтобы при свайпе не было спиннера.
|
// Prefetch ближайших изображений, чтобы при свайпе не было спиннера.
|
||||||
LaunchedEffect(pagerState.currentPage, images, privateKey) {
|
LaunchedEffect(pagerState.currentPage, images, privateKey) {
|
||||||
@@ -389,7 +382,6 @@ fun ImageViewerScreen(
|
|||||||
state = pagerState,
|
state = pagerState,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
.padding(top = imageViewportTopInset, bottom = imageViewportBottomInset)
|
|
||||||
.graphicsLayer {
|
.graphicsLayer {
|
||||||
alpha = dismissAlpha.value * edgeTapFadeAlpha.value
|
alpha = dismissAlpha.value * edgeTapFadeAlpha.value
|
||||||
translationY = animatedOffsetY.value
|
translationY = animatedOffsetY.value
|
||||||
@@ -641,6 +633,7 @@ fun ImageViewerScreen(
|
|||||||
// ═══════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════
|
||||||
// 📝 CAPTION BAR - Telegram-style снизу с анимацией
|
// 📝 CAPTION BAR - Telegram-style снизу с анимацией
|
||||||
// ═══════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════
|
||||||
|
val currentCaption = currentImage?.caption ?: ""
|
||||||
if (currentCaption.isNotEmpty()) {
|
if (currentCaption.isNotEmpty()) {
|
||||||
AnimatedVisibility(
|
AnimatedVisibility(
|
||||||
visible = showControls && animationState == 1 && !isClosing,
|
visible = showControls && animationState == 1 && !isClosing,
|
||||||
|
|||||||
Reference in New Issue
Block a user