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 47c699b..9115e39 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 @@ -1,4 +1,4 @@ -@file:OptIn(UnstableApi::class) +@file:UnstableApi package ru.daemonlord.messenger.ui.chat @@ -25,6 +25,8 @@ import androidx.compose.foundation.gestures.detectTransformGestures import androidx.compose.foundation.gestures.detectVerticalDragGestures import androidx.compose.foundation.gestures.awaitEachGesture import androidx.compose.foundation.gestures.awaitFirstDown +import androidx.compose.foundation.gestures.calculatePan +import androidx.compose.foundation.gestures.calculateZoom import androidx.compose.foundation.gestures.waitForUpOrCancellation import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height @@ -2331,14 +2333,30 @@ private fun ZoomableImageViewerPage( Box( modifier = Modifier .fillMaxSize() - .pointerInput(imageUrl) { - detectTransformGestures { _, pan, zoom, _ -> - val nextScale = (scale * zoom).coerceIn(1f, 4f) - scale = nextScale - offset = if (nextScale <= 1.02f) { - Offset.Zero - } else { - offset + pan + .pointerInput(imageUrl, scale) { + awaitEachGesture { + awaitFirstDown(requireUnconsumed = false) + var gestureHandled = false + do { + val event = awaitPointerEvent() + val pointerCount = event.changes.count { it.pressed } + val zoomChange = event.calculateZoom() + val panChange = event.calculatePan() + val shouldTransform = pointerCount > 1 || scale > 1.02f + if (shouldTransform && (zoomChange != 1f || panChange != Offset.Zero)) { + val nextScale = (scale * zoomChange).coerceIn(1f, 4f) + scale = nextScale + offset = if (nextScale <= 1.02f) { + Offset.Zero + } else { + offset + panChange + } + event.changes.forEach { if (it.pressed) it.consume() } + gestureHandled = true + } + } while (event.changes.any { it.pressed }) + if (!gestureHandled && scale <= 1.02f) { + offset = Offset.Zero } } } @@ -2439,10 +2457,8 @@ private fun VideoViewerPage( AndroidView( factory = { androidContext -> PlayerView(androidContext).apply { - useController = true + useController = false resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT - controllerAutoShow = true - controllerHideOnTouch = false player = playerState.player } },