@regulaforensics/react-native-document-reader-api 7.4.735 → 7.5.85-rc

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.
@@ -1,10 +1,10 @@
1
- @file:Suppress("UNCHECKED_CAST")
1
+ @file:Suppress("UNCHECKED_CAST", "MissingPermission")
2
2
 
3
3
  package com.regula.documentreader
4
4
 
5
- import android.annotation.SuppressLint
6
5
  import android.app.Activity
7
6
  import android.app.PendingIntent
7
+ import android.content.Context
8
8
  import android.content.Intent
9
9
  import android.content.IntentFilter
10
10
  import android.nfc.NfcAdapter
@@ -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.PermissionAwareActivity
24
25
  import com.regula.common.LocalizationCallbacks
25
26
  import com.regula.documentreader.Convert.bitmapToBase64
26
27
  import com.regula.documentreader.Convert.byteArrayFromBase64
@@ -54,31 +55,20 @@ import com.regula.documentreader.api.results.DocumentReaderScenario
54
55
  import org.json.JSONArray
55
56
  import org.json.JSONObject
56
57
 
57
- @Suppress("unused", "UNUSED_PARAMETER")
58
- class RNRegulaDocumentReaderModule(rc: ReactApplicationContext) : ReactContextBaseJavaModule(rc), ActivityEventListener {
59
- init {
60
- reactContext = rc
61
- reactContext.addActivityEventListener(this)
62
- }
63
-
64
- @ReactMethod
65
- fun addListener(eventName: String?) = Unit
66
-
67
- @ReactMethod
68
- fun removeListeners(count: Int?) = Unit
69
-
70
- @ReactMethod
71
- 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
- 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
75
- }
58
+ lateinit var args: JSONArray
59
+ lateinit var binding: ReactContext
60
+ val context: Context
61
+ get() = binding.applicationContext
62
+ val activity: Activity
63
+ get() = binding.currentActivity!!
64
+ val lifecycle: Lifecycle
65
+ get() = (activity as AppCompatActivity).lifecycle
76
66
 
77
67
  fun sendEvent(event: String, data: Any? = "") {
78
68
  val map = Arguments.createMap()
79
69
  val result = if (data is JSONObject || data is JSONArray) data.toString() else data.toString() + ""
80
70
  map.putString("msg", result)
81
- reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java).emit(event, map)
71
+ binding.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java).emit(event, map)
82
72
  }
83
73
 
84
74
  fun <T> argsNullable(index: Int): T? {
@@ -94,14 +84,45 @@ fun <T> argsNullable(index: Int): T? {
94
84
  return args[index] as T
95
85
  }
96
86
 
97
- lateinit var args: JSONArray
98
- lateinit var reactContext: ReactContext
99
- val lifecycle: Lifecycle
100
- get() = (activity as AppCompatActivity).lifecycle
87
+ @Suppress("unused", "UNUSED_PARAMETER")
88
+ class RNRegulaDocumentReaderModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), ActivityEventListener {
89
+ init {
90
+ binding = reactContext
91
+ binding.addActivityEventListener(this)
92
+ }
93
+
94
+ @ReactMethod
95
+ fun addListener(eventName: String?) = Unit
96
+
97
+ @ReactMethod
98
+ fun removeListeners(count: Int?) = Unit
99
+
100
+ @ReactMethod
101
+ 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)
102
+
103
+ override fun getName() = "RNRegulaDocumentReader"
104
+
105
+ override fun onNewIntent(intent: Intent) {
106
+ newIntent(intent)
107
+ }
108
+
109
+ override fun onActivityResult(activity: Activity, requestCode: Int, resultCode: Int, data: Intent?) {
110
+ onActivityResult(requestCode, resultCode, data)
111
+ }
112
+ }
113
+
114
+ fun requestPermissions(activity: Activity, permissions: Array<String>, requestCode: Int) {
115
+ (activity as PermissionAwareActivity).requestPermissions(permissions, requestCode) { code, perms, grantResults ->
116
+ onRequestPermissionsResult(code, perms, grantResults)
117
+ }
118
+ }
119
+
120
+ fun startActivityForResult(activity: Activity, intent: Intent, requestCode: Int) {
121
+ activity.startActivityForResult(intent, requestCode)
122
+ }
101
123
 
102
124
  fun exec(action: String?, arguments: ReadableArray, successCallback: com.facebook.react.bridge.Callback, errorCallback: com.facebook.react.bridge.Callback) {
103
125
  args = JSONArray(arguments.toArrayList())
104
- reactContext.currentActivity?.let { activity = it }
105
126
  val callback = object : Callback {
106
127
  override fun success(data: Any?) = successCallback.invoke(data.toSendable())
107
128
  override fun error(message: String) = errorCallback.invoke(message)
@@ -109,8 +130,6 @@ fun exec(action: String?, arguments: ReadableArray, successCallback: com.faceboo
109
130
  when (action) {
110
131
  "getDocumentReaderIsReady" -> getDocumentReaderIsReady(callback)
111
132
  "getDocumentReaderStatus" -> getDocumentReaderStatus(callback)
112
- "isAuthenticatorAvailableForUse" -> isAuthenticatorAvailableForUse(callback)
113
- "isBlePermissionsGranted" -> isBlePermissionsGranted(callback)
114
133
  "getRfidSessionStatus" -> getRfidSessionStatus(callback)
115
134
  "setRfidSessionStatus" -> setRfidSessionStatus(callback)
116
135
  "getTag" -> getTag(callback)
@@ -150,11 +169,13 @@ fun exec(action: String?, arguments: ReadableArray, successCallback: com.faceboo
150
169
  "addPKDCertificates" -> addPKDCertificates(callback, args(0))
151
170
  "clearPKDCertificates" -> clearPKDCertificates(callback)
152
171
  "startNewSession" -> startNewSession(callback)
153
- "startBluetoothService" -> startBluetoothService()
172
+ "connectBluetoothDevice" -> connectBluetoothDevice(callback)
154
173
  "setLocalizationDictionary" -> setLocalizationDictionary(args(0))
155
174
  "getLicense" -> getLicense(callback)
156
175
  "getAvailableScenarios" -> getAvailableScenarios(callback)
157
176
  "getIsRFIDAvailableForUse" -> getIsRFIDAvailableForUse(callback)
177
+ "isAuthenticatorAvailableForUse" -> isAuthenticatorAvailableForUse(callback)
178
+ "isAuthenticatorRFIDAvailableForUse" -> isAuthenticatorRFIDAvailableForUse(callback)
158
179
  "getDocReaderVersion" -> getDocReaderVersion(callback)
159
180
  "getDocReaderDocumentsDatabase" -> getDocReaderDocumentsDatabase(callback)
160
181
  "textFieldValueByType" -> textFieldValueByType(callback, args(0), args(1))
@@ -175,6 +196,7 @@ fun exec(action: String?, arguments: ReadableArray, successCallback: com.faceboo
175
196
  "containers" -> containers(callback, args(0), args(1))
176
197
  "encryptedContainers" -> encryptedContainers(callback, args(0))
177
198
  "finalizePackage" -> finalizePackage(callback)
199
+ "endBackendTransaction" -> endBackendTransaction(callback)
178
200
  "getTranslation" -> getTranslation(callback, args(0), args(1))
179
201
  }
180
202
  }
@@ -185,14 +207,6 @@ interface Callback {
185
207
  fun error(message: String)
186
208
  }
187
209
 
188
- @SuppressLint("StaticFieldLeak")
189
- lateinit var activity: Activity
190
- lateinit var lifecycleObserver: LifecycleEventObserver
191
- val context
192
- get() = activity
193
-
194
- var backgroundRFIDEnabled = false
195
-
196
210
  const val eventCompletion = "completion"
197
211
  const val eventDatabaseProgress = "database_progress"
198
212
 
@@ -204,10 +218,6 @@ const val eventPACertificateCompletion = "pa_certificate_completion"
204
218
  const val eventTACertificateCompletion = "ta_certificate_completion"
205
219
  const val eventTASignatureCompletion = "ta_signature_completion"
206
220
 
207
- const val bleOnServiceConnectedEvent = "bleOnServiceConnectedEvent"
208
- const val bleOnServiceDisconnectedEvent = "bleOnServiceDisconnectedEvent"
209
- const val bleOnDeviceReadyEvent = "bleOnDeviceReadyEvent"
210
-
211
221
  const val eventVideoEncoderCompletion = "video_encoder_completion"
212
222
  const val onCustomButtonTappedEvent = "onCustomButtonTappedEvent"
213
223
 
@@ -215,10 +225,6 @@ fun getDocumentReaderIsReady(callback: Callback) = callback.success(Instance().i
215
225
 
216
226
  fun getDocumentReaderStatus(callback: Callback) = callback.success(Instance().status)
217
227
 
218
- fun isAuthenticatorAvailableForUse(callback: Callback) = callback.success(Instance().isAuthenticatorAvailableForUse)
219
-
220
- fun isBlePermissionsGranted(callback: Callback) = callback.success(isBlePermissionsGranted((activity)))
221
-
222
228
  fun getRfidSessionStatus(callback: Callback) = callback.error("getRfidSessionStatus() is an ios-only method")
223
229
 
224
230
  fun setRfidSessionStatus(callback: Callback) = callback.error("setRfidSessionStatus() is an ios-only method")
@@ -353,13 +359,6 @@ fun startNewSession(callback: Callback) {
353
359
  callback.success()
354
360
  }
355
361
 
356
- fun startBluetoothService() = startBluetoothService(
357
- activity,
358
- { sendEvent(bleOnServiceConnectedEvent, it) },
359
- { sendEvent(bleOnServiceDisconnectedEvent) },
360
- { sendEvent(bleOnDeviceReadyEvent) }
361
- )
362
-
363
362
  fun setLocalizationDictionary(dictionary: JSONObject) {
364
363
  localizationCallbacks = LocalizationCallbacks { if (dictionary.has(it)) dictionary.getString(it) else null }
365
364
  Instance().setLocalizationCallback(localizationCallbacks!!)
@@ -376,6 +375,10 @@ fun getAvailableScenarios(callback: Callback) {
376
375
 
377
376
  fun getIsRFIDAvailableForUse(callback: Callback) = callback.success(Instance().isRFIDAvailableForUse)
378
377
 
378
+ fun isAuthenticatorAvailableForUse(callback: Callback) = callback.success(Instance().isAuthenticatorAvailableForUse)
379
+
380
+ fun isAuthenticatorRFIDAvailableForUse(callback: Callback) = callback.success(Instance().isAuthenticatorRFIDAvailableForUse)
381
+
379
382
  fun getDocReaderVersion(callback: Callback) = callback.success(generateDocReaderVersion(Instance().version))
380
383
 
381
384
  fun getDocReaderDocumentsDatabase(callback: Callback) = callback.success(Instance().version?.let { generateDocReaderDocumentsDatabase(it.database) })
@@ -416,6 +419,11 @@ fun encryptedContainers(callback: Callback, raw: String) = callback.success(from
416
419
 
417
420
  fun finalizePackage(callback: Callback) = Instance().finalizePackage { action, info, error -> callback.success(generateFinalizePackageCompletion(action, info, error)) }
418
421
 
422
+ fun endBackendTransaction(callback: Callback) {
423
+ Instance().endBackendTransaction()
424
+ callback.success()
425
+ }
426
+
419
427
  fun getTranslation(callback: Callback, className: String, value: Int) = when (className) {
420
428
  "RFIDErrorCodes" -> callback.success(eRFID_ErrorCodes.getTranslation(context, value))
421
429
  "LDSParsingErrorCodes" -> callback.success(eLDS_ParsingErrorCodes.getTranslation(context, value))
@@ -496,12 +504,18 @@ var requestType = RfidReaderRequestType(
496
504
  )
497
505
 
498
506
  @Suppress("DEPRECATION")
499
- fun newIntent(intent: Intent) = if (intent.action == NfcAdapter.ACTION_TECH_DISCOVERED)
507
+ fun newIntent(intent: Intent): Boolean {
508
+ if (intent.action != NfcAdapter.ACTION_TECH_DISCOVERED) return false
500
509
  Instance().readRFID(
501
510
  IsoDep.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)),
502
511
  rfidReaderCompletion,
503
512
  requestType.getRfidReaderRequest()
504
- ) else Unit
513
+ )
514
+ return true
515
+ }
516
+
517
+ var backgroundRFIDEnabled = false
518
+ lateinit var lifecycleObserver: LifecycleEventObserver
505
519
 
506
520
  fun startForegroundDispatch() {
507
521
  backgroundRFIDEnabled = true
@@ -510,9 +524,9 @@ fun startForegroundDispatch() {
510
524
  filters[0]!!.addAction(NfcAdapter.ACTION_TECH_DISCOVERED)
511
525
  filters[0]!!.addCategory(Intent.CATEGORY_DEFAULT)
512
526
  val techList = arrayOf(arrayOf("android.nfc.tech.IsoDep"))
513
- val intent = Intent(context, context.javaClass)
527
+ val intent = Intent(activity, activity.javaClass)
514
528
  val flag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_MUTABLE else 0
515
- val pendingIntent = PendingIntent.getActivity(context, 0, intent, flag)
529
+ val pendingIntent = PendingIntent.getActivity(activity, 0, intent, flag)
516
530
 
517
531
  if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED))
518
532
  enableForegroundDispatch(pendingIntent, filters, techList)
@@ -523,7 +537,7 @@ fun startForegroundDispatch() {
523
537
  else -> Unit
524
538
  }
525
539
  }
526
- context.runOnUiThread { lifecycle.addObserver(lifecycleObserver) }
540
+ activity.runOnUiThread { lifecycle.addObserver(lifecycleObserver) }
527
541
  }
528
542
 
529
543
  fun enableForegroundDispatch(
@@ -532,15 +546,15 @@ fun enableForegroundDispatch(
532
546
  techList: Array<Array<String>>
533
547
  ) = NfcAdapter.getDefaultAdapter(context).enableForegroundDispatch(activity, pendingIntent, filters, techList)
534
548
 
535
- fun disableForegroundDispatch() = NfcAdapter.getDefaultAdapter(activity).disableForegroundDispatch(activity)
549
+ fun disableForegroundDispatch() = NfcAdapter.getDefaultAdapter(context).disableForegroundDispatch(activity)
536
550
 
537
551
  fun stopBackgroundRFID() {
538
552
  if (!backgroundRFIDEnabled) return
539
553
  backgroundRFIDEnabled = false
540
554
  if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED))
541
555
  disableForegroundDispatch()
542
- context.runOnUiThread { lifecycle.removeObserver(lifecycleObserver) }
556
+ activity.runOnUiThread { lifecycle.removeObserver(lifecycleObserver) }
543
557
  }
544
558
 
545
559
  // Weak references
546
- var localizationCallbacks: LocalizationCallbacks? = null
560
+ var localizationCallbacks: LocalizationCallbacks? = null
@@ -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 {
package/example/App.tsx CHANGED
@@ -201,6 +201,11 @@ export default class App extends React.Component<IProps, IState> {
201
201
  if (value != null && value != "")
202
202
  this.setState({ portrait: { uri: "data:image/png;base64," + value } })
203
203
  }, (error: string) => console.log(error))
204
+
205
+ results.graphicFieldImageByTypeSource(Enum.eGraphicFieldType.GF_PORTRAIT, Enum.eRPRM_ResultType.RFID_RESULT_TYPE_RFID_IMAGE_DATA, (value: string | undefined) => {
206
+ if (value != null && value != "")
207
+ this.setState({ portrait: { uri: "data:image/png;base64," + value } })
208
+ }, (error: string) => console.log(error))
204
209
  }
205
210
 
206
211
  customRFID() {
@@ -11,6 +11,7 @@
11
11
  <activity
12
12
  android:name=".MainActivity"
13
13
  android:label="@string/app_name"
14
+ android:screenOrientation="portrait"
14
15
  android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
15
16
  android:launchMode="singleTask"
16
17
  android:windowSoftInputMode="adjustResize"
@@ -1,6 +1,6 @@
1
1
  distributionBase=GRADLE_USER_HOME
2
2
  distributionPath=wrapper/dists
3
- distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-all.zip
3
+ distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
4
4
  networkTimeout=10000
5
5
  zipStoreBase=GRADLE_USER_HOME
6
6
  zipStorePath=wrapper/dists
@@ -55,8 +55,6 @@
55
55
  </array>
56
56
  <key>UISupportedInterfaceOrientations~ipad</key>
57
57
  <array>
58
- <string>UIInterfaceOrientationLandscapeLeft</string>
59
- <string>UIInterfaceOrientationLandscapeRight</string>
60
58
  <string>UIInterfaceOrientationPortrait</string>
61
59
  </array>
62
60
  <key>UIViewControllerBasedStatusBarAppearance</key>
@@ -448,7 +448,7 @@
448
448
  "$(inherited)",
449
449
  );
450
450
  INFOPLIST_FILE = DocumentReaderTests/Info.plist;
451
- IPHONEOS_DEPLOYMENT_TARGET = 12.4;
451
+ IPHONEOS_DEPLOYMENT_TARGET = 15.6;
452
452
  LD_RUNPATH_SEARCH_PATHS = (
453
453
  "$(inherited)",
454
454
  "@executable_path/Frameworks",
@@ -477,7 +477,7 @@
477
477
  BUNDLE_LOADER = "$(TEST_HOST)";
478
478
  COPY_PHASE_STRIP = NO;
479
479
  INFOPLIST_FILE = DocumentReaderTests/Info.plist;
480
- IPHONEOS_DEPLOYMENT_TARGET = 12.4;
480
+ IPHONEOS_DEPLOYMENT_TARGET = 15.6;
481
481
  LD_RUNPATH_SEARCH_PATHS = (
482
482
  "$(inherited)",
483
483
  "@executable_path/Frameworks",
@@ -612,7 +612,7 @@
612
612
  GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
613
613
  GCC_WARN_UNUSED_FUNCTION = YES;
614
614
  GCC_WARN_UNUSED_VARIABLE = YES;
615
- IPHONEOS_DEPLOYMENT_TARGET = 12.4;
615
+ IPHONEOS_DEPLOYMENT_TARGET = 15.6;
616
616
  LD_RUNPATH_SEARCH_PATHS = (
617
617
  /usr/lib/swift,
618
618
  "$(inherited)",
@@ -678,7 +678,7 @@
678
678
  GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
679
679
  GCC_WARN_UNUSED_FUNCTION = YES;
680
680
  GCC_WARN_UNUSED_VARIABLE = YES;
681
- IPHONEOS_DEPLOYMENT_TARGET = 12.4;
681
+ IPHONEOS_DEPLOYMENT_TARGET = 15.6;
682
682
  LD_RUNPATH_SEARCH_PATHS = (
683
683
  /usr/lib/swift,
684
684
  "$(inherited)",
@@ -1,3 +1,5 @@
1
+ source "https://github.com/CocoaPods/Specs.git"
2
+
1
3
  # Resolve react_native_pods.rb with node to allow for hoisting
2
4
  require Pod::Executable.execute_command('node', ['-p',
3
5
  'require.resolve(