diff --git a/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatScreen.kt b/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatScreen.kt index a1c0fd9..4055545 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatScreen.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatScreen.kt @@ -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) }, ) }