diff --git a/qrscanner/src/main/java/nl/rijksoverheid/ctr/qrscanner/PreviewExt.kt b/qrscanner/src/main/java/nl/rijksoverheid/ctr/qrscanner/PreviewExt.kt new file mode 100644 index 000000000..44557ed38 --- /dev/null +++ b/qrscanner/src/main/java/nl/rijksoverheid/ctr/qrscanner/PreviewExt.kt @@ -0,0 +1,48 @@ +package nl.rijksoverheid.ctr.qrscanner + +import android.annotation.SuppressLint +import android.view.MotionEvent +import android.view.ViewTreeObserver +import androidx.camera.core.* +import androidx.camera.view.PreviewView +import timber.log.Timber + +fun PreviewView.focusOnTouch(cameraControl: CameraControl) { + viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + @SuppressLint("ClickableViewAccessibility") + override fun onGlobalLayout() { + if (measuredWidth > 0 && measuredHeight > 0) { + viewTreeObserver.removeOnGlobalLayoutListener(this) + + setOnTouchListener { _, event -> + return@setOnTouchListener when (event.action) { + MotionEvent.ACTION_DOWN -> { + true + } + MotionEvent.ACTION_UP -> { + val factory: MeteringPointFactory = SurfaceOrientedMeteringPointFactory( + width.toFloat(), height.toFloat() + ) + val autoFocusPoint = factory.createPoint(event.x, event.y) + try { + cameraControl.startFocusAndMetering( + FocusMeteringAction.Builder( + autoFocusPoint, + FocusMeteringAction.FLAG_AF + ).apply { + // focus only when the user taps the preview + disableAutoCancel() + }.build() + ) + } catch (e: CameraInfoUnavailableException) { + Timber.d("ERROR", "cannot access camera", e) + } + true + } + else -> false // Unhandled event. + } + } + } + } + }) +} diff --git a/qrscanner/src/main/java/nl/rijksoverheid/ctr/qrscanner/QrCodeScannerFragment.kt b/qrscanner/src/main/java/nl/rijksoverheid/ctr/qrscanner/QrCodeScannerFragment.kt index 8376f7211..b68ceded4 100644 --- a/qrscanner/src/main/java/nl/rijksoverheid/ctr/qrscanner/QrCodeScannerFragment.kt +++ b/qrscanner/src/main/java/nl/rijksoverheid/ctr/qrscanner/QrCodeScannerFragment.kt @@ -15,7 +15,9 @@ import android.content.pm.PackageManager import android.graphics.Paint import android.os.Bundle import android.util.DisplayMetrics +import android.view.MotionEvent import android.view.View +import android.view.ViewTreeObserver import androidx.activity.result.contract.ActivityResultContracts import androidx.camera.core.* import androidx.camera.lifecycle.ProcessCameraProvider @@ -224,6 +226,11 @@ abstract class QrCodeScannerFragment : Fragment(R.layout.fragment_scanner) { cameraSelector, cameraPreview ).also { camera -> + try { + previewView.focusOnTouch(camera.cameraControl) + } catch (exception: Exception) { + Timber.e(exception) + } // If device supports flash, enable flash functionality if (camera.cameraInfo.hasFlashUnit()) { binding.toolbar.menu.findItem(R.id.flash)?.let { flashItem ->