ns-bxl-label 0.0.1

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/index.js ADDED
@@ -0,0 +1,110 @@
1
+ // index.js
2
+ // Plugin NativeScript 7+ — JS + JAR Bixolon + tus clases Java
3
+
4
+ const app = require("@nativescript/core/application");
5
+
6
+ // -----------------------------------------------------------------------------
7
+ // 1. Listener JS equivalente a PrinterStateListener
8
+ // -----------------------------------------------------------------------------
9
+ function createPrinterStateListener(callbacks) {
10
+ return com.rivercon.appprintbixolon.PrinterControl.PrinterStateListener.extend({
11
+
12
+ onConnectionStateChanged(status) {
13
+ if (callbacks && callbacks.onConnectionStateChanged) {
14
+ callbacks.onConnectionStateChanged(status);
15
+ }
16
+ },
17
+
18
+ showPrintingDialog() {
19
+ if (callbacks && callbacks.showPrintingDialog) {
20
+ callbacks.showPrintingDialog();
21
+ }
22
+ },
23
+
24
+ hidePrintingDialog() {
25
+ if (callbacks && callbacks.hidePrintingDialog) {
26
+ callbacks.hidePrintingDialog();
27
+ }
28
+ },
29
+
30
+ onPrintError(errorMessage) {
31
+ if (callbacks && callbacks.onPrintError) {
32
+ callbacks.onPrintError(errorMessage);
33
+ }
34
+ }
35
+ });
36
+ }
37
+
38
+ // -----------------------------------------------------------------------------
39
+ // 2. Instancias internas (solo Android)
40
+ // -----------------------------------------------------------------------------
41
+ let _manager = null;
42
+ let _dialogManager = null;
43
+
44
+ // -----------------------------------------------------------------------------
45
+ // 3. Inicialización del plugin
46
+ // -----------------------------------------------------------------------------
47
+ function init(callbacks) {
48
+ if (!app.android || !app.android.context) {
49
+ throw new Error("Este plugin solo funciona en Android.");
50
+ }
51
+
52
+ const context = app.android.context;
53
+
54
+ const ListenerImpl = createPrinterStateListener(callbacks);
55
+
56
+ _manager = new com.rivercon.appprintbixolon.PrinterControl.BixolonPrinterManager(
57
+ context,
58
+ new ListenerImpl()
59
+ );
60
+
61
+ // PrinterDialogManager no lo enviaste, pero lo integro porque tu MainActivity lo usa
62
+ _dialogManager = new com.rivercon.appprintbixolon.PrinterControl.PrinterDialogManager(
63
+ context
64
+ );
65
+ }
66
+
67
+ // -----------------------------------------------------------------------------
68
+ // 4. Mostrar diálogo Bluetooth (equivalente a showBluetoothDeviceDialog)
69
+ // -----------------------------------------------------------------------------
70
+ function selectPrinter(callback) {
71
+ if (!_dialogManager) {
72
+ throw new Error("Debes llamar init() primero.");
73
+ }
74
+
75
+ _dialogManager.showBluetoothDeviceDialog(
76
+ new com.rivercon.appprintbixolon.PrinterControl.PrinterDialogManager
77
+ .OnDeviceSelectedListener({
78
+ onDeviceSelected(address) {
79
+ if (callback) callback(address);
80
+ }
81
+ })
82
+ );
83
+ }
84
+
85
+ // -----------------------------------------------------------------------------
86
+ // 5. Iniciar secuencia completa de impresión
87
+ // -----------------------------------------------------------------------------
88
+ function startFullSequence(address, zplString) {
89
+ if (!_manager) {
90
+ throw new Error("Debes llamar init() primero.");
91
+ }
92
+ _manager.startFullSequence(address, zplString);
93
+ }
94
+
95
+ // -----------------------------------------------------------------------------
96
+ // 6. Desconectar impresora
97
+ // -----------------------------------------------------------------------------
98
+ function disconnect() {
99
+ if (_manager) {
100
+ _manager.disconnect();
101
+ }
102
+ }
103
+
104
+ // -----------------------------------------------------------------------------
105
+ // 7. API pública del plugin
106
+ // -----------------------------------------------------------------------------
107
+ exports.init = init;
108
+ exports.selectPrinter = selectPrinter;
109
+ exports.startFullSequence = startFullSequence;
110
+ exports.disconnect = disconnect;
package/package.json ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "ns-bxl-label",
3
+ "version": "0.0.1",
4
+ "main": "index.js",
5
+ "nativescript": {
6
+ "platforms": {
7
+ "android": "7.0.0"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,6 @@
1
+ android {
2
+ }
3
+
4
+ dependencies {
5
+ implementation files('libs/BixolonLabelPrinterLibrary_V2.0.9.jar')
6
+ }
@@ -0,0 +1,74 @@
1
+ package com.rivercon.appprintbixolon.PrinterControl;
2
+
3
+ // Fichero: app/src/main/java/com/bixolon/labelprintersample/BixolonPrinterConnector.java
4
+ import android.content.Context;
5
+ import android.os.Handler;
6
+ import android.os.Message;
7
+ import android.util.Log;
8
+ import com.bixolon.labelprinter.BixolonLabelPrinter;
9
+
10
+ public class BixolonPrinterConnector {
11
+
12
+ private static final String TAG = "BixolonPrinterConnector"; // Tag para los logs
13
+ private final BixolonLabelPrinter mBixolonLabelPrinter;
14
+
15
+ public BixolonPrinterConnector(Context context, Handler handler) {
16
+ // La instancia de la impresora se crea aquí y se gestiona dentro de esta clase.
17
+ this.mBixolonLabelPrinter = new BixolonLabelPrinter(context, handler, null);
18
+ }
19
+
20
+ /**
21
+ * Devuelve la instancia de la impresora para que otras clases puedan usarla.
22
+ */
23
+ public BixolonLabelPrinter getPrinter() {
24
+ return mBixolonLabelPrinter;
25
+ }
26
+
27
+ /**
28
+ * Inicia la conexión con una dirección de dispositivo Bluetooth.
29
+ * @param address La dirección MAC del dispositivo Bluetooth.
30
+ */
31
+ public void connect(String address) {
32
+ if (mBixolonLabelPrinter.isConnected()) {
33
+ Log.d(TAG, "La impresora ya está conectada.");
34
+ return;
35
+ }
36
+ if (address == null || address.isEmpty()) {
37
+ Log.e(TAG, "La dirección de conexión es nula o está vacía.");
38
+ return;
39
+ }
40
+ Log.d(TAG, "Intentando conectar con la impresora en la dirección: " + address);
41
+ mBixolonLabelPrinter.connect(address);
42
+ }
43
+
44
+ /**
45
+ * Desconecta la impresora si está conectada.
46
+ */
47
+ public void disconnect() {
48
+ if (mBixolonLabelPrinter.isConnected()) {
49
+ Log.d(TAG, "Desconectando la impresora.");
50
+ mBixolonLabelPrinter.disconnect();
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Procesa los mensajes del Handler relacionados con el estado de la conexión
56
+ * y los muestra en el Logcat.
57
+ */
58
+ public void handleConnectionMessages(Message msg) {
59
+ if (msg.what == BixolonLabelPrinter.MESSAGE_STATE_CHANGE) {
60
+ switch (msg.arg1) {
61
+ case BixolonLabelPrinter.STATE_CONNECTING:
62
+ Log.d(TAG, "Estado: Conectando...");
63
+ break;
64
+ case BixolonLabelPrinter.STATE_CONNECTED:
65
+ String deviceName = msg.getData().getString(BixolonLabelPrinter.DEVICE_NAME);
66
+ Log.d(TAG, "Estado: Conexión exitosa al dispositivo: " + deviceName);
67
+ break;
68
+ case BixolonLabelPrinter.STATE_NONE:
69
+ Log.d(TAG, "Estado: Desconectado o conexión perdida.");
70
+ break;
71
+ }
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,96 @@
1
+ package com.rivercon.appprintbixolon.PrinterControl;
2
+ // Fichero: app/src/main/java/com/bixolon/labelprintersample/BixolonPrinterManager.java
3
+
4
+ import android.annotation.SuppressLint;
5
+ import android.content.Context;
6
+ import android.os.Handler;
7
+ import android.os.Looper;
8
+ import android.os.Message;
9
+ import android.util.Log;
10
+
11
+ import com.bixolon.labelprinter.BixolonLabelPrinter;
12
+
13
+ public class BixolonPrinterManager {
14
+
15
+ private static final String TAG = "BixolonPrinterManager";
16
+
17
+ private final BixolonPrinterConnector mPrinterConnector;
18
+ private final LabelPrinterHelper mLabelPrinterHelper;
19
+ private final Handler mHandler;
20
+ private final Handler mUiHandler;
21
+ private final PrinterStateListener mStateListener;
22
+
23
+ private boolean isAutoPrintSequenceActive = false;
24
+ private String mBase64PdfToPrint; // Variable para almacenar el PDF a imprimir
25
+
26
+ @SuppressLint("HandlerLeak")
27
+ public BixolonPrinterManager(Context context, PrinterStateListener stateListener) {
28
+ this.mStateListener = stateListener;
29
+ this.mUiHandler = new Handler(Looper.getMainLooper());
30
+ this.mHandler = new Handler(this::dispatchMessage);
31
+ this.mPrinterConnector = new BixolonPrinterConnector(context, mHandler);
32
+ this.mLabelPrinterHelper = new LabelPrinterHelper(context, mPrinterConnector.getPrinter());
33
+ }
34
+
35
+ /**
36
+ * Nuevo método público que inicia la secuencia completa.
37
+ * @param address La dirección MAC a la que conectar.
38
+ * @param base64Pdf El string Base64 del PDF que se va a imprimir.
39
+ */
40
+ public void startFullSequence(String address, String base64Pdf) {
41
+ if (isAutoPrintSequenceActive) {
42
+ Log.w(TAG, "Ya hay una secuencia de impresión en curso.");
43
+ return;
44
+ }
45
+
46
+ // Guarda el PDF que se necesita imprimir cuando la conexión esté lista
47
+ this.mBase64PdfToPrint = base64Pdf;
48
+ isAutoPrintSequenceActive = true;
49
+ mPrinterConnector.connect(address);
50
+ }
51
+
52
+ public void disconnect() {
53
+ isAutoPrintSequenceActive = false;
54
+ mPrinterConnector.disconnect();
55
+ }
56
+
57
+ private boolean dispatchMessage(Message msg) {
58
+ mPrinterConnector.handleConnectionMessages(msg);
59
+
60
+ if (msg.what == BixolonLabelPrinter.MESSAGE_STATE_CHANGE) {
61
+ switch (msg.arg1) {
62
+ case BixolonLabelPrinter.STATE_CONNECTING:
63
+ mStateListener.onConnectionStateChanged("Estado: Conectando...");
64
+ break;
65
+ case BixolonLabelPrinter.STATE_CONNECTED:
66
+ String deviceName = msg.getData().getString(BixolonLabelPrinter.DEVICE_NAME, "desconocido");
67
+ mStateListener.onConnectionStateChanged("Estado: Conectado a " + deviceName);
68
+ if (isAutoPrintSequenceActive) {
69
+ executePrintSequence();
70
+ }
71
+ break;
72
+ case BixolonLabelPrinter.STATE_NONE:
73
+ mStateListener.onConnectionStateChanged("Estado: Desconectado");
74
+ isAutoPrintSequenceActive = false;
75
+ break;
76
+ }
77
+ }
78
+ return true;
79
+ }
80
+
81
+ private void executePrintSequence() {
82
+ new Thread(() -> {
83
+ mUiHandler.post(mStateListener::showPrintingDialog);
84
+ try {
85
+ // Pasa el PDF guardado al helper de impresión
86
+ mLabelPrinterHelper.printLabelSample2(mBase64PdfToPrint);
87
+ } catch (Exception e) {
88
+ //Log.e(TAG, "Ocurrió un error durante la impresión", e);
89
+ //mUiHandler.post(() -> mStateListener.onPrintError("Error: " + e.getMessage()));
90
+ } finally {
91
+ mUiHandler.post(mStateListener::hidePrintingDialog);
92
+ disconnect();
93
+ }
94
+ }).start();
95
+ }
96
+ }
@@ -0,0 +1,57 @@
1
+ package com.rivercon.appprintbixolon.PrinterControl;
2
+ // Fichero: app/src/main/java/com/bixolon/labelprintersample/LabelPrinterHelper.java
3
+
4
+ import android.content.Context;
5
+ import android.graphics.Bitmap;
6
+ import android.graphics.BitmapFactory;
7
+ import android.graphics.pdf.PdfRenderer;
8
+ import android.os.ParcelFileDescriptor;
9
+ import android.util.Base64;
10
+ import android.util.Log;
11
+
12
+ import com.bixolon.labelprinter.BixolonLabelPrinter;
13
+ import com.bixolon.labelprinter.ResponseType;
14
+
15
+ import java.io.*;
16
+ import java.nio.charset.StandardCharsets;
17
+
18
+ public class LabelPrinterHelper {
19
+
20
+ private static final String TAG = "LabelPrinterHelper";
21
+ private final BixolonLabelPrinter mBixolonLabelPrinter;
22
+ private final Context mContext;
23
+
24
+ public LabelPrinterHelper(Context context, BixolonLabelPrinter printer) {
25
+ this.mContext = context;
26
+ this.mBixolonLabelPrinter = printer;
27
+ }
28
+
29
+ /**
30
+ * Imprime una etiqueta a partir de un PDF codificado en Base64.
31
+ * Ahora acepta el Base64 del PDF como parámetro.
32
+ * @param command El string Base64 que representa el PDF a imprimir.
33
+ */
34
+ public void printLabelSample2(String command) {
35
+ if (!mBixolonLabelPrinter.isConnected()) {
36
+ Log.e(TAG, "Impresora no conectada. Abortando impresión.");
37
+ throw new IllegalStateException("La impresora no está conectada.");
38
+ }
39
+
40
+ if (command == null || command.isEmpty()) {
41
+ Log.e(TAG, "El string ZPL está vacío o es nulo.");
42
+ throw new IllegalArgumentException("El ZPL no puede ser nulo.");
43
+ }
44
+
45
+ Log.d(TAG, "Iniciando transacción de impresión en la impresora.");
46
+
47
+
48
+ mBixolonLabelPrinter.beginTransactionPrint();
49
+
50
+ mBixolonLabelPrinter.executeDirectIo(command.getBytes(StandardCharsets.UTF_8), false,0);
51
+
52
+ mBixolonLabelPrinter.print(1, 0);
53
+ mBixolonLabelPrinter.endTransactionPrint();
54
+ Log.d(TAG, "Transacción de impresión finalizada.");
55
+ }
56
+
57
+ }
@@ -0,0 +1,82 @@
1
+ package com.rivercon.appprintbixolon.PrinterControl;
2
+ // Fichero: app/src/main/java/com/bixolon/labelprintersample/PrinterDialogManager.java
3
+
4
+ import android.app.AlertDialog;
5
+ import android.app.ProgressDialog;
6
+ import android.bluetooth.BluetoothAdapter;
7
+ import android.bluetooth.BluetoothDevice;
8
+ import android.content.Context;
9
+ import android.content.DialogInterface;
10
+ import android.widget.Toast;
11
+
12
+ import java.util.ArrayList;
13
+ import java.util.Set;
14
+ import java.util.function.Consumer;
15
+
16
+ /**
17
+ * Gestiona la creación y visualización de todos los diálogos de la impresora.
18
+ */
19
+ public class PrinterDialogManager {
20
+
21
+ private ProgressDialog mPrintingDialog;
22
+ private final Context mContext;
23
+ private final BluetoothAdapter mBluetoothAdapter;
24
+
25
+ public PrinterDialogManager(Context context) {
26
+ this.mContext = context;
27
+ this.mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
28
+ }
29
+
30
+ /**
31
+ * Muestra un diálogo con la lista de dispositivos Bluetooth pareados.
32
+ * @param onDeviceSelected Callback que se ejecuta cuando el usuario selecciona un dispositivo.
33
+ * Devuelve la dirección MAC del dispositivo.
34
+ */
35
+ public void showBluetoothDeviceDialog(Consumer<String> onDeviceSelected) {
36
+ if (mBluetoothAdapter == null) {
37
+ Toast.makeText(mContext, "Este dispositivo no soporta Bluetooth", Toast.LENGTH_SHORT).show();
38
+ return;
39
+ }
40
+
41
+ Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
42
+ if (pairedDevices.isEmpty()) {
43
+ Toast.makeText(mContext, "No hay impresoras Bluetooth pareadas.", Toast.LENGTH_LONG).show();
44
+ return;
45
+ }
46
+
47
+ final ArrayList<BluetoothDevice> deviceList = new ArrayList<>(pairedDevices);
48
+ final CharSequence[] deviceNames = new CharSequence[deviceList.size()];
49
+ for (int i = 0; i < deviceList.size(); i++) {
50
+ deviceNames[i] = deviceList.get(i).getName();
51
+ }
52
+
53
+ new AlertDialog.Builder(mContext)
54
+ .setTitle("Seleccione una Impresora")
55
+ .setItems(deviceNames, (dialog, which) -> {
56
+ // El usuario seleccionó un dispositivo, devolvemos su dirección MAC.
57
+ String selectedAddress = deviceList.get(which).getAddress();
58
+ onDeviceSelected.accept(selectedAddress);
59
+ })
60
+ .setNegativeButton("Cancelar", null)
61
+ .show();
62
+ }
63
+
64
+
65
+ public void showPrintingDialog() {
66
+ mPrintingDialog = new ProgressDialog(mContext);
67
+ mPrintingDialog.setMessage("Imprimiendo...");
68
+ mPrintingDialog.setCancelable(false);
69
+ mPrintingDialog.show();
70
+ }
71
+
72
+ public void hidePrintingDialog() {
73
+ if (mPrintingDialog != null && mPrintingDialog.isShowing()) {
74
+ mPrintingDialog.dismiss();
75
+ mPrintingDialog = null;
76
+ }
77
+ }
78
+
79
+ public void onDestroy() {
80
+ hidePrintingDialog();
81
+ }
82
+ }
@@ -0,0 +1,31 @@
1
+ package com.rivercon.appprintbixolon.PrinterControl;
2
+
3
+ // Fichero: app/src/main/java/com/bixolon/labelprintersample/PrinterStateListener.java
4
+
5
+ /**
6
+ * Interfaz para comunicar eventos desde BixolonPrinterManager
7
+ * hacia la capa de la UI (MainActivity).
8
+ */
9
+ public interface PrinterStateListener {
10
+ /**
11
+ * Se llama cuando el estado de la conexión cambia.
12
+ * @param status Un mensaje descriptivo del estado de conexión.
13
+ */
14
+ void onConnectionStateChanged(String status);
15
+
16
+ /**
17
+ * Pide a la UI que muestre un diálogo de impresión.
18
+ */
19
+ void showPrintingDialog();
20
+
21
+ /**
22
+ * Pide a la UI que oculte el diálogo de impresión.
23
+ */
24
+ void hidePrintingDialog();
25
+
26
+ /**
27
+ * Notifica a la UI sobre un error durante la impresión.
28
+ * @param errorMessage Mensaje del error.
29
+ */
30
+ void onPrintError(String errorMessage);
31
+ }