Skip to content

Commit

Permalink
feat: Implement focusInCameraCoordinates in Android as well
Browse files Browse the repository at this point in the history
  • Loading branch information
mrousavy committed Jul 25, 2024
1 parent 5b9c4b0 commit ea376ea
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -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<CoordinateSystem> {
override fun fromUnionValue(unionValue: String?): CoordinateSystem =
when (unionValue) {
"preview-view" -> PREVIEW_VIEW
"camera" -> CAMERA
else -> throw InvalidTypeScriptUnionError("coordinateSystem", unionValue)
}
}
}
Original file line number Diff line number Diff line change
@@ -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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
}
}
Expand Down
2 changes: 1 addition & 1 deletion package/ios/React/CameraView+Focus.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion package/ios/React/CameraViewManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ final class CameraViewManager: RCTViewManager {

Check failure on line 107 in package/ios/React/CameraViewManager.swift

View workflow job for this annotation

GitHub Actions / SwiftLint

Trailing Whitespace Violation: Lines should not have trailing whitespace (trailing_whitespace)
switch coordinateSystem {
case .previewView:
component.focus(pointInPreviewView: point, promise: promise)
component.focus(pointInPreviewViewCoordinates: point, promise: promise)
case .camera:
component.focus(pointInCameraCoordinates: point, promise: promise)
}
Expand Down

0 comments on commit ea376ea

Please sign in to comment.