From 9db2085ed13cc7bd8955321703afe8eb5caf9212 Mon Sep 17 00:00:00 2001 From: Giorgos Papadopoulos Date: Tue, 19 Oct 2021 12:29:36 +0200 Subject: [PATCH 1/2] allow the user to focus on touch --- .../rijksoverheid/ctr/qrscanner/PreviewExt.kt | 48 +++++++++++++++++++ .../ctr/qrscanner/QrCodeScannerFragment.kt | 3 ++ 2 files changed, 51 insertions(+) create mode 100644 qrscanner/src/main/java/nl/rijksoverheid/ctr/qrscanner/PreviewExt.kt 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..cc7888c5d 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,7 @@ abstract class QrCodeScannerFragment : Fragment(R.layout.fragment_scanner) { cameraSelector, cameraPreview ).also { camera -> + previewView.focusOnTouch(camera.cameraControl) // If device supports flash, enable flash functionality if (camera.cameraInfo.hasFlashUnit()) { binding.toolbar.menu.findItem(R.id.flash)?.let { flashItem -> From d7d27bfee3b06f6fb964f357ce455e6765bcfc7f Mon Sep 17 00:00:00 2001 From: Giorgos Papadopoulos Date: Wed, 3 Nov 2021 14:38:28 +0100 Subject: [PATCH 2/2] experiment with tap on screen camera focus --- .../nl/rijksoverheid/ctr/qrscanner/QrCodeScannerFragment.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 cc7888c5d..b68ceded4 100644 --- a/qrscanner/src/main/java/nl/rijksoverheid/ctr/qrscanner/QrCodeScannerFragment.kt +++ b/qrscanner/src/main/java/nl/rijksoverheid/ctr/qrscanner/QrCodeScannerFragment.kt @@ -226,7 +226,11 @@ abstract class QrCodeScannerFragment : Fragment(R.layout.fragment_scanner) { cameraSelector, cameraPreview ).also { camera -> - previewView.focusOnTouch(camera.cameraControl) + 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 ->