react-native-pdf417-scanner 1.0.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.
Files changed (62) hide show
  1. package/README.md +304 -0
  2. package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/results.bin +1 -0
  3. package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/BuildConfig.dex +0 -0
  4. package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417CameraManager$1.dex +0 -0
  5. package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417CameraManager$2.dex +0 -0
  6. package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417CameraManager$3.dex +0 -0
  7. package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417CameraManager.dex +0 -0
  8. package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417ScannerConfig.dex +0 -0
  9. package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417ScannerModule.dex +0 -0
  10. package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/pdf417scanner/PDF417ScannerPackage.dex +0 -0
  11. package/android/build/.transforms/9b66633dab4e9d17bdb8e8633f202036/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  12. package/android/build/.transforms/d503444439e8ad92acf84485353ac7d0/results.bin +1 -0
  13. package/android/build/.transforms/d503444439e8ad92acf84485353ac7d0/transformed/classes/classes_dex/classes.dex +0 -0
  14. package/android/build/generated/source/buildConfig/debug/com/pdf417scanner/BuildConfig.java +10 -0
  15. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +20 -0
  16. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
  17. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
  18. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
  19. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  20. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  21. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -0
  22. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -0
  23. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  24. package/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
  25. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  26. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  27. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/BuildConfig.class +0 -0
  28. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417CameraManager$1.class +0 -0
  29. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417CameraManager$2.class +0 -0
  30. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417CameraManager$3.class +0 -0
  31. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417CameraManager.class +0 -0
  32. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417ScannerConfig.class +0 -0
  33. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417ScannerModule.class +0 -0
  34. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/pdf417scanner/PDF417ScannerPackage.class +0 -0
  35. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +2 -0
  36. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +33 -0
  37. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +20 -0
  38. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
  39. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
  40. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/BuildConfig.class +0 -0
  41. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417CameraManager$1.class +0 -0
  42. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417CameraManager$2.class +0 -0
  43. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417CameraManager$3.class +0 -0
  44. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417CameraManager.class +0 -0
  45. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417ScannerConfig.class +0 -0
  46. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417ScannerModule.class +0 -0
  47. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/pdf417scanner/PDF417ScannerPackage.class +0 -0
  48. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  49. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +1 -0
  50. package/android/build/outputs/logs/manifest-merger-debug-report.txt +43 -0
  51. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  52. package/android/build.gradle +31 -0
  53. package/android/src/main/AndroidManifest.xml +18 -0
  54. package/android/src/main/java/com/pdf417scanner/PDF417CameraManager.java +283 -0
  55. package/android/src/main/java/com/pdf417scanner/PDF417ScannerConfig.java +49 -0
  56. package/android/src/main/java/com/pdf417scanner/PDF417ScannerModule.java +138 -0
  57. package/android/src/main/java/com/pdf417scanner/PDF417ScannerPackage.java +28 -0
  58. package/lib/index.d.ts +60 -0
  59. package/lib/index.d.ts.map +1 -0
  60. package/lib/index.js +125 -0
  61. package/lib/index.js.map +1 -0
  62. package/package.json +34 -0
@@ -0,0 +1,283 @@
1
+ package com.pdf417scanner;
2
+
3
+ import android.app.Activity;
4
+ import android.content.Context;
5
+ import android.graphics.ImageFormat;
6
+ import android.hardware.camera2.CameraAccessException;
7
+ import android.hardware.camera2.CameraCaptureSession;
8
+ import android.hardware.camera2.CameraCharacteristics;
9
+ import android.hardware.camera2.CameraDevice;
10
+ import android.hardware.camera2.CameraManager;
11
+ import android.hardware.camera2.CaptureRequest;
12
+ import android.hardware.camera2.params.StreamConfigurationMap;
13
+ import android.media.Image;
14
+ import android.media.ImageReader;
15
+ import android.os.Handler;
16
+ import android.os.HandlerThread;
17
+ import android.util.Log;
18
+ import android.util.Size;
19
+ import android.view.Surface;
20
+
21
+ import androidx.annotation.NonNull;
22
+
23
+ import com.facebook.react.bridge.ReactApplicationContext;
24
+ import com.google.zxing.BarcodeFormat;
25
+ import com.google.zxing.BinaryBitmap;
26
+ import com.google.zxing.DecodeHintType;
27
+ import com.google.zxing.MultiFormatReader;
28
+ import com.google.zxing.PlanarYUVLuminanceSource;
29
+ import com.google.zxing.Result;
30
+ import com.google.zxing.common.HybridBinarizer;
31
+
32
+ import java.nio.ByteBuffer;
33
+ import java.util.Arrays;
34
+ import java.util.EnumMap;
35
+ import java.util.EnumSet;
36
+ import java.util.Map;
37
+ import java.util.concurrent.Semaphore;
38
+ import java.util.concurrent.TimeUnit;
39
+
40
+ public class PDF417CameraManager {
41
+ private static final String TAG = "PDF417CameraManager";
42
+
43
+ private ReactApplicationContext reactContext;
44
+ private PDF417ScannerModule scannerModule;
45
+ private CameraManager cameraManager;
46
+ private CameraDevice cameraDevice;
47
+ private CameraCaptureSession captureSession;
48
+ private ImageReader imageReader;
49
+ private HandlerThread backgroundThread;
50
+ private Handler backgroundHandler;
51
+ private MultiFormatReader multiFormatReader;
52
+ private Semaphore cameraOpenCloseLock = new Semaphore(1);
53
+ private String cameraId;
54
+ private Size previewSize;
55
+ private boolean isScanning = false;
56
+ private PDF417ScannerConfig config;
57
+
58
+ public PDF417CameraManager(ReactApplicationContext reactContext, PDF417ScannerModule scannerModule) {
59
+ this.reactContext = reactContext;
60
+ this.scannerModule = scannerModule;
61
+ this.cameraManager = (CameraManager) reactContext.getSystemService(Context.CAMERA_SERVICE);
62
+ setupBarcodeReader();
63
+ }
64
+
65
+ private void setupBarcodeReader() {
66
+ multiFormatReader = new MultiFormatReader();
67
+ Map<DecodeHintType, Object> hints = new EnumMap<>(DecodeHintType.class);
68
+ hints.put(DecodeHintType.POSSIBLE_FORMATS, EnumSet.of(BarcodeFormat.PDF_417));
69
+ hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
70
+ multiFormatReader.setHints(hints);
71
+ }
72
+
73
+ public void startScanning(PDF417ScannerConfig config) throws Exception {
74
+ this.config = config;
75
+ startBackgroundThread();
76
+ openCamera();
77
+ }
78
+
79
+ public void stopScanning() {
80
+ isScanning = false;
81
+ closeCamera();
82
+ stopBackgroundThread();
83
+ }
84
+
85
+ public void setTorchEnabled(boolean enabled) throws CameraAccessException {
86
+ if (captureSession != null && cameraDevice != null) {
87
+ CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
88
+ builder.addTarget(imageReader.getSurface());
89
+ builder.set(CaptureRequest.FLASH_MODE, enabled ?
90
+ CaptureRequest.FLASH_MODE_TORCH : CaptureRequest.FLASH_MODE_OFF);
91
+ captureSession.setRepeatingRequest(builder.build(), null, backgroundHandler);
92
+ }
93
+ }
94
+
95
+ private void startBackgroundThread() {
96
+ backgroundThread = new HandlerThread("CameraBackground");
97
+ backgroundThread.start();
98
+ backgroundHandler = new Handler(backgroundThread.getLooper());
99
+ }
100
+
101
+ private void stopBackgroundThread() {
102
+ if (backgroundThread != null) {
103
+ backgroundThread.quitSafely();
104
+ try {
105
+ backgroundThread.join();
106
+ backgroundThread = null;
107
+ backgroundHandler = null;
108
+ } catch (InterruptedException e) {
109
+ Log.e(TAG, "Error stopping background thread", e);
110
+ }
111
+ }
112
+ }
113
+
114
+ private void openCamera() throws Exception {
115
+ if (!cameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
116
+ throw new RuntimeException("Time out waiting to lock camera opening.");
117
+ }
118
+
119
+ try {
120
+ cameraId = selectCamera();
121
+ if (cameraId == null) {
122
+ throw new RuntimeException("No suitable camera found");
123
+ }
124
+
125
+ setupImageReader();
126
+ cameraManager.openCamera(cameraId, stateCallback, backgroundHandler);
127
+ } catch (CameraAccessException e) {
128
+ throw new RuntimeException("Failed to open camera", e);
129
+ }
130
+ }
131
+
132
+ private String selectCamera() throws CameraAccessException {
133
+ for (String cameraId : cameraManager.getCameraIdList()) {
134
+ CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
135
+ Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
136
+ if (facing != null && facing == CameraCharacteristics.LENS_FACING_BACK) {
137
+ StreamConfigurationMap map = characteristics.get(
138
+ CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
139
+ if (map != null) {
140
+ previewSize = chooseOptimalSize(map.getOutputSizes(ImageFormat.YUV_420_888));
141
+ return cameraId;
142
+ }
143
+ }
144
+ }
145
+ return null;
146
+ }
147
+
148
+ private Size chooseOptimalSize(Size[] choices) {
149
+ for (Size size : choices) {
150
+ if (size.getWidth() <= 1920 && size.getHeight() <= 1080) {
151
+ return size;
152
+ }
153
+ }
154
+ return choices[0];
155
+ }
156
+
157
+ private void setupImageReader() {
158
+ imageReader = ImageReader.newInstance(previewSize.getWidth(), previewSize.getHeight(),
159
+ ImageFormat.YUV_420_888, 2);
160
+ imageReader.setOnImageAvailableListener(onImageAvailableListener, backgroundHandler);
161
+ }
162
+
163
+ private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
164
+ @Override
165
+ public void onOpened(@NonNull CameraDevice camera) {
166
+ cameraOpenCloseLock.release();
167
+ cameraDevice = camera;
168
+ createCameraPreviewSession();
169
+ }
170
+
171
+ @Override
172
+ public void onDisconnected(@NonNull CameraDevice camera) {
173
+ cameraOpenCloseLock.release();
174
+ camera.close();
175
+ cameraDevice = null;
176
+ }
177
+
178
+ @Override
179
+ public void onError(@NonNull CameraDevice camera, int error) {
180
+ cameraOpenCloseLock.release();
181
+ camera.close();
182
+ cameraDevice = null;
183
+ scannerModule.onScanError("CAMERA_ERROR", "Camera error: " + error);
184
+ }
185
+ };
186
+
187
+ private void createCameraPreviewSession() {
188
+ try {
189
+ CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
190
+ builder.addTarget(imageReader.getSurface());
191
+
192
+ if (config.isEnableAutoFocus()) {
193
+ builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
194
+ }
195
+
196
+ cameraDevice.createCaptureSession(Arrays.asList(imageReader.getSurface()),
197
+ new CameraCaptureSession.StateCallback() {
198
+ @Override
199
+ public void onConfigured(@NonNull CameraCaptureSession session) {
200
+ if (cameraDevice == null) return;
201
+
202
+ captureSession = session;
203
+ try {
204
+ session.setRepeatingRequest(builder.build(), null, backgroundHandler);
205
+ isScanning = true;
206
+ scannerModule.onCameraReady();
207
+ } catch (CameraAccessException e) {
208
+ Log.e(TAG, "Error starting camera preview", e);
209
+ scannerModule.onScanError("CAMERA_ERROR", "Failed to start preview");
210
+ }
211
+ }
212
+
213
+ @Override
214
+ public void onConfigureFailed(@NonNull CameraCaptureSession session) {
215
+ scannerModule.onScanError("CAMERA_ERROR", "Failed to configure camera");
216
+ }
217
+ }, null);
218
+ } catch (CameraAccessException e) {
219
+ Log.e(TAG, "Error creating camera preview session", e);
220
+ scannerModule.onScanError("CAMERA_ERROR", "Failed to create preview session");
221
+ }
222
+ }
223
+
224
+ private final ImageReader.OnImageAvailableListener onImageAvailableListener =
225
+ new ImageReader.OnImageAvailableListener() {
226
+ @Override
227
+ public void onImageAvailable(ImageReader reader) {
228
+ if (!isScanning) return;
229
+
230
+ Image image = reader.acquireLatestImage();
231
+ if (image != null) {
232
+ try {
233
+ processImage(image);
234
+ } finally {
235
+ image.close();
236
+ }
237
+ }
238
+ }
239
+ };
240
+
241
+ private void processImage(Image image) {
242
+ try {
243
+ ByteBuffer buffer = image.getPlanes()[0].getBuffer();
244
+ byte[] data = new byte[buffer.remaining()];
245
+ buffer.get(data);
246
+
247
+ PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(
248
+ data, image.getWidth(), image.getHeight(), 0, 0,
249
+ image.getWidth(), image.getHeight(), false);
250
+
251
+ BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
252
+ Result result = multiFormatReader.decode(bitmap);
253
+
254
+ if (result != null) {
255
+ scannerModule.onScanResult(result.getText(), result.getBarcodeFormat().toString());
256
+ }
257
+ } catch (Exception e) {
258
+ // No barcode found, continue scanning
259
+ }
260
+ }
261
+
262
+ private void closeCamera() {
263
+ try {
264
+ cameraOpenCloseLock.acquire();
265
+ if (captureSession != null) {
266
+ captureSession.close();
267
+ captureSession = null;
268
+ }
269
+ if (cameraDevice != null) {
270
+ cameraDevice.close();
271
+ cameraDevice = null;
272
+ }
273
+ if (imageReader != null) {
274
+ imageReader.close();
275
+ imageReader = null;
276
+ }
277
+ } catch (InterruptedException e) {
278
+ throw new RuntimeException("Interrupted while trying to lock camera closing.", e);
279
+ } finally {
280
+ cameraOpenCloseLock.release();
281
+ }
282
+ }
283
+ }
@@ -0,0 +1,49 @@
1
+ package com.pdf417scanner;
2
+
3
+ public class PDF417ScannerConfig {
4
+ private boolean enableAutoFocus = true;
5
+ private boolean enableTorch = false;
6
+ private int scanTimeout = 30000; // 30 seconds
7
+ private boolean enableBeep = true;
8
+ private boolean enableVibration = true;
9
+
10
+ public boolean isEnableAutoFocus() {
11
+ return enableAutoFocus;
12
+ }
13
+
14
+ public void setEnableAutoFocus(boolean enableAutoFocus) {
15
+ this.enableAutoFocus = enableAutoFocus;
16
+ }
17
+
18
+ public boolean isEnableTorch() {
19
+ return enableTorch;
20
+ }
21
+
22
+ public void setEnableTorch(boolean enableTorch) {
23
+ this.enableTorch = enableTorch;
24
+ }
25
+
26
+ public int getScanTimeout() {
27
+ return scanTimeout;
28
+ }
29
+
30
+ public void setScanTimeout(int scanTimeout) {
31
+ this.scanTimeout = scanTimeout;
32
+ }
33
+
34
+ public boolean isEnableBeep() {
35
+ return enableBeep;
36
+ }
37
+
38
+ public void setEnableBeep(boolean enableBeep) {
39
+ this.enableBeep = enableBeep;
40
+ }
41
+
42
+ public boolean isEnableVibration() {
43
+ return enableVibration;
44
+ }
45
+
46
+ public void setEnableVibration(boolean enableVibration) {
47
+ this.enableVibration = enableVibration;
48
+ }
49
+ }
@@ -0,0 +1,138 @@
1
+ package com.pdf417scanner;
2
+
3
+ import android.Manifest;
4
+ import android.content.pm.PackageManager;
5
+ import android.os.Handler;
6
+ import android.os.Looper;
7
+ import android.util.Log;
8
+
9
+ import androidx.annotation.NonNull;
10
+ import androidx.core.app.ActivityCompat;
11
+
12
+ import com.facebook.react.bridge.Arguments;
13
+ import com.facebook.react.bridge.Promise;
14
+ import com.facebook.react.bridge.ReactApplicationContext;
15
+ import com.facebook.react.bridge.ReactContextBaseJavaModule;
16
+ import com.facebook.react.bridge.ReactMethod;
17
+ import com.facebook.react.bridge.ReadableMap;
18
+ import com.facebook.react.bridge.WritableMap;
19
+ import com.facebook.react.modules.core.DeviceEventManagerModule;
20
+
21
+ import java.util.HashMap;
22
+ import java.util.Map;
23
+
24
+ public class PDF417ScannerModule extends ReactContextBaseJavaModule {
25
+ private static final String TAG = "PDF417ScannerModule";
26
+ private static final String MODULE_NAME = "PDF417Scanner";
27
+
28
+ private PDF417CameraManager cameraManager;
29
+ private ReactApplicationContext reactContext;
30
+ private Handler mainHandler;
31
+
32
+ public PDF417ScannerModule(ReactApplicationContext reactContext) {
33
+ super(reactContext);
34
+ this.reactContext = reactContext;
35
+ this.mainHandler = new Handler(Looper.getMainLooper());
36
+ this.cameraManager = new PDF417CameraManager(reactContext, this);
37
+ }
38
+
39
+ @NonNull
40
+ @Override
41
+ public String getName() {
42
+ return MODULE_NAME;
43
+ }
44
+
45
+ @Override
46
+ public Map<String, Object> getConstants() {
47
+ final Map<String, Object> constants = new HashMap<>();
48
+ constants.put("SCAN_RESULT_EVENT", "PDF417ScanResult");
49
+ constants.put("SCAN_ERROR_EVENT", "PDF417ScanError");
50
+ constants.put("CAMERA_READY_EVENT", "PDF417CameraReady");
51
+ return constants;
52
+ }
53
+
54
+ @ReactMethod
55
+ public void startScanning(ReadableMap config, Promise promise) {
56
+ try {
57
+ if (!hasRequiredPermissions()) {
58
+ promise.reject("PERMISSION_DENIED", "Camera permission is required");
59
+ return;
60
+ }
61
+
62
+ PDF417ScannerConfig scannerConfig = new PDF417ScannerConfig();
63
+ if (config.hasKey("enableAutoFocus")) {
64
+ scannerConfig.setEnableAutoFocus(config.getBoolean("enableAutoFocus"));
65
+ }
66
+ if (config.hasKey("enableTorch")) {
67
+ scannerConfig.setEnableTorch(config.getBoolean("enableTorch"));
68
+ }
69
+ if (config.hasKey("scanTimeout")) {
70
+ scannerConfig.setScanTimeout(config.getInt("scanTimeout"));
71
+ }
72
+ if (config.hasKey("enableBeep")) {
73
+ scannerConfig.setEnableBeep(config.getBoolean("enableBeep"));
74
+ }
75
+ if (config.hasKey("enableVibration")) {
76
+ scannerConfig.setEnableVibration(config.getBoolean("enableVibration"));
77
+ }
78
+
79
+ cameraManager.startScanning(scannerConfig);
80
+ promise.resolve(null);
81
+ } catch (Exception e) {
82
+ Log.e(TAG, "Error starting scanner", e);
83
+ promise.reject("START_SCANNING_ERROR", e.getMessage());
84
+ }
85
+ }
86
+
87
+ @ReactMethod
88
+ public void stopScanning(Promise promise) {
89
+ try {
90
+ cameraManager.stopScanning();
91
+ promise.resolve(null);
92
+ } catch (Exception e) {
93
+ Log.e(TAG, "Error stopping scanner", e);
94
+ promise.reject("STOP_SCANNING_ERROR", e.getMessage());
95
+ }
96
+ }
97
+
98
+ @ReactMethod
99
+ public void setTorchEnabled(boolean enabled, Promise promise) {
100
+ try {
101
+ cameraManager.setTorchEnabled(enabled);
102
+ promise.resolve(null);
103
+ } catch (Exception e) {
104
+ Log.e(TAG, "Error setting torch", e);
105
+ promise.reject("TORCH_ERROR", e.getMessage());
106
+ }
107
+ }
108
+
109
+ private boolean hasRequiredPermissions() {
110
+ return ActivityCompat.checkSelfPermission(reactContext, Manifest.permission.CAMERA)
111
+ == PackageManager.PERMISSION_GRANTED;
112
+ }
113
+
114
+ public void sendEvent(String eventName, WritableMap params) {
115
+ reactContext
116
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
117
+ .emit(eventName, params);
118
+ }
119
+
120
+ public void onScanResult(String data, String format) {
121
+ WritableMap result = Arguments.createMap();
122
+ result.putString("data", data);
123
+ result.putString("format", format);
124
+ result.putDouble("timestamp", System.currentTimeMillis());
125
+ sendEvent("PDF417ScanResult", result);
126
+ }
127
+
128
+ public void onScanError(String code, String message) {
129
+ WritableMap error = Arguments.createMap();
130
+ error.putString("code", code);
131
+ error.putString("message", message);
132
+ sendEvent("PDF417ScanError", error);
133
+ }
134
+
135
+ public void onCameraReady() {
136
+ sendEvent("PDF417CameraReady", null);
137
+ }
138
+ }
@@ -0,0 +1,28 @@
1
+ package com.pdf417scanner;
2
+
3
+ import androidx.annotation.NonNull;
4
+
5
+ import com.facebook.react.ReactPackage;
6
+ import com.facebook.react.bridge.NativeModule;
7
+ import com.facebook.react.bridge.ReactApplicationContext;
8
+ import com.facebook.react.uimanager.ViewManager;
9
+
10
+ import java.util.ArrayList;
11
+ import java.util.Collections;
12
+ import java.util.List;
13
+
14
+ public class PDF417ScannerPackage implements ReactPackage {
15
+ @NonNull
16
+ @Override
17
+ public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
18
+ List<NativeModule> modules = new ArrayList<>();
19
+ modules.add(new PDF417ScannerModule(reactContext));
20
+ return modules;
21
+ }
22
+
23
+ @NonNull
24
+ @Override
25
+ public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
26
+ return Collections.emptyList();
27
+ }
28
+ }
package/lib/index.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ export interface PDF417ScanResult {
2
+ data: string;
3
+ format: string;
4
+ timestamp: number;
5
+ }
6
+ export interface PDF417ScanError {
7
+ code: string;
8
+ message: string;
9
+ }
10
+ export interface PDF417ScannerConfig {
11
+ enableAutoFocus?: boolean;
12
+ enableTorch?: boolean;
13
+ scanTimeout?: number;
14
+ enableBeep?: boolean;
15
+ enableVibration?: boolean;
16
+ }
17
+ declare class PDF417ScannerModule {
18
+ private eventEmitter;
19
+ private isScanning;
20
+ constructor();
21
+ /**
22
+ * Request camera permission
23
+ */
24
+ requestCameraPermission(): Promise<boolean>;
25
+ /**
26
+ * Check if camera permission is granted
27
+ */
28
+ hasCameraPermission(): Promise<boolean>;
29
+ /**
30
+ * Start PDF417 scanning
31
+ */
32
+ startScanning(config?: PDF417ScannerConfig): Promise<void>;
33
+ /**
34
+ * Stop PDF417 scanning
35
+ */
36
+ stopScanning(): Promise<void>;
37
+ /**
38
+ * Check if scanner is currently running
39
+ */
40
+ isCurrentlyScanning(): boolean;
41
+ /**
42
+ * Enable/disable torch (flashlight)
43
+ */
44
+ setTorchEnabled(enabled: boolean): Promise<void>;
45
+ /**
46
+ * Listen for scan results
47
+ */
48
+ onScanResult(callback: (result: PDF417ScanResult) => void): () => void;
49
+ /**
50
+ * Listen for scan errors
51
+ */
52
+ onScanError(callback: (error: PDF417ScanError) => void): () => void;
53
+ /**
54
+ * Listen for camera ready event
55
+ */
56
+ onCameraReady(callback: () => void): () => void;
57
+ }
58
+ declare const _default: PDF417ScannerModule;
59
+ export default _default;
60
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,cAAM,mBAAmB;IACvB,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,UAAU,CAAkB;;IAMpC;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC;IAuBjD;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAgB7C;;OAEG;IACG,aAAa,CAAC,MAAM,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBpE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAanC;;OAEG;IACH,mBAAmB,IAAI,OAAO;IAI9B;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtD;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAKtE;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAKnE;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;CAIhD;;AAED,wBAAyC"}
package/lib/index.js ADDED
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const react_native_1 = require("react-native");
4
+ const { PDF417Scanner } = react_native_1.NativeModules;
5
+ class PDF417ScannerModule {
6
+ constructor() {
7
+ this.isScanning = false;
8
+ this.eventEmitter = new react_native_1.NativeEventEmitter(PDF417Scanner);
9
+ }
10
+ /**
11
+ * Request camera permission
12
+ */
13
+ async requestCameraPermission() {
14
+ if (react_native_1.Platform.OS !== 'android') {
15
+ return true;
16
+ }
17
+ try {
18
+ const granted = await react_native_1.PermissionsAndroid.request(react_native_1.PermissionsAndroid.PERMISSIONS.CAMERA, {
19
+ title: 'Camera Permission',
20
+ message: 'This app needs camera access to scan PDF417 barcodes',
21
+ buttonNeutral: 'Ask Me Later',
22
+ buttonNegative: 'Cancel',
23
+ buttonPositive: 'OK',
24
+ });
25
+ return granted === react_native_1.PermissionsAndroid.RESULTS.GRANTED;
26
+ }
27
+ catch (err) {
28
+ console.warn('Camera permission error:', err);
29
+ return false;
30
+ }
31
+ }
32
+ /**
33
+ * Check if camera permission is granted
34
+ */
35
+ async hasCameraPermission() {
36
+ if (react_native_1.Platform.OS !== 'android') {
37
+ return true;
38
+ }
39
+ try {
40
+ const hasPermission = await react_native_1.PermissionsAndroid.check(react_native_1.PermissionsAndroid.PERMISSIONS.CAMERA);
41
+ return hasPermission;
42
+ }
43
+ catch (err) {
44
+ console.warn('Permission check error:', err);
45
+ return false;
46
+ }
47
+ }
48
+ /**
49
+ * Start PDF417 scanning
50
+ */
51
+ async startScanning(config = {}) {
52
+ if (this.isScanning) {
53
+ throw new Error('Scanner is already running');
54
+ }
55
+ const hasPermission = await this.hasCameraPermission();
56
+ if (!hasPermission) {
57
+ const granted = await this.requestCameraPermission();
58
+ if (!granted) {
59
+ throw new Error('Camera permission denied');
60
+ }
61
+ }
62
+ try {
63
+ await PDF417Scanner.startScanning(config);
64
+ this.isScanning = true;
65
+ }
66
+ catch (error) {
67
+ throw new Error(`Failed to start scanning: ${error}`);
68
+ }
69
+ }
70
+ /**
71
+ * Stop PDF417 scanning
72
+ */
73
+ async stopScanning() {
74
+ if (!this.isScanning) {
75
+ return;
76
+ }
77
+ try {
78
+ await PDF417Scanner.stopScanning();
79
+ this.isScanning = false;
80
+ }
81
+ catch (error) {
82
+ throw new Error(`Failed to stop scanning: ${error}`);
83
+ }
84
+ }
85
+ /**
86
+ * Check if scanner is currently running
87
+ */
88
+ isCurrentlyScanning() {
89
+ return this.isScanning;
90
+ }
91
+ /**
92
+ * Enable/disable torch (flashlight)
93
+ */
94
+ async setTorchEnabled(enabled) {
95
+ try {
96
+ await PDF417Scanner.setTorchEnabled(enabled);
97
+ }
98
+ catch (error) {
99
+ throw new Error(`Failed to set torch: ${error}`);
100
+ }
101
+ }
102
+ /**
103
+ * Listen for scan results
104
+ */
105
+ onScanResult(callback) {
106
+ const subscription = this.eventEmitter.addListener('PDF417ScanResult', callback);
107
+ return () => subscription.remove();
108
+ }
109
+ /**
110
+ * Listen for scan errors
111
+ */
112
+ onScanError(callback) {
113
+ const subscription = this.eventEmitter.addListener('PDF417ScanError', callback);
114
+ return () => subscription.remove();
115
+ }
116
+ /**
117
+ * Listen for camera ready event
118
+ */
119
+ onCameraReady(callback) {
120
+ const subscription = this.eventEmitter.addListener('PDF417CameraReady', callback);
121
+ return () => subscription.remove();
122
+ }
123
+ }
124
+ exports.default = new PDF417ScannerModule();
125
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}