diff --git a/package/android/src/main/java/com/mrousavy/camera/core/types/CoordinateSystem.kt b/package/android/src/main/java/com/mrousavy/camera/core/types/CoordinateSystem.kt new file mode 100644 index 0000000000..26aafbf00e --- /dev/null +++ b/package/android/src/main/java/com/mrousavy/camera/core/types/CoordinateSystem.kt @@ -0,0 +1,17 @@ +package com.mrousavy.camera.core.types + +import com.mrousavy.camera.core.InvalidTypeScriptUnionError + +enum class CoordinateSystem(override val unionValue: String) : JSUnionValue { + PREVIEW_VIEW("preview-view"), + CAMERA("camera"); + + companion object : JSUnionValue.Companion { + override fun fromUnionValue(unionValue: String?): CoordinateSystem = + when (unionValue) { + "preview-view" -> PREVIEW_VIEW + "camera" -> CAMERA + else -> throw InvalidTypeScriptUnionError("coordinateSystem", unionValue) + } + } +} diff --git a/package/android/src/main/java/com/mrousavy/camera/react/CameraView+Focus.kt b/package/android/src/main/java/com/mrousavy/camera/react/CameraView+Focus.kt index a9d568309a..58d109ffe9 100644 --- a/package/android/src/main/java/com/mrousavy/camera/react/CameraView+Focus.kt +++ b/package/android/src/main/java/com/mrousavy/camera/react/CameraView+Focus.kt @@ -1,19 +1,24 @@ package com.mrousavy.camera.react import android.content.res.Resources +import androidx.camera.core.SurfaceOrientedMeteringPointFactory import com.facebook.react.bridge.ReadableMap import com.mrousavy.camera.core.FocusRequiresPreviewError import com.mrousavy.camera.core.focus import com.mrousavy.camera.core.utils.runOnUiThreadAndWait -suspend fun CameraView.focus(pointMap: ReadableMap) { - val x = pointMap.getDouble("x") - val y = pointMap.getDouble("y") +suspend fun CameraView.focusInPreviewViewCoordinates(x: Float, y: Float) { val previewView = previewView ?: throw FocusRequiresPreviewError() val point = runOnUiThreadAndWait { val dp = Resources.getSystem().displayMetrics.density - previewView.meteringPointFactory.createPoint(x.toFloat() * dp, y.toFloat() * dp) + previewView.meteringPointFactory.createPoint(x * dp, y * dp) } cameraSession.focus(point) } + +suspend fun CameraView.focusInCameraCoordinates(x: Float, y: Float) { + val factory = SurfaceOrientedMeteringPointFactory(1f, 1f) + val point = factory.createPoint(x, y) + cameraSession.focus(point) +} diff --git a/package/android/src/main/java/com/mrousavy/camera/react/CameraViewModule.kt b/package/android/src/main/java/com/mrousavy/camera/react/CameraViewModule.kt index 6e0206555c..cd935b8276 100644 --- a/package/android/src/main/java/com/mrousavy/camera/react/CameraViewModule.kt +++ b/package/android/src/main/java/com/mrousavy/camera/react/CameraViewModule.kt @@ -19,6 +19,7 @@ import com.mrousavy.camera.BuildConfig import com.mrousavy.camera.core.CameraError import com.mrousavy.camera.core.CameraQueues import com.mrousavy.camera.core.ViewNotFoundError +import com.mrousavy.camera.core.types.CoordinateSystem import com.mrousavy.camera.core.types.PermissionStatus import com.mrousavy.camera.core.types.RecordVideoOptions import com.mrousavy.camera.core.types.SnapshotOptions @@ -178,11 +179,17 @@ class CameraViewModule(reactContext: ReactApplicationContext) : ReactContextBase } @ReactMethod - fun focus(viewTag: Int, point: ReadableMap, promise: Promise) { + fun focus(viewTag: Int, focusOptions: ReadableMap, promise: Promise) { backgroundCoroutineScope.launch { val view = findCameraView(viewTag) withPromise(promise) { - view.focus(point) + val coordinateSystem = CoordinateSystem.fromUnionValue(focusOptions.getString("coordinateSystem")) + val x = focusOptions.getDouble("x").toFloat() + val y = focusOptions.getDouble("y").toFloat() + when (coordinateSystem) { + CoordinateSystem.PREVIEW_VIEW -> view.focusInPreviewViewCoordinates(x, y) + CoordinateSystem.CAMERA -> view.focusInCameraCoordinates(x, y) + } return@withPromise null } } diff --git a/package/ios/React/CameraView+Focus.swift b/package/ios/React/CameraView+Focus.swift index 0a7b47ba16..b970d886e1 100644 --- a/package/ios/React/CameraView+Focus.swift +++ b/package/ios/React/CameraView+Focus.swift @@ -10,7 +10,7 @@ import AVFoundation import Foundation extension CameraView { - func focus(pointInPreviewView point: CGPoint, promise: Promise) { + func focus(pointInPreviewViewCoordinates point: CGPoint, promise: Promise) { withPromise(promise) { guard let previewView = self.previewView else { throw CameraError.capture(.focusRequiresPreview) diff --git a/package/ios/React/CameraViewManager.swift b/package/ios/React/CameraViewManager.swift index b7f81e89f4..4cd7c1bdf9 100644 --- a/package/ios/React/CameraViewManager.swift +++ b/package/ios/React/CameraViewManager.swift @@ -107,7 +107,7 @@ final class CameraViewManager: RCTViewManager { switch coordinateSystem { case .previewView: - component.focus(pointInPreviewView: point, promise: promise) + component.focus(pointInPreviewViewCoordinates: point, promise: promise) case .camera: component.focus(pointInCameraCoordinates: point, promise: promise) }