diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java index 080d9c3e64..b51ea3ea34 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java @@ -377,10 +377,14 @@ public class CameraXFragment extends LoggingFragment implements CameraFragment { selfieFlash = requireView().findViewById(R.id.camera_selfie_flash); captureButton.setOnClickListener(v -> { - captureButton.setEnabled(false); - flipButton.setEnabled(false); - flashButton.setEnabled(false); - onCaptureClicked(); + if (cameraController.isInitialized()) { + captureButton.setEnabled(false); + flipButton.setEnabled(false); + flashButton.setEnabled(false); + onCaptureClicked(); + } else { + Log.i(TAG, "Camera capture button clicked but the camera controller is not yet initialized."); + } }); previewView.setScaleType(PREVIEW_SCALE_TYPE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXController.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXController.kt index a84eae6756..a2fe406498 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXController.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXController.kt @@ -27,6 +27,8 @@ import java.util.concurrent.Executor interface CameraXController { + fun isInitialized(): Boolean + fun initializeAndBind(context: Context, lifecycleOwner: LifecycleOwner) @RequiresPermission(Manifest.permission.CAMERA) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/PlatformCameraController.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/PlatformCameraController.kt index 0231d98ed0..9223160b2e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/PlatformCameraController.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/PlatformCameraController.kt @@ -31,6 +31,10 @@ import java.util.concurrent.Executor class PlatformCameraController(context: Context) : CameraXController { val delegate = LifecycleCameraController(context) + override fun isInitialized(): Boolean { + return delegate.initializationFuture.isDone + } + override fun initializeAndBind(context: Context, lifecycleOwner: LifecycleOwner) { delegate.bindToLifecycle(lifecycleOwner) delegate.setCameraSelector(CameraXUtil.toCameraSelector(TextSecurePreferences.getDirectCaptureCameraId(context))) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/SignalCameraController.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/SignalCameraController.kt index a99c2a8b0b..83dde1db0b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/SignalCameraController.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/SignalCameraController.kt @@ -110,6 +110,10 @@ class SignalCameraController( private lateinit var extensionsManager: ExtensionsManager private lateinit var cameraProperty: Camera + override fun isInitialized(): Boolean { + return this::cameraProvider.isInitialized && this::extensionsManager.isInitialized + } + override fun initializeAndBind(context: Context, lifecycleOwner: LifecycleOwner) { bindToLifecycle(lifecycleOwner) { Log.d(TAG, "Camera initialization and binding complete.") } } @@ -117,7 +121,7 @@ class SignalCameraController( @RequiresPermission(Manifest.permission.CAMERA) override fun bindToLifecycle(lifecycleOwner: LifecycleOwner, onCameraBoundListener: Runnable) { ThreadUtil.assertMainThread() - if (this::cameraProvider.isInitialized && this::extensionsManager.isInitialized) { + if (isInitialized()) { bindToLifecycleInternal() onCameraBoundListener.run() } else if (!listenerAdded) {