@regulaforensics/cordova-plugin-document-reader-api 6.9.0 → 7.1.0

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.
@@ -0,0 +1,525 @@
1
+ package cordova.plugin.documentreader
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.app.Activity
5
+ import android.app.PendingIntent
6
+ import android.content.Intent
7
+ import android.content.IntentFilter
8
+ import android.nfc.NfcAdapter
9
+ import android.nfc.tech.IsoDep
10
+ import android.os.Build
11
+ import androidx.appcompat.app.AppCompatActivity
12
+ import androidx.lifecycle.Lifecycle
13
+ import androidx.lifecycle.LifecycleEventObserver
14
+ import com.regula.common.LocalizationCallbacks
15
+ import com.regula.documentreader.api.DocumentReader.Instance
16
+ import com.regula.documentreader.api.completions.IDocumentReaderCompletion
17
+ import com.regula.documentreader.api.completions.IDocumentReaderInitCompletion
18
+ import com.regula.documentreader.api.completions.IDocumentReaderPrepareCompletion
19
+ import com.regula.documentreader.api.completions.rfid.IRfidPKDCertificateCompletion
20
+ import com.regula.documentreader.api.completions.rfid.IRfidReaderCompletion
21
+ import com.regula.documentreader.api.completions.rfid.IRfidReaderRequest
22
+ import com.regula.documentreader.api.completions.rfid.IRfidTASignatureCompletion
23
+ import com.regula.documentreader.api.completions.rfid.certificates.IRfidPACertificates
24
+ import com.regula.documentreader.api.completions.rfid.certificates.IRfidTACertificates
25
+ import com.regula.documentreader.api.completions.rfid.certificates.IRfidTASignature
26
+ import com.regula.documentreader.api.enums.DocReaderAction
27
+ import com.regula.documentreader.api.enums.LCID
28
+ import com.regula.documentreader.api.enums.eImageQualityCheckType
29
+ import com.regula.documentreader.api.enums.eLDS_ParsingErrorCodes
30
+ import com.regula.documentreader.api.enums.eLDS_ParsingNotificationCodes
31
+ import com.regula.documentreader.api.enums.eRFID_DataFile_Type
32
+ import com.regula.documentreader.api.enums.eRFID_ErrorCodes
33
+ import com.regula.documentreader.api.enums.eVisualFieldType
34
+ import com.regula.documentreader.api.errors.DocReaderRfidException
35
+ import com.regula.documentreader.api.errors.DocumentReaderException
36
+ import com.regula.documentreader.api.internal.core.CoreScenarioUtil
37
+ import com.regula.documentreader.api.results.DocumentReaderNotification
38
+ import com.regula.documentreader.api.results.DocumentReaderResults
39
+ import com.regula.documentreader.api.results.DocumentReaderResults.fromRawResults
40
+ import com.regula.documentreader.api.results.DocumentReaderScenario
41
+ import cordova.plugin.documentreader.Convert.bitmapToBase64
42
+ import cordova.plugin.documentreader.Convert.byteArrayFromBase64
43
+ import org.apache.cordova.CallbackContext
44
+ import org.apache.cordova.CordovaPlugin
45
+ import org.apache.cordova.PluginResult
46
+ import org.json.JSONArray
47
+ import org.json.JSONObject
48
+
49
+ class DocumentReader : CordovaPlugin() {
50
+ override fun onNewIntent(intent: Intent) = newIntent(intent)
51
+ override fun execute(action: String, args: JSONArray, callbackContext: CallbackContext): Boolean {
52
+ activity = cordova.activity
53
+ exec(args, callbackContext)
54
+ return true
55
+ }
56
+ }
57
+
58
+ fun sendEvent(event: String, data: Any? = "") {
59
+ // These events are not working in cordova and ionic because they don't have a method
60
+ // associated with it. Callbacks are set automatically right after init.
61
+ val skippedEvents = listOf(eventVideoEncoderCompletion, onCustomButtonTappedEvent)
62
+ if (skippedEvents.contains(event)) return
63
+ val pluginResult = when (data) {
64
+ is Boolean -> PluginResult(PluginResult.Status.OK, data)
65
+ is Int -> PluginResult(PluginResult.Status.OK, data)
66
+ else -> {
67
+ var result = data.toSendable() as String?
68
+ // Allows user to determine which event fired when there are more
69
+ // than one event associated with the function
70
+ val singleEvents = listOf(eventDatabaseProgress, eventCompletion, "")
71
+ if (!singleEvents.contains(event)) result = event + result
72
+ PluginResult(PluginResult.Status.OK, result)
73
+ }
74
+ }
75
+ pluginResult.keepCallback = true
76
+ callbackContext.sendPluginResult(pluginResult)
77
+ }
78
+
79
+ @Suppress("UNCHECKED_CAST")
80
+ private fun <T> argsNullable(index: Int): T? = args.get(index) as T?
81
+
82
+ lateinit var args: JSONArray
83
+ lateinit var callbackContext: CallbackContext
84
+ val lifecycle: Lifecycle
85
+ get() = (activity as AppCompatActivity).lifecycle
86
+
87
+ fun exec(arguments: JSONArray, tempContext: CallbackContext) {
88
+ args = arguments
89
+ callbackContext = tempContext
90
+ val action = args.remove(0) as String
91
+ val callback = object : Callback {
92
+ override fun error(message: String) = callbackContext.error(message)
93
+ override fun success(data: Any?) = sendEvent("", data)
94
+ }
95
+ when (action) {
96
+ "getDocumentReaderIsReady" -> getDocumentReaderIsReady(callback)
97
+ "getDocumentReaderStatus" -> getDocumentReaderStatus(callback)
98
+ "isAuthenticatorAvailableForUse" -> isAuthenticatorAvailableForUse(callback)
99
+ "isBlePermissionsGranted" -> isBlePermissionsGranted(callback)
100
+ "getRfidSessionStatus" -> getRfidSessionStatus(callback)
101
+ "setRfidSessionStatus" -> setRfidSessionStatus(callback)
102
+ "getTag" -> getTag(callback)
103
+ "setTag" -> setTag(argsNullable(0))
104
+ "getFunctionality" -> getFunctionality(callback)
105
+ "setFunctionality" -> setFunctionality(args(0))
106
+ "getProcessParams" -> getProcessParams(callback)
107
+ "setProcessParams" -> setProcessParams(args(0))
108
+ "getCustomization" -> getCustomization(callback)
109
+ "setCustomization" -> setCustomization(args(0))
110
+ "getRfidScenario" -> getRfidScenario(callback)
111
+ "setRfidScenario" -> setRfidScenario(args(0))
112
+ "initializeReader" -> initializeReader(callback, args(0))
113
+ "initializeReaderWithBleDeviceConfig" -> initializeReaderWithBleDeviceConfig(callback, args(0))
114
+ "deinitializeReader" -> deinitializeReader(callback)
115
+ "prepareDatabase" -> prepareDatabase(callback, args(0))
116
+ "removeDatabase" -> removeDatabase(callback)
117
+ "runAutoUpdate" -> runAutoUpdate(callback, args(0))
118
+ "cancelDBUpdate" -> cancelDBUpdate(callback)
119
+ "checkDatabaseUpdate" -> checkDatabaseUpdate(callback, args(0))
120
+ "scan" -> scan(args(0))
121
+ "recognize" -> recognize(args(0))
122
+ "startNewPage" -> startNewPage(callback)
123
+ "stopScanner" -> stopScanner(callback)
124
+ "startRFIDReader" -> startRFIDReader(args(0), args(1), args(2))
125
+ "stopRFIDReader" -> stopRFIDReader(callback)
126
+ "readRFID" -> readRFID(args(0), args(1), args(2))
127
+ "providePACertificates" -> providePACertificates(callback, argsNullable(0))
128
+ "provideTACertificates" -> provideTACertificates(callback, argsNullable(0))
129
+ "provideTASignature" -> provideTASignature(callback, args(0))
130
+ "setTCCParams" -> setTCCParams(callback, args(0))
131
+ "addPKDCertificates" -> addPKDCertificates(callback, args(0))
132
+ "clearPKDCertificates" -> clearPKDCertificates(callback)
133
+ "startNewSession" -> startNewSession(callback)
134
+ "startBluetoothService" -> startBluetoothService()
135
+ "setLocalizationDictionary" -> setLocalizationDictionary(args(0))
136
+ "getLicense" -> getLicense(callback)
137
+ "getAvailableScenarios" -> getAvailableScenarios(callback)
138
+ "getIsRFIDAvailableForUse" -> getIsRFIDAvailableForUse(callback)
139
+ "getDocReaderVersion" -> getDocReaderVersion(callback)
140
+ "getDocReaderDocumentsDatabase" -> getDocReaderDocumentsDatabase(callback)
141
+ "textFieldValueByType" -> textFieldValueByType(callback, args(0), args(1))
142
+ "textFieldValueByTypeLcid" -> textFieldValueByTypeLcid(callback, args(0), args(1), args(2))
143
+ "textFieldValueByTypeSource" -> textFieldValueByTypeSource(callback, args(0), args(1), args(2))
144
+ "textFieldValueByTypeLcidSource" -> textFieldValueByTypeLcidSource(callback, args(0), args(1), args(2), args(3))
145
+ "textFieldValueByTypeSourceOriginal" -> textFieldValueByTypeSourceOriginal(callback, args(0), args(1), args(2), args(3))
146
+ "textFieldValueByTypeLcidSourceOriginal" -> textFieldValueByTypeLcidSourceOriginal(callback, args(0), args(1), args(2), args(3), args(4))
147
+ "textFieldByType" -> textFieldByType(callback, args(0), args(1))
148
+ "textFieldByTypeLcid" -> textFieldByTypeLcid(callback, args(0), args(1), args(2))
149
+ "graphicFieldByTypeSource" -> graphicFieldByTypeSource(callback, args(0), args(1), args(2))
150
+ "graphicFieldByTypeSourcePageIndex" -> graphicFieldByTypeSourcePageIndex(callback, args(0), args(1), args(2), args(3))
151
+ "graphicFieldByTypeSourcePageIndexLight" -> graphicFieldByTypeSourcePageIndexLight(callback, args(0), args(1), args(2), args(3), args(4))
152
+ "graphicFieldImageByType" -> graphicFieldImageByType(callback, args(0), args(1))
153
+ "graphicFieldImageByTypeSource" -> graphicFieldImageByTypeSource(callback, args(0), args(1), args(2))
154
+ "graphicFieldImageByTypeSourcePageIndex" -> graphicFieldImageByTypeSourcePageIndex(callback, args(0), args(1), args(2), args(3))
155
+ "graphicFieldImageByTypeSourcePageIndexLight" -> graphicFieldImageByTypeSourcePageIndexLight(callback, args(0), args(1), args(2), args(3), args(4))
156
+ "containers" -> containers(callback, args(0), args(1))
157
+ "encryptedContainers" -> encryptedContainers(callback, args(0))
158
+ "getTranslation" -> getTranslation(callback, args(0), args(1))
159
+ "finalizePackage" -> finalizePackage(callback)
160
+ }
161
+ }
162
+
163
+ fun <T> args(index: Int): T = argsNullable(index)!!
164
+ interface Callback {
165
+ fun success(data: Any? = "")
166
+ fun error(message: String)
167
+ }
168
+
169
+ @SuppressLint("StaticFieldLeak")
170
+ lateinit var activity: Activity
171
+ lateinit var lifecycleObserver: LifecycleEventObserver
172
+ val context
173
+ get() = activity
174
+
175
+ var backgroundRFIDEnabled = false
176
+ var databaseDownloadProgress = 0
177
+
178
+ const val eventCompletion = "completion"
179
+ const val eventDatabaseProgress = "database_progress"
180
+
181
+ const val rfidOnProgressEvent = "rfidOnProgressCompletion"
182
+ const val rfidOnChipDetectedEvent = "rfidOnChipDetectedEvent"
183
+ const val rfidOnRetryReadChipEvent = "rfidOnRetryReadChipEvent"
184
+
185
+ const val eventPACertificateCompletion = "pa_certificate_completion"
186
+ const val eventTACertificateCompletion = "ta_certificate_completion"
187
+ const val eventTASignatureCompletion = "ta_signature_completion"
188
+
189
+ const val bleOnServiceConnectedEvent = "bleOnServiceConnectedEvent"
190
+ const val bleOnServiceDisconnectedEvent = "bleOnServiceDisconnectedEvent"
191
+ const val bleOnDeviceReadyEvent = "bleOnDeviceReadyEvent"
192
+
193
+ const val eventVideoEncoderCompletion = "video_encoder_completion"
194
+ const val onCustomButtonTappedEvent = "onCustomButtonTappedEvent"
195
+
196
+ fun getDocumentReaderIsReady(callback: Callback) = callback.success(Instance().isReady)
197
+
198
+ fun getDocumentReaderStatus(callback: Callback) = callback.success(Instance().status)
199
+
200
+ fun isAuthenticatorAvailableForUse(callback: Callback) = callback.success(Instance().isAuthenticatorAvailableForUse)
201
+
202
+ fun isBlePermissionsGranted(callback: Callback) = callback.success(isBlePermissionsGranted((activity)))
203
+
204
+ fun getRfidSessionStatus(callback: Callback) = callback.error("getRfidSessionStatus() is an ios-only method")
205
+
206
+ fun setRfidSessionStatus(callback: Callback) = callback.error("setRfidSessionStatus() is an ios-only method")
207
+
208
+ fun getTag(callback: Callback) = callback.success(Instance().tag)
209
+
210
+ fun setTag(tag: String?) = tag.let { Instance().tag = it }
211
+
212
+ fun getFunctionality(callback: Callback) = callback.success(getFunctionality(Instance().functionality()))
213
+
214
+ fun setFunctionality(functionality: JSONObject) = setFunctionality(Instance().functionality(), functionality)
215
+
216
+ fun getProcessParams(callback: Callback) = callback.success(getProcessParams(Instance().processParams()))
217
+
218
+ fun setProcessParams(processParams: JSONObject) = setProcessParams(Instance().processParams(), processParams)
219
+
220
+ fun getCustomization(callback: Callback) = callback.success(getCustomization(Instance().customization()))
221
+
222
+ fun setCustomization(customization: JSONObject) = setCustomization(Instance().customization(), customization, context)
223
+
224
+ fun getRfidScenario(callback: Callback) = callback.success(getRfidScenario(Instance().rfidScenario()))
225
+
226
+ fun setRfidScenario(rfidScenario: JSONObject) = setRfidScenario(Instance().rfidScenario(), rfidScenario)
227
+
228
+ fun initializeReader(callback: Callback, config: JSONObject) = Instance().initializeReader(context, docReaderConfigFromJSON(config), getInitCompletion(callback))
229
+
230
+ fun initializeReaderWithBleDeviceConfig(callback: Callback, config: JSONObject) = Instance().initializeReader(context, bleDeviceConfigFromJSON(config), getInitCompletion(callback))
231
+
232
+ fun deinitializeReader(callback: Callback) {
233
+ Instance().deinitializeReader()
234
+ callback.success()
235
+ }
236
+
237
+ fun prepareDatabase(callback: Callback, databaseID: String) = Instance().prepareDatabase(context, databaseID, getPrepareCompletion(callback))
238
+
239
+ fun removeDatabase(callback: Callback) = callback.success(Instance().removeDatabase(context))
240
+
241
+ fun runAutoUpdate(callback: Callback, databaseID: String) = Instance().runAutoUpdate(context, databaseID, getPrepareCompletion(callback))
242
+
243
+ fun cancelDBUpdate(callback: Callback) = callback.success(Instance().cancelDBUpdate(context))
244
+
245
+ fun checkDatabaseUpdate(callback: Callback, databaseID: String) = Instance().checkDatabaseUpdate(context, databaseID) { callback.success(generateDocReaderDocumentsDatabase(it)) }
246
+
247
+ fun scan(config: JSONObject) {
248
+ stopBackgroundRFID()
249
+ Instance().showScanner(context, scannerConfigFromJSON(config), completion)
250
+ }
251
+
252
+ fun recognize(config: JSONObject) {
253
+ stopBackgroundRFID()
254
+ Instance().recognize(recognizeConfigFromJSON(config), completion)
255
+ }
256
+
257
+ fun startNewPage(callback: Callback) {
258
+ Instance().startNewPage()
259
+ callback.success()
260
+ }
261
+
262
+ fun stopScanner(callback: Callback) {
263
+ Instance().stopScanner(context)
264
+ callback.success()
265
+ }
266
+
267
+ fun startRFIDReader(onRequestPACertificates: Boolean, onRequestTACertificates: Boolean, onRequestTASignature: Boolean) {
268
+ stopBackgroundRFID()
269
+ requestType = RfidReaderRequestType(
270
+ onRequestPACertificates,
271
+ onRequestTACertificates,
272
+ onRequestTASignature
273
+ )
274
+ Instance().startRFIDReader(context, rfidReaderCompletion, requestType.getRfidReaderRequest())
275
+ }
276
+
277
+ fun readRFID(onRequestPACertificates: Boolean, onRequestTACertificates: Boolean, onRequestTASignature: Boolean) {
278
+ requestType = RfidReaderRequestType(
279
+ onRequestPACertificates,
280
+ onRequestTACertificates,
281
+ onRequestTASignature
282
+ )
283
+ startForegroundDispatch()
284
+ }
285
+
286
+ fun stopRFIDReader(callback: Callback) {
287
+ Instance().stopRFIDReader(context)
288
+ stopBackgroundRFID()
289
+ callback.success()
290
+ }
291
+
292
+ fun providePACertificates(callback: Callback, certificates: JSONArray?) {
293
+ paCertificateCompletion!!.onCertificatesReceived(arrayFromJSON(certificates, ::pkdCertificateFromJSON, arrayOfNulls(certificates?.length() ?: 0)))
294
+ callback.success()
295
+ }
296
+
297
+ fun provideTACertificates(callback: Callback, certificates: JSONArray?) {
298
+ taCertificateCompletion!!.onCertificatesReceived(arrayFromJSON(certificates, ::pkdCertificateFromJSON, arrayOfNulls(certificates?.length() ?: 0)))
299
+ callback.success()
300
+ }
301
+
302
+ fun provideTASignature(callback: Callback, signature: String?) {
303
+ taSignatureCompletion!!.onSignatureReceived(byteArrayFromBase64(signature))
304
+ callback.success()
305
+ }
306
+
307
+ fun setTCCParams(callback: Callback, params: JSONObject) {
308
+ Instance().setTccParams(tccParamsFromJSON(params)) { success, error ->
309
+ callback.success(generateSuccessCompletion(success, error))
310
+ }
311
+ }
312
+
313
+ fun addPKDCertificates(callback: Callback, certificates: JSONArray) {
314
+ Instance().addPKDCertificates(listFromJSON(certificates, ::pkdCertificateFromJSON)!!)
315
+ callback.success()
316
+ }
317
+
318
+ fun clearPKDCertificates(callback: Callback) {
319
+ Instance().clearPKDCertificates()
320
+ callback.success()
321
+ }
322
+
323
+ fun startNewSession(callback: Callback) {
324
+ Instance().startNewSession()
325
+ callback.success()
326
+ }
327
+
328
+ fun startBluetoothService() = startBluetoothService(
329
+ activity,
330
+ { sendEvent(bleOnServiceConnectedEvent, it) },
331
+ { sendEvent(bleOnServiceDisconnectedEvent) },
332
+ { sendEvent(bleOnDeviceReadyEvent) }
333
+ )
334
+
335
+ @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
336
+ fun setLocalizationDictionary(dictionary: JSONObject) {
337
+ localizationCallbacks = LocalizationCallbacks { dictionary.optString(it, null) }
338
+ Instance().setLocalizationCallback(localizationCallbacks!!)
339
+ }
340
+
341
+ fun getLicense(callback: Callback) = callback.success(generateLicense(Instance().license()))
342
+
343
+ fun getAvailableScenarios(callback: Callback) {
344
+ val scenarios: MutableList<DocumentReaderScenario> = ArrayList()
345
+ for (scenario: DocumentReaderScenario in Instance().availableScenarios)
346
+ scenarios.add(CoreScenarioUtil.getScenario(scenario.name))
347
+ callback.success(generateList(scenarios, ::generateDocumentReaderScenario))
348
+ }
349
+
350
+ fun getIsRFIDAvailableForUse(callback: Callback) = callback.success(Instance().isRFIDAvailableForUse)
351
+
352
+ fun getDocReaderVersion(callback: Callback) = callback.success(generateDocReaderVersion(Instance().version))
353
+
354
+ fun getDocReaderDocumentsDatabase(callback: Callback) = callback.success(Instance().version?.let { generateDocReaderDocumentsDatabase(it.database) })
355
+
356
+ fun textFieldValueByType(callback: Callback, raw: String, fieldType: Int) = callback.success(fromRawResults(raw).getTextFieldValueByType(fieldType))
357
+
358
+ fun textFieldValueByTypeLcid(callback: Callback, raw: String, fieldType: Int, lcid: Int) = callback.success(fromRawResults(raw).getTextFieldValueByType(fieldType, lcid))
359
+
360
+ fun textFieldValueByTypeSource(callback: Callback, raw: String, fieldType: Int, source: Int) = callback.success(fromRawResults(raw).getTextFieldValueByTypeAndSource(fieldType, source))
361
+
362
+ fun textFieldValueByTypeLcidSource(callback: Callback, raw: String, fieldType: Int, lcid: Int, source: Int) = callback.success(fromRawResults(raw).getTextFieldValueByType(fieldType, lcid, source))
363
+
364
+ fun textFieldValueByTypeSourceOriginal(callback: Callback, raw: String, fieldType: Int, source: Int, original: Boolean) = callback.success(fromRawResults(raw).getTextFieldValueByTypeAndSource(fieldType, source, original))
365
+
366
+ fun textFieldValueByTypeLcidSourceOriginal(callback: Callback, raw: String, fieldType: Int, lcid: Int, source: Int, original: Boolean) = callback.success(fromRawResults(raw).getTextFieldValueByType(fieldType, lcid, source, original))
367
+
368
+ fun textFieldByType(callback: Callback, raw: String, fieldType: Int) = callback.success(generateDocumentReaderTextField(fromRawResults(raw).getTextFieldByType(fieldType), context))
369
+
370
+ fun textFieldByTypeLcid(callback: Callback, raw: String, fieldType: Int, lcid: Int) = callback.success(generateDocumentReaderTextField(fromRawResults(raw).getTextFieldByType(fieldType, lcid), context))
371
+
372
+ fun graphicFieldByTypeSource(callback: Callback, raw: String, fieldType: Int, source: Int) = callback.success(generateDocumentReaderGraphicField(fromRawResults(raw).getGraphicFieldByType(fieldType, source), context))
373
+
374
+ fun graphicFieldByTypeSourcePageIndex(callback: Callback, raw: String, fieldType: Int, source: Int, pageIndex: Int) = callback.success(generateDocumentReaderGraphicField(fromRawResults(raw).getGraphicFieldByType(fieldType, source, pageIndex), context))
375
+
376
+ fun graphicFieldByTypeSourcePageIndexLight(callback: Callback, raw: String, fieldType: Int, source: Int, pageIndex: Int, light: Int) = callback.success(generateDocumentReaderGraphicField(fromRawResults(raw).getGraphicFieldByType(fieldType, source, pageIndex, light), context))
377
+
378
+ fun graphicFieldImageByType(callback: Callback, raw: String, fieldType: Int) = callback.success(bitmapToBase64(fromRawResults(raw).getGraphicFieldImageByType(fieldType)))
379
+
380
+ fun graphicFieldImageByTypeSource(callback: Callback, raw: String, fieldType: Int, source: Int) = callback.success(bitmapToBase64(fromRawResults(raw).getGraphicFieldImageByType(fieldType, source)))
381
+
382
+ fun graphicFieldImageByTypeSourcePageIndex(callback: Callback, raw: String, fieldType: Int, source: Int, pageIndex: Int) = callback.success(bitmapToBase64(fromRawResults(raw).getGraphicFieldImageByType(fieldType, source, pageIndex)))
383
+
384
+ fun graphicFieldImageByTypeSourcePageIndexLight(callback: Callback, raw: String, fieldType: Int, source: Int, pageIndex: Int, light: Int) = callback.success(bitmapToBase64(fromRawResults(raw).getGraphicFieldImageByType(fieldType, source, pageIndex, light)))
385
+
386
+ fun containers(callback: Callback, raw: String, resultType: JSONArray) = callback.success(fromRawResults(raw).getContainers(resultType.toIntArray()!!))
387
+
388
+ fun encryptedContainers(callback: Callback, raw: String) = callback.success(fromRawResults(raw).encryptedContainers)
389
+
390
+ fun finalizePackage(callback: Callback) = Instance().finalizePackage { action, info, error -> callback.success(generateFinalizePackageCompletion(action, info, error)) }
391
+
392
+ fun getTranslation(callback: Callback, className: String, value: Int) = when (className) {
393
+ "RFIDErrorCodes" -> callback.success(eRFID_ErrorCodes.getTranslation(context, value))
394
+ "LDSParsingErrorCodes" -> callback.success(eLDS_ParsingErrorCodes.getTranslation(context, value))
395
+ "LDSParsingNotificationCodes" -> callback.success(eLDS_ParsingNotificationCodes.getTranslation(context, value))
396
+ "ImageQualityCheckType" -> callback.success(eImageQualityCheckType.getTranslation(context, value))
397
+ "RFIDDataFileType" -> callback.success(eRFID_DataFile_Type.getTranslation(context, value))
398
+ "VisualFieldType" -> callback.success(eVisualFieldType.getTranslation(context, value))
399
+ "LCID" -> callback.success(LCID.getTranslation(context, value))
400
+ else -> null
401
+ }
402
+
403
+ val completed = { action: Int, results: DocumentReaderResults?, error: DocumentReaderException? ->
404
+ sendEvent(eventCompletion, generateCompletion(action, results, error, context))
405
+ if ((action == DocReaderAction.ERROR) || (action == DocReaderAction.CANCEL) || ((action == DocReaderAction.COMPLETE) && (results?.rfidResult == 1)))
406
+ stopBackgroundRFID()
407
+ }
408
+
409
+ val completion = IDocumentReaderCompletion(completed)
410
+
411
+ val rfidReaderCompletion = object : IRfidReaderCompletion() {
412
+ override fun onCompleted(action: Int, results: DocumentReaderResults?, error: DocumentReaderException?): Unit = completed(action, results, error)
413
+ override fun onChipDetected(): Unit = sendEvent(rfidOnChipDetectedEvent)
414
+ override fun onRetryReadChip(error: DocReaderRfidException) = sendEvent(rfidOnRetryReadChipEvent, generateRegulaException(error))
415
+ override fun onProgress(notification: DocumentReaderNotification) = sendEvent(rfidOnProgressEvent, generateDocumentReaderNotification(notification))
416
+ }
417
+
418
+ fun getPrepareCompletion(callback: Callback) = object : IDocumentReaderPrepareCompletion {
419
+ override fun onPrepareProgressChanged(progress: Int) {
420
+ if (progress != databaseDownloadProgress) {
421
+ sendEvent(eventDatabaseProgress, progress)
422
+ databaseDownloadProgress = progress
423
+ }
424
+ }
425
+
426
+ override fun onPrepareCompleted(s: Boolean, e: DocumentReaderException?) = callback.success(generateSuccessCompletion(s, e))
427
+ }
428
+
429
+ fun getInitCompletion(callback: Callback) = IDocumentReaderInitCompletion { success, error ->
430
+ if (success) {
431
+ Instance().setVideoEncoderCompletion { _, file -> sendEvent(eventVideoEncoderCompletion, file.path) }
432
+ Instance().setOnClickListener { sendEvent(onCustomButtonTappedEvent, it.tag) }
433
+ }
434
+ callback.success(generateSuccessCompletion(success, error))
435
+ }
436
+
437
+ var paCertificateCompletion: IRfidPKDCertificateCompletion? = null
438
+ var taCertificateCompletion: IRfidPKDCertificateCompletion? = null
439
+ var taSignatureCompletion: IRfidTASignatureCompletion? = null
440
+
441
+ class RfidReaderRequestType(
442
+ val doPACertificates: Boolean,
443
+ val doTACertificates: Boolean,
444
+ val doTASignature: Boolean
445
+ ) {
446
+ private val onRequestPACertificates = IRfidPACertificates { serialNumber, issuer, completion ->
447
+ paCertificateCompletion = completion
448
+ sendEvent(eventPACertificateCompletion, generatePACertificateCompletion(serialNumber, issuer))
449
+ }
450
+ private val onRequestTACertificates = IRfidTACertificates { keyCAR, completion ->
451
+ taCertificateCompletion = completion
452
+ sendEvent(eventTACertificateCompletion, keyCAR)
453
+ }
454
+ private val onRequestTASignature = IRfidTASignature { challenge, completion ->
455
+ taSignatureCompletion = completion
456
+ sendEvent(eventTASignatureCompletion, generateTAChallenge(challenge))
457
+ }
458
+
459
+ fun getRfidReaderRequest(): IRfidReaderRequest? = when {
460
+ !doPACertificates && !doTACertificates && doTASignature -> IRfidReaderRequest(onRequestTASignature)
461
+ !doPACertificates && doTACertificates && !doTASignature -> IRfidReaderRequest(onRequestTACertificates)
462
+ !doPACertificates && doTACertificates && doTASignature -> IRfidReaderRequest(onRequestTACertificates, onRequestTASignature)
463
+ doPACertificates && !doTACertificates && !doTASignature -> IRfidReaderRequest(onRequestPACertificates)
464
+ doPACertificates && !doTACertificates && doTASignature -> IRfidReaderRequest(onRequestPACertificates, onRequestTASignature)
465
+ doPACertificates && doTACertificates && !doTASignature -> IRfidReaderRequest(onRequestPACertificates, onRequestTACertificates)
466
+ doPACertificates && doTACertificates && doTASignature -> IRfidReaderRequest(onRequestPACertificates, onRequestTACertificates, onRequestTASignature)
467
+ else -> null
468
+ }
469
+ }
470
+
471
+ var requestType = RfidReaderRequestType(
472
+ doPACertificates = false,
473
+ doTACertificates = false,
474
+ doTASignature = false
475
+ )
476
+
477
+ @Suppress("DEPRECATION")
478
+ fun newIntent(intent: Intent) = if (intent.action == NfcAdapter.ACTION_TECH_DISCOVERED)
479
+ Instance().readRFID(
480
+ IsoDep.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)),
481
+ rfidReaderCompletion,
482
+ requestType.getRfidReaderRequest()
483
+ ) else Unit
484
+
485
+ fun startForegroundDispatch() {
486
+ backgroundRFIDEnabled = true
487
+ val filters: Array<IntentFilter?> = arrayOfNulls(1)
488
+ filters[0] = IntentFilter()
489
+ filters[0]!!.addAction(NfcAdapter.ACTION_TECH_DISCOVERED)
490
+ filters[0]!!.addCategory(Intent.CATEGORY_DEFAULT)
491
+ val techList = arrayOf(arrayOf("android.nfc.tech.IsoDep"))
492
+ val intent = Intent(context, context.javaClass)
493
+ val flag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_MUTABLE else 0
494
+ val pendingIntent = PendingIntent.getActivity(context, 0, intent, flag)
495
+
496
+ if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED))
497
+ enableForegroundDispatch(pendingIntent, filters, techList)
498
+ lifecycleObserver = LifecycleEventObserver { _, event ->
499
+ if (backgroundRFIDEnabled) when (event) {
500
+ Lifecycle.Event.ON_RESUME -> enableForegroundDispatch(pendingIntent, filters, techList)
501
+ Lifecycle.Event.ON_PAUSE -> disableForegroundDispatch()
502
+ else -> Unit
503
+ }
504
+ }
505
+ context.runOnUiThread { lifecycle.addObserver(lifecycleObserver) }
506
+ }
507
+
508
+ fun enableForegroundDispatch(
509
+ pendingIntent: PendingIntent,
510
+ filters: Array<IntentFilter?>,
511
+ techList: Array<Array<String>>
512
+ ) = NfcAdapter.getDefaultAdapter(context).enableForegroundDispatch(activity, pendingIntent, filters, techList)
513
+
514
+ fun disableForegroundDispatch() = NfcAdapter.getDefaultAdapter(activity).disableForegroundDispatch(activity)
515
+
516
+ fun stopBackgroundRFID() {
517
+ if (!backgroundRFIDEnabled) return
518
+ backgroundRFIDEnabled = false
519
+ if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED))
520
+ disableForegroundDispatch()
521
+ context.runOnUiThread { lifecycle.removeObserver(lifecycleObserver) }
522
+ }
523
+
524
+ // Weak references
525
+ var localizationCallbacks: LocalizationCallbacks? = null