diff --git a/android/app/src/main/kotlin/com/run/sportsx/recording/RecordingCameraController.kt b/android/app/src/main/kotlin/com/run/sportsx/recording/RecordingCameraController.kt index 5bc2117..c13e93d 100644 --- a/android/app/src/main/kotlin/com/run/sportsx/recording/RecordingCameraController.kt +++ b/android/app/src/main/kotlin/com/run/sportsx/recording/RecordingCameraController.kt @@ -11,6 +11,7 @@ import androidx.camera.camera2.interop.Camera2CameraInfo import androidx.camera.camera2.interop.CaptureRequestOptions import androidx.camera.camera2.interop.ExperimentalCamera2Interop import androidx.camera.core.Camera +import androidx.camera.core.CameraControl import androidx.camera.core.CameraSelector import androidx.camera.core.Preview import androidx.camera.lifecycle.ProcessCameraProvider @@ -24,6 +25,7 @@ import androidx.camera.view.PreviewView import androidx.core.content.ContextCompat import androidx.lifecycle.LifecycleOwner import java.util.concurrent.Executor +import java.util.concurrent.ExecutionException import kotlin.math.atan import kotlin.math.round @@ -247,7 +249,7 @@ class RecordingCameraController( if (currentLensMode == LensMode.ULTRA_WIDE) { ultraWideZoomRatio } else { - (zoomState?.zoomRatio ?: currentZoomRatio).coerceIn(minZoom, maxZoom) + currentZoomRatio.coerceIn(minZoom, maxZoom) } currentZoomRatio = zoom Log.d( @@ -313,8 +315,17 @@ class RecordingCameraController( { try { future.get() - onComplete(true, zoomCapabilitiesMap(), null) + val capabilities = zoomCapabilitiesMap() + logSetZoomResult(ratio, nextZoom, capabilities) + onComplete(true, capabilities, null) } catch (error: Exception) { + if (isSupersededCamera2ZoomRequest(error)) { + Log.d(TAG, "setZoomRatio superseded by newer Camera2 options") + val capabilities = zoomCapabilitiesMap() + logSetZoomResult(ratio, nextZoom, capabilities) + onComplete(true, capabilities, null) + return@addListener + } Log.e(TAG, "setZoomRatio failed", error) onComplete(false, zoomCapabilitiesMap(), error.message) } @@ -706,6 +717,29 @@ class RecordingCameraController( .build(), ) + private fun isSupersededCamera2ZoomRequest(error: Exception): Boolean { + val cause = + if (error is ExecutionException) { + error.cause + } else { + error + } + return cause is CameraControl.OperationCanceledException && + cause.message?.contains("updated with new options") == true + } + + private fun logSetZoomResult( + requestedRatio: Double, + nextZoom: Float, + capabilities: Map, + ) { + Log.d( + TAG, + "setZoomRatio result requestedRatio=$requestedRatio nextZoom=$nextZoom " + + "currentZoomRatio=$currentZoomRatio returnedZoom=${capabilities["zoomRatio"]}", + ) + } + private fun selectorForCurrentLensMode(): CameraSelector { val cameraId = if (currentLensMode == LensMode.ULTRA_WIDE) {