package io.scanbot.sdk.capacitor import android.app.Application import android.content.Intent import com.getcapacitor.JSObject import com.getcapacitor.Plugin import com.getcapacitor.PluginCall import com.getcapacitor.PluginMethod import com.getcapacitor.annotation.CapacitorPlugin import io.scanbot.sdk_wrapper.barcode.rtuui.SBRtuUiRequestCodes import io.scanbot.sdk_wrapper.document.operations.analytics.SBDAnalytics import io.scanbot.sdk_wrapper.document.operations.barcode.detection.SBDBarcodesDetection import io.scanbot.sdk_wrapper.document.operations.barcode.parsing.SBDBarcodeDocumentParser import io.scanbot.sdk_wrapper.document.operations.doc_analyzer.SBDDocumentQualityAnalyzer import io.scanbot.sdk_wrapper.document.operations.doc_data_extractor.SBDDocumentDataExtractor import io.scanbot.sdk_wrapper.document.operations.doc_detection.SBDDocumentDetection import io.scanbot.sdk_wrapper.document.operations.document.SBDDocument import io.scanbot.sdk_wrapper.document.operations.image_filters.SBDImageFilters import io.scanbot.sdk_wrapper.document.operations.image_operations.SBDImageOperations import io.scanbot.sdk_wrapper.document.operations.legacy_page.SBDLegacyPage import io.scanbot.sdk_wrapper.document.operations.license.SBDLicenseOperations import io.scanbot.sdk_wrapper.document.operations.mock.SBDMock import io.scanbot.sdk_wrapper.document.operations.ocr.SBDOcr import io.scanbot.sdk_wrapper.document.operations.pdf.SBDPdf import io.scanbot.sdk_wrapper.document.operations.pdf_extraction.SBDExtractFromPdf import io.scanbot.sdk_wrapper.document.operations.recognizers.check.SBDCheckRecognizer import io.scanbot.sdk_wrapper.document.operations.recognizers.credit_card.SBDCreditCardRecognizer import io.scanbot.sdk_wrapper.document.operations.recognizers.doc_data_extractor.SBDDocDataExtractorRecognizer import io.scanbot.sdk_wrapper.document.operations.recognizers.mrz.SBDMrzRecognizer import io.scanbot.sdk_wrapper.document.operations.setup.SBDSetupOperations import io.scanbot.sdk_wrapper.document.operations.tif.SBDTiff import io.scanbot.sdk_wrapper.document.rtuui.SBDRtuUi import io.scanbot.sdk_wrapper.document.rtuui.SBDRtuUiRequestCodes import org.json.JSONObject @CapacitorPlugin( name = "ScanbotSDKCapacitor", requestCodes = [ SBDRtuUiRequestCodes.DOCUMENT_SCANNER, SBDRtuUiRequestCodes.CROPPING_SCREEN, SBDRtuUiRequestCodes.DOCUMENT_DATA_EXTRACTOR, SBDRtuUiRequestCodes.MRZ_SCANNER, SBDRtuUiRequestCodes.TEXT_PATTERN_SCANNER, SBDRtuUiRequestCodes.CREDIT_CARD_SCANNER, SBDRtuUiRequestCodes.CHECK_SCANNER, SBDRtuUiRequestCodes.VIN_SCANNER, SBRtuUiRequestCodes.BARCODE_SCANNER, ] ) class ScanbotSDKCapacitorPlugin : Plugin() { private var barcodeItemMapperPluginCall: PluginCall? = null private var analyticsServicePluginCall: PluginCall? = null // region SDK APIs @PluginMethod fun initialize(call: PluginCall) { SBDSetupOperations.initializeSdk( (context.applicationContext as Application), call.data, ScanbotSDKPluginResultDelegate(call) ) } @PluginMethod fun getLicenseInfo(call: PluginCall) { SBDLicenseOperations.getLicenseInfo(ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun getOcrConfigs(call: PluginCall) { SBDOcr.getConfigs(ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun cleanupStorage(call: PluginCall) { SBDSetupOperations.cleanup(ScanbotSDKPluginResultDelegate(call)) } @PluginMethod(returnType = PluginMethod.RETURN_CALLBACK) fun setAnalyticsServiceCallback(call: PluginCall) { analyticsServicePluginCall?.release(bridge) analyticsServicePluginCall = null call.setKeepAlive(true) analyticsServicePluginCall = call SBDAnalytics.subscribe(ScanbotSDKPluginResultDelegate(call)) { eventAsJson -> analyticsServicePluginCall?.resolve(JSObject.fromJSONObject(eventAsJson)) } } @PluginMethod fun removeAnalyticsServiceCallback(call: PluginCall) { SBDAnalytics.subscribe(ScanbotSDKPluginResultDelegate(call), null) analyticsServicePluginCall?.release(bridge) analyticsServicePluginCall = null } @PluginMethod fun mockCamera(call: PluginCall) { SBDMock.camera(call.data, ScanbotSDKPluginResultDelegate(call)) } // endregion SDK APIs // region BARCODE APIs @PluginMethod fun scanBarcodesFromImage(call: PluginCall) { SBDBarcodesDetection.detectOnImage( call.data, ScanbotSDKPluginResultDelegate(call) ) } @PluginMethod fun scanBarcodesFromPdf(call: PluginCall) { SBDBarcodesDetection.detectOnPdf( call.data, ScanbotSDKPluginResultDelegate(call) ) } @PluginMethod fun parseBarcodeDocument(call: PluginCall) { SBDBarcodeDocumentParser.parseDocument( call.data, ScanbotSDKPluginResultDelegate(call) ) } @PluginMethod fun startBarcodeScanner(pluginCall: PluginCall) { if (barcodeItemMapperPluginCall != null) { SBDRtuUi.startBarcodeScanner( activity, pluginCall.data, ScanbotSDKPluginResultDelegate(pluginCall) ) { barcodeItem -> barcodeItemMapperPluginCall?.resolve(JSObject.fromJSONObject(barcodeItem)) ?: run { // This code should never be executed, but just in case SBDRtuUi.onBarcodeItemMapper(barcodeItemUuid(barcodeItem)) } } } else { SBDRtuUi.startBarcodeScanner( activity, pluginCall.data, ScanbotSDKPluginResultDelegate(pluginCall) ) } } // endregion BARCODE APIs // region CHECK APIs @PluginMethod fun scanCheckFromImage(call: PluginCall) { SBDCheckRecognizer.recognize(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun startCheckScanner(call: PluginCall) { SBDRtuUi.startCheckScanner( activity, call.data, ScanbotSDKPluginResultDelegate(call) ) } // endregion CHECK APIs // region CREDIT CARD APIs @PluginMethod fun scanCreditCardFromImage(call: PluginCall) { SBDCreditCardRecognizer.recognize(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun startCreditCardScanner(call: PluginCall) { SBDRtuUi.startCreditCardScanner( activity, call.data, ScanbotSDKPluginResultDelegate(call) ) } // endregion CREDIT CARD APIs // region DOCUMENT APIs @PluginMethod fun createDocumentFromImages(call: PluginCall) { SBDDocument.createFromImages(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun createDocumentFromLegacyPages(call: PluginCall) { SBDDocument.createFromLegacyPages( call.data, ScanbotSDKPluginResultDelegate(call) ) } @PluginMethod fun createDocumentFromPdf(call: PluginCall) { SBDDocument.createFromPDF(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun documentExists(call: PluginCall) { SBDDocument.exists(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun loadDocument(call: PluginCall) { SBDDocument.load(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun getStoredDocumentUuids(call: PluginCall) { SBDDocument.storedIDs(ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun cloneDocument(call: PluginCall) { SBDDocument.clone(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun deleteDocument(call: PluginCall) { SBDDocument.delete(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun deleteAllDocuments(call: PluginCall) { SBDDocument.deleteAll(ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun addPages(call: PluginCall) { SBDDocument.addPages(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun movePage(call: PluginCall) { SBDDocument.movePage(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun modifyPage(call: PluginCall) { SBDDocument.modifyPage(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun removePagesFromDocument(call: PluginCall) { SBDDocument.removePages(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun removeAllPages(call: PluginCall) { SBDDocument.removeAllPages(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun scanDocumentFromImage(call: PluginCall) { SBDDocumentDetection.scanFromImage( call.data, ScanbotSDKPluginResultDelegate(call) ) } @PluginMethod fun analyzeDocumentQualityOnImage(call: PluginCall) { SBDDocumentQualityAnalyzer.analyzeOnImage( call.data, ScanbotSDKPluginResultDelegate(call) ) } @PluginMethod fun startDocumentScanner(call: PluginCall) { SBDRtuUi.startDocumentScanner( activity, call.data, ScanbotSDKPluginResultDelegate(call) ) } @PluginMethod fun startCroppingScreen(call: PluginCall) { SBDRtuUi.startCroppingScreen( activity, call.data, ScanbotSDKPluginResultDelegate(call) ) } // endregion DOCUMENT APIs // region LEGACY PAGE APIs @PluginMethod fun removeLegacyPage(call: PluginCall) { SBDLegacyPage.removePage( call.data, ScanbotSDKPluginResultDelegate(call) ) } @PluginMethod fun removeAllLegacyPages(call: PluginCall) { SBDLegacyPage.removeAllPages(ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun setDocumentImageOnLegacyPage(call: PluginCall) { SBDLegacyPage.setDocumentImage( call.data, ScanbotSDKPluginResultDelegate(call) ) } @PluginMethod fun refreshImageUrisOnLegacyPage(call: PluginCall) { SBDLegacyPage.refreshImageUris( call.data, ScanbotSDKPluginResultDelegate(call) ) } // endregion LEGACY PAGE APIs // region DDE APIs @PluginMethod fun extractDocumentDataFromImage(call: PluginCall) { SBDDocDataExtractorRecognizer.recognize( call.data, ScanbotSDKPluginResultDelegate(call) ) } @PluginMethod fun verifyDocument(call: PluginCall) { SBDDocumentDataExtractor.verifyDocument( call.getArray("documentParts").toList(), ScanbotSDKPluginResultDelegate(call) ) } @PluginMethod fun startDDEScreen(call: PluginCall) { SBDRtuUi.startDocumentDataExtractor( activity, call.data, ScanbotSDKPluginResultDelegate(call) ) } // endregion DDE APIs // region MRZ APIs @PluginMethod fun scanMrzFromImage(call: PluginCall) { SBDMrzRecognizer.recognize(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun startMrzScanner(call: PluginCall) { SBDRtuUi.startMrzScanner( activity, call.data, ScanbotSDKPluginResultDelegate(call) ) } // endregion MRZ APIs // region TEXT PATTERN APIs @PluginMethod fun startTextPatternScanner(call: PluginCall) { SBDRtuUi.startTextPatternScanner( activity, call.data, ScanbotSDKPluginResultDelegate(call) ) } // endregion TEXT PATTERN APIs // region VIN APIs @PluginMethod fun startVinScanner(call: PluginCall) { SBDRtuUi.startVinScanner( activity, call.data, ScanbotSDKPluginResultDelegate(call) ) } // endregion VIN APIs // region IMAGE OPERATIONS APIs @PluginMethod fun readImageData(call: PluginCall) { SBDImageOperations.getImageData(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun rotateImage(call: PluginCall) { SBDImageOperations.rotateImage(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun rotateImageFile(call: PluginCall) { SBDImageOperations.rotateImageFile(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun applyFiltersOnImage(call: PluginCall) { SBDImageFilters.applyFiltersOnImage(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun applyFiltersOnImageFile(call: PluginCall) { SBDImageFilters.applyFiltersOnImageFile(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun resizeImage(call: PluginCall) { SBDImageOperations.resizeImage(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun resizeImageFile(call: PluginCall) { SBDImageOperations.resizeImageFile(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun cropImage(call: PluginCall) { SBDImageOperations.cropImage(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun cropImageFile(call: PluginCall) { SBDImageOperations.cropImageFile(call.data, ScanbotSDKPluginResultDelegate(call)) } // endregion IMAGE OPERATIONS APIs // region Generator APIs @PluginMethod fun generatePdfFromImages(call: PluginCall) { SBDPdf.generateFromImages(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun generatePdfFromDocument(call: PluginCall) { SBDPdf.createFromDocument(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun generateTiffFromImages(call: PluginCall) { SBDTiff.generateFromImages(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun generateTiffFromDocument(call: PluginCall) { SBDTiff.createFromDocument(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun extractImageFilesFromPdf(call: PluginCall) { SBDExtractFromPdf.extractImages(call.data, ScanbotSDKPluginResultDelegate(call)) } // endregion Generator APIs // region OCR APIs @PluginMethod fun recognizeOcrOnImages(call: PluginCall) { SBDOcr.recognizeOnImages(call.data, ScanbotSDKPluginResultDelegate(call)) } @PluginMethod fun recognizeOcrOnDocument(call: PluginCall) { SBDOcr.recognizeOnDocument(call.data, ScanbotSDKPluginResultDelegate(call)) } // endregion OCR APIs //region ImageRef @PluginMethod fun imageRefSerialize(pluginCall: PluginCall) { SBDImageOperations.imageRefSerialize( pluginCall.data, ScanbotSDKPluginResultDelegate(pluginCall) ) } @PluginMethod fun imageRefDeserialize(pluginCall: PluginCall) { SBDImageOperations.imageRefDeserialize( pluginCall.data, ScanbotSDKPluginResultDelegate(pluginCall) ) } @PluginMethod fun imageRefFromImageFileUri(pluginCall: PluginCall) { SBDImageOperations.imageRefFromImageFileUri( pluginCall.data, ScanbotSDKPluginResultDelegate(pluginCall) ) } @PluginMethod fun imageRefFromEncodedBuffer(pluginCall: PluginCall) { SBDImageOperations.imageRefFromEncodedBuffer( pluginCall.data, ScanbotSDKPluginResultDelegate(pluginCall) ) } @PluginMethod fun imageRefHibernate(pluginCall: PluginCall) { SBDImageOperations.imageRefHibernate( pluginCall.data, ScanbotSDKPluginResultDelegate(pluginCall) ) } @PluginMethod fun imageRefClear(pluginCall: PluginCall) { SBDImageOperations.imageRefClear( pluginCall.data, ScanbotSDKPluginResultDelegate(pluginCall) ) } @PluginMethod fun imageRefInfo(pluginCall: PluginCall) { SBDImageOperations.imageRefInfo( pluginCall.data, ScanbotSDKPluginResultDelegate(pluginCall) ) } @PluginMethod fun imageRefSaveImage(pluginCall: PluginCall) { SBDImageOperations.imageRefSaveImage( pluginCall.data, ScanbotSDKPluginResultDelegate(pluginCall) ) } @PluginMethod fun imageRefEncodeImage(pluginCall: PluginCall) { SBDImageOperations.imageRefEncodeImage( pluginCall.data, ScanbotSDKPluginResultDelegate(pluginCall) ) } @PluginMethod fun imageRefRelease(pluginCall: PluginCall) { SBDImageOperations.imageRefRelease( pluginCall.data, ScanbotSDKPluginResultDelegate(pluginCall) ) } @PluginMethod fun makeSnapshot(pluginCall: PluginCall) { SBDImageOperations.makeSnapshot( ScanbotSDKPluginResultDelegate(pluginCall) ) } @PluginMethod fun imageRefReleaseAll(pluginCall: PluginCall) { SBDImageOperations.releaseAllImageRefs( ScanbotSDKPluginResultDelegate(pluginCall) ) } //endregion ImageRef //region Helper methods that are used only by us from the plugin middle layer (not exposed to the users) @PluginMethod(returnType = PluginMethod.RETURN_NONE) fun registerBarcodeItemMapperCallback(pluginCall: PluginCall) { barcodeItemMapperPluginCall = pluginCall.apply { setKeepAlive(true) } } @PluginMethod(returnType = PluginMethod.RETURN_NONE) fun onBarcodeItemMapper(pluginCall: PluginCall) { val barcodeMappedData = pluginCall.getObject("barcodeMappedData") SBDRtuUi.onBarcodeItemMapper( pluginCall.getString("barcodeItemUuid")!!, barcodeMappedData ) } //endregion Helper methods that are used only by us from the plugin middle layer (not exposed to the users) //region Private helper methods private fun barcodeItemUuid(barcodeItem: JSONObject): String { val text = barcodeItem.getString("text") val ext = barcodeItem.getString("upcEanExtension") val format = barcodeItem.getString("format") return "${text}${ext}_$format" } //endregion Private helper methods @Suppress("OVERRIDE_DEPRECATION", "DEPRECATION") override fun handleOnActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { val handledByWrapper = SBDRtuUi.onActivityResult(requestCode, resultCode, data) if (handledByWrapper) { if (requestCode == SBRtuUiRequestCodes.BARCODE_SCANNER) { barcodeItemMapperPluginCall?.release(bridge) barcodeItemMapperPluginCall = null } } else { super.handleOnActivityResult(requestCode, resultCode, data) } } }