diff --git a/feature/camera/src/main/java/org/signal/camera/CameraScreen.kt b/feature/camera/src/main/java/org/signal/camera/CameraScreen.kt index 09bc42c058..cd45b9021c 100644 --- a/feature/camera/src/main/java/org/signal/camera/CameraScreen.kt +++ b/feature/camera/src/main/java/org/signal/camera/CameraScreen.kt @@ -4,6 +4,7 @@ import android.content.res.Configuration import androidx.camera.compose.CameraXViewfinder import androidx.camera.core.SurfaceRequest import androidx.camera.lifecycle.ProcessCameraProvider +import androidx.camera.viewfinder.compose.MutableCoordinateTransformer import androidx.camera.core.Preview as CameraPreview import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.Animatable @@ -132,8 +133,12 @@ fun CameraScreen( } ) } else if (surfaceRequest != null) { + val coordinateTransformer = remember { MutableCoordinateTransformer() } + val currentSurfaceRequest = surfaceRequest!! + CameraXViewfinder( - surfaceRequest = surfaceRequest!!, + surfaceRequest = currentSurfaceRequest, + coordinateTransformer = coordinateTransformer, modifier = Modifier .fillMaxSize() .clip(cornerShape) @@ -143,12 +148,15 @@ fun CameraScreen( emitter(CameraScreenEvents.SwitchCamera(context)) }, onTap = { offset -> + val surfaceCoords = with(coordinateTransformer) { offset.transform() } emitter( CameraScreenEvents.TapToFocus( - x = offset.x, - y = offset.y, - width = size.width.toFloat(), - height = size.height.toFloat() + viewX = offset.x, + viewY = offset.y, + surfaceX = surfaceCoords.x, + surfaceY = surfaceCoords.y, + surfaceWidth = currentSurfaceRequest.resolution.width.toFloat(), + surfaceHeight = currentSurfaceRequest.resolution.height.toFloat() ) ) } diff --git a/feature/camera/src/main/java/org/signal/camera/CameraScreenEvents.kt b/feature/camera/src/main/java/org/signal/camera/CameraScreenEvents.kt index 29b266efb9..5591a13d74 100644 --- a/feature/camera/src/main/java/org/signal/camera/CameraScreenEvents.kt +++ b/feature/camera/src/main/java/org/signal/camera/CameraScreenEvents.kt @@ -18,10 +18,12 @@ sealed interface CameraScreenEvents { /** Focuses the camera on a point. */ data class TapToFocus( - val x: Float, - val y: Float, - val width: Float, - val height: Float + val viewX: Float, + val viewY: Float, + val surfaceX: Float, + val surfaceY: Float, + val surfaceWidth: Float, + val surfaceHeight: Float ) : CameraScreenEvents /** Zoom that happens when you pinch your fingers. */ diff --git a/feature/camera/src/main/java/org/signal/camera/CameraScreenViewModel.kt b/feature/camera/src/main/java/org/signal/camera/CameraScreenViewModel.kt index bea556dd96..0d75fe5b3f 100644 --- a/feature/camera/src/main/java/org/signal/camera/CameraScreenViewModel.kt +++ b/feature/camera/src/main/java/org/signal/camera/CameraScreenViewModel.kt @@ -363,14 +363,14 @@ class CameraScreenViewModel : ViewModel() { ) { val currentCamera = camera ?: return - val factory = SurfaceOrientedMeteringPointFactory(event.width, event.height) - val point = factory.createPoint(event.x, event.y) + val factory = SurfaceOrientedMeteringPointFactory(event.surfaceWidth, event.surfaceHeight) + val point = factory.createPoint(event.surfaceX, event.surfaceY) val action = FocusMeteringAction.Builder(point).build() currentCamera.cameraControl.startFocusAndMetering(action) _state.value = state.copy( - focusPoint = Offset(event.x, event.y), + focusPoint = Offset(event.viewX, event.viewY), showFocusIndicator = true )