diff --git a/app/src/main/java/no/naiv/tiltshift/camera/CameraManager.kt b/app/src/main/java/no/naiv/tiltshift/camera/CameraManager.kt index ec5ff15..921c0cd 100644 --- a/app/src/main/java/no/naiv/tiltshift/camera/CameraManager.kt +++ b/app/src/main/java/no/naiv/tiltshift/camera/CameraManager.kt @@ -12,6 +12,7 @@ import androidx.camera.core.Preview import androidx.camera.core.SurfaceRequest import androidx.camera.core.resolutionselector.AspectRatioStrategy import androidx.camera.core.resolutionselector.ResolutionSelector +import androidx.camera.core.resolutionselector.ResolutionStrategy import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import androidx.lifecycle.LifecycleOwner @@ -37,6 +38,20 @@ class CameraManager(private val context: Context) { val lensController = LensController() + private val _useHighResCapture = MutableStateFlow(false) + val useHighResCapture: StateFlow = _useHighResCapture.asStateFlow() + + /** + * Toggles between CameraX default resolution and highest available. + * Rebinds camera use cases to apply the change. + */ + fun setHighResCapture(enabled: Boolean) { + if (_useHighResCapture.value != enabled) { + _useHighResCapture.value = enabled + lifecycleOwnerRef?.let { bindCameraUseCases(it) } + } + } + private val _error = MutableStateFlow(null) val error: StateFlow = _error.asStateFlow() @@ -94,10 +109,18 @@ class CameraManager(private val context: Context) { .setResolutionSelector(resolutionSelector) .build() - // Image capture use case for high-res photos - imageCapture = ImageCapture.Builder() + // Image capture use case + val captureBuilder = ImageCapture.Builder() .setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY) - .build() + + if (_useHighResCapture.value) { + val captureResolutionSelector = ResolutionSelector.Builder() + .setResolutionStrategy(ResolutionStrategy.HIGHEST_AVAILABLE_STRATEGY) + .build() + captureBuilder.setResolutionSelector(captureResolutionSelector) + } + + imageCapture = captureBuilder.build() // Select camera based on front/back preference val cameraSelector = if (_isFrontCamera.value) {