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.
- package/README.md +441 -0
- package/android/build/.transforms/9bdecbc31aaf57a08a337d36d73153ec/results.bin +1 -0
- package/android/build/.transforms/9bdecbc31aaf57a08a337d36d73153ec/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/.transforms/bc167481fd58833142c92ba32b0fc3e3/results.bin +1 -0
- package/android/build/.transforms/bc167481fd58833142c92ba32b0fc3e3/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/generated/source/buildConfig/debug/com/pinmi/react/printer/BuildConfig.java +10 -0
- package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeBLEPrinterSpec.java +70 -0
- package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeNetPrinterSpec.java +70 -0
- package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeUSBPrinterSpec.java +62 -0
- package/android/build/generated/source/codegen/jni/CMakeLists.txt +46 -0
- package/android/build/generated/source/codegen/jni/RNThermalReceiptPrinterSpec-generated.cpp +190 -0
- package/android/build/generated/source/codegen/jni/RNThermalReceiptPrinterSpec.h +49 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ComponentDescriptors.h +22 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/EventEmitters.cpp +18 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/EventEmitters.h +19 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/Props.cpp +21 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/Props.h +20 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/RNThermalReceiptPrinterSpecJSI-generated.cpp +205 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/RNThermalReceiptPrinterSpecJSI.h +355 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ShadowNodes.cpp +19 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ShadowNodes.h +25 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/States.cpp +18 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/States.h +23 -0
- package/android/build/generated/source/codegen/schema.json +514 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +13 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json +18 -0
- package/android/build/intermediates/aar_metadata/debug/aar-metadata.properties +5 -0
- package/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +1 -0
- package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
- package/android/build/intermediates/compile_r_class_jar/debug/R.jar +0 -0
- package/android/build/intermediates/compile_symbol_list/debug/R.txt +1 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml +4 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
- package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +2 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/BuildConfig.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeBLEPrinterSpec.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeNetPrinterSpec.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeUSBPrinterSpec.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNBLEPrinterModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNNetPrinterModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNPrinterModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNPrinterPackage.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNUSBPrinterModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterAdapter$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterAdapter.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterDevice.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterDeviceId.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter$2.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterDevice.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterDeviceId.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterAdapter.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterDevice.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterDeviceId.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter$2.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterDevice.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterDeviceId.class +0 -0
- package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +3 -0
- package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +23 -0
- package/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +13 -0
- package/android/build/intermediates/navigation_json/debug/navigation.json +1 -0
- package/android/build/intermediates/packaged_res/debug/values/values.xml +4 -0
- package/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar +0 -0
- package/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +2 -0
- package/android/build/outputs/logs/manifest-merger-debug-report.txt +37 -0
- package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/build.gradle +30 -0
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +6 -0
- package/android/gradlew +160 -0
- package/android/gradlew.bat +90 -0
- package/android/src/androidTest/java/com/pinmi/react/printer/ExampleInstrumentedTest.java +26 -0
- package/android/src/main/AndroidManifest.xml +10 -0
- package/android/src/main/java/com/pinmi/react/printer/RNBLEPrinterModule.java +91 -0
- package/android/src/main/java/com/pinmi/react/printer/RNNetPrinterModule.java +95 -0
- package/android/src/main/java/com/pinmi/react/printer/RNPrinterModule.java +24 -0
- package/android/src/main/java/com/pinmi/react/printer/RNPrinterPackage.java +57 -0
- package/android/src/main/java/com/pinmi/react/printer/RNUSBPrinterModule.java +79 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterAdapter.java +391 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterDevice.java +33 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterDeviceId.java +38 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterAdapter.java +433 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterDevice.java +30 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterDeviceId.java +48 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterAdapter.java +29 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterDevice.java +17 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterDeviceId.java +8 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterAdapter.java +468 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterDevice.java +41 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterDeviceId.java +49 -0
- package/android/src/main/res/values/strings.xml +3 -0
- package/android/src/test/java/com/pinmi/react/printer/ExampleUnitTest.java +17 -0
- package/dist/NativeBLEPrinter.d.ts +15 -0
- package/dist/NativeBLEPrinter.d.ts.map +1 -0
- package/dist/NativeBLEPrinter.js +3 -0
- package/dist/NativeBLEPrinter.js.map +1 -0
- package/dist/NativeNetPrinter.d.ts +15 -0
- package/dist/NativeNetPrinter.d.ts.map +1 -0
- package/dist/NativeNetPrinter.js +3 -0
- package/dist/NativeNetPrinter.js.map +1 -0
- package/dist/NativeUSBPrinter.d.ts +13 -0
- package/dist/NativeUSBPrinter.d.ts.map +1 -0
- package/dist/NativeUSBPrinter.js +3 -0
- package/dist/NativeUSBPrinter.js.map +1 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/EPToolkit.d.ts +9 -0
- package/dist/utils/EPToolkit.d.ts.map +1 -0
- package/dist/utils/EPToolkit.js +161 -0
- package/dist/utils/EPToolkit.js.map +1 -0
- package/dist/utils/buffer-helper.d.ts +12 -0
- package/dist/utils/buffer-helper.d.ts.map +1 -0
- package/dist/utils/buffer-helper.js +32 -0
- package/dist/utils/buffer-helper.js.map +1 -0
- package/ios/PrinterSDK/PrinterSDK.h +74 -0
- package/ios/PrinterSDK/libPrinterSDK.a +0 -0
- package/ios/RNBLEPrinter.h +24 -0
- package/ios/RNBLEPrinter.mm +251 -0
- package/ios/RNNetPrinter.h +25 -0
- package/ios/RNNetPrinter.mm +306 -0
- package/ios/RNThermalReceiptPrinter.xcodeproj/project.pbxproj +294 -0
- package/ios/RNThermalReceiptPrinter.xcworkspace/contents.xcworkspacedata +9 -0
- package/ios/RNUSBPrinter.h +19 -0
- package/ios/RNUSBPrinter.mm +80 -0
- package/package.json +70 -0
- package/react-native-earl-thermal-printer.podspec +22 -0
- package/src/NativeBLEPrinter.ts +16 -0
- package/src/NativeNetPrinter.ts +16 -0
- package/src/NativeUSBPrinter.ts +14 -0
- package/src/index.ts +160 -0
- package/src/utils/EPToolkit.ts +193 -0
- 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
|
+
}
|