@regulaforensics/react-native-document-reader-api 7.5.762-nightly → 7.5.766-nightly

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,6 +14,6 @@ Pod::Spec.new do |s|
14
14
  s.source = { :http => 'file:' + __dir__ }
15
15
  s.ios.deployment_target = '11.0'
16
16
  s.source_files = "ios/*.{h,m}"
17
- s.dependency 'DocumentReaderNightly', '7.5.4150'
17
+ s.dependency 'DocumentReaderNightly', '7.5.4166'
18
18
  s.dependency 'React'
19
19
  end
@@ -41,7 +41,7 @@ dependencies {
41
41
  //noinspection GradleDynamicVersion
42
42
  implementation 'com.facebook.react:react-native:+'
43
43
  //noinspection GradleDependency
44
- implementation('com.regula.documentreader:api:7.5.10329') {
44
+ implementation('com.regula.documentreader:api:7.5.10343') {
45
45
  transitive = true
46
46
  }
47
47
  }
@@ -5,10 +5,13 @@
5
5
  // Created by Pavel Masiuk on 21.09.2023.
6
6
  // Copyright © 2023 Regula. All rights reserved.
7
7
  //
8
+ @file:SuppressLint("MissingPermission")
8
9
 
9
10
  package com.regula.documentreader
10
11
 
11
- import android.Manifest.permission.*
12
+ import android.Manifest.permission.ACCESS_FINE_LOCATION
13
+ import android.Manifest.permission.BLUETOOTH_CONNECT
14
+ import android.Manifest.permission.BLUETOOTH_SCAN
12
15
  import android.annotation.SuppressLint
13
16
  import android.app.Activity
14
17
  import android.bluetooth.BluetoothAdapter
@@ -19,7 +22,6 @@ import android.content.pm.PackageManager.PERMISSION_GRANTED
19
22
  import android.os.Build
20
23
  import android.os.IBinder
21
24
  import android.provider.Settings
22
- import androidx.annotation.RequiresPermission
23
25
  import androidx.core.app.ActivityCompat.requestPermissions
24
26
  import androidx.core.content.ContextCompat.checkSelfPermission
25
27
  import com.regula.documentreader.api.ble.BLEWrapper
@@ -28,37 +30,103 @@ import com.regula.documentreader.api.ble.RegulaBleService
28
30
  import com.regula.documentreader.api.internal.permission.BluetoothPermissionHelper.BLE_ACCESS_PERMISSION
29
31
  import com.regula.documentreader.api.internal.permission.BluetoothSettingsHelper.isBluetoothEnabled
30
32
  import com.regula.documentreader.api.internal.permission.BluetoothSettingsHelper.isLocationServiceEnabled
33
+ import java.util.Timer
34
+ import java.util.TimerTask
31
35
 
32
- const val REQUEST_ENABLE_LOCATION = 196
33
- const val REQUEST_ENABLE_BT = 197
36
+ const val SEARCHING_TIMEOUT: Long = 7000
37
+
38
+ const val INTENT_REQUEST_ENABLE_LOCATION = 196
39
+ const val INTENT_REQUEST_ENABLE_BLUETOOTH = 197
34
40
 
35
41
  @SuppressLint("StaticFieldLeak")
36
- var bleManager: BLEWrapper? = null
42
+ lateinit var bluetooth: BLEWrapper
43
+ lateinit var savedCallbackForPermissionResult: Callback
44
+ var deviceConnected = false
37
45
 
38
- @RequiresPermission("android.permission.BLUETOOTH_CONNECT")
39
- fun requestEnableBle(activity: Activity) {
40
- val enableIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
41
- activity.startActivityForResult(enableIntent, REQUEST_ENABLE_BT)
46
+ fun connectBluetoothDevice(callback: Callback) {
47
+ // return if already connected
48
+ if (deviceConnected) return
49
+
50
+ // If some of the bluetooth permissions/settings don't match the requirements,
51
+ // save callback for later and request the permissions/settings.
52
+ // Callback will then be used in onRequestPermissionsResult for permission requests
53
+ // and in onActivityResult for settings change requests.
54
+ if (!isBluetoothSettingsReady(activity)) {
55
+ savedCallbackForPermissionResult = callback
56
+ return
57
+ }
58
+
59
+ // set searching timeout
60
+ val timer = object : TimerTask() {
61
+ override fun run() {
62
+ callback.success(false)
63
+ bluetooth.stopDeviceScan()
64
+ bluetooth.disconnect()
65
+ }
66
+ }
67
+ Timer().schedule(timer, SEARCHING_TIMEOUT)
68
+
69
+ // start searching devices
70
+ val bleIntent = Intent(activity, RegulaBleService::class.java)
71
+ activity.startService(bleIntent)
72
+ activity.bindService(bleIntent, object : ServiceConnection {
73
+ override fun onServiceConnected(name: ComponentName, service: IBinder) {
74
+ bluetooth = (service as RegulaBleService.LocalBinder).service.bleManager
75
+ bluetooth.addCallback(object : BleWrapperCallback() {
76
+ override fun onDeviceReady() {
77
+ timer.cancel()
78
+ bluetooth.removeCallback(this)
79
+ deviceConnected = true
80
+ callback.success(true)
81
+ }
82
+ })
83
+ }
84
+
85
+ override fun onServiceDisconnected(name: ComponentName) {}
86
+ }, 0)
42
87
  }
43
88
 
44
- fun requestEnableLocationService(activity: Activity) {
45
- val myIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
46
- activity.startActivityForResult(myIntent, REQUEST_ENABLE_LOCATION)
89
+ fun onRequestPermissionsResult(
90
+ requestCode: Int,
91
+ permissions: Array<out String>,
92
+ grantResults: IntArray
93
+ ): Boolean {
94
+ if (requestCode != BLE_ACCESS_PERMISSION || permissions.isEmpty()) return false
95
+ if (grantResults.isEmpty() || grantResults[0] != PERMISSION_GRANTED) {
96
+ savedCallbackForPermissionResult.success(false)
97
+ return true
98
+ }
99
+ connectBluetoothDevice(savedCallbackForPermissionResult)
100
+ return true
47
101
  }
48
102
 
49
- // requestEnableBle() is called after a check for permission
50
- @SuppressLint("MissingPermission")
51
- fun isBlePermissionsGranted(activity: Activity): Boolean {
52
- if (!isLocationServiceEnabled(activity)) {
53
- requestEnableLocationService(activity)
54
- return false
103
+ fun onActivityResult(requestCode: Int, rc: Int, @Suppress("UNUSED_PARAMETER") data: Intent?): Boolean {
104
+ var resultCode = rc
105
+ if (requestCode == INTENT_REQUEST_ENABLE_LOCATION)
106
+ resultCode = if (isLocationServiceEnabled(activity)) Activity.RESULT_OK
107
+ else requestCode
108
+
109
+ if (requestCode == INTENT_REQUEST_ENABLE_BLUETOOTH || requestCode == INTENT_REQUEST_ENABLE_LOCATION) {
110
+ if (resultCode == Activity.RESULT_OK)
111
+ connectBluetoothDevice(savedCallbackForPermissionResult)
112
+ else
113
+ savedCallbackForPermissionResult.success(false)
114
+ return true
55
115
  }
116
+ return false
117
+ }
118
+
119
+ fun isBluetoothSettingsReady(activity: Activity): Boolean {
56
120
  deniedBluetoothPermissions(activity)?.let {
57
121
  requestPermissions(activity, it, BLE_ACCESS_PERMISSION)
58
122
  return false
59
123
  }
60
124
  if (!isBluetoothEnabled(activity)) {
61
- requestEnableBle(activity)
125
+ requestEnableBluetooth(activity)
126
+ return false
127
+ }
128
+ if (!isLocationServiceEnabled(activity)) {
129
+ requestEnableLocationService(activity)
62
130
  return false
63
131
  }
64
132
  return true
@@ -83,30 +151,12 @@ fun deniedBluetoothPermission(
83
151
  return arrayOf()
84
152
  }
85
153
 
86
- fun startBluetoothService(
87
- activity: Activity,
88
- onConnected: (Boolean) -> Unit,
89
- onDisconnected: () -> Unit,
90
- onReady: () -> Unit
91
- ) {
92
- val bleIntent = Intent(activity, RegulaBleService::class.java)
93
- activity.startService(bleIntent)
94
-
95
- activity.bindService(bleIntent, object : ServiceConnection {
96
- override fun onServiceConnected(name: ComponentName, service: IBinder) {
97
- bleManager = (service as RegulaBleService.LocalBinder).service.bleManager
98
- val isBleManagerConnected = bleManager?.isConnected == true
99
- onConnected(isBleManagerConnected)
100
- if (!isBleManagerConnected) {
101
- bleManager?.addCallback(object : BleWrapperCallback() {
102
- override fun onDeviceReady() {
103
- bleManager!!.removeCallback(this)
104
- onReady()
105
- }
106
- })
107
- }
108
- }
154
+ fun requestEnableBluetooth(activity: Activity) {
155
+ val enableIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
156
+ activity.startActivityForResult(enableIntent, INTENT_REQUEST_ENABLE_BLUETOOTH)
157
+ }
109
158
 
110
- override fun onServiceDisconnected(name: ComponentName) = onDisconnected()
111
- }, 0)
112
- }
159
+ fun requestEnableLocationService(activity: Activity) {
160
+ val myIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
161
+ activity.startActivityForResult(myIntent, INTENT_REQUEST_ENABLE_LOCATION)
162
+ }
@@ -1,5 +1,5 @@
1
1
  //
2
- // Config.java
2
+ // Config.kt
3
3
  // DocumentReader
4
4
  //
5
5
  // Created by Pavel Masiuk on 21.09.2023.
@@ -26,6 +26,7 @@ import com.regula.documentreader.api.params.LivenessParams
26
26
  import com.regula.documentreader.api.params.ParamsCustomization
27
27
  import com.regula.documentreader.api.params.ProcessParam
28
28
  import com.regula.documentreader.api.params.RfidScenario
29
+ import com.regula.documentreader.api.params.rfid.dg.DTCDataGroup
29
30
  import com.regula.documentreader.api.params.rfid.dg.DataGroups
30
31
  import com.regula.documentreader.api.params.rfid.dg.EIDDataGroups
31
32
  import com.regula.documentreader.api.params.rfid.dg.EPassportDataGroups
@@ -129,12 +130,16 @@ fun setProcessParams(processParams: ProcessParam, opts: JSONObject) = opts.forEa
129
130
  "shouldReturnPackageForReprocess" -> processParams.shouldReturnPackageForReprocess = v as Boolean
130
131
  "disablePerforationOCR" -> processParams.disablePerforationOCR = v as Boolean
131
132
  "respectImageQuality" -> processParams.respectImageQuality = v as Boolean
133
+ "strictImageQuality" -> processParams.strictImageQuality = v as Boolean
132
134
  "splitNames" -> processParams.splitNames = v as Boolean
133
135
  "doDetectCan" -> processParams.doDetectCan = v as Boolean
134
136
  "useFaceApi" -> processParams.useFaceApi = v as Boolean
135
137
  "useAuthenticityCheck" -> processParams.useAuthenticityCheck = v as Boolean
136
138
  "checkHologram" -> processParams.checkHologram = v as Boolean
137
139
  "generateNumericCodes" -> processParams.generateNumericCodes = v as Boolean
140
+ "strictBarcodeDigitalSignatureCheck" -> processParams.strictBarcodeDigitalSignatureCheck = v as Boolean
141
+ "selectLongestNames" -> processParams.selectLongestNames = v as Boolean
142
+ "generateDTCVC" -> processParams.generateDTCVC = v as Boolean
138
143
  "measureSystem" -> processParams.measureSystem = v.toInt()
139
144
  "barcodeParserType" -> processParams.barcodeParserType = v.toInt()
140
145
  "perspectiveAngle" -> processParams.perspectiveAngle = v.toInt()
@@ -207,12 +212,16 @@ fun getProcessParams(processParams: ProcessParam) = mapOf(
207
212
  "shouldReturnPackageForReprocess" to processParams.shouldReturnPackageForReprocess,
208
213
  "disablePerforationOCR" to processParams.disablePerforationOCR,
209
214
  "respectImageQuality" to processParams.respectImageQuality,
215
+ "strictImageQuality" to processParams.strictImageQuality,
210
216
  "splitNames" to processParams.splitNames,
211
217
  "doDetectCan" to processParams.doDetectCan,
212
218
  "useFaceApi" to processParams.useFaceApi,
213
219
  "useAuthenticityCheck" to processParams.useAuthenticityCheck,
214
220
  "checkHologram" to processParams.checkHologram,
215
221
  "generateNumericCodes" to processParams.generateNumericCodes,
222
+ "strictBarcodeDigitalSignatureCheck" to processParams.strictBarcodeDigitalSignatureCheck,
223
+ "selectLongestNames" to processParams.selectLongestNames,
224
+ "generateDTCVC" to processParams.generateDTCVC,
216
225
  "measureSystem" to processParams.measureSystem,
217
226
  "barcodeParserType" to processParams.barcodeParserType,
218
227
  "perspectiveAngle" to processParams.perspectiveAngle,
@@ -265,6 +274,8 @@ fun setCustomization(customization: ParamsCustomization, opts: JSONObject, conte
265
274
  "cameraFrameLineLength" -> editor.setCameraFrameLineLength(v.toInt())
266
275
  "cameraFrameShapeType" -> editor.setCameraFrameShapeType(v.toInt())
267
276
  "cameraFrameOffsetWidth" -> editor.setCameraFrameOffsetWidth(v.toInt())
277
+ "nextPageAnimationStartDelay" -> editor.setNextPageAnimationStartDelay(v.toInt())
278
+ "nextPageAnimationEndDelay" -> editor.setNextPageAnimationEndDelay(v.toInt())
268
279
  "activityIndicatorSize" -> editor.setActivityIndicatorSize(v.toInt())
269
280
  "status" -> editor.setStatus(v as String)
270
281
  "resultStatus" -> editor.setResultStatus(v as String)
@@ -278,6 +289,7 @@ fun setCustomization(customization: ParamsCustomization, opts: JSONObject, conte
278
289
  "activityIndicatorColor" -> editor.setActivityIndicatorColor(v.toColor())
279
290
  "statusBackgroundColor" -> editor.setStatusBackgroundColor(v.toColor())
280
291
  "cameraPreviewBackgroundColor" -> editor.setCameraPreviewBackgroundColor(v.toColor())
292
+ "backgroundMaskColor" -> editor.setBackgroundMaskColor(v.toColor())
281
293
  "statusPositionMultiplier" -> editor.setStatusPositionMultiplier(v.toFloat())
282
294
  "resultStatusPositionMultiplier" -> editor.setResultStatusPositionMultiplier(v.toFloat())
283
295
  "toolbarSize" -> editor.setToolbarSize(v.toFloat())
@@ -336,6 +348,8 @@ fun getCustomization(customization: ParamsCustomization) = mapOf(
336
348
  "cameraFrameLineLength" to customization.cameraFrameLineLength,
337
349
  "cameraFrameShapeType" to customization.cameraFrameShapeType,
338
350
  "cameraFrameOffsetWidth" to customization.cameraFrameOffsetWidth,
351
+ "nextPageAnimationStartDelay" to customization.nextPageAnimationStartDelay,
352
+ "nextPageAnimationEndDelay" to customization.nextPageAnimationEndDelay,
339
353
  "activityIndicatorSize" to customization.activityIndicatorSize,
340
354
  "status" to customization.status,
341
355
  "resultStatus" to customization.resultStatus,
@@ -349,6 +363,7 @@ fun getCustomization(customization: ParamsCustomization) = mapOf(
349
363
  "activityIndicatorColor" to customization.activityIndicatorColor.toLong(),
350
364
  "statusBackgroundColor" to customization.statusBackgroundColor.toLong(),
351
365
  "cameraPreviewBackgroundColor" to customization.cameraPreviewBackgroundColor.toLong(),
366
+ "backgroundMaskColor" to customization.backgroundMaskColor.toLong(),
352
367
  "statusPositionMultiplier" to customization.statusPositionMultiplier,
353
368
  "resultStatusPositionMultiplier" to customization.resultStatusPositionMultiplier,
354
369
  "backgroundMaskAlpha" to customization.backgroundMaskAlpha,
@@ -422,6 +437,8 @@ fun setRfidScenario(rfidScenario: RfidScenario, opts: JSONObject) = opts.forEach
422
437
  "applyAmendments" -> rfidScenario.isApplyAmendments = v as Boolean
423
438
  "autoSettings" -> rfidScenario.isAutoSettings = v as Boolean
424
439
  "proceedReadingAlways" -> rfidScenario.proceedReadingAlways = v as Boolean
440
+ "readDTC" -> rfidScenario.isReadDTC = v as Boolean
441
+ "mrzStrictCheck" -> rfidScenario.isMrzStrictCheck = v as Boolean
425
442
  "signManagementAction" -> rfidScenario.signManagementAction = v.toInt()
426
443
  "readingBuffer" -> rfidScenario.readingBuffer = v.toInt()
427
444
  "onlineTAToSignDataType" -> rfidScenario.onlineTAToSignDataType = v.toInt()
@@ -437,9 +454,11 @@ fun setRfidScenario(rfidScenario: RfidScenario, opts: JSONObject) = opts.forEach
437
454
  "mrz" -> rfidScenario.mrz = v as String
438
455
  "eSignPINDefault" -> rfidScenario.seteSignPINDefault(v as String)
439
456
  "eSignPINNewValue" -> rfidScenario.seteSignPINNewValue(v as String)
457
+ "cardAccess" -> rfidScenario.cardAccess = v as String
440
458
  "ePassportDataGroups" -> setDataGroups(rfidScenario.ePassportDataGroups(), v as JSONObject)
441
459
  "eIDDataGroups" -> setDataGroups(rfidScenario.eIDDataGroups(), v as JSONObject)
442
460
  "eDLDataGroups" -> setDataGroups(rfidScenario.eDLDataGroups(), v as JSONObject)
461
+ "dtcDataGroups" -> setDataGroups(rfidScenario.DTCDataGroup(), v as JSONObject)
443
462
  }
444
463
  }
445
464
 
@@ -478,6 +497,8 @@ fun getRfidScenario(rfidScenario: RfidScenario) = mapOf(
478
497
  "applyAmendments" to rfidScenario.isApplyAmendments,
479
498
  "autoSettings" to rfidScenario.isAutoSettings,
480
499
  "proceedReadingAlways" to rfidScenario.proceedReadingAlways,
500
+ "readDTC" to rfidScenario.isReadDTC,
501
+ "mrzStrictCheck" to rfidScenario.isMrzStrictCheck,
481
502
  "signManagementAction" to rfidScenario.signManagementAction,
482
503
  "readingBuffer" to rfidScenario.readingBuffer,
483
504
  "onlineTAToSignDataType" to rfidScenario.onlineTAToSignDataType,
@@ -493,9 +514,11 @@ fun getRfidScenario(rfidScenario: RfidScenario) = mapOf(
493
514
  "mrz" to rfidScenario.mrz,
494
515
  "eSignPINDefault" to rfidScenario.geteSignPINDefault(),
495
516
  "eSignPINNewValue" to rfidScenario.geteSignPINNewValue(),
517
+ "cardAccess" to rfidScenario.cardAccess,
496
518
  "ePassportDataGroups" to getDataGroups(rfidScenario.ePassportDataGroups()),
497
519
  "eIDDataGroups" to getDataGroups(rfidScenario.eIDDataGroups()),
498
- "eDLDataGroups" to getDataGroups(rfidScenario.eDLDataGroups())
520
+ "eDLDataGroups" to getDataGroups(rfidScenario.eDLDataGroups()),
521
+ "dtcDataGroups" to getDataGroups(rfidScenario.DTCDataGroup())
499
522
  ).toJsonObject()
500
523
 
501
524
  fun setDataGroups(dataGroup: DataGroups, opts: JSONObject) = opts.forEach { k, v ->
@@ -529,6 +552,15 @@ fun setDataGroups(dataGroup: DataGroups, opts: JSONObject) = opts.forEach { k, v
529
552
  "DG20" -> dataGroup.isDG20 = value
530
553
  "DG21" -> dataGroup.isDG21 = value
531
554
  }
555
+ if (dataGroup is DTCDataGroup) when (k) {
556
+ "DG15" -> dataGroup.isDG15 = value
557
+ "DG16" -> dataGroup.isDG16 = value
558
+ "DG17" -> dataGroup.isDG17 = value
559
+ "DG18" -> dataGroup.isDG18 = value
560
+ "DG22" -> dataGroup.isDG22 = value
561
+ "DG23" -> dataGroup.isDG23 = value
562
+ "DG24" -> dataGroup.isDG24 = value
563
+ }
532
564
  }
533
565
 
534
566
  fun getDataGroups(dataGroup: DataGroups): JSONObject {
@@ -561,6 +593,15 @@ fun getDataGroups(dataGroup: DataGroups): JSONObject {
561
593
  result["DG20"] = dataGroup.isDG20
562
594
  result["DG21"] = dataGroup.isDG21
563
595
  }
596
+ if (dataGroup is DTCDataGroup) {
597
+ result["DG15"] = dataGroup.isDG15
598
+ result["DG16"] = dataGroup.isDG16
599
+ result["DG17"] = dataGroup.isDG17
600
+ result["DG18"] = dataGroup.isDG18
601
+ result["DG22"] = dataGroup.isDG22
602
+ result["DG23"] = dataGroup.isDG23
603
+ result["DG24"] = dataGroup.isDG24
604
+ }
564
605
  return result.toJsonObject()
565
606
  }
566
607
 
@@ -1,5 +1,5 @@
1
1
  //
2
- // JSONConstructor.java
2
+ // JSONConstructor.kt
3
3
  // DocumentReader
4
4
  //
5
5
  // Created by Pavel Masiuk on 21.09.2023.
@@ -46,6 +46,7 @@ import com.regula.documentreader.api.params.rfid.TccParams
46
46
  import com.regula.documentreader.api.params.rfid.authorization.PAAttribute
47
47
  import com.regula.documentreader.api.params.rfid.authorization.PAResourcesIssuer
48
48
  import com.regula.documentreader.api.params.rfid.authorization.TAChallenge
49
+ import com.regula.documentreader.api.params.rfid.dg.DTCDataGroup
49
50
  import com.regula.documentreader.api.params.rfid.dg.EDLDataGroups
50
51
  import com.regula.documentreader.api.params.rfid.dg.EIDDataGroups
51
52
  import com.regula.documentreader.api.params.rfid.dg.EPassportDataGroups
@@ -243,6 +244,17 @@ fun generateDocReaderConfig(temp: DocReaderConfig?): JSONObject? {
243
244
  return result
244
245
  }
245
246
 
247
+ fun bleDeviceConfigFromJSON(input: JSONObject): BleDeviceConfig {
248
+ var result = BleDeviceConfig(bluetooth)
249
+
250
+ if (input.has("customDb")) result = BleDeviceConfig(bluetooth, byteArrayFromBase64(input.getString("customDb")))
251
+ if (input.has("licenseUpdate")) result.setLicenseUpdate(input.getBoolean("licenseUpdate"))
252
+ if (input.has("delayedNNLoad")) result.isDelayedNNLoad = input.getBoolean("delayedNNLoad")
253
+ if (input.has("blackList")) result.blackList = input.getJSONObject("blackList")
254
+
255
+ return result
256
+ }
257
+
246
258
  fun scannerConfigFromJSON(input: JSONObject): ScannerConfig {
247
259
  val builder = if (input.has("scenario")) ScannerConfig.Builder(input.getString("scenario"))
248
260
  else ScannerConfig.Builder(onlineProcessingConfigFromJSON(input.getJSONObject("onlineProcessingConfig"))!!)
@@ -274,6 +286,7 @@ fun recognizeConfigFromJSON(input: JSONObject): RecognizeConfig {
274
286
  else RecognizeConfig.Builder(onlineProcessingConfigFromJSON(input.getJSONObject("onlineProcessingConfig"))!!)
275
287
 
276
288
  if (input.has("oneShotIdentification")) builder.setOneShotIdentification(input.getBoolean("oneShotIdentification"))
289
+ if (input.has("dtc")) builder.setDTC(byteArrayFromBase64(input.getString("dtc"))!!)
277
290
  if (input.has("livePortrait")) builder.setLivePortrait(bitmapFromBase64(input.getString("livePortrait"))!!)
278
291
  if (input.has("extPortrait")) builder.setExtPortrait(bitmapFromBase64(input.getString("extPortrait"))!!)
279
292
  if (input.has("image")) builder.setBitmap(bitmapFromBase64(input.getString("image"))!!)
@@ -302,6 +315,7 @@ fun generateRecognizeConfig(temp: RecognizeConfig?): JSONObject? {
302
315
  result.put("scenario", input.scenario)
303
316
  result.put("onlineProcessingConfig", generateOnlineProcessingConfig(input.onlineProcessingConfig))
304
317
  result.put("oneShotIdentification", input.oneShotIdentification)
318
+ result.put("dtc", generateByteArray(input.dtc))
305
319
  result.put("livePortrait", bitmapToBase64(input.livePortrait))
306
320
  result.put("extPortrait", bitmapToBase64(input.extPortrait))
307
321
  result.put("image", bitmapToBase64(input.bitmap))
@@ -325,6 +339,7 @@ fun backendProcessingConfigFromJSON(temp: JSONObject?): BackendProcessingConfig?
325
339
  val result = BackendProcessingConfig(input.getString("url"))
326
340
  if (input.has("httpHeaders")) result.httpHeaders = stringMapFromJson(input.getJSONObject("httpHeaders"))
327
341
  if (input.has("rfidServerSideChipVerification")) result.rfidServerSideChipVerification = input.getBoolean("rfidServerSideChipVerification")
342
+ if (input.has("timeoutConnection")) result.timeoutConnection = input.getDouble("timeoutConnection")
328
343
 
329
344
  return result
330
345
  }
@@ -337,6 +352,7 @@ fun generateBackendProcessingConfig(temp: BackendProcessingConfig?): JSONObject?
337
352
  result.put("url", input.url)
338
353
  result.put("httpHeaders", generateStringMap(input.httpHeaders))
339
354
  result.put("rfidServerSideChipVerification", input.rfidServerSideChipVerification)
355
+ result.put("timeoutConnection", input.timeoutConnection)
340
356
 
341
357
  return result
342
358
  }
@@ -508,6 +524,14 @@ fun eIDDataGroupsFromJSON(input: JSONObject): EIDDataGroups {
508
524
 
509
525
  fun generateEIDDataGroups(input: EIDDataGroups): JSONObject = getDataGroups(input)
510
526
 
527
+ fun dtcDataGroupsFromJSON(input: JSONObject): DTCDataGroup {
528
+ val result = DTCDataGroup()
529
+ setDataGroups(result, input)
530
+ return result
531
+ }
532
+
533
+ fun generateDTCDataGroups(input: DTCDataGroup): JSONObject = getDataGroups(input)
534
+
511
535
  fun rfidScenarioFromJSON(input: JSONObject): RfidScenario {
512
536
  val result = RfidScenario()
513
537
  setRfidScenario(result, input)
@@ -573,18 +597,6 @@ fun generateTypeface(temp: Typeface?, size: Int? = null): JSONObject? {
573
597
  return result
574
598
  }
575
599
 
576
- fun bleDeviceConfigFromJSON(input: JSONObject): BleDeviceConfig {
577
- val bleWrapper = bleManager
578
- var result = BleDeviceConfig(bleWrapper)
579
-
580
- if (input.has("customDb")) result = BleDeviceConfig(bleWrapper!!, byteArrayFromBase64(input.getString("customDb")))
581
- if (input.has("licenseUpdate")) result.setLicenseUpdate(input.getBoolean("licenseUpdate"))
582
- if (input.has("delayedNNLoad")) result.isDelayedNNLoad = input.getBoolean("delayedNNLoad")
583
- if (input.has("blackList")) result.blackList = input.getJSONObject("blackList")
584
-
585
- return result
586
- }
587
-
588
600
  fun imageInputDataFromJSON(temp: JSONObject?): ImageInputData? {
589
601
  if (temp == null || !temp.has("image")) return null
590
602
  val input: JSONObject = temp
@@ -2168,6 +2180,7 @@ fun documentReaderResultsFromJSON(temp: JSONObject?): DocumentReaderResults? {
2168
2180
  result.documentType = listFromJSON(input.optJSONArray("documentType"), ::documentReaderDocumentTypeFromJSON)!!
2169
2181
  result.status = documentReaderResultsStatusFromJSON(input.optJSONObject("status"))!!
2170
2182
  result.vdsncData = vdsncDataFromJSON(input.optJSONObject("vdsncData")!!)
2183
+ result.dtcData = input.getString("dtcData")
2171
2184
  result.transactionInfo = transactionInfoFromJSON(input.optJSONObject("transactionInfo"))
2172
2185
 
2173
2186
  return result
@@ -2196,6 +2209,7 @@ fun generateDocumentReaderResults(temp: DocumentReaderResults?, context: Context
2196
2209
  result.put("documentType", generateList(input.documentType, ::generateDocumentReaderDocumentType))
2197
2210
  result.put("status", generateDocumentReaderResultsStatus(input.status))
2198
2211
  result.put("vdsncData", generateVDSNCData(input.vdsncData))
2212
+ result.put("dtcData", input.dtcData)
2199
2213
  result.put("transactionInfo", generateTransactionInfo(input.transactionInfo))
2200
2214
 
2201
2215
  return result
@@ -21,6 +21,7 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule
21
21
  import com.facebook.react.bridge.ReactMethod
22
22
  import com.facebook.react.bridge.ReadableArray
23
23
  import com.facebook.react.modules.core.DeviceEventManagerModule
24
+ import com.facebook.react.modules.core.PermissionListener
24
25
  import com.regula.common.LocalizationCallbacks
25
26
  import com.regula.documentreader.Convert.bitmapToBase64
26
27
  import com.regula.documentreader.Convert.byteArrayFromBase64
@@ -55,7 +56,7 @@ import org.json.JSONArray
55
56
  import org.json.JSONObject
56
57
 
57
58
  @Suppress("unused", "UNUSED_PARAMETER")
58
- class RNRegulaDocumentReaderModule(rc: ReactApplicationContext) : ReactContextBaseJavaModule(rc), ActivityEventListener {
59
+ class RNRegulaDocumentReaderModule(rc: ReactApplicationContext) : ReactContextBaseJavaModule(rc), ActivityEventListener, PermissionListener {
59
60
  init {
60
61
  reactContext = rc
61
62
  reactContext.addActivityEventListener(this)
@@ -70,8 +71,15 @@ class RNRegulaDocumentReaderModule(rc: ReactApplicationContext) : ReactContextBa
70
71
  @ReactMethod
71
72
  fun exec(moduleName: String?, action: String?, args: ReadableArray, successCallback: com.facebook.react.bridge.Callback, errorCallback: com.facebook.react.bridge.Callback) = exec(action, args, successCallback, errorCallback)
72
73
  override fun getName() = "RNRegulaDocumentReader"
73
- override fun onNewIntent(intent: Intent) = newIntent(intent)
74
- override fun onActivityResult(activity: Activity, requestCode: Int, resultCode: Int, data: Intent?) = Unit
74
+ override fun onNewIntent(intent: Intent) {
75
+ newIntent(intent)
76
+ }
77
+
78
+ override fun onActivityResult(activity: Activity, requestCode: Int, resultCode: Int, data: Intent?) {
79
+ onActivityResult(requestCode, resultCode, data)
80
+ }
81
+
82
+ override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>?, grantResults: IntArray?) = com.regula.documentreader.onRequestPermissionsResult(requestCode, permissions!!, grantResults!!)
75
83
  }
76
84
 
77
85
  fun sendEvent(event: String, data: Any? = "") {
@@ -109,8 +117,6 @@ fun exec(action: String?, arguments: ReadableArray, successCallback: com.faceboo
109
117
  when (action) {
110
118
  "getDocumentReaderIsReady" -> getDocumentReaderIsReady(callback)
111
119
  "getDocumentReaderStatus" -> getDocumentReaderStatus(callback)
112
- "isAuthenticatorAvailableForUse" -> isAuthenticatorAvailableForUse(callback)
113
- "isBlePermissionsGranted" -> isBlePermissionsGranted(callback)
114
120
  "getRfidSessionStatus" -> getRfidSessionStatus(callback)
115
121
  "setRfidSessionStatus" -> setRfidSessionStatus(callback)
116
122
  "getTag" -> getTag(callback)
@@ -150,11 +156,13 @@ fun exec(action: String?, arguments: ReadableArray, successCallback: com.faceboo
150
156
  "addPKDCertificates" -> addPKDCertificates(callback, args(0))
151
157
  "clearPKDCertificates" -> clearPKDCertificates(callback)
152
158
  "startNewSession" -> startNewSession(callback)
153
- "startBluetoothService" -> startBluetoothService()
159
+ "connectBluetoothDevice" -> connectBluetoothDevice(callback)
154
160
  "setLocalizationDictionary" -> setLocalizationDictionary(args(0))
155
161
  "getLicense" -> getLicense(callback)
156
162
  "getAvailableScenarios" -> getAvailableScenarios(callback)
157
163
  "getIsRFIDAvailableForUse" -> getIsRFIDAvailableForUse(callback)
164
+ "isAuthenticatorAvailableForUse" -> isAuthenticatorAvailableForUse(callback)
165
+ "isAuthenticatorRFIDAvailableForUse" -> isAuthenticatorRFIDAvailableForUse(callback)
158
166
  "getDocReaderVersion" -> getDocReaderVersion(callback)
159
167
  "getDocReaderDocumentsDatabase" -> getDocReaderDocumentsDatabase(callback)
160
168
  "textFieldValueByType" -> textFieldValueByType(callback, args(0), args(1))
@@ -175,6 +183,7 @@ fun exec(action: String?, arguments: ReadableArray, successCallback: com.faceboo
175
183
  "containers" -> containers(callback, args(0), args(1))
176
184
  "encryptedContainers" -> encryptedContainers(callback, args(0))
177
185
  "finalizePackage" -> finalizePackage(callback)
186
+ "endBackendTransaction" -> endBackendTransaction(callback)
178
187
  "getTranslation" -> getTranslation(callback, args(0), args(1))
179
188
  }
180
189
  }
@@ -204,10 +213,6 @@ const val eventPACertificateCompletion = "pa_certificate_completion"
204
213
  const val eventTACertificateCompletion = "ta_certificate_completion"
205
214
  const val eventTASignatureCompletion = "ta_signature_completion"
206
215
 
207
- const val bleOnServiceConnectedEvent = "bleOnServiceConnectedEvent"
208
- const val bleOnServiceDisconnectedEvent = "bleOnServiceDisconnectedEvent"
209
- const val bleOnDeviceReadyEvent = "bleOnDeviceReadyEvent"
210
-
211
216
  const val eventVideoEncoderCompletion = "video_encoder_completion"
212
217
  const val onCustomButtonTappedEvent = "onCustomButtonTappedEvent"
213
218
 
@@ -215,10 +220,6 @@ fun getDocumentReaderIsReady(callback: Callback) = callback.success(Instance().i
215
220
 
216
221
  fun getDocumentReaderStatus(callback: Callback) = callback.success(Instance().status)
217
222
 
218
- fun isAuthenticatorAvailableForUse(callback: Callback) = callback.success(Instance().isAuthenticatorAvailableForUse)
219
-
220
- fun isBlePermissionsGranted(callback: Callback) = callback.success(isBlePermissionsGranted((activity)))
221
-
222
223
  fun getRfidSessionStatus(callback: Callback) = callback.error("getRfidSessionStatus() is an ios-only method")
223
224
 
224
225
  fun setRfidSessionStatus(callback: Callback) = callback.error("setRfidSessionStatus() is an ios-only method")
@@ -353,13 +354,6 @@ fun startNewSession(callback: Callback) {
353
354
  callback.success()
354
355
  }
355
356
 
356
- fun startBluetoothService() = startBluetoothService(
357
- activity,
358
- { sendEvent(bleOnServiceConnectedEvent, it) },
359
- { sendEvent(bleOnServiceDisconnectedEvent) },
360
- { sendEvent(bleOnDeviceReadyEvent) }
361
- )
362
-
363
357
  fun setLocalizationDictionary(dictionary: JSONObject) {
364
358
  localizationCallbacks = LocalizationCallbacks { if (dictionary.has(it)) dictionary.getString(it) else null }
365
359
  Instance().setLocalizationCallback(localizationCallbacks!!)
@@ -376,6 +370,10 @@ fun getAvailableScenarios(callback: Callback) {
376
370
 
377
371
  fun getIsRFIDAvailableForUse(callback: Callback) = callback.success(Instance().isRFIDAvailableForUse)
378
372
 
373
+ fun isAuthenticatorAvailableForUse(callback: Callback) = callback.success(Instance().isAuthenticatorAvailableForUse)
374
+
375
+ fun isAuthenticatorRFIDAvailableForUse(callback: Callback) = callback.success(Instance().isAuthenticatorRFIDAvailableForUse)
376
+
379
377
  fun getDocReaderVersion(callback: Callback) = callback.success(generateDocReaderVersion(Instance().version))
380
378
 
381
379
  fun getDocReaderDocumentsDatabase(callback: Callback) = callback.success(Instance().version?.let { generateDocReaderDocumentsDatabase(it.database) })
@@ -416,6 +414,11 @@ fun encryptedContainers(callback: Callback, raw: String) = callback.success(from
416
414
 
417
415
  fun finalizePackage(callback: Callback) = Instance().finalizePackage { action, info, error -> callback.success(generateFinalizePackageCompletion(action, info, error)) }
418
416
 
417
+ fun endBackendTransaction(callback: Callback) {
418
+ Instance().endBackendTransaction()
419
+ callback.success()
420
+ }
421
+
419
422
  fun getTranslation(callback: Callback, className: String, value: Int) = when (className) {
420
423
  "RFIDErrorCodes" -> callback.success(eRFID_ErrorCodes.getTranslation(context, value))
421
424
  "LDSParsingErrorCodes" -> callback.success(eLDS_ParsingErrorCodes.getTranslation(context, value))
@@ -496,12 +499,15 @@ var requestType = RfidReaderRequestType(
496
499
  )
497
500
 
498
501
  @Suppress("DEPRECATION")
499
- fun newIntent(intent: Intent) = if (intent.action == NfcAdapter.ACTION_TECH_DISCOVERED)
502
+ fun newIntent(intent: Intent): Boolean {
503
+ if (intent.action != NfcAdapter.ACTION_TECH_DISCOVERED) return false
500
504
  Instance().readRFID(
501
505
  IsoDep.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)),
502
506
  rfidReaderCompletion,
503
507
  requestType.getRfidReaderRequest()
504
- ) else Unit
508
+ )
509
+ return true
510
+ }
505
511
 
506
512
  fun startForegroundDispatch() {
507
513
  backgroundRFIDEnabled = true
@@ -1,5 +1,5 @@
1
1
  //
2
- // Utils.java
2
+ // Utils.kt
3
3
  // DocumentReader
4
4
  //
5
5
  // Created by Pavel Masiuk on 21.09.2023.
@@ -225,7 +225,12 @@ fun CustomizationFont.setFont(editor: ParamsCustomization.CustomizationEditor, v
225
225
  }
226
226
 
227
227
  internal object Convert {
228
- fun byteArrayFromBase64(base64: String?) = base64?.let { Base64.decode(it, Base64.NO_WRAP) }
228
+ fun byteArrayFromBase64(base64: String?): ByteArray? {
229
+ var str = base64 ?: return null
230
+ if (str.startsWith("data")) str = str.substring(str.indexOf(",") + 1)
231
+ return Base64.decode(str, Base64.NO_WRAP)
232
+ }
233
+
229
234
  fun generateByteArray(array: ByteArray?) = array?.let { Base64.encodeToString(it, Base64.NO_WRAP) }
230
235
 
231
236
  fun bitmapFromBase64(base64: String?) = base64?.let {