package io.scanbot.sdk.reactnative import android.app.Activity import android.content.Intent import com.facebook.react.bridge.ActivityEventListener import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReactMethod import com.facebook.react.bridge.ReadableMap import com.facebook.react.modules.core.DeviceEventManagerModule import io.scanbot.sdk.reactnative.extensions.toJSON import io.scanbot.sdk.reactnative.extensions.toWritableMap import io.scanbot.sdk_wrapper.document.rtuui.SBDRtuUi import org.json.JSONObject class ScanbotSDKUIModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), ActivityEventListener { companion object { const val NAME = "RNScanbotRTUUI" const val BARCODE_ITEM_MAPPER_EVENT = "barcodeItemMapperEvent" } override fun getName(): String { return NAME } override fun initialize() { super.initialize() reactApplicationContext?.addActivityEventListener(this) } override fun invalidate() { reactApplicationContext?.removeActivityEventListener(this) super.invalidate() } @ReactMethod fun startDocumentScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startLegacyDocumentScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun closeDocumentScanner(promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.closeLegacyDocumentScanner(it, ScanbotSDKPluginResultDelegate(promise)) } @ReactMethod fun startFinderDocumentScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startLegacyFinderDocumentScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun closeFinderDocumentScanner(promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.closeLegacyFinderDocumentScanner(it, ScanbotSDKPluginResultDelegate(promise)) } @ReactMethod fun startDocumentScannerV2(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startDocumentScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun startCroppingScreen(page: ReadableMap, configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startLegacyCroppingScreen( it, page.toJSON(), configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun closeCroppingScreen(promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.closeLegacyCroppingScreen(it, ScanbotSDKPluginResultDelegate(promise)) } @ReactMethod fun startCroppingScreenV2(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startCroppingScreen( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun startMrzScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startMrzScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun closeMrzScanner(promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.closeMrzScanner(it, ScanbotSDKPluginResultDelegate(promise)) } @ReactMethod fun startBarcodeScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startLegacyBarcodeScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun closeBarcodeScanner(promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.closeLegacyBarcodeScanner(it, ScanbotSDKPluginResultDelegate(promise)) } @ReactMethod fun startBatchBarcodeScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startLegacyBatchBarcodeScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun closeBatchBarcodeScanner(promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.closeLegacyBatchBarcodeScanner(it, ScanbotSDKPluginResultDelegate(promise)) } @ReactMethod fun startBarcodeScannerV2( configuration: ReadableMap, barcodeItemMapperImplemented: Boolean, promise: Promise ) = runOperationWithSafeActivity(promise) { if (barcodeItemMapperImplemented) { SBDRtuUi.startBarcodeScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) { barcodeItemAsJson: JSONObject -> reactApplicationContextIfActiveOrWarn?.getJSModule( DeviceEventManagerModule.RCTDeviceEventEmitter::class.java )?.emit(BARCODE_ITEM_MAPPER_EVENT, barcodeItemAsJson.toWritableMap()) } } else { SBDRtuUi.startBarcodeScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } } @ReactMethod fun onBarcodeItemMapper(barcodeItemUuid: String, barcodeMappedData: ReadableMap?) { SBDRtuUi.onBarcodeItemMapper(barcodeItemUuid, barcodeMappedData?.toJSON()) } @ReactMethod fun startEHICScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startEhicScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun closeEHICScanner(promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.closeEhicScanner(it, ScanbotSDKPluginResultDelegate(promise)) } @ReactMethod fun startTextDataScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startTextDataScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun closeTextDataScanner(promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.closeTextDataScanner(it, ScanbotSDKPluginResultDelegate(promise)) } @ReactMethod fun startLicensePlateScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startLicensePlateScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun closeLicensePlateScanner(promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.closeLicensePlateScanner(it, ScanbotSDKPluginResultDelegate(promise)) } @ReactMethod fun startMedicalCertificateRecognizer(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startMedicalCertRecognizer( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun closeMedicalCertificateRecognizer(promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.closeMedicalCertRecognizer(it, ScanbotSDKPluginResultDelegate(promise)) } @ReactMethod fun startGenericDocumentRecognizer(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startGenericDocRecognizer( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun closeGenericDocumentRecognizer(promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.closeGenericDocRecognizer(it, ScanbotSDKPluginResultDelegate(promise)) } @ReactMethod fun startCheckRecognizer(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startCheckRecognizer( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun closeCheckRecognizer(promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.closeCheckRecognizer(it, ScanbotSDKPluginResultDelegate(promise)) } @ReactMethod fun startVinScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startVinScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun closeVinScanner(promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.closeVinScanner(it, ScanbotSDKPluginResultDelegate(promise)) } override fun onActivityResult( activity: Activity?, requestCode: Int, resultCode: Int, data: Intent? ) { SBDRtuUi.onActivityResult(requestCode, resultCode, data) } @Suppress("UNUSED_PARAMETER") override fun onNewIntent(data: Intent?) { // NO-OP } @Suppress("UNUSED_PARAMETER") @ReactMethod fun addListener(type: String) { // Keep: Required for RN built in Event Emitter Calls, otherwise warnings are thrown in the console log. } @ReactMethod fun removeListeners(type: Int) { // Keep: Required for RN built in Event Emitter Calls, otherwise warnings are thrown in the console log. } //region Helpers private fun runOperationWithSafeActivity( promise: Promise, operation: (currentActivity: Activity) -> Unit ) { reactApplicationContext?.currentActivity?.let { operation(it) } ?: run { promise.reject(Exception("$NAME is not attached to activity")) } } //endregion Helpers }