fix: restore media viewer swipe navigation
Some checks failed
Android CI / android (push) Failing after 5m9s
Android Release / release (push) Has started running
CI / test (push) Has been cancelled

Let the gallery pager keep single-finger horizontal swipes for images.

Disable native PlayerView controls in the video viewer so video pages no longer steal paging gestures.

Switch the ChatScreen file-level Media3 marker to the correct UnstableApi annotation.
This commit is contained in:
2026-04-05 19:48:02 +03:00
parent eb643ad3d2
commit f012733df3

View File

@@ -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
}
},