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,57 @@
1
+ package com.pinmi.react.printer;
2
+
3
+ import androidx.annotation.NonNull;
4
+ import androidx.annotation.Nullable;
5
+
6
+ import com.facebook.react.TurboReactPackage;
7
+ import com.facebook.react.bridge.NativeModule;
8
+ import com.facebook.react.bridge.ReactApplicationContext;
9
+ import com.facebook.react.module.model.ReactModuleInfo;
10
+ import com.facebook.react.module.model.ReactModuleInfoProvider;
11
+
12
+ import java.util.HashMap;
13
+ import java.util.Map;
14
+
15
+ /**
16
+ * TurboReactPackage that registers all printer TurboModules.
17
+ *
18
+ * @author Ordovez, Earl Romeo
19
+ */
20
+ public class RNPrinterPackage extends TurboReactPackage {
21
+
22
+ @Nullable
23
+ @Override
24
+ public NativeModule getModule(@NonNull String name, @NonNull ReactApplicationContext reactContext) {
25
+ switch (name) {
26
+ case RNUSBPrinterModule.NAME:
27
+ return new RNUSBPrinterModule(reactContext);
28
+ case RNBLEPrinterModule.NAME:
29
+ return new RNBLEPrinterModule(reactContext);
30
+ case RNNetPrinterModule.NAME:
31
+ return new RNNetPrinterModule(reactContext);
32
+ default:
33
+ return null;
34
+ }
35
+ }
36
+
37
+ @Override
38
+ public ReactModuleInfoProvider getReactModuleInfoProvider() {
39
+ return () -> {
40
+ final Map<String, ReactModuleInfo> moduleInfos = new HashMap<>();
41
+ boolean isTurboModule = true;
42
+ moduleInfos.put(RNUSBPrinterModule.NAME, new ReactModuleInfo(
43
+ RNUSBPrinterModule.NAME,
44
+ RNUSBPrinterModule.class.getName(),
45
+ false, false, false, false, isTurboModule));
46
+ moduleInfos.put(RNBLEPrinterModule.NAME, new ReactModuleInfo(
47
+ RNBLEPrinterModule.NAME,
48
+ RNBLEPrinterModule.class.getName(),
49
+ false, false, false, false, isTurboModule));
50
+ moduleInfos.put(RNNetPrinterModule.NAME, new ReactModuleInfo(
51
+ RNNetPrinterModule.NAME,
52
+ RNNetPrinterModule.class.getName(),
53
+ false, false, false, false, isTurboModule));
54
+ return moduleInfos;
55
+ };
56
+ }
57
+ }
@@ -0,0 +1,79 @@
1
+ package com.pinmi.react.printer;
2
+
3
+ import androidx.annotation.NonNull;
4
+
5
+ import com.facebook.react.bridge.Promise;
6
+ import com.facebook.react.bridge.ReactApplicationContext;
7
+ import com.facebook.react.bridge.ReactMethod;
8
+ import com.pinmi.react.printer.adapter.PrinterAdapter;
9
+ import com.pinmi.react.printer.adapter.USBPrinterAdapter;
10
+ import com.pinmi.react.printer.adapter.USBPrinterDeviceId;
11
+
12
+ /**
13
+ * TurboModule implementation for USB thermal receipt printers.
14
+ *
15
+ * @author Ordovez, Earl Romeo
16
+ */
17
+ public class RNUSBPrinterModule extends NativeUSBPrinterSpec implements RNPrinterModule {
18
+
19
+ public static final String NAME = "RNUSBPrinter";
20
+
21
+ private PrinterAdapter adapter;
22
+
23
+ public RNUSBPrinterModule(ReactApplicationContext reactContext) {
24
+ super(reactContext);
25
+ }
26
+
27
+ @Override
28
+ @NonNull
29
+ public String getName() {
30
+ return NAME;
31
+ }
32
+
33
+ @Override
34
+ @ReactMethod
35
+ public void init(Promise promise) {
36
+ this.adapter = USBPrinterAdapter.getInstance();
37
+ this.adapter.init(getReactApplicationContext(), promise);
38
+ }
39
+
40
+ @Override
41
+ @ReactMethod
42
+ public void closeConn() {
43
+ if (adapter != null) {
44
+ adapter.closeConnectionIfExists();
45
+ }
46
+ }
47
+
48
+ @Override
49
+ @ReactMethod
50
+ public void getDeviceList(Promise promise) {
51
+ adapter.getDeviceList(promise);
52
+ }
53
+
54
+ @Override
55
+ @ReactMethod
56
+ public void connectPrinter(double vendorId, double productId, Promise promise) {
57
+ adapter.selectDevice(
58
+ USBPrinterDeviceId.valueOf((int) vendorId, (int) productId),
59
+ promise);
60
+ }
61
+
62
+ @Override
63
+ @ReactMethod
64
+ public void printRawData(String base64Data, Promise promise) {
65
+ adapter.printRawData(base64Data, promise);
66
+ }
67
+
68
+ @Override
69
+ @ReactMethod
70
+ public void printImageData(String imageUrl, Promise promise) {
71
+ adapter.printImageData(imageUrl, promise);
72
+ }
73
+
74
+ @Override
75
+ @ReactMethod
76
+ public void printQrCode(String qrCode, Promise promise) {
77
+ adapter.printQrCode(qrCode, promise);
78
+ }
79
+ }
@@ -0,0 +1,391 @@
1
+ package com.pinmi.react.printer.adapter;
2
+
3
+ import android.bluetooth.BluetoothAdapter;
4
+ import android.bluetooth.BluetoothDevice;
5
+ import android.bluetooth.BluetoothSocket;
6
+ import android.graphics.Bitmap;
7
+ import android.graphics.BitmapFactory;
8
+ import android.graphics.Color;
9
+ import android.util.Base64;
10
+ import android.util.Log;
11
+ import android.widget.Toast;
12
+
13
+ import com.facebook.common.internal.ImmutableMap;
14
+ import com.facebook.react.bridge.Arguments;
15
+ import com.facebook.react.bridge.Promise;
16
+ import com.facebook.react.bridge.ReactApplicationContext;
17
+ import com.facebook.react.bridge.WritableArray;
18
+ import com.google.zxing.EncodeHintType;
19
+ import com.google.zxing.WriterException;
20
+ import com.google.zxing.common.BitMatrix;
21
+ import com.google.zxing.qrcode.QRCodeWriter;
22
+
23
+ import java.io.ByteArrayOutputStream;
24
+ import java.io.IOException;
25
+ import java.io.InputStream;
26
+ import java.io.OutputStream;
27
+ import java.net.HttpURLConnection;
28
+ import java.net.URL;
29
+ import java.util.Set;
30
+ import java.util.UUID;
31
+
32
+ /**
33
+ * BLE (Bluetooth) printer adapter implementation.
34
+ * Migrated to Promise-based API for React Native New Architecture (TurboModules).
35
+ *
36
+ * @author Ordovez, Earl Romeo
37
+ */
38
+ public class BLEPrinterAdapter implements PrinterAdapter {
39
+ private static BLEPrinterAdapter mInstance;
40
+
41
+ private String LOG_TAG = "RNBLEPrinter";
42
+
43
+ private BluetoothDevice mBluetoothDevice;
44
+ private BluetoothSocket mBluetoothSocket;
45
+
46
+ private ReactApplicationContext mContext;
47
+
48
+ private final static char ESC_CHAR = 0x1B;
49
+ private static byte[] SELECT_BIT_IMAGE_MODE = { 0x1B, 0x2A, 33 };
50
+ private final static byte[] SET_LINE_SPACE_24 = new byte[] { ESC_CHAR, 0x33, 24 };
51
+ private final static byte[] SET_LINE_SPACE_32 = new byte[] { ESC_CHAR, 0x33, 32 };
52
+ private final static byte[] LINE_FEED = new byte[] { 0x0A };
53
+ private static byte[] CENTER_ALIGN = { 0x1B, 0X61, 0X31 };
54
+
55
+ private BLEPrinterAdapter() {
56
+ }
57
+
58
+ public static BLEPrinterAdapter getInstance() {
59
+ if (mInstance == null) {
60
+ mInstance = new BLEPrinterAdapter();
61
+ }
62
+ return mInstance;
63
+ }
64
+
65
+ @Override
66
+ public void init(ReactApplicationContext reactContext, Promise promise) {
67
+ this.mContext = reactContext;
68
+ BluetoothAdapter bluetoothAdapter = getBTAdapter();
69
+ if (bluetoothAdapter == null) {
70
+ promise.reject("ERR_BT_ADAPTER", "No bluetooth adapter available");
71
+ return;
72
+ }
73
+ if (!bluetoothAdapter.isEnabled()) {
74
+ promise.reject("ERR_BT_DISABLED", "Bluetooth adapter is not enabled");
75
+ return;
76
+ }
77
+ promise.resolve("RNBLEPrinter initialized");
78
+ }
79
+
80
+ private static BluetoothAdapter getBTAdapter() {
81
+ return BluetoothAdapter.getDefaultAdapter();
82
+ }
83
+
84
+ @Override
85
+ public void getDeviceList(Promise promise) {
86
+ BluetoothAdapter bluetoothAdapter = getBTAdapter();
87
+ if (bluetoothAdapter == null) {
88
+ promise.reject("ERR_BT_ADAPTER", "No bluetooth adapter available");
89
+ return;
90
+ }
91
+ if (!bluetoothAdapter.isEnabled()) {
92
+ promise.reject("ERR_BT_DISABLED", "Bluetooth is not enabled");
93
+ return;
94
+ }
95
+ WritableArray array = Arguments.createArray();
96
+ Set<BluetoothDevice> pairedDevices = getBTAdapter().getBondedDevices();
97
+ for (BluetoothDevice device : pairedDevices) {
98
+ array.pushMap(new BLEPrinterDevice(device).toRNWritableMap());
99
+ }
100
+ promise.resolve(array);
101
+ }
102
+
103
+ @Override
104
+ public void selectDevice(PrinterDeviceId printerDeviceId, Promise promise) {
105
+ BluetoothAdapter bluetoothAdapter = getBTAdapter();
106
+ if (bluetoothAdapter == null) {
107
+ promise.reject("ERR_BT_ADAPTER", "No bluetooth adapter available");
108
+ return;
109
+ }
110
+ if (!bluetoothAdapter.isEnabled()) {
111
+ promise.reject("ERR_BT_DISABLED", "Bluetooth is not enabled");
112
+ return;
113
+ }
114
+ BLEPrinterDeviceId blePrinterDeviceId = (BLEPrinterDeviceId) printerDeviceId;
115
+ if (this.mBluetoothDevice != null) {
116
+ if (this.mBluetoothDevice.getAddress().equals(blePrinterDeviceId.getInnerMacAddress())
117
+ && this.mBluetoothSocket != null) {
118
+ Log.v(LOG_TAG, "do not need to reconnect");
119
+ promise.resolve(new BLEPrinterDevice(this.mBluetoothDevice).toRNWritableMap());
120
+ return;
121
+ } else {
122
+ closeConnectionIfExists();
123
+ }
124
+ }
125
+ Set<BluetoothDevice> pairedDevices = getBTAdapter().getBondedDevices();
126
+ for (BluetoothDevice device : pairedDevices) {
127
+ if (device.getAddress().equals(blePrinterDeviceId.getInnerMacAddress())) {
128
+ try {
129
+ connectBluetoothDevice(device);
130
+ promise.resolve(new BLEPrinterDevice(this.mBluetoothDevice).toRNWritableMap());
131
+ return;
132
+ } catch (IOException e) {
133
+ e.printStackTrace();
134
+ promise.reject("ERR_BT_CONNECT", e.getMessage());
135
+ return;
136
+ }
137
+ }
138
+ }
139
+ String errorText = "Can not find the specified printing device, please perform Bluetooth pairing in the system settings first.";
140
+ Toast.makeText(this.mContext, errorText, Toast.LENGTH_LONG).show();
141
+ promise.reject("ERR_NOT_FOUND", errorText);
142
+ }
143
+
144
+ private void connectBluetoothDevice(BluetoothDevice device) throws IOException {
145
+ UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
146
+ this.mBluetoothSocket = device.createRfcommSocketToServiceRecord(uuid);
147
+ this.mBluetoothSocket.connect();
148
+ this.mBluetoothDevice = device;
149
+ }
150
+
151
+ @Override
152
+ public void closeConnectionIfExists() {
153
+ try {
154
+ if (this.mBluetoothSocket != null) {
155
+ this.mBluetoothSocket.close();
156
+ this.mBluetoothSocket = null;
157
+ }
158
+ } catch (IOException e) {
159
+ e.printStackTrace();
160
+ }
161
+
162
+ if (this.mBluetoothDevice != null) {
163
+ this.mBluetoothDevice = null;
164
+ }
165
+ }
166
+
167
+ @Override
168
+ public void printRawData(String rawBase64Data, Promise promise) {
169
+ if (this.mBluetoothSocket == null) {
170
+ promise.reject("ERR_NO_CONN", "Bluetooth connection is not built, may be you forgot to connectPrinter");
171
+ return;
172
+ }
173
+ final String rawData = rawBase64Data;
174
+ final BluetoothSocket socket = this.mBluetoothSocket;
175
+ Log.v(LOG_TAG, "start to print raw data " + rawBase64Data);
176
+ new Thread(new Runnable() {
177
+ @Override
178
+ public void run() {
179
+ try {
180
+ byte[] bytes = Base64.decode(rawData, Base64.DEFAULT);
181
+ OutputStream printerOutputStream = socket.getOutputStream();
182
+ printerOutputStream.write(bytes, 0, bytes.length);
183
+ printerOutputStream.flush();
184
+ promise.resolve(null);
185
+ } catch (IOException e) {
186
+ Log.e(LOG_TAG, "failed to print data" + rawData);
187
+ e.printStackTrace();
188
+ promise.reject("ERR_PRINT", e.getMessage());
189
+ }
190
+ }
191
+ }).start();
192
+ }
193
+
194
+ public static Bitmap getBitmapFromURL(String src) {
195
+ try {
196
+ URL url = new URL(src);
197
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
198
+ connection.setDoInput(true);
199
+ connection.connect();
200
+ InputStream input = connection.getInputStream();
201
+ Bitmap myBitmap = BitmapFactory.decodeStream(input);
202
+
203
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
204
+ myBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
205
+
206
+ return myBitmap;
207
+ } catch (IOException e) {
208
+ return null;
209
+ }
210
+ }
211
+
212
+ @Override
213
+ public void printImageData(String imageUrl, Promise promise) {
214
+ final Bitmap bitmapImage = getBitmapFromURL(imageUrl);
215
+
216
+ if (bitmapImage == null) {
217
+ promise.reject("ERR_IMAGE", "image not found");
218
+ return;
219
+ }
220
+ if (this.mBluetoothSocket == null) {
221
+ promise.reject("ERR_NO_CONN", "Bluetooth connection is not built, may be you forgot to connectPrinter");
222
+ return;
223
+ }
224
+
225
+ final BluetoothSocket socket = this.mBluetoothSocket;
226
+
227
+ try {
228
+ int[][] pixels = getPixelsSlow(bitmapImage);
229
+ OutputStream printerOutputStream = socket.getOutputStream();
230
+
231
+ printerOutputStream.write(SET_LINE_SPACE_24);
232
+ printerOutputStream.write(CENTER_ALIGN);
233
+
234
+ for (int y = 0; y < pixels.length; y += 24) {
235
+ printerOutputStream.write(SELECT_BIT_IMAGE_MODE);
236
+ printerOutputStream.write(
237
+ new byte[] { (byte) (0x00ff & pixels[y].length), (byte) ((0xff00 & pixels[y].length) >> 8) });
238
+ for (int x = 0; x < pixels[y].length; x++) {
239
+ printerOutputStream.write(recollectSlice(y, x, pixels));
240
+ }
241
+ printerOutputStream.write(LINE_FEED);
242
+ }
243
+ printerOutputStream.write(SET_LINE_SPACE_32);
244
+ printerOutputStream.write(LINE_FEED);
245
+ printerOutputStream.flush();
246
+ promise.resolve(null);
247
+ } catch (IOException e) {
248
+ Log.e(LOG_TAG, "failed to print data");
249
+ e.printStackTrace();
250
+ promise.reject("ERR_PRINT_IMAGE", e.getMessage());
251
+ }
252
+ }
253
+
254
+ @Override
255
+ public void printQrCode(String qrCode, Promise promise) {
256
+ final Bitmap bitmapImage = TextToQrImageEncode(qrCode);
257
+
258
+ if (bitmapImage == null) {
259
+ promise.reject("ERR_QR", "QR code generation failed");
260
+ return;
261
+ }
262
+ if (this.mBluetoothSocket == null) {
263
+ promise.reject("ERR_NO_CONN", "Bluetooth connection is not built, may be you forgot to connectPrinter");
264
+ return;
265
+ }
266
+
267
+ final BluetoothSocket socket = this.mBluetoothSocket;
268
+
269
+ try {
270
+ int[][] pixels = getPixelsSlow(bitmapImage);
271
+ OutputStream printerOutputStream = socket.getOutputStream();
272
+
273
+ printerOutputStream.write(SET_LINE_SPACE_24);
274
+ printerOutputStream.write(CENTER_ALIGN);
275
+
276
+ for (int y = 0; y < pixels.length; y += 24) {
277
+ printerOutputStream.write(SELECT_BIT_IMAGE_MODE);
278
+ printerOutputStream.write(
279
+ new byte[] { (byte) (0x00ff & pixels[y].length), (byte) ((0xff00 & pixels[y].length) >> 8) });
280
+ for (int x = 0; x < pixels[y].length; x++) {
281
+ printerOutputStream.write(recollectSlice(y, x, pixels));
282
+ }
283
+ printerOutputStream.write(LINE_FEED);
284
+ }
285
+ printerOutputStream.write(SET_LINE_SPACE_32);
286
+ printerOutputStream.write(LINE_FEED);
287
+ printerOutputStream.flush();
288
+ promise.resolve(null);
289
+ } catch (IOException e) {
290
+ Log.e(LOG_TAG, "failed to print data");
291
+ e.printStackTrace();
292
+ promise.reject("ERR_PRINT_QR", e.getMessage());
293
+ }
294
+ }
295
+
296
+ private Bitmap TextToQrImageEncode(String Value) {
297
+ com.google.zxing.Writer writer = new QRCodeWriter();
298
+ BitMatrix bitMatrix = null;
299
+ try {
300
+ bitMatrix = writer.encode(Value, com.google.zxing.BarcodeFormat.QR_CODE, 250, 250,
301
+ ImmutableMap.of(EncodeHintType.MARGIN, 1));
302
+ int width = 250;
303
+ int height = 250;
304
+ Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
305
+
306
+ for (int i = 0; i < width; i++) {
307
+ for (int j = 0; j < height; j++) {
308
+ bmp.setPixel(i, j, bitMatrix.get(i, j) ? Color.BLACK : Color.WHITE);
309
+ }
310
+ }
311
+ return bmp;
312
+ } catch (WriterException e) {
313
+ return null;
314
+ }
315
+ }
316
+
317
+ public static int[][] getPixelsSlow(Bitmap image2) {
318
+ Bitmap image = resizeTheImageForPrinting(image2);
319
+ int width = image.getWidth();
320
+ int height = image.getHeight();
321
+ int[][] result = new int[height][width];
322
+ for (int row = 0; row < height; row++) {
323
+ for (int col = 0; col < width; col++) {
324
+ result[row][col] = getRGB(image, col, row);
325
+ }
326
+ }
327
+ return result;
328
+ }
329
+
330
+ private byte[] recollectSlice(int y, int x, int[][] img) {
331
+ byte[] slices = new byte[] { 0, 0, 0 };
332
+ for (int yy = y, i = 0; yy < y + 24 && i < 3; yy += 8, i++) {
333
+ byte slice = 0;
334
+ for (int b = 0; b < 8; b++) {
335
+ int yyy = yy + b;
336
+ if (yyy >= img.length) {
337
+ continue;
338
+ }
339
+ int col = img[yyy][x];
340
+ boolean v = shouldPrintColor(col);
341
+ slice |= (byte) ((v ? 1 : 0) << (7 - b));
342
+ }
343
+ slices[i] = slice;
344
+ }
345
+ return slices;
346
+ }
347
+
348
+ private boolean shouldPrintColor(int col) {
349
+ final int threshold = 127;
350
+ int a, r, g, b, luminance;
351
+ a = (col >> 24) & 0xff;
352
+ if (a != 0xff) {
353
+ return false;
354
+ }
355
+ r = (col >> 16) & 0xff;
356
+ g = (col >> 8) & 0xff;
357
+ b = col & 0xff;
358
+
359
+ luminance = (int) (0.299 * r + 0.587 * g + 0.114 * b);
360
+ return luminance < threshold;
361
+ }
362
+
363
+ public static Bitmap resizeTheImageForPrinting(Bitmap image) {
364
+ int width = image.getWidth();
365
+ int height = image.getHeight();
366
+ if (width > 200 || height > 200) {
367
+ if (width > height) {
368
+ float decreaseSizeBy = (200.0f / width);
369
+ return getBitmapResized(image, decreaseSizeBy);
370
+ } else {
371
+ float decreaseSizeBy = (200.0f / height);
372
+ return getBitmapResized(image, decreaseSizeBy);
373
+ }
374
+ }
375
+ return image;
376
+ }
377
+
378
+ public static int getRGB(Bitmap bmpOriginal, int col, int row) {
379
+ int pixel = bmpOriginal.getPixel(col, row);
380
+ int R = Color.red(pixel);
381
+ int G = Color.green(pixel);
382
+ int B = Color.blue(pixel);
383
+ return Color.rgb(R, G, B);
384
+ }
385
+
386
+ public static Bitmap getBitmapResized(Bitmap image, float decreaseSizeBy) {
387
+ Bitmap resized = Bitmap.createScaledBitmap(image, (int) (image.getWidth() * decreaseSizeBy),
388
+ (int) (image.getHeight() * decreaseSizeBy), true);
389
+ return resized;
390
+ }
391
+ }
@@ -0,0 +1,33 @@
1
+ package com.pinmi.react.printer.adapter;
2
+
3
+ import android.bluetooth.BluetoothDevice;
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 BLEPrinterDevice implements PrinterDevice {
13
+ private BluetoothDevice mBluetoothDevice;
14
+ private BLEPrinterDeviceId mPrinterDeviceId;
15
+
16
+ public BLEPrinterDevice(BluetoothDevice bluetoothDevice) {
17
+ this.mBluetoothDevice = bluetoothDevice;
18
+ this.mPrinterDeviceId = BLEPrinterDeviceId.valueOf(bluetoothDevice.getAddress());
19
+ }
20
+
21
+ @Override
22
+ public PrinterDeviceId getPrinterDeviceId() {
23
+ return this.mPrinterDeviceId;
24
+ }
25
+
26
+ @Override
27
+ public WritableMap toRNWritableMap() {
28
+ WritableMap deviceMap = Arguments.createMap();
29
+ deviceMap.putString("inner_mac_address", this.mPrinterDeviceId.getInnerMacAddress());
30
+ deviceMap.putString("device_name", this.mBluetoothDevice.getName());
31
+ return deviceMap;
32
+ }
33
+ }
@@ -0,0 +1,38 @@
1
+ package com.pinmi.react.printer.adapter;
2
+
3
+ /**
4
+ * Created by xiesubin on 2017/9/21.
5
+ */
6
+
7
+ public class BLEPrinterDeviceId extends PrinterDeviceId {
8
+ private String innerMacAddress;
9
+
10
+ public static BLEPrinterDeviceId valueOf(String innerMacAddress) {
11
+ return new BLEPrinterDeviceId(innerMacAddress);
12
+ }
13
+
14
+ private BLEPrinterDeviceId(String innerMacAddress) {
15
+ this.innerMacAddress = innerMacAddress;
16
+ }
17
+
18
+ public String getInnerMacAddress() {
19
+ return innerMacAddress;
20
+ }
21
+
22
+ @Override
23
+ public boolean equals(Object o) {
24
+ if (this == o) return true;
25
+ if (o == null || getClass() != o.getClass()) return false;
26
+ if (!super.equals(o)) return false;
27
+
28
+ BLEPrinterDeviceId that = (BLEPrinterDeviceId) o;
29
+
30
+ return innerMacAddress.equals(that.innerMacAddress);
31
+
32
+ }
33
+
34
+ @Override
35
+ public int hashCode() {
36
+ return innerMacAddress.hashCode();
37
+ }
38
+ }