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