From f662429c2442fb2dbe0aa77a228c4b69f7dbcc79 Mon Sep 17 00:00:00 2001 From: Serhii Chaban Date: Fri, 19 Sep 2025 13:49:50 +0200 Subject: [PATCH 01/56] fix compiling for data example app fix compiling data sdk fix compiling data sdk example WIP fix dc compiling 8.0.0 WIP --- classic-components-example/build.gradle | 2 +- .../app/build.gradle | 5 +- .../java/io/scanbot/example/Application.kt | 6 +- .../java/io/scanbot/example/MainActivity.kt | 90 +++------ .../CheckStableImageDetectionSnippet.kt | 19 +- .../doc_code_snippet/cheque/CheckUiSnippet.kt | 3 +- .../cheque/WrapCheckSnippet.kt | 2 +- .../CreditCardStableImageDetection.kt | 19 +- .../DataExtractorStableImageDetection.kt | 21 +- .../DetectionOnImageSnippets.kt | 5 +- ...ocumentDataExtractorFrameHandlerSnippet.kt | 3 +- .../data_extractor/UiComponentsSnippets.kt | 13 +- .../WrapGenericDocumentSnippet.kt | 2 +- .../LicenseHandlingSnippets.kt | 54 ++++-- .../mc/DetectionOnImageSnippets.kt | 38 ---- .../MedicalCertificateStableImageDetection.kt | 103 ---------- .../mc/UiComponentsSnippets.kt | 183 ------------------ .../migration/RtuUi1DocumentSnippets.kt | 1 + .../migration/RtuUi2DocumentSnippets.kt | 1 + .../mrz/MrzStableImageDetection.kt | 19 +- .../doc_code_snippet/ocr/OcrSnippets.kt | 122 ++++++------ .../doc_code_snippet/vin/VinSnippets.kt | 3 +- .../fragments/EHICResultDialogFragment.kt | 90 --------- .../example/fragments/MRZDialogFragment.kt | 4 +- .../MedicalCertificateResultDialogFragment.kt | 153 --------------- .../app/src/main/res/layout/activity_main.xml | 8 - .../settings.gradle.kts | 1 + .../.idea/codeStyles/Project.xml | 34 ++++ .../app/build.gradle | 2 +- .../com/example/scanbot/ExampleApplication.kt | 16 +- .../example/scanbot/di/ExampleSingleton.kt | 25 +-- .../DocumentDetectionSnippet.kt | 5 +- .../DocumentQualityCheckSnippet.kt | 7 +- .../doc_code_snippet/ImageFilterSnippet.kt | 24 +-- .../doc_code_snippet/ImageProcessorSnippet.kt | 15 +- .../ImageQualityCheckSnippet.kt | 15 +- .../doc_code_snippet/PageFilterSnippet.kt | 8 +- .../PdfFromDocumentSnippet.kt | 17 +- .../doc_code_snippet/PdfFromImageSnippet.kt | 5 +- .../TiffFromDocumentSnippet.kt | 16 +- .../doc_code_snippet/TiffFromImageSnippet.kt | 11 +- .../classic_ui/ClassicUiSnippets.kt | 37 ++-- .../rtu_ui/AcknowledgeScreenSnippet.kt | 2 +- .../rtu_ui/AutomaticFilteringSnippet.kt | 4 +- .../doc_code_snippet/rtu_ui/ComposeSnippet.kt | 2 +- .../rtu_ui/SinglePageWithFinderSnippet.kt | 2 +- .../com/example/scanbot/main/MainActivity.kt | 15 +- .../preview/DocumentPreviewActivity.kt | 8 +- .../preview/FiltersBottomSheetMenuFragment.kt | 16 +- .../scanbot/preview/FiltersListener.kt | 4 +- .../preview/SinglePagePreviewActivity.kt | 19 +- .../usecases/GeneratePdfForSharingUseCase.kt | 4 +- .../usecases/GenerateTiffForSharingUseCase.kt | 6 +- .../settings.gradle.kts | 8 + 54 files changed, 383 insertions(+), 914 deletions(-) delete mode 100644 data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mc/DetectionOnImageSnippets.kt delete mode 100644 data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mc/MedicalCertificateStableImageDetection.kt delete mode 100644 data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mc/UiComponentsSnippets.kt delete mode 100644 data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/fragments/EHICResultDialogFragment.kt delete mode 100644 data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/fragments/MedicalCertificateResultDialogFragment.kt diff --git a/classic-components-example/build.gradle b/classic-components-example/build.gradle index 200232c8..aa33ec25 100644 --- a/classic-components-example/build.gradle +++ b/classic-components-example/build.gradle @@ -15,7 +15,7 @@ allprojects { jvmToolchainVersion = 17 - scanbotSdkVersion = "7.1.1" + scanbotSdkVersion = "8.0.0.38-STAGING-SNAPSHOT" androidCoreKtxVersion = "1.6.0" constraintLayoutVersion = "2.0.4" diff --git a/data-capture-ready-to-use-ui-example/app/build.gradle b/data-capture-ready-to-use-ui-example/app/build.gradle index 92ef73c6..6ef6d9e9 100644 --- a/data-capture-ready-to-use-ui-example/app/build.gradle +++ b/data-capture-ready-to-use-ui-example/app/build.gradle @@ -74,7 +74,7 @@ dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version") - def scanbotSdkVersion = "7.1.1" + def scanbotSdkVersion = "8.0.0.38-STAGING-SNAPSHOT" implementation("io.scanbot:sdk-package-4:$scanbotSdkVersion") implementation("io.scanbot:sdk-package-ui:$scanbotSdkVersion") @@ -95,9 +95,6 @@ dependencies { // This dependency is only needed if you plan to use Credit Card Scanner feature implementation("io.scanbot:sdk-creditcard-assets:$scanbotSdkVersion") - // This dependency is only needed if you plan to use EHIC scanner feature - implementation("io.scanbot:sdk-ehic-assets:$scanbotSdkVersion") - // This dependency is only needed if you plan to use MRZ scanner feature implementation("io.scanbot:sdk-mrz-assets:$scanbotSdkVersion") diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/Application.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/Application.kt index 24f2228e..162ea5d2 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/Application.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/Application.kt @@ -5,9 +5,9 @@ import android.util.Log import android.widget.Toast import io.scanbot.example.util.SharingCopier import io.scanbot.sap.IScanbotSDKLicenseErrorHandler -import io.scanbot.sap.Status import io.scanbot.sdk.ScanbotSDK import io.scanbot.sdk.ScanbotSDKInitializer +import io.scanbot.sdk.licensing.LicenseStatus import io.scanbot.sdk.pdf.PdfImagesExtractor import io.scanbot.sdk.persistence.CameraImageFormat import io.scanbot.sdk.persistence.page.PageStorageSettings @@ -60,11 +60,11 @@ class Application : Application(), CoroutineScope { .prepareOCRLanguagesBlobs(true) .pdfImagesExtractorType(PdfImagesExtractor.Type.ANDROID_PDF_WRITER) .useFileEncryption(USE_ENCRYPTION, AESEncryptedFileIOProcessor(ENCRYPTION_PASSWORD, ENCRYPTION_METHOD)) - .licenceErrorHandler(IScanbotSDKLicenseErrorHandler { status, feature, statusMessage -> + .licenseErrorHandler(IScanbotSDKLicenseErrorHandler { status, feature, statusMessage -> // Optional license failure handler implementation. Handle license issues here. // A license issue can either be an invalid or expired license key // or missing SDK feature (see SDK feature packages on https://scanbot.io). - val errorMsg = if (status != Status.StatusOkay && status != Status.StatusTrial) { + val errorMsg = if (status != LicenseStatus.OKAY && status != LicenseStatus.TRIAL) { "License Error! License status: ${status.name}. $statusMessage" } else { "License Error! Missing SDK feature in license: ${feature.name}. $statusMessage" diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/MainActivity.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/MainActivity.kt index 26aec100..7fb0d235 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/MainActivity.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/MainActivity.kt @@ -9,22 +9,16 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import io.scanbot.example.databinding.* import io.scanbot.example.fragments.* -import io.scanbot.example.util.applyEdgeToEdge -import io.scanbot.sap.* +import io.scanbot.example.util.* import io.scanbot.sdk.* import io.scanbot.sdk.check.entity.* import io.scanbot.sdk.creditcard.entity.* -import io.scanbot.sdk.ehicscanner.* -import io.scanbot.sdk.genericdocument.entity.* -import io.scanbot.sdk.mc.* -import io.scanbot.sdk.ui.* -import io.scanbot.sdk.ui.view.hic.* -import io.scanbot.sdk.ui.view.hic.configuration.* -import io.scanbot.sdk.ui.view.mc.* -import io.scanbot.sdk.ui.view.mc.configuration.* -import io.scanbot.sdk.ui_v2.check.CheckScannerActivity -import io.scanbot.sdk.ui_v2.check.configuration.CheckScannerScreenConfiguration -import io.scanbot.sdk.ui_v2.check.configuration.CheckScannerUiResult +import io.scanbot.sdk.documentdata.* +import io.scanbot.sdk.documentdata.entity.* +import io.scanbot.sdk.genericdocument.* +import io.scanbot.sdk.licensing.* +import io.scanbot.sdk.ui_v2.check.* +import io.scanbot.sdk.ui_v2.check.configuration.* import io.scanbot.sdk.ui_v2.common.* import io.scanbot.sdk.ui_v2.common.activity.* import io.scanbot.sdk.ui_v2.creditcard.* @@ -35,8 +29,8 @@ import io.scanbot.sdk.ui_v2.mrz.* import io.scanbot.sdk.ui_v2.mrz.configuration.* import io.scanbot.sdk.ui_v2.textpattern.* import io.scanbot.sdk.ui_v2.textpattern.configuration.* -import io.scanbot.sdk.ui_v2.vin.VinScannerActivity -import io.scanbot.sdk.ui_v2.vin.configuration.VinScannerScreenConfiguration +import io.scanbot.sdk.ui_v2.vin.* +import io.scanbot.sdk.ui_v2.vin.configuration.* class MainActivity : AppCompatActivity() { @@ -46,8 +40,6 @@ class MainActivity : AppCompatActivity() { private val creditCardUiResultLauncher: ActivityResultLauncher private val textDataScannerResultLauncher: ActivityResultLauncher private val vinScannerResultLauncher: ActivityResultLauncher - private val medicalCertificateScannerActivityResultLauncher: ActivityResultLauncher - private val ehicScannerResultLauncher: ActivityResultLauncher private val dataExtractorResultLauncher: ActivityResultLauncher private val checkScannerResultLauncher: ActivityResultLauncher @@ -115,18 +107,20 @@ class MainActivity : AppCompatActivity() { } binding.ehicDefaultUi.setOnClickListener { - val ehicScannerConfig = HealthInsuranceCardScannerConfiguration() - ehicScannerConfig.setTopBarButtonsColor(Color.WHITE) - ehicScannerConfig.setRecognizerParameters( - EuropeanHealthInsuranceCardRecognizerConfiguration( - // Add your parameters here if needed + val configuration = DocumentDataExtractorScreenConfiguration() + configuration.scannerConfiguration.configurations = + listOf( + DocumentDataExtractorCommonConfiguration( + acceptedDocumentTypes = listOf( + EuropeanHealthInsuranceCard.DOCUMENT_TYPE + ) + ), + EuropeanHealthInsuranceCardConfiguration(expectedCountry = EuropeanHealthInsuranceCardIssuingCountry.GERMANY) ) + configuration.topBar.backgroundColor = ScanbotColor( + ContextCompat.getColor(this, R.color.colorPrimaryDark) ) - // ehicScannerConfig.setTopBarBackgroundColor(ContextCompat.getColor(this, android.R.color.holo_red_dark)) - // ehicScannerConfig.setFinderTextHint("custom text") - // ... - - ehicScannerResultLauncher.launch(ehicScannerConfig) + dataExtractorResultLauncher.launch(configuration) } binding.checkRecognizerUi.setOnClickListener { @@ -136,20 +130,6 @@ class MainActivity : AppCompatActivity() { checkScannerResultLauncher.launch(config) } - - binding.mcScannerUi.setOnClickListener { - val config = MedicalCertificateScannerConfiguration().apply { - setTopBarBackgroundColor( - ContextCompat.getColor( - this@MainActivity, - R.color.colorPrimaryDark - ) - ) - setTopBarButtonsColor(ContextCompat.getColor(this@MainActivity, R.color.greyColor)) - } - - medicalCertificateScannerActivityResultLauncher.launch(config) - } } override fun onResume() { @@ -158,7 +138,7 @@ class MainActivity : AppCompatActivity() { showLicenseDialog() } binding.warningView.visibility = - if (scanbotSdk.licenseInfo.status != Status.StatusOkay) View.VISIBLE else View.GONE + if (scanbotSdk.licenseInfo.status != LicenseStatus.OKAY) View.VISIBLE else View.GONE } private fun handleDocumentDataExtractorResult(result: List) { @@ -184,22 +164,6 @@ class MainActivity : AppCompatActivity() { dialogFragment.show(supportFragmentManager, MRZDialogFragment.NAME) } - private fun showEHICResultDialog(recognitionResult: EuropeanHealthInsuranceCardRecognitionResult) { - val dialogFragment = EHICResultDialogFragment.newInstance(recognitionResult) - dialogFragment.show(supportFragmentManager, EHICResultDialogFragment.NAME) - } - - private fun handleMedicalCertificateResult(resultWrapper: MedicalCertificateScanningResult) { - - - showMedicalCertificateScannerResult(resultWrapper!!) - } - - private fun showMedicalCertificateScannerResult(recognitionResult: MedicalCertificateScanningResult) { - val dialogFragment = MedicalCertificateResultDialogFragment.newInstance(recognitionResult) - dialogFragment.show(supportFragmentManager, MedicalCertificateResultDialogFragment.NAME) - } - private fun handleCheckScannerResult(result: CheckScannerUiResult) { showCheckScannerResult(result) } @@ -255,21 +219,11 @@ class MainActivity : AppCompatActivity() { ).show() } - ehicScannerResultLauncher = - registerForActivityResultOk(HealthInsuranceCardScannerActivity.ResultContract()) { resultEntity -> - showEHICResultDialog(resultEntity.result!!) - } - dataExtractorResultLauncher = registerForActivityResultOk(DocumentDataExtractorActivity.ResultContract()) { resultEntity -> handleDocumentDataExtractorResult(listOfNotNull(resultEntity.result)) } - medicalCertificateScannerActivityResultLauncher = - registerForActivityResultOk(MedicalCertificateScannerActivity.ResultContract()) { resultEntity -> - handleMedicalCertificateResult(resultEntity.result!!) - } - checkScannerResultLauncher = registerForActivityResultOk(CheckScannerActivity.ResultContract()) { resultEntity -> handleCheckScannerResult(resultEntity.result!!) diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/cheque/CheckStableImageDetectionSnippet.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/cheque/CheckStableImageDetectionSnippet.kt index 4e1b9674..1d7e3fcc 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/cheque/CheckStableImageDetectionSnippet.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/cheque/CheckStableImageDetectionSnippet.kt @@ -8,9 +8,12 @@ import android.util.Log import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope +import io.scanbot.common.getOrNull import io.scanbot.example.util.* import io.scanbot.sdk.* import io.scanbot.sdk.check.* +import io.scanbot.sdk.image.ImageRef +import io.scanbot.sdk.ui_v2.document.utils.toImageRef import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -44,16 +47,16 @@ class CheckStableImageDetectionSnippet : AppCompatActivity() { withContext(Dispatchers.Default) { getUrisFromGalleryResult(imagePickerResult) .asSequence() // process images one by one instead of collecting the whole list - less memory consumption - .map { it.toBitmap(contentResolver) } - .forEach { bitmap -> - if (bitmap == null) { + .map { it.toImageRef(contentResolver) } + .forEach { image -> + if (image == null) { Log.e( "Snippet", "Failed to load bitmap from URI" ) return@forEach } - processImage(checkScanner, bitmap) + checkScanner?.let { processImage(it, image) } } } @@ -77,14 +80,14 @@ class CheckStableImageDetectionSnippet : AppCompatActivity() { } // Create a check scanner instance - val checkScanner = scanbotSDK.createCheckScanner() + val checkScanner = scanbotSDK.createCheckScanner().getOrNull() private fun processImage( checkScanner: CheckScanner, - bitmap: Bitmap + image: ImageRef ) { - val result = checkScanner.scanFromBitmap(bitmap, 0) - result?.check?.let { wrapCheck(it) } + val result = checkScanner.run(image) + result.getOrNull()?.check?.let { wrapCheck(it) } // Check recognition results are processed } // @EndTag("Extracting cheque data from an image") diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/cheque/CheckUiSnippet.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/cheque/CheckUiSnippet.kt index 512f326a..ea6d79ca 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/cheque/CheckUiSnippet.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/cheque/CheckUiSnippet.kt @@ -17,6 +17,7 @@ import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.appcompat.app.AppCompatActivity import androidx.compose.ui.platform.ComposeView +import io.scanbot.common.getOrThrow import io.scanbot.example.* import io.scanbot.sdk.* import io.scanbot.sdk.camera.FrameHandlerResult @@ -512,7 +513,7 @@ class ComposeSnippet : AppCompatActivity() { fun getInstances(context: Context, cameraView: ScanbotCameraXView) { // @Tag("Get Instances") val scanbotSDK = ScanbotSDK(context) - val checkScanner: CheckScanner = scanbotSDK.createCheckScanner() + val checkScanner: CheckScanner = scanbotSDK.createCheckScanner().getOrThrow() val checkScannerFrameHandler: CheckScannerFrameHandler = CheckScannerFrameHandler.attach(cameraView, checkScanner) // @EndTag("Get Instances") diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/cheque/WrapCheckSnippet.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/cheque/WrapCheckSnippet.kt index 85539eeb..59b569fe 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/cheque/WrapCheckSnippet.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/cheque/WrapCheckSnippet.kt @@ -12,7 +12,7 @@ package io.scanbot.example.doc_code_snippet.cheque // TODO: add URLs here import io.scanbot.sdk.check.entity.* -import io.scanbot.sdk.genericdocument.entity.* +import io.scanbot.sdk.genericdocument.GenericDocument fun wrapCheck(genericDocument: GenericDocument) { // @Tag("Check Scanner Result Wrapper") diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/creditcard/CreditCardStableImageDetection.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/creditcard/CreditCardStableImageDetection.kt index e80cab98..c8d051f2 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/creditcard/CreditCardStableImageDetection.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/creditcard/CreditCardStableImageDetection.kt @@ -10,9 +10,12 @@ import android.util.Log import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope +import io.scanbot.common.getOrNull import io.scanbot.example.util.* import io.scanbot.sdk.* import io.scanbot.sdk.creditcard.* +import io.scanbot.sdk.image.ImageRef +import io.scanbot.sdk.ui_v2.document.utils.toImageRef import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -72,16 +75,16 @@ class CreditCardStableImageDetection : AppCompatActivity() { withContext(Dispatchers.Default) { getUrisFromGalleryResult(imagePickerResult) .asSequence() // process images one by one instead of collecting the whole list - less memory consumption - .map { it.toBitmap(contentResolver) } - .forEach { bitmap -> - if (bitmap == null) { + .map { it.toImageRef(contentResolver) } + .forEach { imageRef -> + if (imageRef == null) { Log.e( "Snippet", - "Failed to load bitmap from URI" + "Failed to load imageRef from URI" ) return@forEach } - processImage(creditCardScanner, bitmap) + creditCardScanner?.let { processImage(it, imageRef) } } } @@ -106,10 +109,10 @@ class CreditCardStableImageDetection : AppCompatActivity() { // @Tag("Extracting credit card data from an image") // Create a data extractor instance - val creditCardScanner = scanbotSDK.createCreditCardScanner() + val creditCardScanner = scanbotSDK.createCreditCardScanner().getOrNull() - private fun processImage(scanner: CreditCardScanner, bitmap: Bitmap) { - val result = scanner.scanFromBitmap(bitmap, 0) + private fun processImage(scanner: CreditCardScanner, image: ImageRef) { + val result = scanner.run(image) // Proceed MRZ scanner result // processResult(result) } diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/DataExtractorStableImageDetection.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/DataExtractorStableImageDetection.kt index 018415fa..e2ab6fe4 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/DataExtractorStableImageDetection.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/DataExtractorStableImageDetection.kt @@ -8,10 +8,13 @@ import android.util.Log import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope +import io.scanbot.common.getOrNull import io.scanbot.example.doc_code_snippet.data_extractor.* import io.scanbot.example.util.* import io.scanbot.sdk.* import io.scanbot.sdk.documentdata.* +import io.scanbot.sdk.image.ImageRef +import io.scanbot.sdk.ui_v2.document.utils.toImageRef import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -45,16 +48,16 @@ class DataExtractorStableImageDetection : AppCompatActivity() { withContext(Dispatchers.Default) { getUrisFromGalleryResult(imagePickerResult) .asSequence() // process images one by one instead of collecting the whole list - less memory consumption - .map { it.toBitmap(contentResolver) } - .forEach { bitmap -> - if (bitmap == null) { + .map { it.toImageRef(contentResolver) } + .forEach { imageRef -> + if (imageRef == null) { Log.e( "Snippet", - "Failed to load bitmap from URI" + "Failed to load imageRef from URI" ) return@forEach } - processImage(dataExtractor, bitmap) + dataExtractor?.let { processImage(it, imageRef) } } } @@ -78,15 +81,15 @@ class DataExtractorStableImageDetection : AppCompatActivity() { } // Create a data extractor instance - val dataExtractor = scanbotSDK.createDocumentDataExtractor() + val dataExtractor = scanbotSDK.createDocumentDataExtractor().getOrNull() private fun processImage( dataExtractor: DocumentDataExtractor, - bitmap: Bitmap + image: ImageRef ) { // @Tag("Extracting document data from an image") - val result = dataExtractor.extractFromBitmap(bitmap, 0) - result?.document?.let { wrapGenericDocument(it) } + val result = dataExtractor.run(image) + result.getOrNull()?.document?.let { wrapGenericDocument(it) } // Data extraction results are processed // @EndTag("Extracting document data from an image") } diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/DetectionOnImageSnippets.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/DetectionOnImageSnippets.kt index 1a1e84c5..059ac3d2 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/DetectionOnImageSnippets.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/DetectionOnImageSnippets.kt @@ -2,6 +2,7 @@ package io.scanbot.example.doc_code_snippet.data_extractor import android.app.Application import android.content.Context +import io.scanbot.common.getOrNull import io.scanbot.sdk.* import io.scanbot.sdk.documentdata.* import io.scanbot.sdk.documentdata.entity.* @@ -41,8 +42,8 @@ fun extractorCreationSnippet(context: Context) { fun ehicExtractorCreationSnippet(context: Context) { // @Tag("Create Document Data Extractor for EHIC") val scanbotSdk = ScanbotSDK(context) - val dataExtractor = scanbotSdk.createDocumentDataExtractor() - dataExtractor.setConfiguration( + val dataExtractor = scanbotSdk.createDocumentDataExtractor().getOrNull() + dataExtractor?.setConfiguration( DocumentDataExtractorConfigurationBuilder() .setAcceptedDocumentTypes(listOf(RootDocumentType.EuropeanHealthInsuranceCard, RootDocumentType.DeHealthInsuranceCardFront)) .build()) diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/DocumentDataExtractorFrameHandlerSnippet.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/DocumentDataExtractorFrameHandlerSnippet.kt index aafd6c2f..413c49cf 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/DocumentDataExtractorFrameHandlerSnippet.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/DocumentDataExtractorFrameHandlerSnippet.kt @@ -11,6 +11,7 @@ package io.scanbot.example.doc_code_snippet.data_extractor import android.content.Context import android.widget.Toast +import io.scanbot.common.getOrThrow import io.scanbot.sdk.ScanbotSDK import io.scanbot.sdk.SdkLicenseError import io.scanbot.sdk.camera.FrameHandlerResult @@ -18,7 +19,7 @@ import io.scanbot.sdk.documentdata.* fun useDocumentDataExtractorFrameHandler(context: Context) { // @Tag("Add a frame handler for DocumentDataExtractor") - val dataExtractor = ScanbotSDK(context).createDocumentDataExtractor() + val dataExtractor = ScanbotSDK(context).createDocumentDataExtractor().getOrThrow() val frameHandler = DocumentDataExtractorFrameHandler(dataExtractor) frameHandler.addResultHandler(object : DocumentDataExtractorFrameHandler.ResultHandler { diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/UiComponentsSnippets.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/UiComponentsSnippets.kt index 0d6ba06c..7909a136 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/UiComponentsSnippets.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/UiComponentsSnippets.kt @@ -2,13 +2,14 @@ package io.scanbot.example.doc_code_snippet.data_extractor import android.app.Application import android.content.Context -import android.graphics.Bitmap import android.widget.TextView import androidx.appcompat.app.AppCompatActivity +import io.scanbot.common.getOrThrow import io.scanbot.example.R import io.scanbot.sdk.* import io.scanbot.sdk.documentdata.* import io.scanbot.sdk.documentdata.entity.* +import io.scanbot.sdk.image.ImageRef import io.scanbot.sdk.process.* import io.scanbot.sdk.ui.camera.* @@ -37,7 +38,7 @@ fun getDocumentDataExtractorInstanceFromSdkSnippet(context: Context, cameraView: // Please note that each call to this method will create a new instance of DocumentDataExtractor // It should be used on a "single instance per screen" basis - val documentDataExtractor = scanbotSdk.createDocumentDataExtractor() + val documentDataExtractor = scanbotSdk.createDocumentDataExtractor().getOrThrow() var acceptedDocumentTypes = RootDocumentType.ALL_TYPES @@ -88,7 +89,7 @@ fun getDocumentDataExtractorInstanceWithEHICFromSdkSnippet( // Please note that each call to this method will create a new instance of DocumentDataExtractor // It should be used on a "single instance per screen" basis - val documentDataExtractor = scanbotSdk.createDocumentDataExtractor() + val documentDataExtractor = scanbotSdk.createDocumentDataExtractor().getOrThrow() documentDataExtractor.setConfiguration( DocumentDataExtractorConfigurationBuilder() @@ -121,13 +122,13 @@ fun excludeFieldsFromExtractingSnippet() { fun rotateImageSnippet(image: ByteArray, imageOrientation: Int) { // @Tag("Rotate image") - val resultBitmap = ImageProcessor(image).rotate(imageOrientation).processedBitmap() + val resultImageRef = ImageProcessor(image).rotate(imageOrientation).processedImageRef() // @EndTag("Rotate image") } -fun extractFromBitmapSnippet(documentDataExtractor: DocumentDataExtractor, resultBitmap: Bitmap) { +fun extractFromImageRefSnippet(documentDataExtractor: DocumentDataExtractor, imageRef: ImageRef) { // @Tag("Extract data from the image") - val recognitionResult = documentDataExtractor.extractFromBitmap(resultBitmap) + val recognitionResult = documentDataExtractor.run(imageRef) // @EndTag("Extract data from the image") } diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/WrapGenericDocumentSnippet.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/WrapGenericDocumentSnippet.kt index 09c4b31d..1698d8fc 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/WrapGenericDocumentSnippet.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/data_extractor/WrapGenericDocumentSnippet.kt @@ -12,7 +12,7 @@ package io.scanbot.example.doc_code_snippet.data_extractor // TODO: add URLs here import io.scanbot.sdk.documentdata.entity.* -import io.scanbot.sdk.genericdocument.entity.* +import io.scanbot.sdk.genericdocument.* fun wrapGenericDocument(genericDocument: GenericDocument) { diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/detailed_setup_guide/LicenseHandlingSnippets.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/detailed_setup_guide/LicenseHandlingSnippets.kt index 81d3a1c6..c26cae60 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/detailed_setup_guide/LicenseHandlingSnippets.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/detailed_setup_guide/LicenseHandlingSnippets.kt @@ -2,10 +2,8 @@ package io.scanbot.example.doc_code_snippet.detailed_setup_guide import android.app.Application import androidx.appcompat.app.AppCompatActivity -import io.scanbot.example.* -import io.scanbot.sap.* -import io.scanbot.sap.Status.* import io.scanbot.sdk.* +import io.scanbot.sdk.licensing.* import io.scanbot.sdk.util.log.* /* @@ -25,7 +23,10 @@ fun checkLicenseStatusSnippet(activity: AppCompatActivity) { val licenseInfo = ScanbotSDK(activity).licenseInfo LoggerProvider.logger.d("ExampleApplication", "License status: ${licenseInfo.status}") LoggerProvider.logger.d("ExampleApplication", "License isValid: ${licenseInfo.isValid}") - LoggerProvider.logger.d("ExampleApplication", "License message: ${licenseInfo.licenseStatusMessage}") + LoggerProvider.logger.d( + "ExampleApplication", + "License message: ${licenseInfo.licenseStatusMessage}" + ) if (licenseInfo.isValid) { // Making your call into ScanbotSDK API is now safe. @@ -37,23 +38,34 @@ fun checkLicenseStatusSnippet(activity: AppCompatActivity) { fun handleLicenseStatusSnippet(application: Application) { // @Tag("Handle License Status") val licenseInfo = ScanbotSDKInitializer() - .license(application, "YOUR_SCANBOT_SDK_LICENSE_KEY") - .licenceErrorHandler(IScanbotSDKLicenseErrorHandler { status, feature, message -> - LoggerProvider.logger.d("ScanbotSDK", "license status:${status.name}, message: $message") - when (status) { - StatusFailureNotSet, - StatusFailureCorrupted, - StatusFailureWrongOS, - StatusFailureAppIDMismatch, - StatusFailureExpired -> { - // license is completely invalid - } - StatusOkay, - StatusTrial -> { - - } + .license(application, "YOUR_SCANBOT_SDK_LICENSE_KEY") + .licenseErrorHandler { status, feature, message -> + LoggerProvider.logger.d( + "ScanbotSDK", + "license status:${status.name}, message: $message" + ) + when (status) { + LicenseStatus.OKAY, + LicenseStatus.TRIAL -> { + + } + + LicenseStatus.OKAY_EXPIRING_SOON -> { + + } + + LicenseStatus.FAILURE_NOT_SET, + LicenseStatus.FAILURE_CORRUPTED, + LicenseStatus.FAILURE_WRONG_OS, + LicenseStatus.FAILURE_APP_ID_MISMATCH, + LicenseStatus.FAILURE_EXPIRED, + LicenseStatus.FAILURE_SERVER, + LicenseStatus.FAILURE_VERSION, + LicenseStatus.FAILURE_INACTIVE -> { + } - }) - .initialize(application) + } + } + .initialize(application) // @EndTag("Handle License Status") } \ No newline at end of file diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mc/DetectionOnImageSnippets.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mc/DetectionOnImageSnippets.kt deleted file mode 100644 index f7ea0181..00000000 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mc/DetectionOnImageSnippets.kt +++ /dev/null @@ -1,38 +0,0 @@ -package io.scanbot.example.doc_code_snippet.mc - -import android.app.Application -import android.content.Context -import io.scanbot.sdk.* - -/* - NOTE: this snippet of code is to be used only as a part of the website documentation. - This code is not intended for any use outside of the support of documentation by Scanbot SDK GmbH employees. -*/ - -// NOTE for maintainers: whenever changing this code, -// ensure that links using it are still pointing to valid lines! -// Pay attention to imports adding/removal/sorting! -// Page URLs using this code: -// TODO: add URLs here - -// @Tag("Initialize SDK") -class ExampleApplication : Application() { - - override fun onCreate() { - super.onCreate() - - // The Scanbot SDK initialization: - ScanbotSDKInitializer() - .prepareOCRLanguagesBlobs(true) - // ... - .initialize(this) - } -} -// @EndTag("Initialize SDK") - -fun scannerCreationSnippet(context: Context) { - // @Tag("Create Medical Certificate Scanner") - val scanbotSdk = ScanbotSDK(context) - val medicalCertificateScanner = scanbotSdk.createMedicalCertificateScanner() - // @EndTag("Create Medical Certificate Scanner") -} \ No newline at end of file diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mc/MedicalCertificateStableImageDetection.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mc/MedicalCertificateStableImageDetection.kt deleted file mode 100644 index fffe846b..00000000 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mc/MedicalCertificateStableImageDetection.kt +++ /dev/null @@ -1,103 +0,0 @@ -package io.scanbot.example.doc_code_snippet.mc - -import android.app.Activity -import android.content.Intent -import android.graphics.Bitmap -import android.os.Bundle -import android.util.Log -import androidx.activity.result.contract.ActivityResultContracts -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.lifecycleScope -import io.scanbot.example.util.* -import io.scanbot.sdk.* -import io.scanbot.sdk.mc.* -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext - -/* - NOTE: this snippet of code is to be used only as a part of the website documentation. - This code is not intended for any use outside of the support of documentation by Scanbot SDK GmbH employees. -*/ - -// NOTE for maintainers: whenever changing this code, -// ensure that links using it are still pointing to valid lines! -// Pay attention to imports adding/removal/sorting! -// Page URLs using this code: -// TODO: add URLs here -class DataExtractorStableImageDetection : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - // In the real application, you should call this function on button click - importImagesFromLibrary() - } - - private val scanbotSDK = ScanbotSDK(this@DataExtractorStableImageDetection) - private val context = this - - private val pictureForDocDetectionResult = - this.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult -> - if (activityResult.resultCode == Activity.RESULT_OK) { - activityResult.data?.let { imagePickerResult -> - lifecycleScope.launch { - withContext(Dispatchers.Default) { - getUrisFromGalleryResult(imagePickerResult) - .asSequence() // process images one by one instead of collecting the whole list - less memory consumption - .map { it.toBitmap(contentResolver) } - .forEach { bitmap -> - if (bitmap == null) { - Log.e( - "Snippet", - "Failed to load bitmap from URI" - ) - return@forEach - } - processImage(medicalCertificateScanner, bitmap) - } - - } - } - } - } - } - - - private fun importImagesFromLibrary() { - val imageIntent = Intent() - imageIntent.type = "image/*" - imageIntent.action = Intent.ACTION_GET_CONTENT - imageIntent.putExtra(Intent.EXTRA_LOCAL_ONLY, false) - imageIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false) - imageIntent.putExtra( - Intent.EXTRA_MIME_TYPES, - arrayOf("image/jpeg", "image/png", "image/webp", "image/heic") - ) - pictureForDocDetectionResult.launch(Intent.createChooser(imageIntent, "Select Picture")) - } - - // @Tag("Extracting medical certificate data from an image") - // Create a medical certificate scanner instance - val medicalCertificateScanner = scanbotSDK.createMedicalCertificateScanner() - - fun processImage( - medicalCertificateScanner: MedicalCertificateScanner, - bitmap: Bitmap - ) { - val result = medicalCertificateScanner.scanFromBitmap( - bitmap, - 0, - parameters = MedicalCertificateScanningParameters( - shouldCropDocument = true, - extractCroppedImage = true, - recognizePatientInfoBox = true, - recognizeBarcode = true - ) - ) - if (result != null && result.scanningSuccessful) { - // Document scanning results are processed - // processResul - } - } - // @EndTag("Extracting medical certificate data from an image") -} diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mc/UiComponentsSnippets.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mc/UiComponentsSnippets.kt deleted file mode 100644 index d5465bd3..00000000 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mc/UiComponentsSnippets.kt +++ /dev/null @@ -1,183 +0,0 @@ -package io.scanbot.example.doc_code_snippet.mc - -import android.app.Application -import android.content.Context -import android.content.Intent -import android.view.Gravity -import android.widget.Button -import android.widget.Toast -import androidx.activity.result.ActivityResultLauncher -import androidx.appcompat.app.AppCompatActivity -import io.scanbot.sdk.* -import io.scanbot.sdk.camera.* -import io.scanbot.sdk.mc.* -import io.scanbot.sdk.ui.camera.* -import io.scanbot.sdk.ui.view.mc.* -import io.scanbot.sdk.ui.view.mc.configuration.* - -/* - NOTE: this snippet of code is to be used only as a part of the website documentation. - This code is not intended for any use outside of the support of documentation by Scanbot SDK GmbH employees. -*/ - -// NOTE for maintainers: whenever changing this code, -// ensure that links using it are still pointing to valid lines! -// Pay attention to imports adding/removal/sorting! -// Page URLs using this code: -// TODO: add URLs here - -fun initSdkSnippet(application: Application) { - // @Tag("Initialize SDK") - ScanbotSDKInitializer() - .prepareOCRLanguagesBlobs(true) - //... - .initialize(application) - // @EndTag("Initialize SDK") -} - -fun startMcScannerRTUAndHandleResultSnippet(activity: AppCompatActivity, myButton: Button) { - // @Tag("Start RTU Medical Certificate Scanner and handle the result") - val resultLauncher: ActivityResultLauncher - - // ... - - resultLauncher = activity.registerForActivityResult(MedicalCertificateScannerActivity.ResultContract()) { resultEntity: MedicalCertificateScannerActivity.Result -> - if (resultEntity.resultOk) { - // Here you can handle and present recognized Medical Certificate information (patient info, the cropped image of the Medical Certificate, all checkboxes and dates) - } - } - - // ... - - myButton.setOnClickListener { - val configuration = MedicalCertificateScannerConfiguration() - resultLauncher.launch(configuration) - } - // @EndTag("Start RTU Medical Certificate Scanner and handle the result") -} - -val MEDICAL_CERTIFICATE_REQUEST_CODE_CONSTANT = 1000 - -fun startMcScannerRTUDeprecatedSnippet(activity: AppCompatActivity, myButton: Button) { - // @Tag("(DEPRECATED) Start RTU Medical Certificate Scanner") - myButton.setOnClickListener { - val configuration = MedicalCertificateScannerConfiguration() - val intent = MedicalCertificateScannerActivity.newIntent(activity, configuration) - activity.startActivityForResult(intent, MEDICAL_CERTIFICATE_REQUEST_CODE_CONSTANT) - } - // @EndTag("(DEPRECATED) Start RTU Medical Certificate Scanner") -} - -fun handleResultDeprecatedSnippet(requestCode: Int, resultCode: Int, data: Intent?) { - // @Tag("(DEPRECATED) Handle RTU Medical Certificate Scanner result") - if (requestCode == MEDICAL_CERTIFICATE_REQUEST_CODE_CONSTANT) { - val result: MedicalCertificateScannerActivity.Result = MedicalCertificateScannerActivity.extractResult(resultCode, data) - if (result.resultOk) { - // Here you can handle and present recognized Medical Certificate information (patient info, the cropped image of the Medical Certificate, all checkboxes and dates) - } - } - // @EndTag("(DEPRECATED) Handle RTU Medical Certificate Scanner result") -} - -fun setMcScannerRTUConfigurationSnippet() { - // @Tag("Set RTU Medical Certificate Scanner configuration") - val configuration = MedicalCertificateScannerConfiguration() - configuration.setScanPatientInfo(true) - configuration.setReturnCroppedDocumentImage(true) - - configuration.setFlashEnabled(false) - configuration.setCancelButtonTitle("Stop") - // @EndTag("Set RTU Medical Certificate Scanner configuration") -} - -fun handleMcScannerRTUResultSnippet(context: Context) { - // @Tag("Handle RTU Medical Certificate Scanner result") - lateinit var result: MedicalCertificateScanningResult - - val medicalCertificateContent: String = StringBuilder() - .append("Type: ").append(if (result.checkBoxes - ?.find { checkBox -> checkBox.type == MedicalCertificateCheckBoxType.INITIAL_CERTIFICATE } - ?.checked == true) - "Initial" - else if (result.checkBoxes - ?.find { checkBox -> checkBox.type == MedicalCertificateCheckBoxType.RENEWED_CERTIFICATE } - ?.checked == true) - "Renewed" - else - "Unknown").append("\n") - .append("Work Accident: ").append(if (result.checkBoxes - ?.find { checkBox -> checkBox.type == MedicalCertificateCheckBoxType.WORK_ACCIDENT } - ?.checked == true) - "Yes" - else "No").append("\n") - .append("Accident Consultant: ").append( - if (result.checkBoxes - ?.find { checkBox -> checkBox.type == MedicalCertificateCheckBoxType.ASSIGNED_TO_ACCIDENT_INSURANCE_DOCTOR } - ?.checked == true) - "Yes" - else "No" - ).append("\n") - .append("Start Date: ").append( - result.dates?.find { dateRecord -> dateRecord.type == MedicalCertificateDateRecordType.INCAPABLE_OF_WORK_SINCE }?.value - ).append("\n") - .append("End Date: ").append( - result.dates?.find { dateRecord -> dateRecord.type == MedicalCertificateDateRecordType.INCAPABLE_OF_WORK_UNTIL }?.value - ).append("\n") - .append("Issue Date: ").append( - result.dates?.find { dateRecord -> dateRecord.type == MedicalCertificateDateRecordType.DIAGNOSED_ON }?.value - ) - .append("\n") - .append("Form type: ${result.formType.name}") - .append("\n") - .append(result.patientInfoBox.fields.joinToString(separator = "\n", prefix = "\n") { "${it.type.name}: ${it.value}" }) - .toString() - - Toast.makeText(context, medicalCertificateContent, Toast.LENGTH_LONG).show() - // @EndTag("Handle RTU Medical Certificate Scanner result") -} - -fun useMcScannerFrameHandlerSnippet(context: Context, cameraView: ScanbotCameraXView) { - // @Tag("Attach Medical Certificate Scanner to ScanbotCameraXView") - val scanbotSDK = ScanbotSDK(context) - val medicalCertificateScanner: MedicalCertificateScanner = scanbotSDK.createMedicalCertificateScanner() - - // Attach `FrameHandler`, that will detect a Medical Certificate document in the camera frames - val frameHandler: MedicalCertificateFrameHandler = MedicalCertificateFrameHandler.attach(cameraView, medicalCertificateScanner) - - // Attach `AutoSnappingController`, that will trigger the snap as soon as `FrameHandler` detects a Medical Certificate document in the preview frame successfully - val autoSnappingController = MedicalCertificateAutoSnappingController.attach(cameraView, frameHandler) - // @EndTag("Attach Medical Certificate Scanner to ScanbotCameraXView") -} - -fun addSnappingResultListenerSnippet(cameraView: ScanbotCameraXView) { - // @Tag("Add snapping result listener") - cameraView.addPictureCallback(object : PictureCallback() { - override fun onPictureTaken(image: ByteArray, captureInfo: CaptureInfo) { - // processPictureTaken(image, captureInfo.imageOrientation) - } - }) - // @EndTag("Add snapping result listener") -} - -fun processTakenPictureSnippet(image: ByteArray, imageOrientation: Int, medicalCertificateScanner: MedicalCertificateScanner, activity: AppCompatActivity) { - // @Tag("Process the taken picture") - // Here we get the full image from the camera. - // Implement a suitable async(!) detection and image handling here. - - // Run Medical Certificate recognition on the snapped image: - val resultInfo = medicalCertificateScanner.scanFromJpeg(image, - 0) - - if (resultInfo != null && resultInfo.scanningSuccessful) { - // Here you can handle and present recognized Medical Certificate information (patient info, the cropped image of the Medical Certificate, all checkboxes and dates) - } else { - // If recognition was not successful - show a warning and try again - activity.runOnUiThread { - val toast = Toast.makeText(activity, "No Medical Certificate content was recognized!", Toast.LENGTH_LONG) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.show() - } - } - // @EndTag("Process the taken picture") -} - diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/migration/RtuUi1DocumentSnippets.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/migration/RtuUi1DocumentSnippets.kt index 6ee3f65a..817afc15 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/migration/RtuUi1DocumentSnippets.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/migration/RtuUi1DocumentSnippets.kt @@ -10,6 +10,7 @@ import androidx.appcompat.app.AppCompatActivity import io.scanbot.example.R import io.scanbot.sdk.* import io.scanbot.sdk.common.* +import io.scanbot.sdk.geometry.AspectRatio import io.scanbot.sdk.persistence.page.* import io.scanbot.sdk.ui.* import io.scanbot.sdk.ui.view.camera.* diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/migration/RtuUi2DocumentSnippets.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/migration/RtuUi2DocumentSnippets.kt index 6fe1aa6f..1eff806a 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/migration/RtuUi2DocumentSnippets.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/migration/RtuUi2DocumentSnippets.kt @@ -23,6 +23,7 @@ import io.scanbot.example.R import io.scanbot.sdk.* import io.scanbot.sdk.common.* import io.scanbot.sdk.docprocessing.* +import io.scanbot.sdk.geometry.AspectRatio import io.scanbot.sdk.ui_v2.common.* import io.scanbot.sdk.ui_v2.common.activity.* import io.scanbot.sdk.ui_v2.document.* diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mrz/MrzStableImageDetection.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mrz/MrzStableImageDetection.kt index 2496d18a..aae7be3a 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mrz/MrzStableImageDetection.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/mrz/MrzStableImageDetection.kt @@ -10,9 +10,12 @@ import android.util.Log import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope +import io.scanbot.common.getOrThrow import io.scanbot.example.util.* import io.scanbot.sdk.* +import io.scanbot.sdk.image.ImageRef import io.scanbot.sdk.mrz.* +import io.scanbot.sdk.ui_v2.document.utils.toImageRef import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -38,10 +41,10 @@ class ExampleApplication : Application() { // Initialize the Scanbot Scanner SDK: ScanbotSDKInitializer() - .license(this, licenseKey) - // TODO: other configuration calls - .prepareOCRLanguagesBlobs(true) - .initialize(this) + .license(this, licenseKey) + // TODO: other configuration calls + .prepareOCRLanguagesBlobs(true) + .initialize(this) } } // @EndTag("Initialize SDK") @@ -73,7 +76,7 @@ class MrzStableImageDetection : AppCompatActivity() { withContext(Dispatchers.Default) { getUrisFromGalleryResult(imagePickerResult) .asSequence() // process images one by one instead of collecting the whole list - less memory consumption - .map { it.toBitmap(contentResolver) } + .map { it.toImageRef(contentResolver) } .forEach { bitmap -> if (bitmap == null) { Log.e( @@ -107,10 +110,10 @@ class MrzStableImageDetection : AppCompatActivity() { // @Tag("Extracting mrz data from an image") // Create a data extractor instance - val mrzScanner = scanbotSDK.createMrzScanner() + val mrzScanner = scanbotSDK.createMrzScanner().getOrThrow() - private fun processImage(mrzScanner: MrzScanner, bitmap: Bitmap) { - val mrzRecognitionResult = mrzScanner.scanFromBitmap(bitmap, 0) + private fun processImage(mrzScanner: MrzScanner, image: ImageRef) { + val mrzRecognitionResult = mrzScanner.run(image) // Proceed MRZ scanner result // processResult(result) } diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/ocr/OcrSnippets.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/ocr/OcrSnippets.kt index dd4a109b..aacf91f8 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/ocr/OcrSnippets.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/ocr/OcrSnippets.kt @@ -5,14 +5,19 @@ import android.content.Context import android.net.Uri import android.util.Log import androidx.core.net.toFile -import io.scanbot.pdf.model.* +import io.scanbot.common.getOrNull import io.scanbot.sdk.* import io.scanbot.sdk.docprocessing.Document import io.scanbot.sdk.entity.* import io.scanbot.sdk.ocr.* import io.scanbot.sdk.ocr.intelligence.* -import io.scanbot.sdk.ocr.model.* import io.scanbot.sdk.ocr.process.* +import io.scanbot.sdk.pdfgeneration.PageDirection +import io.scanbot.sdk.pdfgeneration.PageFit +import io.scanbot.sdk.pdfgeneration.PageSize +import io.scanbot.sdk.pdfgeneration.PdfAttributes +import io.scanbot.sdk.pdfgeneration.PdfConfiguration +import io.scanbot.sdk.pdfgeneration.ResamplingMethod /* NOTE: this snippet of code is to be used only as a part of the website documentation. @@ -28,58 +33,59 @@ import io.scanbot.sdk.ocr.process.* fun initSdkSnippet(application: Application, licenseKey: String) { // @Tag("Initialize SDK") ScanbotSDKInitializer() - .license(application, licenseKey) - .prepareOCRLanguagesBlobs(true) - //... - .initialize(application) + .license(application, licenseKey) + .prepareOCRLanguagesBlobs(true) + //... + .initialize(application) // @EndTag("Initialize SDK") } fun createOcrEngine(context: Context) { // @Tag("Create OCR Engine") val scanbotSDK = ScanbotSDK(context) - val ocrRecognizer = scanbotSDK.createOcrEngine() + val ocrEngine = scanbotSDK.createOcrEngineManager() // @EndTag("Create OCR Engine") } fun enableBinarizationInOcrSettingsSnippet(application: Application) { // @Tag("Enable Binarization in OCR Settings") ScanbotSDKInitializer() - .useOcrSettings(OcrSettings.Builder().binarizeImage(true).build()) - //... - .initialize(application) + .useOcrSettings(OcrSettings.Builder().binarizeImage(true).build()) + //... + .initialize(application) // @EndTag("Enable Binarization in OCR Settings") } fun engineModeTesseractSnippet(context: Context) { // @Tag("Engine Mode Tesseract") - val ocrRecognizer = ScanbotSDK(context).createOcrEngine() + val ocrRecognizer = ScanbotSDK(context).createOcrEngineManager() val languages = mutableSetOf() languages.add(Language.ENG) ocrRecognizer.setOcrConfig( - OcrEngine.OcrConfig( - engineMode = OcrEngine.EngineMode.TESSERACT, - languages = languages, - ) + OcrEngineManager.OcrConfig( + engineMode = OcrEngineManager.EngineMode.TESSERACT, + languages = languages, + ) ) // @EndTag("Engine Mode Tesseract") } -fun runOcrOnUrisSnippet(ocrEngine: OcrEngine) { +fun runOcrOnUrisSnippet(ocrEngine: OcrEngineManager) { // @Tag("Run OCR from images") - val imageFileUris: List = listOf() // ["file:///some/path/file1.jpg", "file:///some/path/file2.jpg", ...] + val imageFileUris: List = + listOf() // ["file:///some/path/file1.jpg", "file:///some/path/file2.jpg", ...] - var result: OcrResult = ocrEngine.recognizeFromUris(imageFileUris, false) + var result: OcrResult? = ocrEngine.recognizeFromUris(imageFileUris, false).getOrNull() // @EndTag("Run OCR from images") } -fun runOcrOnDocumentSnippet(ocrEngine: OcrEngine, yourDocument: Document) { +fun runOcrOnDocumentSnippet(ocrEngine: OcrEngineManager, yourDocument: Document) { // @Tag("Run OCR from Document") val document: Document = yourDocument - var result: OcrResult = ocrEngine.recognizeFromDocument(document) + var result: OcrResult? = ocrEngine.recognizeFromDocument(document).getOrNull() // @EndTag("Run OCR from Document") } @@ -100,30 +106,30 @@ fun generatePdfWithOcrLayerSnippet(scanbotSDK: ScanbotSDK, document: Document) { val pdfGenerator = scanbotSDK.createPdfGenerator() val pdfConfig = PdfConfiguration( - attributes = PdfAttributes( - author = "", - title = "", - subject = "", - keywords = "", - creator = "" - ), - pageSize = PageSize.A4, - pageDirection = PageDirection.AUTO, - dpi = 200, - jpegQuality = 100, - pageFit = PageFit.NONE, - resamplingMethod = ResamplingMethod.NONE, + attributes = PdfAttributes( + author = "", + title = "", + subject = "", + keywords = "", + creator = "" + ), + pageSize = PageSize.A4, + pageDirection = PageDirection.AUTO, + dpi = 200, + jpegQuality = 100, + pageFit = PageFit.NONE, + resamplingMethod = ResamplingMethod.NONE, ) - val ocrConfig = OcrEngine.OcrConfig( - engineMode = OcrEngine.EngineMode.SCANBOT_OCR + val ocrConfig = OcrEngineManager.OcrConfig( + engineMode = OcrEngineManager.EngineMode.SCANBOT_OCR ) val pdfGenerated = pdfGenerator.generateWithOcrFromDocument( - document = document, - pdfConfig = pdfConfig, - ocrConfig = ocrConfig - ) + document = document, + pdfConfig = pdfConfig, + ocrConfig = ocrConfig + ).getOrNull() val pdfFile = document.pdfUri.toFile() - if (pdfGenerated && pdfFile.exists()) { + if (pdfGenerated != null && pdfFile.exists()) { // Do something with the PDF file } else { Log.e("PdfWithOcrFromDocument", "Failed to create PDF") @@ -137,27 +143,27 @@ fun generatePdfWithOcrLayerFormUrisSnippet(scanbotSDK: ScanbotSDK, imageFileUris val pdfGenerator = scanbotSDK.createPdfGenerator() val pdfConfig = PdfConfiguration( - attributes = PdfAttributes( - author = "", - title = "", - subject = "", - keywords = "", - creator = "" - ), - pageSize = PageSize.A4, - pageDirection = PageDirection.AUTO, - dpi = 200, - jpegQuality = 100, - pageFit = PageFit.NONE, - resamplingMethod = ResamplingMethod.NONE, + attributes = PdfAttributes( + author = "", + title = "", + subject = "", + keywords = "", + creator = "" + ), + pageSize = PageSize.A4, + pageDirection = PageDirection.AUTO, + dpi = 200, + jpegQuality = 100, + pageFit = PageFit.NONE, + resamplingMethod = ResamplingMethod.NONE, ) - val ocrConfig = OcrEngine.OcrConfig( - engineMode = OcrEngine.EngineMode.SCANBOT_OCR + val ocrConfig = OcrEngineManager.OcrConfig( + engineMode = OcrEngineManager.EngineMode.SCANBOT_OCR ) val generatedPdfFile = pdfGenerator.generateWithOcrFromUris( - imageFileUris = imageFileUris, - pdfConfig = pdfConfig, - ocrConfig = ocrConfig + imageFileUris = imageFileUris, + pdfConfig = pdfConfig, + ocrConfig = ocrConfig ) if (generatedPdfFile != null) { // Do something with the PDF file diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/vin/VinSnippets.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/vin/VinSnippets.kt index 96c3ac17..5f0e6f97 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/vin/VinSnippets.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/doc_code_snippet/vin/VinSnippets.kt @@ -9,6 +9,7 @@ import android.widget.TextView import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.appcompat.app.AppCompatActivity +import io.scanbot.common.getOrThrow import io.scanbot.sdk.* import io.scanbot.sdk.camera.* import io.scanbot.sdk.ui.camera.* @@ -106,7 +107,7 @@ fun handleVinScannerRTUResultSnippet(context: Context, result: VinScannerActivit fun useVinScannerFrameHandlerSnippet(context: Context, cameraView: ScanbotCameraXView) { // @Tag("Attach Vin Scanner to ScanbotCameraXView") val scanbotSdk = ScanbotSDK(context) - val vinScanner = scanbotSdk.createVinScanner() + val vinScanner = scanbotSdk.createVinScanner().getOrThrow() val vinScannerFrameHandler = VinScannerFrameHandler.attach(cameraView, vinScanner) // @EndTag("Attach Vin Scanner to ScanbotCameraXView") } diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/fragments/EHICResultDialogFragment.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/fragments/EHICResultDialogFragment.kt deleted file mode 100644 index e6d36435..00000000 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/fragments/EHICResultDialogFragment.kt +++ /dev/null @@ -1,90 +0,0 @@ -package io.scanbot.example.fragments - -import android.annotation.SuppressLint -import android.app.Dialog -import android.content.ClipData -import android.content.ClipboardManager -import android.content.Context -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.appcompat.app.AlertDialog -import io.scanbot.example.R -import io.scanbot.sdk.ehicscanner.EuropeanHealthInsuranceCardRecognitionResult - - -class EHICResultDialogFragment : androidx.fragment.app.DialogFragment() { - - companion object { - const val EHIC_DATA = "EHIC_DATA" - const val NAME = "EHICResultDialogFragment" - - @JvmStatic - fun newInstance(recognitionResult: EuropeanHealthInsuranceCardRecognitionResult): EHICResultDialogFragment { - val frag = EHICResultDialogFragment() - val args = Bundle() - args.putParcelable(EHIC_DATA, recognitionResult) - frag.arguments = args - return frag - } - } - - private var ehicRecognitionResult: EuropeanHealthInsuranceCardRecognitionResult? = null - - private fun addContentView(inflater: LayoutInflater, container: ViewGroup?): View? { - ehicRecognitionResult = requireArguments().getParcelable(EHIC_DATA) - - val view = inflater.inflate(R.layout.fragment_ehic_result_dialog, container) - view.findViewById(R.id.ehic_data).text = extractData(ehicRecognitionResult!!) - return view - } - - @SuppressLint("InflateParams") - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val builder = AlertDialog.Builder(requireActivity()) - - val inflater = LayoutInflater.from(activity) - - val contentContainer = inflater.inflate(R.layout.holo_dialog_frame, null, false) as ViewGroup - addContentView(inflater, contentContainer) - - builder.setView(contentContainer) - - - builder.setPositiveButton( - getString(R.string.cancel_dialog_button)) { _, _ -> - run { - dismiss() - } - } - - builder.setNegativeButton( - R.string.copy_dialog_button) { _, _ -> - run { - val clipboard = context?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - - ehicRecognitionResult?.let { - val data = extractData(it) - val clip = ClipData.newPlainText(data, data) - clipboard.setPrimaryClip(clip) - } - - dismiss() - } - } - val dialog = builder.create() - dialog.setCanceledOnTouchOutside(true) - - return dialog - } - - private fun extractData(result: EuropeanHealthInsuranceCardRecognitionResult): String { - val builder = StringBuilder() - for (field in result.fields) { - builder.append(field.type.name).append(": ").append(field.value).append("\n\n") - } - return builder.toString() - } -} \ No newline at end of file diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/fragments/MRZDialogFragment.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/fragments/MRZDialogFragment.kt index 64dba1d4..2a4df555 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/fragments/MRZDialogFragment.kt +++ b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/fragments/MRZDialogFragment.kt @@ -12,7 +12,7 @@ import android.view.ViewGroup import android.widget.TextView import androidx.appcompat.app.AlertDialog import io.scanbot.example.R -import io.scanbot.sdk.genericdocument.entity.* +import io.scanbot.sdk.genericdocument.GenericDocument import io.scanbot.sdk.mrz.* @@ -23,7 +23,7 @@ class MRZDialogFragment : androidx.fragment.app.DialogFragment() { const val NAME = "MRZDialogFragment" @JvmStatic - fun newInstance(data: GenericDocument): MRZDialogFragment { + fun newInstance(data: GenericDocument): MRZDialogFragment { val frag = MRZDialogFragment() val args = Bundle() args.putParcelable(MRZ_DATA, data) diff --git a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/fragments/MedicalCertificateResultDialogFragment.kt b/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/fragments/MedicalCertificateResultDialogFragment.kt deleted file mode 100644 index cc5c4b40..00000000 --- a/data-capture-ready-to-use-ui-example/app/src/main/java/io/scanbot/example/fragments/MedicalCertificateResultDialogFragment.kt +++ /dev/null @@ -1,153 +0,0 @@ -package io.scanbot.example.fragments - -import android.annotation.SuppressLint -import android.app.Dialog -import android.content.ClipData -import android.content.ClipboardManager -import android.content.Context -import android.graphics.Bitmap -import android.os.Build -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import androidx.appcompat.app.AlertDialog -import io.scanbot.example.R -import io.scanbot.example.databinding.FragmentMedicalCertificateResultDialogBinding -import io.scanbot.sdk.core.ImageRef -import io.scanbot.sdk.mc.* - -class MedicalCertificateResultDialogFragment : androidx.fragment.app.DialogFragment() { - - companion object { - - const val NAME = "MedicalCertificateResultDialogFragment" - - const val MEDICAL_CERTIFICATE_RESULT_EXTRA = "MEDICAL_CERTIFICATE_RESULT_EXTRA" - - fun newInstance(medicalCertificateScanResult: MedicalCertificateScanningResult): MedicalCertificateResultDialogFragment { - val f = MedicalCertificateResultDialogFragment() - - // Supply num input as an argument. - val args = Bundle() - args.putParcelable(MEDICAL_CERTIFICATE_RESULT_EXTRA, medicalCertificateScanResult) - f.arguments = args - - return f - } - } - - private var _binding: FragmentMedicalCertificateResultDialogBinding? = null - private val binding get() = _binding!! - - private var medicalCertificateResult: MedicalCertificateScanningResult? = null - - private fun addContentView(inflater: LayoutInflater, container: ViewGroup?): View { - medicalCertificateResult = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - arguments?.getParcelable(MEDICAL_CERTIFICATE_RESULT_EXTRA, MedicalCertificateScanningResult::class.java) - } else { - @Suppress("DEPRECATION") - arguments?.getParcelable(MEDICAL_CERTIFICATE_RESULT_EXTRA) - } - - _binding = FragmentMedicalCertificateResultDialogBinding.inflate(inflater, container, true) - - binding.title.text = getString(R.string.mrz_result_caption) - - medicalCertificateResult?.let { result -> - binding.tvData.text = extractData(result) - binding.imagesContainer.visibility = View.VISIBLE - result.croppedImage?.let { showBitmapImage(it, binding.frontSnapResult) } - } - - return binding.root - } - - private fun showBitmapImage(mcImage: ImageRef, imageView: ImageView) { - imageView.visibility = View.VISIBLE - imageView.setImageBitmap(mcImage.toBitmap()) - } - - - @SuppressLint("InflateParams") - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val builder = AlertDialog.Builder(requireActivity()) - - val inflater = LayoutInflater.from(activity) - - val contentContainer = inflater.inflate(R.layout.holo_dialog_frame, null, false) as ViewGroup - addContentView(inflater, contentContainer) - - builder.setView(contentContainer) - - - builder.setPositiveButton(getString(R.string.cancel_dialog_button)) { _, _ -> - run { - dismiss() - } - } - - builder.setNegativeButton(R.string.copy_dialog_button) { _, _ -> - run { - val clipboard = context?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - val data = medicalCertificateResult?.let { extractData(it) } - - - val clip = ClipData.newPlainText(data, data) - - clipboard.setPrimaryClip(clip) - dismiss() - } - } - val dialog = builder.create() - dialog.setCanceledOnTouchOutside(true) - - return dialog - } - - private fun extractData(result: MedicalCertificateScanningResult): String { - return StringBuilder() - .append("Type: ").append(if (result.checkBoxes - .find { medicalCertificateInfoBox -> medicalCertificateInfoBox.type == MedicalCertificateCheckBoxType.INITIAL_CERTIFICATE } - ?.checked == true) - "Initial" - else if (result.checkBoxes - .find { medicalCertificateInfoBox -> medicalCertificateInfoBox.type == MedicalCertificateCheckBoxType.RENEWED_CERTIFICATE } - ?.checked == true) - "Renewed" - else - "Unknown").append("\n") - .append("Work Accident: ").append(if (result.checkBoxes - .find { medicalCertificateInfoBox -> medicalCertificateInfoBox.type == MedicalCertificateCheckBoxType.WORK_ACCIDENT } - ?.checked == true) - "Yes" - else "No").append("\n") - .append("Accident Consultant: ").append( - if (result.checkBoxes - .find { medicalCertificateInfoBox -> medicalCertificateInfoBox.type == MedicalCertificateCheckBoxType.ASSIGNED_TO_ACCIDENT_INSURANCE_DOCTOR } - ?.checked == true) - "Yes" - else "No" - ).append("\n") - .append("Start Date: ").append( - result.dates.find { dateRecord -> dateRecord.type == MedicalCertificateDateRecordType.INCAPABLE_OF_WORK_SINCE }?.value - ).append("\n") - .append("End Date: ").append( - result.dates.find { dateRecord -> dateRecord.type == MedicalCertificateDateRecordType.INCAPABLE_OF_WORK_UNTIL }?.value - ).append("\n") - .append("Issue Date: ").append( - result.dates.find { dateRecord -> dateRecord.type == MedicalCertificateDateRecordType.DIAGNOSED_ON }?.value - ) - .append("\n") - .append("Form type: ${result.formType.name}") - .append("\n") - .append(result.patientInfoBox.fields.joinToString(separator = "\n", prefix = "\n") { "${it.type.name}: ${it.value}" }) - .toString() - } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } -} diff --git a/data-capture-ready-to-use-ui-example/app/src/main/res/layout/activity_main.xml b/data-capture-ready-to-use-ui-example/app/src/main/res/layout/activity_main.xml index 34f4f9b6..5a7fdf48 100644 --- a/data-capture-ready-to-use-ui-example/app/src/main/res/layout/activity_main.xml +++ b/data-capture-ready-to-use-ui-example/app/src/main/res/layout/activity_main.xml @@ -124,14 +124,6 @@ android:layout_marginEnd="8dp" android:text="@string/scan_ehic" /> -