package cash.z.android.wallet.ui.util.vision import android.graphics.Bitmap import android.util.Log import cash.z.android.wallet.ui.util.VisionProcessorBase import com.google.android.gms.tasks.Task import com.google.firebase.ml.vision.FirebaseVision import com.google.firebase.ml.vision.barcode.FirebaseVisionBarcode import com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector import com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetectorOptions import com.google.firebase.ml.vision.common.FirebaseVisionImage import java.io.IOException /** Barcode Detector Demo. */ class BarcodeScanningProcessor : VisionProcessorBase>() { // Note that if you know which format of barcode your app is dealing with, detection will be // faster to specify the supported barcode formats one by one, e.g. // FirebaseVisionBarcodeDetectorOptions.Builder() // .setBarcodeFormats(FirebaseVisionBarcode.FORMAT_QR_CODE) // .build() val detector: FirebaseVisionBarcodeDetector by lazy { val options = FirebaseVisionBarcodeDetectorOptions.Builder() .setBarcodeFormats(FirebaseVisionBarcode.FORMAT_QR_CODE) .build() FirebaseVision.getInstance().getVisionBarcodeDetector(options) } override fun stop() { try { detector.close() } catch (e: IOException) { Log.e(TAG, "Exception thrown while trying to close Barcode Detector: $e") } } override fun detectInImage(image: FirebaseVisionImage): Task> { return detector.detectInImage(image) } override fun onSuccess( originalCameraImage: Bitmap?, barcodes: List, frameMetadata: FrameMetadata, graphicOverlay: GraphicOverlay ) { graphicOverlay.clear() originalCameraImage?.let { val imageGraphic = CameraImageGraphic(graphicOverlay, it) graphicOverlay.add(imageGraphic) } barcodes.forEach { val barcodeGraphic = BarcodeGraphic(graphicOverlay, it) graphicOverlay.add(barcodeGraphic) } graphicOverlay.postInvalidate() } override fun onFailure(e: Exception) { Log.e(TAG, "Barcode detection failed $e") } companion object { private const val TAG = "BarcodeScanProc" } }