react-native-earl-thermal-printer 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 (140) hide show
  1. package/README.md +441 -0
  2. package/android/build/.transforms/9bdecbc31aaf57a08a337d36d73153ec/results.bin +1 -0
  3. package/android/build/.transforms/9bdecbc31aaf57a08a337d36d73153ec/transformed/classes/classes_dex/classes.dex +0 -0
  4. package/android/build/.transforms/bc167481fd58833142c92ba32b0fc3e3/results.bin +1 -0
  5. package/android/build/.transforms/bc167481fd58833142c92ba32b0fc3e3/transformed/classes/classes_dex/classes.dex +0 -0
  6. package/android/build/generated/source/buildConfig/debug/com/pinmi/react/printer/BuildConfig.java +10 -0
  7. package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeBLEPrinterSpec.java +70 -0
  8. package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeNetPrinterSpec.java +70 -0
  9. package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeUSBPrinterSpec.java +62 -0
  10. package/android/build/generated/source/codegen/jni/CMakeLists.txt +46 -0
  11. package/android/build/generated/source/codegen/jni/RNThermalReceiptPrinterSpec-generated.cpp +190 -0
  12. package/android/build/generated/source/codegen/jni/RNThermalReceiptPrinterSpec.h +49 -0
  13. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ComponentDescriptors.h +22 -0
  14. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/EventEmitters.cpp +18 -0
  15. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/EventEmitters.h +19 -0
  16. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/Props.cpp +21 -0
  17. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/Props.h +20 -0
  18. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/RNThermalReceiptPrinterSpecJSI-generated.cpp +205 -0
  19. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/RNThermalReceiptPrinterSpecJSI.h +355 -0
  20. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ShadowNodes.cpp +19 -0
  21. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ShadowNodes.h +25 -0
  22. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/States.cpp +18 -0
  23. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/States.h +23 -0
  24. package/android/build/generated/source/codegen/schema.json +514 -0
  25. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +13 -0
  26. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json +18 -0
  27. package/android/build/intermediates/aar_metadata/debug/aar-metadata.properties +5 -0
  28. package/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +1 -0
  29. package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
  30. package/android/build/intermediates/compile_r_class_jar/debug/R.jar +0 -0
  31. package/android/build/intermediates/compile_symbol_list/debug/R.txt +1 -0
  32. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -0
  33. package/android/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml +4 -0
  34. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  35. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  36. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  37. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +2 -0
  38. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/BuildConfig.class +0 -0
  39. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeBLEPrinterSpec.class +0 -0
  40. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeNetPrinterSpec.class +0 -0
  41. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeUSBPrinterSpec.class +0 -0
  42. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNBLEPrinterModule.class +0 -0
  43. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNNetPrinterModule.class +0 -0
  44. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNPrinterModule.class +0 -0
  45. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNPrinterPackage.class +0 -0
  46. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNUSBPrinterModule.class +0 -0
  47. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterAdapter$1.class +0 -0
  48. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterAdapter.class +0 -0
  49. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterDevice.class +0 -0
  50. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterDeviceId.class +0 -0
  51. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter$1.class +0 -0
  52. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter$2.class +0 -0
  53. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter.class +0 -0
  54. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterDevice.class +0 -0
  55. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterDeviceId.class +0 -0
  56. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterAdapter.class +0 -0
  57. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterDevice.class +0 -0
  58. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterDeviceId.class +0 -0
  59. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter$1.class +0 -0
  60. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter$2.class +0 -0
  61. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter.class +0 -0
  62. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterDevice.class +0 -0
  63. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterDeviceId.class +0 -0
  64. package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +3 -0
  65. package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +23 -0
  66. package/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +13 -0
  67. package/android/build/intermediates/navigation_json/debug/navigation.json +1 -0
  68. package/android/build/intermediates/packaged_res/debug/values/values.xml +4 -0
  69. package/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar +0 -0
  70. package/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +2 -0
  71. package/android/build/outputs/logs/manifest-merger-debug-report.txt +37 -0
  72. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  73. package/android/build.gradle +30 -0
  74. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  75. package/android/gradle/wrapper/gradle-wrapper.properties +6 -0
  76. package/android/gradlew +160 -0
  77. package/android/gradlew.bat +90 -0
  78. package/android/src/androidTest/java/com/pinmi/react/printer/ExampleInstrumentedTest.java +26 -0
  79. package/android/src/main/AndroidManifest.xml +10 -0
  80. package/android/src/main/java/com/pinmi/react/printer/RNBLEPrinterModule.java +91 -0
  81. package/android/src/main/java/com/pinmi/react/printer/RNNetPrinterModule.java +95 -0
  82. package/android/src/main/java/com/pinmi/react/printer/RNPrinterModule.java +24 -0
  83. package/android/src/main/java/com/pinmi/react/printer/RNPrinterPackage.java +57 -0
  84. package/android/src/main/java/com/pinmi/react/printer/RNUSBPrinterModule.java +79 -0
  85. package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterAdapter.java +391 -0
  86. package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterDevice.java +33 -0
  87. package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterDeviceId.java +38 -0
  88. package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterAdapter.java +433 -0
  89. package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterDevice.java +30 -0
  90. package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterDeviceId.java +48 -0
  91. package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterAdapter.java +29 -0
  92. package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterDevice.java +17 -0
  93. package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterDeviceId.java +8 -0
  94. package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterAdapter.java +468 -0
  95. package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterDevice.java +41 -0
  96. package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterDeviceId.java +49 -0
  97. package/android/src/main/res/values/strings.xml +3 -0
  98. package/android/src/test/java/com/pinmi/react/printer/ExampleUnitTest.java +17 -0
  99. package/dist/NativeBLEPrinter.d.ts +15 -0
  100. package/dist/NativeBLEPrinter.d.ts.map +1 -0
  101. package/dist/NativeBLEPrinter.js +3 -0
  102. package/dist/NativeBLEPrinter.js.map +1 -0
  103. package/dist/NativeNetPrinter.d.ts +15 -0
  104. package/dist/NativeNetPrinter.d.ts.map +1 -0
  105. package/dist/NativeNetPrinter.js +3 -0
  106. package/dist/NativeNetPrinter.js.map +1 -0
  107. package/dist/NativeUSBPrinter.d.ts +13 -0
  108. package/dist/NativeUSBPrinter.d.ts.map +1 -0
  109. package/dist/NativeUSBPrinter.js +3 -0
  110. package/dist/NativeUSBPrinter.js.map +1 -0
  111. package/dist/index.d.ts +59 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +58 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/utils/EPToolkit.d.ts +9 -0
  116. package/dist/utils/EPToolkit.d.ts.map +1 -0
  117. package/dist/utils/EPToolkit.js +161 -0
  118. package/dist/utils/EPToolkit.js.map +1 -0
  119. package/dist/utils/buffer-helper.d.ts +12 -0
  120. package/dist/utils/buffer-helper.d.ts.map +1 -0
  121. package/dist/utils/buffer-helper.js +32 -0
  122. package/dist/utils/buffer-helper.js.map +1 -0
  123. package/ios/PrinterSDK/PrinterSDK.h +74 -0
  124. package/ios/PrinterSDK/libPrinterSDK.a +0 -0
  125. package/ios/RNBLEPrinter.h +24 -0
  126. package/ios/RNBLEPrinter.mm +251 -0
  127. package/ios/RNNetPrinter.h +25 -0
  128. package/ios/RNNetPrinter.mm +306 -0
  129. package/ios/RNThermalReceiptPrinter.xcodeproj/project.pbxproj +294 -0
  130. package/ios/RNThermalReceiptPrinter.xcworkspace/contents.xcworkspacedata +9 -0
  131. package/ios/RNUSBPrinter.h +19 -0
  132. package/ios/RNUSBPrinter.mm +80 -0
  133. package/package.json +70 -0
  134. package/react-native-earl-thermal-printer.podspec +22 -0
  135. package/src/NativeBLEPrinter.ts +16 -0
  136. package/src/NativeNetPrinter.ts +16 -0
  137. package/src/NativeUSBPrinter.ts +14 -0
  138. package/src/index.ts +160 -0
  139. package/src/utils/EPToolkit.ts +193 -0
  140. package/src/utils/buffer-helper.ts +42 -0
@@ -0,0 +1,468 @@
1
+ package com.pinmi.react.printer.adapter;
2
+
3
+ import android.app.PendingIntent;
4
+ import android.content.BroadcastReceiver;
5
+ import android.content.Context;
6
+ import android.content.Intent;
7
+ import android.content.IntentFilter;
8
+ import android.graphics.Bitmap;
9
+ import android.graphics.BitmapFactory;
10
+ import android.graphics.Color;
11
+ import android.hardware.usb.UsbConstants;
12
+ import android.hardware.usb.UsbDevice;
13
+ import android.hardware.usb.UsbDeviceConnection;
14
+ import android.hardware.usb.UsbEndpoint;
15
+ import android.hardware.usb.UsbInterface;
16
+ import android.hardware.usb.UsbManager;
17
+ import android.util.Base64;
18
+ import android.util.Log;
19
+ import android.widget.Toast;
20
+
21
+ import com.facebook.common.internal.ImmutableMap;
22
+ import com.facebook.react.bridge.Arguments;
23
+ import com.facebook.react.bridge.Promise;
24
+ import com.facebook.react.bridge.ReactApplicationContext;
25
+ import com.facebook.react.bridge.WritableArray;
26
+ import com.facebook.react.modules.core.DeviceEventManagerModule;
27
+ import com.google.zxing.EncodeHintType;
28
+ import com.google.zxing.WriterException;
29
+ import com.google.zxing.common.BitMatrix;
30
+ import com.google.zxing.qrcode.QRCodeWriter;
31
+
32
+ import java.io.ByteArrayOutputStream;
33
+ import java.io.IOException;
34
+ import java.io.InputStream;
35
+ import java.net.HttpURLConnection;
36
+ import java.net.URL;
37
+
38
+ /**
39
+ * USB printer adapter implementation.
40
+ * Migrated to Promise-based API for React Native New Architecture (TurboModules).
41
+ *
42
+ * @author Ordovez, Earl Romeo
43
+ */
44
+ public class USBPrinterAdapter implements PrinterAdapter {
45
+ private static USBPrinterAdapter mInstance;
46
+
47
+ private String LOG_TAG = "RNUSBPrinter";
48
+ private Context mContext;
49
+ private UsbManager mUSBManager;
50
+ private PendingIntent mPermissionIndent;
51
+ private UsbDevice mUsbDevice;
52
+ private UsbDeviceConnection mUsbDeviceConnection;
53
+ private UsbInterface mUsbInterface;
54
+ private UsbEndpoint mEndPoint;
55
+ private static final String ACTION_USB_PERMISSION = "com.pinmi.react.USBPrinter.USB_PERMISSION";
56
+ private static final String EVENT_USB_DEVICE_ATTACHED = "usbAttached";
57
+
58
+ private final static char ESC_CHAR = 0x1B;
59
+ private static byte[] SELECT_BIT_IMAGE_MODE = { 0x1B, 0x2A, 33 };
60
+ private final static byte[] SET_LINE_SPACE_24 = new byte[] { ESC_CHAR, 0x33, 24 };
61
+ private final static byte[] SET_LINE_SPACE_32 = new byte[] { ESC_CHAR, 0x33, 32 };
62
+ private final static byte[] LINE_FEED = new byte[] { 0x0A };
63
+ private static byte[] CENTER_ALIGN = { 0x1B, 0X61, 0X31 };
64
+
65
+ private USBPrinterAdapter() {
66
+ }
67
+
68
+ public static USBPrinterAdapter getInstance() {
69
+ if (mInstance == null) {
70
+ mInstance = new USBPrinterAdapter();
71
+ }
72
+ return mInstance;
73
+ }
74
+
75
+ private final BroadcastReceiver mUsbDeviceReceiver = new BroadcastReceiver() {
76
+ @Override
77
+ public void onReceive(Context context, Intent intent) {
78
+ String action = intent.getAction();
79
+ if (ACTION_USB_PERMISSION.equals(action)) {
80
+ synchronized (this) {
81
+ UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
82
+ if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
83
+ Log.i(LOG_TAG, "success to grant permission for device " + usbDevice.getDeviceId()
84
+ + ", vendor_id: " + usbDevice.getVendorId()
85
+ + " product_id: " + usbDevice.getProductId());
86
+ mUsbDevice = usbDevice;
87
+ } else {
88
+ Toast.makeText(context,
89
+ "User refuses to obtain USB device permissions" + usbDevice.getDeviceName(),
90
+ Toast.LENGTH_LONG).show();
91
+ }
92
+ }
93
+ } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
94
+ if (mUsbDevice != null) {
95
+ Toast.makeText(context, "USB device has been turned off", Toast.LENGTH_LONG).show();
96
+ closeConnectionIfExists();
97
+ }
98
+ } else if (UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(action)
99
+ || UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
100
+ synchronized (this) {
101
+ if (mContext != null) {
102
+ ((ReactApplicationContext) mContext)
103
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
104
+ .emit(EVENT_USB_DEVICE_ATTACHED, null);
105
+ }
106
+ }
107
+ }
108
+ }
109
+ };
110
+
111
+ @Override
112
+ public void init(ReactApplicationContext reactContext, Promise promise) {
113
+ this.mContext = reactContext;
114
+ this.mUSBManager = (UsbManager) this.mContext.getSystemService(Context.USB_SERVICE);
115
+ this.mPermissionIndent = PendingIntent.getBroadcast(mContext, 0,
116
+ new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_MUTABLE);
117
+ IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
118
+ filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
119
+ filter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
120
+ filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
121
+ mContext.registerReceiver(mUsbDeviceReceiver, filter);
122
+ Log.v(LOG_TAG, "RNUSBPrinter initialized");
123
+ promise.resolve("RNUSBPrinter initialized");
124
+ }
125
+
126
+ @Override
127
+ public void closeConnectionIfExists() {
128
+ if (mUsbDeviceConnection != null) {
129
+ mUsbDeviceConnection.releaseInterface(mUsbInterface);
130
+ mUsbDeviceConnection.close();
131
+ mUsbInterface = null;
132
+ mEndPoint = null;
133
+ mUsbDeviceConnection = null;
134
+ }
135
+ }
136
+
137
+ @Override
138
+ public void getDeviceList(Promise promise) {
139
+ if (mUSBManager == null) {
140
+ promise.reject("ERR_USB_MANAGER", "USBManager is not initialized while get device list");
141
+ return;
142
+ }
143
+
144
+ WritableArray array = Arguments.createArray();
145
+ for (UsbDevice usbDevice : mUSBManager.getDeviceList().values()) {
146
+ array.pushMap(new USBPrinterDevice(usbDevice).toRNWritableMap());
147
+ }
148
+ promise.resolve(array);
149
+ }
150
+
151
+ @Override
152
+ public void selectDevice(PrinterDeviceId printerDeviceId, Promise promise) {
153
+ if (mUSBManager == null) {
154
+ promise.reject("ERR_USB_MANAGER", "USBManager is not initialized before select device");
155
+ return;
156
+ }
157
+
158
+ USBPrinterDeviceId usbPrinterDeviceId = (USBPrinterDeviceId) printerDeviceId;
159
+ if (mUsbDevice != null
160
+ && mUsbDevice.getVendorId() == usbPrinterDeviceId.getVendorId()
161
+ && mUsbDevice.getProductId() == usbPrinterDeviceId.getProductId()) {
162
+ Log.i(LOG_TAG, "already selected device, do not need repeat to connect");
163
+ if (!mUSBManager.hasPermission(mUsbDevice)) {
164
+ closeConnectionIfExists();
165
+ mUSBManager.requestPermission(mUsbDevice, mPermissionIndent);
166
+ }
167
+ promise.resolve(new USBPrinterDevice(mUsbDevice).toRNWritableMap());
168
+ return;
169
+ }
170
+ closeConnectionIfExists();
171
+ if (mUSBManager.getDeviceList().size() == 0) {
172
+ promise.reject("ERR_EMPTY_LIST", "Device list is empty, can not choose device");
173
+ return;
174
+ }
175
+ for (UsbDevice usbDevice : mUSBManager.getDeviceList().values()) {
176
+ if (usbDevice.getVendorId() == usbPrinterDeviceId.getVendorId()
177
+ && usbDevice.getProductId() == usbPrinterDeviceId.getProductId()) {
178
+ Log.v(LOG_TAG, "request for device: vendor_id: " + usbPrinterDeviceId.getVendorId()
179
+ + ", product_id: " + usbPrinterDeviceId.getProductId());
180
+ closeConnectionIfExists();
181
+ mUSBManager.requestPermission(usbDevice, mPermissionIndent);
182
+ promise.resolve(new USBPrinterDevice(usbDevice).toRNWritableMap());
183
+ return;
184
+ }
185
+ }
186
+
187
+ promise.reject("ERR_NOT_FOUND", "can not find specified device");
188
+ }
189
+
190
+ private boolean openConnection() {
191
+ if (mUsbDevice == null) {
192
+ Log.e(LOG_TAG, "USB Device is not initialized");
193
+ return false;
194
+ }
195
+ if (mUSBManager == null) {
196
+ Log.e(LOG_TAG, "USB Manager is not initialized");
197
+ return false;
198
+ }
199
+
200
+ if (mUsbDeviceConnection != null) {
201
+ Log.i(LOG_TAG, "USB Connection already connected");
202
+ return true;
203
+ }
204
+
205
+ UsbInterface usbInterface = mUsbDevice.getInterface(0);
206
+ for (int i = 0; i < usbInterface.getEndpointCount(); i++) {
207
+ final UsbEndpoint ep = usbInterface.getEndpoint(i);
208
+ if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
209
+ if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
210
+ UsbDeviceConnection usbDeviceConnection = mUSBManager.openDevice(mUsbDevice);
211
+ if (usbDeviceConnection == null) {
212
+ Log.e(LOG_TAG, "failed to open USB Connection");
213
+ return false;
214
+ }
215
+ if (usbDeviceConnection.claimInterface(usbInterface, true)) {
216
+ mEndPoint = ep;
217
+ mUsbInterface = usbInterface;
218
+ mUsbDeviceConnection = usbDeviceConnection;
219
+ Log.i(LOG_TAG, "Device connected");
220
+ return true;
221
+ } else {
222
+ usbDeviceConnection.close();
223
+ Log.e(LOG_TAG, "failed to claim usb connection");
224
+ return false;
225
+ }
226
+ }
227
+ }
228
+ }
229
+ return true;
230
+ }
231
+
232
+ @Override
233
+ public void printRawData(String data, Promise promise) {
234
+ final String rawData = data;
235
+ Log.v(LOG_TAG, "start to print raw data " + data);
236
+ boolean isConnected = openConnection();
237
+ if (isConnected) {
238
+ Log.v(LOG_TAG, "Connected to device");
239
+ new Thread(new Runnable() {
240
+ @Override
241
+ public void run() {
242
+ try {
243
+ byte[] bytes = Base64.decode(rawData, Base64.DEFAULT);
244
+ int b = mUsbDeviceConnection.bulkTransfer(mEndPoint, bytes, bytes.length, 100000);
245
+ Log.i(LOG_TAG, "Return Status: b-->" + b);
246
+ promise.resolve(null);
247
+ } catch (Exception e) {
248
+ promise.reject("ERR_PRINT", e.getMessage());
249
+ }
250
+ }
251
+ }).start();
252
+ } else {
253
+ String msg = "failed to connected to device";
254
+ Log.v(LOG_TAG, msg);
255
+ promise.reject("ERR_CONN", msg);
256
+ }
257
+ }
258
+
259
+ public static Bitmap getBitmapFromURL(String src) {
260
+ try {
261
+ URL url = new URL(src);
262
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
263
+ connection.setDoInput(true);
264
+ connection.connect();
265
+ InputStream input = connection.getInputStream();
266
+ Bitmap myBitmap = BitmapFactory.decodeStream(input);
267
+
268
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
269
+ myBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
270
+
271
+ return myBitmap;
272
+ } catch (IOException e) {
273
+ return null;
274
+ }
275
+ }
276
+
277
+ @Override
278
+ public void printImageData(final String imageUrl, Promise promise) {
279
+ final Bitmap bitmapImage = getBitmapFromURL(imageUrl);
280
+
281
+ if (bitmapImage == null) {
282
+ promise.reject("ERR_IMAGE", "image not found");
283
+ return;
284
+ }
285
+
286
+ Log.v(LOG_TAG, "start to print image data " + bitmapImage);
287
+ boolean isConnected = openConnection();
288
+ if (isConnected) {
289
+ Log.v(LOG_TAG, "Connected to device");
290
+ try {
291
+ int[][] pixels = getPixelsSlow(bitmapImage);
292
+
293
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, SET_LINE_SPACE_24, SET_LINE_SPACE_24.length, 100000);
294
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, CENTER_ALIGN, CENTER_ALIGN.length, 100000);
295
+
296
+ for (int y = 0; y < pixels.length; y += 24) {
297
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, SELECT_BIT_IMAGE_MODE,
298
+ SELECT_BIT_IMAGE_MODE.length, 100000);
299
+
300
+ byte[] row = new byte[] { (byte) (0x00ff & pixels[y].length),
301
+ (byte) ((0xff00 & pixels[y].length) >> 8) };
302
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, row, row.length, 100000);
303
+
304
+ for (int x = 0; x < pixels[y].length; x++) {
305
+ byte[] slice = recollectSlice(y, x, pixels);
306
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, slice, slice.length, 100000);
307
+ }
308
+
309
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, LINE_FEED, LINE_FEED.length, 100000);
310
+ }
311
+
312
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, SET_LINE_SPACE_32, SET_LINE_SPACE_32.length, 100000);
313
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, LINE_FEED, LINE_FEED.length, 100000);
314
+ promise.resolve(null);
315
+ } catch (Exception e) {
316
+ promise.reject("ERR_PRINT_IMAGE", e.getMessage());
317
+ }
318
+ } else {
319
+ String msg = "failed to connected to device";
320
+ Log.v(LOG_TAG, msg);
321
+ promise.reject("ERR_CONN", msg);
322
+ }
323
+ }
324
+
325
+ private Bitmap TextToQrImageEncode(String Value) {
326
+ com.google.zxing.Writer writer = new QRCodeWriter();
327
+ BitMatrix bitMatrix = null;
328
+ try {
329
+ bitMatrix = writer.encode(Value, com.google.zxing.BarcodeFormat.QR_CODE, 250, 250,
330
+ ImmutableMap.of(EncodeHintType.MARGIN, 1));
331
+ int width = 250;
332
+ int height = 250;
333
+ Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
334
+
335
+ for (int i = 0; i < width; i++) {
336
+ for (int j = 0; j < height; j++) {
337
+ bmp.setPixel(i, j, bitMatrix.get(i, j) ? Color.BLACK : Color.WHITE);
338
+ }
339
+ }
340
+ return bmp;
341
+ } catch (WriterException e) {
342
+ return null;
343
+ }
344
+ }
345
+
346
+ @Override
347
+ public void printQrCode(String qrCode, Promise promise) {
348
+ final Bitmap bitmapImage = TextToQrImageEncode(qrCode);
349
+
350
+ if (bitmapImage == null) {
351
+ promise.reject("ERR_QR", "QR code generation failed");
352
+ return;
353
+ }
354
+
355
+ Log.v(LOG_TAG, "start to print QR code " + qrCode);
356
+ boolean isConnected = openConnection();
357
+ if (isConnected) {
358
+ Log.v(LOG_TAG, "Connected to device");
359
+ try {
360
+ int[][] pixels = getPixelsSlow(bitmapImage);
361
+
362
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, SET_LINE_SPACE_24, SET_LINE_SPACE_24.length, 100000);
363
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, CENTER_ALIGN, CENTER_ALIGN.length, 100000);
364
+
365
+ for (int y = 0; y < pixels.length; y += 24) {
366
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, SELECT_BIT_IMAGE_MODE,
367
+ SELECT_BIT_IMAGE_MODE.length, 100000);
368
+
369
+ byte[] row = new byte[] { (byte) (0x00ff & pixels[y].length),
370
+ (byte) ((0xff00 & pixels[y].length) >> 8) };
371
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, row, row.length, 100000);
372
+
373
+ for (int x = 0; x < pixels[y].length; x++) {
374
+ byte[] slice = recollectSlice(y, x, pixels);
375
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, slice, slice.length, 100000);
376
+ }
377
+
378
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, LINE_FEED, LINE_FEED.length, 100000);
379
+ }
380
+
381
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, SET_LINE_SPACE_32, SET_LINE_SPACE_32.length, 100000);
382
+ mUsbDeviceConnection.bulkTransfer(mEndPoint, LINE_FEED, LINE_FEED.length, 100000);
383
+ promise.resolve(null);
384
+ } catch (Exception e) {
385
+ promise.reject("ERR_PRINT_QR", e.getMessage());
386
+ }
387
+ } else {
388
+ String msg = "failed to connected to device";
389
+ Log.v(LOG_TAG, msg);
390
+ promise.reject("ERR_CONN", msg);
391
+ }
392
+ }
393
+
394
+ public static int[][] getPixelsSlow(Bitmap image2) {
395
+ Bitmap image = resizeTheImageForPrinting(image2);
396
+ int width = image.getWidth();
397
+ int height = image.getHeight();
398
+ int[][] result = new int[height][width];
399
+ for (int row = 0; row < height; row++) {
400
+ for (int col = 0; col < width; col++) {
401
+ result[row][col] = getRGB(image, col, row);
402
+ }
403
+ }
404
+ return result;
405
+ }
406
+
407
+ private byte[] recollectSlice(int y, int x, int[][] img) {
408
+ byte[] slices = new byte[] { 0, 0, 0 };
409
+ for (int yy = y, i = 0; yy < y + 24 && i < 3; yy += 8, i++) {
410
+ byte slice = 0;
411
+ for (int b = 0; b < 8; b++) {
412
+ int yyy = yy + b;
413
+ if (yyy >= img.length) {
414
+ continue;
415
+ }
416
+ int col = img[yyy][x];
417
+ boolean v = shouldPrintColor(col);
418
+ slice |= (byte) ((v ? 1 : 0) << (7 - b));
419
+ }
420
+ slices[i] = slice;
421
+ }
422
+ return slices;
423
+ }
424
+
425
+ private boolean shouldPrintColor(int col) {
426
+ final int threshold = 127;
427
+ int a, r, g, b, luminance;
428
+ a = (col >> 24) & 0xff;
429
+ if (a != 0xff) {
430
+ return false;
431
+ }
432
+ r = (col >> 16) & 0xff;
433
+ g = (col >> 8) & 0xff;
434
+ b = col & 0xff;
435
+
436
+ luminance = (int) (0.299 * r + 0.587 * g + 0.114 * b);
437
+ return luminance < threshold;
438
+ }
439
+
440
+ public static Bitmap resizeTheImageForPrinting(Bitmap image) {
441
+ int width = image.getWidth();
442
+ int height = image.getHeight();
443
+ if (width > 200 || height > 200) {
444
+ if (width > height) {
445
+ float decreaseSizeBy = (200.0f / width);
446
+ return getBitmapResized(image, decreaseSizeBy);
447
+ } else {
448
+ float decreaseSizeBy = (200.0f / height);
449
+ return getBitmapResized(image, decreaseSizeBy);
450
+ }
451
+ }
452
+ return image;
453
+ }
454
+
455
+ public static int getRGB(Bitmap bmpOriginal, int col, int row) {
456
+ int pixel = bmpOriginal.getPixel(col, row);
457
+ int R = Color.red(pixel);
458
+ int G = Color.green(pixel);
459
+ int B = Color.blue(pixel);
460
+ return Color.rgb(R, G, B);
461
+ }
462
+
463
+ public static Bitmap getBitmapResized(Bitmap image, float decreaseSizeBy) {
464
+ Bitmap resized = Bitmap.createScaledBitmap(image, (int) (image.getWidth() * decreaseSizeBy),
465
+ (int) (image.getHeight() * decreaseSizeBy), true);
466
+ return resized;
467
+ }
468
+ }
@@ -0,0 +1,41 @@
1
+ package com.pinmi.react.printer.adapter;
2
+
3
+ import android.hardware.usb.UsbDevice;
4
+
5
+ import com.facebook.react.bridge.Arguments;
6
+ import com.facebook.react.bridge.WritableMap;
7
+
8
+ /**
9
+ * Created by xiesubin on 2017/9/21.
10
+ */
11
+
12
+ public class USBPrinterDevice implements PrinterDevice{
13
+ private UsbDevice mDevice;
14
+ private USBPrinterDeviceId usbPrinterDeviceId;
15
+
16
+ public USBPrinterDevice(UsbDevice device) {
17
+ this.usbPrinterDeviceId = USBPrinterDeviceId.valueOf(device.getVendorId(), device.getProductId());
18
+ this.mDevice = device;
19
+ }
20
+
21
+
22
+ @Override
23
+ public PrinterDeviceId getPrinterDeviceId() {
24
+ return this.usbPrinterDeviceId;
25
+ }
26
+
27
+ public UsbDevice getUsbDevice() {
28
+ return this.mDevice;
29
+ }
30
+
31
+ @Override
32
+ public WritableMap toRNWritableMap() {
33
+ WritableMap deviceMap = Arguments.createMap();
34
+ deviceMap.putString("device_name", this.mDevice.getDeviceName());
35
+ deviceMap.putInt("device_id", this.mDevice.getDeviceId());
36
+ deviceMap.putInt("vendor_id", this.mDevice.getVendorId());
37
+ deviceMap.putInt("product_id", this.mDevice.getProductId());
38
+ return deviceMap;
39
+ }
40
+
41
+ }
@@ -0,0 +1,49 @@
1
+ package com.pinmi.react.printer.adapter;
2
+
3
+ /**
4
+ * Created by xiesubin on 2017/9/21.
5
+ */
6
+
7
+ public class USBPrinterDeviceId extends PrinterDeviceId {
8
+
9
+ private Integer vendorId;
10
+ private Integer productId;
11
+
12
+ public Integer getVendorId() {
13
+ return vendorId;
14
+ }
15
+
16
+ public Integer getProductId() {
17
+ return productId;
18
+ }
19
+
20
+
21
+ public static USBPrinterDeviceId valueOf(Integer vendorId, Integer productId) {
22
+ return new USBPrinterDeviceId(vendorId, productId);
23
+ }
24
+
25
+ @Override
26
+ public boolean equals(Object o) {
27
+ if (this == o) return true;
28
+ if (o == null || getClass() != o.getClass()) return false;
29
+ if (!super.equals(o)) return false;
30
+
31
+ USBPrinterDeviceId that = (USBPrinterDeviceId) o;
32
+
33
+ if (!vendorId.equals(that.vendorId)) return false;
34
+ return productId.equals(that.productId);
35
+
36
+ }
37
+
38
+ @Override
39
+ public int hashCode() {
40
+ int result = vendorId.hashCode();
41
+ result = 31 * result + productId.hashCode();
42
+ return result;
43
+ }
44
+
45
+ private USBPrinterDeviceId(Integer vendorId, Integer productId){
46
+ this.vendorId = vendorId;
47
+ this.productId = productId;
48
+ }
49
+ }
@@ -0,0 +1,3 @@
1
+ <resources>
2
+ <string name="app_name">RNPrinter</string>
3
+ </resources>
@@ -0,0 +1,17 @@
1
+ package com.pinmi.react.printer;
2
+
3
+ import org.junit.Test;
4
+
5
+ import static org.junit.Assert.*;
6
+
7
+ /**
8
+ * Example local unit test, which will execute on the development machine (host).
9
+ *
10
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
11
+ */
12
+ public class ExampleUnitTest {
13
+ @Test
14
+ public void addition_isCorrect() throws Exception {
15
+ assertEquals(4, 2 + 2);
16
+ }
17
+ }
@@ -0,0 +1,15 @@
1
+ import type { TurboModule } from "react-native";
2
+ export interface Spec extends TurboModule {
3
+ init(): Promise<string>;
4
+ getDeviceList(): Promise<Object[]>;
5
+ connectPrinter(innerAddress: string): Promise<Object>;
6
+ closeConn(): void;
7
+ printRawData(base64Data: string): Promise<void>;
8
+ printImageData(imageUrl: string): Promise<void>;
9
+ printQrCode(qrCode: string): Promise<void>;
10
+ addListener(eventName: string): void;
11
+ removeListeners(count: number): void;
12
+ }
13
+ declare const _default: Spec;
14
+ export default _default;
15
+ //# sourceMappingURL=NativeBLEPrinter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeBLEPrinter.d.ts","sourceRoot":"","sources":["../src/NativeBLEPrinter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACxC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,SAAS,IAAI,IAAI,CAAC;IAClB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;;AAED,wBAAsE"}
@@ -0,0 +1,3 @@
1
+ import { TurboModuleRegistry } from "react-native";
2
+ export default TurboModuleRegistry.getEnforcing("RNBLEPrinter");
3
+ //# sourceMappingURL=NativeBLEPrinter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeBLEPrinter.js","sourceRoot":"","sources":["../src/NativeBLEPrinter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAcnD,eAAe,mBAAmB,CAAC,YAAY,CAAO,cAAc,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { TurboModule } from "react-native";
2
+ export interface Spec extends TurboModule {
3
+ init(): Promise<string>;
4
+ getDeviceList(): Promise<Object[]>;
5
+ connectPrinter(host: string, port: number): Promise<Object>;
6
+ closeConn(): void;
7
+ printRawData(base64Data: string): Promise<void>;
8
+ printImageData(imageUrl: string): Promise<void>;
9
+ printQrCode(qrCode: string): Promise<void>;
10
+ addListener(eventName: string): void;
11
+ removeListeners(count: number): void;
12
+ }
13
+ declare const _default: Spec;
14
+ export default _default;
15
+ //# sourceMappingURL=NativeNetPrinter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeNetPrinter.d.ts","sourceRoot":"","sources":["../src/NativeNetPrinter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACxC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,SAAS,IAAI,IAAI,CAAC;IAClB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;;AAED,wBAAsE"}
@@ -0,0 +1,3 @@
1
+ import { TurboModuleRegistry } from "react-native";
2
+ export default TurboModuleRegistry.getEnforcing("RNNetPrinter");
3
+ //# sourceMappingURL=NativeNetPrinter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeNetPrinter.js","sourceRoot":"","sources":["../src/NativeNetPrinter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAcnD,eAAe,mBAAmB,CAAC,YAAY,CAAO,cAAc,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { TurboModule } from "react-native";
2
+ export interface Spec extends TurboModule {
3
+ init(): Promise<string>;
4
+ getDeviceList(): Promise<Object[]>;
5
+ connectPrinter(vendorId: number, productId: number): Promise<Object>;
6
+ closeConn(): void;
7
+ printRawData(base64Data: string): Promise<void>;
8
+ printImageData(imageUrl: string): Promise<void>;
9
+ printQrCode(qrCode: string): Promise<void>;
10
+ }
11
+ declare const _default: Spec;
12
+ export default _default;
13
+ //# sourceMappingURL=NativeUSBPrinter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeUSBPrinter.d.ts","sourceRoot":"","sources":["../src/NativeUSBPrinter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACxC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrE,SAAS,IAAI,IAAI,CAAC;IAClB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;;AAED,wBAAsE"}
@@ -0,0 +1,3 @@
1
+ import { TurboModuleRegistry } from "react-native";
2
+ export default TurboModuleRegistry.getEnforcing("RNUSBPrinter");
3
+ //# sourceMappingURL=NativeUSBPrinter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeUSBPrinter.js","sourceRoot":"","sources":["../src/NativeUSBPrinter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAYnD,eAAe,mBAAmB,CAAC,YAAY,CAAO,cAAc,CAAC,CAAC"}