From 18a4289b961c53589d618164ecc46fb25677d661 Mon Sep 17 00:00:00 2001 From: Ole-Morten Duesund Date: Thu, 5 Mar 2026 11:56:03 +0100 Subject: [PATCH] Harden CameraManager error handling - Catch SecurityException separately with permission-specific message - Replace raw e.message with generic user-friendly error strings - Wrap cameraProviderFuture.get() in try-catch to handle CameraX initialization failures instead of crashing Co-Authored-By: Claude Opus 4.6 --- .../no/naiv/tiltshift/camera/CameraManager.kt | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) 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 b2d4e6c..3717693 100644 --- a/app/src/main/java/no/naiv/tiltshift/camera/CameraManager.kt +++ b/app/src/main/java/no/naiv/tiltshift/camera/CameraManager.kt @@ -73,9 +73,14 @@ class CameraManager(private val context: Context) { val cameraProviderFuture = ProcessCameraProvider.getInstance(context) cameraProviderFuture.addListener({ - cameraProvider = cameraProviderFuture.get() - lensController.initialize(cameraProvider?.availableCameraInfos ?: emptyList()) - bindCameraUseCases(lifecycleOwner) + try { + cameraProvider = cameraProviderFuture.get() + lensController.initialize(cameraProvider?.availableCameraInfos ?: emptyList()) + bindCameraUseCases(lifecycleOwner) + } catch (e: Exception) { + Log.e(TAG, "CameraX initialization failed", e) + _error.value = "Camera could not initialize. Please restart the app." + } }, ContextCompat.getMainExecutor(context)) } @@ -129,9 +134,12 @@ class CameraManager(private val context: Context) { provideSurface(request) } + } catch (e: SecurityException) { + Log.e(TAG, "Camera permission denied at runtime", e) + _error.value = "Camera permission was revoked. Please grant it in Settings." } catch (e: Exception) { Log.e(TAG, "Camera binding failed", e) - _error.value = "Camera failed: ${e.message}" + _error.value = "Camera could not start. Please try again or restart the app." } }