@delicity/capacitor-thermal-printer 7.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 (100) hide show
  1. package/DelicityThermalPrinter.podspec +28 -0
  2. package/LICENSE +21 -0
  3. package/README.md +649 -0
  4. package/android/build.gradle +122 -0
  5. package/android/src/main/AndroidManifest.xml +38 -0
  6. package/android/src/main/java/com/delicity/thermalprinter/Logger.kt +50 -0
  7. package/android/src/main/java/com/delicity/thermalprinter/ThermalPrinterEngine.kt +528 -0
  8. package/android/src/main/java/com/delicity/thermalprinter/ThermalPrinterPlugin.kt +334 -0
  9. package/android/src/main/java/com/delicity/thermalprinter/adapters/BleAdapter.kt +125 -0
  10. package/android/src/main/java/com/delicity/thermalprinter/adapters/BrotherAdapter.kt +206 -0
  11. package/android/src/main/java/com/delicity/thermalprinter/adapters/EpsonAdapter.kt +384 -0
  12. package/android/src/main/java/com/delicity/thermalprinter/adapters/EscPosAdapter.kt +160 -0
  13. package/android/src/main/java/com/delicity/thermalprinter/adapters/EscPosCommands.kt +42 -0
  14. package/android/src/main/java/com/delicity/thermalprinter/adapters/EscPosTextEncoder.kt +138 -0
  15. package/android/src/main/java/com/delicity/thermalprinter/adapters/PrinterAdapter.kt +95 -0
  16. package/android/src/main/java/com/delicity/thermalprinter/adapters/RawTcpAdapter.kt +96 -0
  17. package/android/src/main/java/com/delicity/thermalprinter/adapters/SdkContract.kt +158 -0
  18. package/android/src/main/java/com/delicity/thermalprinter/adapters/SdkReflect.kt +104 -0
  19. package/android/src/main/java/com/delicity/thermalprinter/adapters/StarAdapter.kt +322 -0
  20. package/android/src/main/java/com/delicity/thermalprinter/adapters/UsbAdapter.kt +248 -0
  21. package/android/src/main/java/com/delicity/thermalprinter/adapters/ZebraAdapter.kt +207 -0
  22. package/android/src/main/java/com/delicity/thermalprinter/discovery/AdapterPriority.kt +39 -0
  23. package/android/src/main/java/com/delicity/thermalprinter/discovery/BleScanner.kt +70 -0
  24. package/android/src/main/java/com/delicity/thermalprinter/discovery/BluetoothClassicScanner.kt +112 -0
  25. package/android/src/main/java/com/delicity/thermalprinter/discovery/DiscoveryManager.kt +136 -0
  26. package/android/src/main/java/com/delicity/thermalprinter/discovery/TcpScanner.kt +96 -0
  27. package/android/src/main/java/com/delicity/thermalprinter/image/ImageCache.kt +88 -0
  28. package/android/src/main/java/com/delicity/thermalprinter/image/ImageProcessor.kt +220 -0
  29. package/android/src/main/java/com/delicity/thermalprinter/image/TextRasterizer.kt +99 -0
  30. package/android/src/main/java/com/delicity/thermalprinter/model/Models.kt +206 -0
  31. package/android/src/main/java/com/delicity/thermalprinter/model/PrintItem.kt +100 -0
  32. package/android/src/main/java/com/delicity/thermalprinter/store/PrinterStore.kt +71 -0
  33. package/android/src/main/java/com/delicity/thermalprinter/transport/BleGattClient.kt +201 -0
  34. package/android/src/main/java/com/delicity/thermalprinter/transport/BluetoothSppTransport.kt +110 -0
  35. package/android/src/main/java/com/delicity/thermalprinter/transport/ByteTransport.kt +18 -0
  36. package/android/src/main/java/com/delicity/thermalprinter/transport/TcpTransport.kt +83 -0
  37. package/dist/esm/adapters/dedup.d.ts +26 -0
  38. package/dist/esm/adapters/dedup.js +66 -0
  39. package/dist/esm/adapters/dedup.js.map +1 -0
  40. package/dist/esm/adapters/priority.d.ts +29 -0
  41. package/dist/esm/adapters/priority.js +55 -0
  42. package/dist/esm/adapters/priority.js.map +1 -0
  43. package/dist/esm/core/enums.d.ts +61 -0
  44. package/dist/esm/core/enums.js +25 -0
  45. package/dist/esm/core/enums.js.map +1 -0
  46. package/dist/esm/core/errors.d.ts +16 -0
  47. package/dist/esm/core/errors.js +53 -0
  48. package/dist/esm/core/errors.js.map +1 -0
  49. package/dist/esm/core/escpos-text.d.ts +33 -0
  50. package/dist/esm/core/escpos-text.js +239 -0
  51. package/dist/esm/core/escpos-text.js.map +1 -0
  52. package/dist/esm/core/imaging.d.ts +91 -0
  53. package/dist/esm/core/imaging.js +184 -0
  54. package/dist/esm/core/imaging.js.map +1 -0
  55. package/dist/esm/core/models.d.ts +131 -0
  56. package/dist/esm/core/models.js +2 -0
  57. package/dist/esm/core/models.js.map +1 -0
  58. package/dist/esm/core/options.d.ts +154 -0
  59. package/dist/esm/core/options.js +2 -0
  60. package/dist/esm/core/options.js.map +1 -0
  61. package/dist/esm/core/text.d.ts +138 -0
  62. package/dist/esm/core/text.js +14 -0
  63. package/dist/esm/core/text.js.map +1 -0
  64. package/dist/esm/definitions.d.ts +155 -0
  65. package/dist/esm/definitions.js +2 -0
  66. package/dist/esm/definitions.js.map +1 -0
  67. package/dist/esm/index.d.ts +15 -0
  68. package/dist/esm/index.js +18 -0
  69. package/dist/esm/index.js.map +1 -0
  70. package/dist/esm/web.d.ts +63 -0
  71. package/dist/esm/web.js +112 -0
  72. package/dist/esm/web.js.map +1 -0
  73. package/dist/plugin.cjs.js +224 -0
  74. package/dist/plugin.cjs.js.map +1 -0
  75. package/dist/plugin.js +227 -0
  76. package/dist/plugin.js.map +1 -0
  77. package/ios/Plugin/Adapters/BrotherAdapter.swift +139 -0
  78. package/ios/Plugin/Adapters/EpsonAdapter.swift +131 -0
  79. package/ios/Plugin/Adapters/EscPosAdapter.swift +106 -0
  80. package/ios/Plugin/Adapters/EscPosCommands.swift +32 -0
  81. package/ios/Plugin/Adapters/EscPosTextEncoder.swift +115 -0
  82. package/ios/Plugin/Adapters/PrinterAdapter.swift +44 -0
  83. package/ios/Plugin/Adapters/RawTcpAdapter.swift +70 -0
  84. package/ios/Plugin/Adapters/StarAdapter.swift +305 -0
  85. package/ios/Plugin/Adapters/ZebraAdapter.swift +119 -0
  86. package/ios/Plugin/Discovery/AdapterPriority.swift +21 -0
  87. package/ios/Plugin/Discovery/BonjourScanner.swift +51 -0
  88. package/ios/Plugin/Discovery/DiscoveryManager.swift +86 -0
  89. package/ios/Plugin/Image/ImageCache.swift +73 -0
  90. package/ios/Plugin/Image/ImageProcessor.swift +168 -0
  91. package/ios/Plugin/Image/TextRasterizer.swift +81 -0
  92. package/ios/Plugin/Logger.swift +33 -0
  93. package/ios/Plugin/Model/Models.swift +174 -0
  94. package/ios/Plugin/Model/PrintItem.swift +111 -0
  95. package/ios/Plugin/Store/PrinterStore.swift +51 -0
  96. package/ios/Plugin/ThermalPrinterEngine.swift +395 -0
  97. package/ios/Plugin/ThermalPrinterPlugin.m +22 -0
  98. package/ios/Plugin/ThermalPrinterPlugin.swift +258 -0
  99. package/ios/Plugin/Transport/TcpTransport.swift +89 -0
  100. package/package.json +96 -0
@@ -0,0 +1,122 @@
1
+ ext {
2
+ junitVersion = project.hasProperty('junitVersion') ? rootProject.ext.junitVersion : '4.13.2'
3
+ androidxAppCompatVersion = project.hasProperty('androidxAppCompatVersion') ? rootProject.ext.androidxAppCompatVersion : '1.6.1'
4
+ androidxJunitVersion = project.hasProperty('androidxJunitVersion') ? rootProject.ext.androidxJunitVersion : '1.1.5'
5
+ androidxEspressoCoreVersion = project.hasProperty('androidxEspressoCoreVersion') ? rootProject.ext.androidxEspressoCoreVersion : '3.5.1'
6
+ }
7
+
8
+ buildscript {
9
+ repositories {
10
+ google()
11
+ mavenCentral()
12
+ }
13
+ dependencies {
14
+ // Capacitor 7 : AGP 8.7.2 / Gradle 8.11.1 / JDK 21
15
+ classpath 'com.android.tools.build:gradle:8.7.2'
16
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.21"
17
+ }
18
+ }
19
+
20
+ apply plugin: 'com.android.library'
21
+ apply plugin: 'kotlin-android'
22
+ apply plugin: 'jacoco'
23
+
24
+ android {
25
+ namespace "com.delicity.thermalprinter"
26
+ compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 35
27
+ defaultConfig {
28
+ minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 23
29
+ targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 35
30
+ versionCode 1
31
+ versionName "0.1.0"
32
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
33
+ }
34
+ compileOptions {
35
+ sourceCompatibility JavaVersion.VERSION_21
36
+ targetCompatibility JavaVersion.VERSION_21
37
+ }
38
+ kotlinOptions {
39
+ jvmTarget = '21'
40
+ }
41
+ lintOptions {
42
+ abortOnError false
43
+ }
44
+ buildTypes {
45
+ release {
46
+ minifyEnabled false
47
+ }
48
+ }
49
+ testOptions {
50
+ unitTests {
51
+ includeAndroidResources = true
52
+ returnDefaultValues = true
53
+ }
54
+ }
55
+ }
56
+
57
+ repositories {
58
+ google()
59
+ mavenCentral()
60
+ flatDir {
61
+ // SDK fabricants livrés en .aar/.jar manuel (Epson ePOS2, Brother, Zebra Link-OS)
62
+ // à déposer dans android/libs/ (binaires NON committés). Voir docs/SDK_INTEGRATION.md
63
+ dirs 'libs'
64
+ }
65
+ // ---- Zebra Link-OS : dépôt Maven PRIVÉ Zebra (credentials requis) ----
66
+ // Décommenter + renseigner zebraCoreId / zebraToken dans gradle.properties pour
67
+ // activer l'auto-download de Zebra. Voir docs/SDK_INTEGRATION.md (§ Zebra).
68
+ // maven {
69
+ // url "https://artifactory-us.zebra.com/artifactory/dmo-mvn-rel/"
70
+ // credentials {
71
+ // username = project.findProperty('zebraCoreId') ?: ''
72
+ // password = project.findProperty('zebraToken') ?: ''
73
+ // }
74
+ // }
75
+ }
76
+
77
+ dependencies {
78
+ implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
79
+ implementation project(':capacitor-android')
80
+ implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
81
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3"
82
+
83
+ // ---- Star StarXpand : SEUL SDK 100% auto-download (Maven Central, sans licence gate) ----
84
+ // L'adapter Star utilise des appels TYPÉS (compilation directe contre ces classes).
85
+ // Pour désactiver Star (réduire la taille), commenter cette ligne ET StarAdapter sera
86
+ // ignoré (isAvailable()=false via réflexion). Version à réactualiser au besoin.
87
+ implementation "com.starmicronics:stario10:1.12.1"
88
+
89
+ // ---- Epson / Brother / Zebra : binaires MANUELS (license-gated, non redistribuables) ----
90
+ // Les adapters correspondants utilisent la RÉFLEXION : le plugin compile/s'installe SANS
91
+ // ces binaires, et chaque adapter s'active automatiquement si le binaire est présent.
92
+ // Déposer les fichiers dans android/libs/ (voir docs/SDK_INTEGRATION.md) :
93
+ // • Epson : ePOS2.jar (portail Epson)
94
+ // • Brother: BrotherPrintLibrary.aar (portail Brother)
95
+ // • Zebra : ZSDK_ANDROID_API.jar (portail Zebra) — ou dépôt Maven privé ci-dessus.
96
+ // Aucune ligne `implementation` n'est requise pour eux : fileTree(libs) ci-dessus suffit
97
+ // à les embarquer dans l'app consommatrice quand ils sont présents.
98
+
99
+ testImplementation "junit:junit:$junitVersion"
100
+ // Tests JVM des adapters SDK (faux SDK sur le classpath de test) + Robolectric
101
+ // pour Context/Bitmap, sans émulateur. Voir docs/TESTING_SDK.md.
102
+ testImplementation "org.robolectric:robolectric:4.13"
103
+ testImplementation "androidx.test:core:1.6.1"
104
+ testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3"
105
+ androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
106
+ androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
107
+ }
108
+
109
+ // Rapport de couverture des tests unitaires JVM (./gradlew testDebugUnitTest jacocoTestReport)
110
+ tasks.register('jacocoTestReport', JacocoReport) {
111
+ dependsOn 'testDebugUnitTest'
112
+ reports {
113
+ html.required = true
114
+ xml.required = true
115
+ }
116
+ def kotlinClasses = fileTree(dir: "${buildDir}/tmp/kotlin-classes/debug", excludes: [
117
+ '**/model/**', // data classes / JSON mapping
118
+ ])
119
+ classDirectories.setFrom(kotlinClasses)
120
+ sourceDirectories.setFrom(files('src/main/java'))
121
+ executionData.setFrom(fileTree(dir: buildDir, includes: ['**/testDebugUnitTest.exec', '**/jacoco/*.exec']))
122
+ }
@@ -0,0 +1,38 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3
+ xmlns:tools="http://schemas.android.com/tools">
4
+
5
+ <!-- ============ Bluetooth (Android <= 11 / API <= 30) ============ -->
6
+ <uses-permission android:name="android.permission.BLUETOOTH"
7
+ android:maxSdkVersion="30" />
8
+ <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
9
+ android:maxSdkVersion="30" />
10
+ <!-- Le scan BLE exige la localisation jusqu'à Android 11 -->
11
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
12
+ android:maxSdkVersion="30" />
13
+
14
+ <!-- ============ Bluetooth (Android 12+ / API 31+) ============ -->
15
+ <!-- usesPermissionFlags=neverForLocation : on déclare ne PAS dériver la
16
+ localisation à partir du scan BT, ce qui évite de demander la localisation. -->
17
+ <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
18
+ android:usesPermissionFlags="neverForLocation"
19
+ tools:targetApi="s" />
20
+ <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"
21
+ tools:targetApi="s" />
22
+
23
+ <!-- ============ Réseau (Wi-Fi / Ethernet TCP 9100) ============ -->
24
+ <uses-permission android:name="android.permission.INTERNET" />
25
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
26
+ <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
27
+ <!-- mDNS / discovery réseau (multicast) -->
28
+ <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
29
+
30
+ <!-- ============ USB host (optionnel) ============ -->
31
+ <uses-feature android:name="android.hardware.usb.host" android:required="false" />
32
+
33
+ <!-- Déclarations de matériel non obligatoire pour ne pas exclure d'appareils -->
34
+ <uses-feature android:name="android.hardware.bluetooth" android:required="false" />
35
+ <uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />
36
+ <uses-feature android:name="android.hardware.wifi" android:required="false" />
37
+
38
+ </manifest>
@@ -0,0 +1,50 @@
1
+ package com.delicity.thermalprinter
2
+
3
+ import android.util.Log
4
+ import org.json.JSONArray
5
+ import org.json.JSONObject
6
+ import java.util.ArrayDeque
7
+
8
+ /**
9
+ * Logger circulaire en mémoire + Logcat, pour le diagnostic support client.
10
+ *
11
+ * - garde les N dernières lignes (ring buffer) consultables via getDebugLog(),
12
+ * - chaque ligne est horodatée et catégorisée (discovery/connect/print/status),
13
+ * - jamais de données image brutes (juste tailles/dimensions).
14
+ *
15
+ * L'app peut exposer ces logs dans un écran "Diagnostic imprimante" et les
16
+ * joindre à un ticket de support.
17
+ */
18
+ object Logger {
19
+ private const val TAG = "ThermalPrinter"
20
+ private const val MAX_LINES = 500
21
+ private val ring = ArrayDeque<JSONObject>(MAX_LINES)
22
+ @Volatile var verbose: Boolean = false
23
+
24
+ @Synchronized
25
+ fun log(category: String, message: String, data: Map<String, Any?>? = null) {
26
+ val entry = JSONObject()
27
+ .put("ts", System.currentTimeMillis())
28
+ .put("category", category)
29
+ .put("message", message)
30
+ data?.forEach { (k, v) -> entry.put(k, v ?: JSONObject.NULL) }
31
+ if (ring.size >= MAX_LINES) ring.pollFirst()
32
+ ring.addLast(entry)
33
+ if (verbose) Log.d(TAG, "[$category] $message ${data ?: ""}")
34
+ }
35
+
36
+ fun error(category: String, message: String, t: Throwable? = null) {
37
+ log(category, message, mapOf("error" to (t?.message ?: "")))
38
+ Log.e(TAG, "[$category] $message", t)
39
+ }
40
+
41
+ @Synchronized
42
+ fun snapshot(): JSONArray {
43
+ val arr = JSONArray()
44
+ ring.forEach { arr.put(it) }
45
+ return arr
46
+ }
47
+
48
+ @Synchronized
49
+ fun clear() = ring.clear()
50
+ }