feat: add interactive swipe-down fade to media viewer
Some checks failed
Android CI / android (push) Failing after 4m24s
Android Release / release (push) Has started running
CI / test (push) Has been cancelled

This commit is contained in:
2026-04-06 01:45:52 +03:00
parent cde92eb28b
commit 37d8c0c82f

View File

@@ -2470,12 +2470,14 @@ private fun ChatMediaViewerOverlay(
items.size
}
var showTopBar by remember { mutableStateOf(true) }
var dismissProgress by remember { mutableStateOf(0f) }
val backgroundAlpha = (0.94f - (dismissProgress.coerceIn(0f, 1f) * 0.55f)).coerceIn(0.35f, 0.94f)
Surface(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.scrim.copy(alpha = 0.82f)),
color = Color.Black.copy(alpha = 0.94f),
.background(MaterialTheme.colorScheme.scrim.copy(alpha = (0.82f - dismissProgress * 0.5f).coerceIn(0.18f, 0.82f))),
color = Color.Black.copy(alpha = backgroundAlpha),
) {
Column(
modifier = Modifier.fillMaxSize(),
@@ -2515,12 +2517,14 @@ private fun ChatMediaViewerOverlay(
imageUrl = item.url,
onDismiss = onDismiss,
onToggleChrome = { showTopBar = !showTopBar },
onDismissProgressChanged = { dismissProgress = it },
)
ChatViewerMediaType.Video -> VideoViewerPage(
videoUrl = item.url,
isCurrentPage = pagerState.currentPage == page,
onDismiss = onDismiss,
onToggleChrome = { showTopBar = !showTopBar },
onDismissProgressChanged = { dismissProgress = it },
)
}
}
@@ -2559,6 +2563,7 @@ private fun ChatMediaViewerOverlay(
}
LaunchedEffect(pagerState.currentPage) {
dismissProgress = 0f
onPageChanged(pagerState.currentPage)
}
}
@@ -2568,6 +2573,7 @@ private fun ZoomableImageViewerPage(
imageUrl: String,
onDismiss: () -> Unit,
onToggleChrome: () -> Unit,
onDismissProgressChanged: (Float) -> Unit,
) {
var scale by remember(imageUrl) { mutableStateOf(1f) }
var offset by remember(imageUrl) { mutableStateOf(Offset.Zero) }
@@ -2609,16 +2615,19 @@ private fun ZoomableImageViewerPage(
if (!canDismiss) return@detectVerticalDragGestures
change.consume()
dismissOffsetY += dragAmount
onDismissProgressChanged((kotlin.math.abs(dismissOffsetY) / 280f).coerceIn(0f, 1f))
},
onDragEnd = {
if (kotlin.math.abs(dismissOffsetY) > 180f) {
onDismiss()
} else {
dismissOffsetY = 0f
onDismissProgressChanged(0f)
}
},
onDragCancel = {
dismissOffsetY = 0f
onDismissProgressChanged(0f)
},
)
}
@@ -2661,6 +2670,7 @@ private fun VideoViewerPage(
isCurrentPage: Boolean,
onDismiss: () -> Unit,
onToggleChrome: () -> Unit,
onDismissProgressChanged: (Float) -> Unit,
) {
val playerState = rememberManagedMediaPlayerState(
url = videoUrl,
@@ -2683,16 +2693,19 @@ private fun VideoViewerPage(
onVerticalDrag = { change, dragAmount ->
change.consume()
dismissOffsetY += dragAmount
onDismissProgressChanged((kotlin.math.abs(dismissOffsetY) / 280f).coerceIn(0f, 1f))
},
onDragEnd = {
if (kotlin.math.abs(dismissOffsetY) > 180f) {
onDismiss()
} else {
dismissOffsetY = 0f
onDismissProgressChanged(0f)
}
},
onDragCancel = {
dismissOffsetY = 0f
onDismissProgressChanged(0f)
},
)
}