xonecode 0.1.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 (187) hide show
  1. package/README.md +167 -0
  2. package/dist/agent/authEnDisco.js +56 -0
  3. package/dist/agent/authEnDisco.js.map +1 -0
  4. package/dist/agent/configEnDisco.js +109 -0
  5. package/dist/agent/configEnDisco.js.map +1 -0
  6. package/dist/agent/crearProyecto.js +34 -0
  7. package/dist/agent/crearProyecto.js.map +1 -0
  8. package/dist/agent/entorno.js +124 -0
  9. package/dist/agent/entorno.js.map +1 -0
  10. package/dist/agent/guionizado.js +53 -0
  11. package/dist/agent/guionizado.js.map +1 -0
  12. package/dist/agent/instantanea.js +129 -0
  13. package/dist/agent/instantanea.js.map +1 -0
  14. package/dist/agent/interrupts.js +83 -0
  15. package/dist/agent/interrupts.js.map +1 -0
  16. package/dist/agent/mensajes.js +24 -0
  17. package/dist/agent/mensajes.js.map +1 -0
  18. package/dist/agent/modelos.js +42 -0
  19. package/dist/agent/modelos.js.map +1 -0
  20. package/dist/agent/normalizar.js +20 -0
  21. package/dist/agent/normalizar.js.map +1 -0
  22. package/dist/agent/perfiles.js +103 -0
  23. package/dist/agent/perfiles.js.map +1 -0
  24. package/dist/agent/proyecto.js +107 -0
  25. package/dist/agent/proyecto.js.map +1 -0
  26. package/dist/agent/puente.js +142 -0
  27. package/dist/agent/puente.js.map +1 -0
  28. package/dist/agent/resumenDeTool.js +48 -0
  29. package/dist/agent/resumenDeTool.js.map +1 -0
  30. package/dist/agent/skills.js +65 -0
  31. package/dist/agent/skills.js.map +1 -0
  32. package/dist/agent/textoDeTool.js +113 -0
  33. package/dist/agent/textoDeTool.js.map +1 -0
  34. package/dist/agent/turnoReal.js +173 -0
  35. package/dist/agent/turnoReal.js.map +1 -0
  36. package/dist/agent/verificador.js +65 -0
  37. package/dist/agent/verificador.js.map +1 -0
  38. package/dist/agent/xoneAgent.js +106 -0
  39. package/dist/agent/xoneAgent.js.map +1 -0
  40. package/dist/bin.js +9 -0
  41. package/dist/bin.js.map +1 -0
  42. package/dist/cli/aprobar.js +82 -0
  43. package/dist/cli/aprobar.js.map +1 -0
  44. package/dist/cli/config.js +133 -0
  45. package/dist/cli/config.js.map +1 -0
  46. package/dist/cli/consola.js +346 -0
  47. package/dist/cli/consola.js.map +1 -0
  48. package/dist/cli/describe.js +53 -0
  49. package/dist/cli/describe.js.map +1 -0
  50. package/dist/cli/doctor.js +45 -0
  51. package/dist/cli/doctor.js.map +1 -0
  52. package/dist/cli/main.js +520 -0
  53. package/dist/cli/main.js.map +1 -0
  54. package/dist/cli/markdown.js +90 -0
  55. package/dist/cli/markdown.js.map +1 -0
  56. package/dist/cli/run.js +164 -0
  57. package/dist/cli/run.js.map +1 -0
  58. package/dist/cli/spinner.js +89 -0
  59. package/dist/cli/spinner.js.map +1 -0
  60. package/dist/cli/stdio.js +193 -0
  61. package/dist/cli/stdio.js.map +1 -0
  62. package/dist/cli/tema.js +40 -0
  63. package/dist/cli/tema.js.map +1 -0
  64. package/dist/cli/verify.js +62 -0
  65. package/dist/cli/verify.js.map +1 -0
  66. package/dist/core/bitacora.js +30 -0
  67. package/dist/core/bitacora.js.map +1 -0
  68. package/dist/core/config.js +236 -0
  69. package/dist/core/config.js.map +1 -0
  70. package/dist/core/contextos.js +56 -0
  71. package/dist/core/contextos.js.map +1 -0
  72. package/dist/core/deps.js +51 -0
  73. package/dist/core/deps.js.map +1 -0
  74. package/dist/core/diff.js +79 -0
  75. package/dist/core/diff.js.map +1 -0
  76. package/dist/core/esqueleto.js +366 -0
  77. package/dist/core/esqueleto.js.map +1 -0
  78. package/dist/core/events.js +2 -0
  79. package/dist/core/events.js.map +1 -0
  80. package/dist/core/modelos.js +85 -0
  81. package/dist/core/modelos.js.map +1 -0
  82. package/dist/core/notify.js +106 -0
  83. package/dist/core/notify.js.map +1 -0
  84. package/dist/core/ports.js +114 -0
  85. package/dist/core/ports.js.map +1 -0
  86. package/dist/core/turno.js +127 -0
  87. package/dist/core/turno.js.map +1 -0
  88. package/dist/vendor/hitl.js +103 -0
  89. package/dist/vendor/hitl.js.map +1 -0
  90. package/dist/vendor/skillLoaders/catalog.js +74 -0
  91. package/dist/vendor/skillLoaders/catalog.js.map +1 -0
  92. package/dist/vendor/tokenTracking.js +58 -0
  93. package/dist/vendor/tokenTracking.js.map +1 -0
  94. package/package.json +41 -0
  95. package/skills/xone-debugging/SKILL.md +52 -0
  96. package/skills/xone-debugging/references/faq.md +561 -0
  97. package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
  98. package/skills/xone-development/SKILL.md +105 -0
  99. package/skills/xone-development/references/anti-patrones.md +94 -0
  100. package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
  101. package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
  102. package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
  103. package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
  104. package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
  105. package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
  106. package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
  107. package/skills/xone-development/references/datos/appdata.md +611 -0
  108. package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
  109. package/skills/xone-development/references/datos/http.md +366 -0
  110. package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
  111. package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
  112. package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
  113. package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
  114. package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
  115. package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
  116. package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
  117. package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
  118. package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
  119. package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
  120. package/skills/xone-development/references/indice-completo.md +77 -0
  121. package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
  122. package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
  123. package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
  124. package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
  125. package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
  126. package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
  127. package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
  128. package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
  129. package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
  130. package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
  131. package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
  132. package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
  133. package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
  134. package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
  135. package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
  136. package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
  137. package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
  138. package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
  139. package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
  140. package/skills/xone-development/references/tipos-de-prop.md +28 -0
  141. package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
  142. package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
  143. package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
  144. package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
  145. package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
  146. package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
  147. package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
  148. package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
  149. package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
  150. package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
  151. package/skills/xone-development/references/xml-ui/mapas.md +685 -0
  152. package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
  153. package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
  154. package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
  155. package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
  156. package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
  157. package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
  158. package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
  159. package/skills/xone-plan-builder/SKILL.md +183 -0
  160. package/skills/xone-plan-builder/agents/openai.yaml +5 -0
  161. package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
  162. package/skills/xone-project-generator/SKILL.md +111 -0
  163. package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
  164. package/skills/xone-project-generator/references/colecciones-base.md +16 -0
  165. package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
  166. package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
  167. package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
  168. package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
  169. package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
  170. package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
  171. package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
  172. package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
  173. package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
  174. package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
  175. package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
  176. package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
  177. package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
  178. package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
  179. package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
  180. package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
  181. package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
  182. package/skills/xone-review/SKILL.md +189 -0
  183. package/skills/xone-spec-builder/SKILL.md +235 -0
  184. package/skills/xone-spec-builder/agents/openai.yaml +5 -0
  185. package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
  186. package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
  187. package/skills/xone-spec-builder/references/PLAN-FORMAT.md +120 -0
@@ -0,0 +1,544 @@
1
+ # XOne — Biometría, ImageDrawing y otros objetos utilitarios
2
+
3
+ > Fuente: `xone/v2/xone-project-generator/references/xone-javascript-patterns-d-createobject.md` §2.11 · `xone/v2/xone-project-generator/references/xone-javascript-patterns-d-createobject.md` §2.12.15–§2.12.17. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
4
+
5
+ Contenido: §2.11 biometricsManager · §2.12.15 ImageDrawing · §2.12.16 otros objetos utilitarios · §2.12.17 tabla resumen de objetos complementarios
6
+
7
+ ---
8
+
9
+ ### 2.11 Biometrics Manager
10
+
11
+ ```javascript
12
+ if (!biometricsManager.isHardwareAvailable()) {
13
+ ui.showToast("Biometria no disponible");
14
+ return;
15
+ }
16
+
17
+ if (!biometricsManager.hasEnrolledFingerprints()) {
18
+ biometricsManager.launchSecuritySettings();
19
+ return;
20
+ }
21
+
22
+ biometricsManager.setCallback({
23
+ title: "Autenticacion", subtitle: "Verificar identidad",
24
+ description: "Coloque su dedo en el sensor",
25
+ negativeButtonText: "Cancelar",
26
+ onSuccess: function(result) {
27
+ let sPublicKey = result.getPublicKey();
28
+ ui.showToast("Autenticación exitosa");
29
+ },
30
+ onFailure: function(nError, sErrorMessage) {
31
+ ui.showToast("Error: " + sErrorMessage);
32
+ }
33
+ // Nota: `onHelp` no existe — la API moderna BiometricPrompt no expone callback de "help".
34
+ });
35
+ biometricsManager.launch();
36
+
37
+ // Firma digital con biometria
38
+ biometricsManager.setCallback({
39
+ title: "Firma digital",
40
+ onSuccess: function(result) {
41
+ let sSigned = result.signWithPrivateKey("datos a firmar");
42
+ self.MAP_FIRMA_DIGITAL = sSigned;
43
+ self.save();
44
+ }
45
+ });
46
+ biometricsManager.launch();
47
+
48
+ // Verificar firma
49
+ result.verify(publicKey, signature, "datos originales");
50
+
51
+ // Firmar/verificar archivos
52
+ result.signFileWithPrivateKey("documento.pdf", "documento_firmado.pdf");
53
+ result.verifyFile(publicKey, "documento_firmado.pdf", "documento.pdf");
54
+ ```
55
+
56
+ #### 2.12.15 ImageDrawing - Edición de Imágenes
57
+
58
+ ```javascript
59
+ var imageDrawing = new ImageDrawing();
60
+ var info = imageDrawing.getImageInfo(appData.getFilesPath() + "foto.jpg");
61
+ imageDrawing.create(info.getWidth(), info.getHeight());
62
+ imageDrawing.setBackground(appData.getFilesPath() + "foto.jpg");
63
+ imageDrawing.setFontSize(64);
64
+ imageDrawing.setFontColor("#FF0000");
65
+ imageDrawing.addTextSetXY(new Date().toString(), 100, 200, 0);
66
+ imageDrawing.addImageSetXY("marca_agua.png", 50, 50);
67
+ imageDrawing.save(appData.getFilesPath() + "foto_editada.jpg");
68
+ ```
69
+
70
+ #### 2.12.16 Otros Objetos Utilitarios
71
+
72
+ ```javascript
73
+ // === AndroidIntent (solo Android) ===
74
+ var intent = new AndroidIntent();
75
+ intent.setAction("android.content.Intent", "ACTION_VIEW");
76
+ intent.setData("https://www.youtube.com/watch?v=VIDEO_ID");
77
+ intent.startActivity();
78
+
79
+ // Lanzar otra aplicación
80
+ intent.getLaunchIntentForPackage("com.app.package");
81
+ intent.startActivity();
82
+
83
+ // === IniParser - Lectura/escritura de archivos .ini ===
84
+ var ini = new IniParser();
85
+ ini.parseFromFile("license.ini");
86
+ var valor = ini.getValue("UsePush");
87
+ ini.setValue("UsePush", false);
88
+ ini.save("license.ini");
89
+
90
+ // === DOMParser - Parsear XML ===
91
+ // Parsear desde string XML
92
+ let domParser = new DOMParser();
93
+ let xmlDoc = domParser.parseFromString(sXml);
94
+
95
+ // Parsear desde fichero XML (en la carpeta de la app)
96
+ let xmlDoc2 = domParser.parseFromFile("MiFichero.xml");
97
+
98
+ // Navegar el documento
99
+ let nodeList = xmlDoc.getElementsByTagName("urn:Usuario"); // Soporta namespaces
100
+ let nodo = nodeList[0];
101
+ let sTexto = nodo.getTextContent(); // Texto del nodo
102
+
103
+ // Ejemplo completo: parsear respuesta SOAP
104
+ function parseFromString() {
105
+ let sXml = "<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope""
106
+ + " xmlns:urn="urn:MiServicio">"
107
+ + "<soap:Body>"
108
+ + "<urn:Check_User>"
109
+ + "<urn:Usuario>Admin</urn:Usuario>"
110
+ + "<urn:Password>1234</urn:Password>"
111
+ + "</urn:Check_User>"
112
+ + "</soap:Body>"
113
+ + "</soap:Envelope>";
114
+ let doc = new DOMParser().parseFromString(sXml);
115
+ let usuarios = doc.getElementsByTagName("urn:Usuario");
116
+ let sUser = usuarios[0].getTextContent(); // "Admin"
117
+ ui.showToast("Usuario: " + sUser);
118
+ }
119
+
120
+ // Ejemplo completo: parsear desde fichero
121
+ function parseFromFile() {
122
+ let doc = new DOMParser().parseFromFile("FileXML.xml");
123
+ let usuarios = doc.getElementsByTagName("urn:Usuario");
124
+ let sUser = usuarios[0].getTextContent();
125
+ ui.showToast("Usuario: " + sUser);
126
+ }
127
+
128
+ // === DebugTools - Envio de logs ===
129
+ var debugTools = new DebugTools();
130
+ var nResult = debugTools.sendLog();
131
+ ```
132
+
133
+ #### 2.12.16b systemSettings - Configuración y Estado del Sistema
134
+
135
+ `systemSettings` es un **singleton global** (no requiere instanciacion). Solo Android salvo indicacion.
136
+
137
+ ##### Pantalla y brillo
138
+
139
+ ```javascript
140
+ systemSettings.setBrightness(75); // 0-100 (se clampa)
141
+ let nBrillo = systemSettings.getBrightness(); // 0-100 (no 0-1)
142
+ systemSettings.setBrightnessMode("automatic"); // Brillo automático
143
+ systemSettings.setBrightnessMode("manual"); // Brillo manual
144
+ let sModoBrillo = systemSettings.getBrightnessMode(); // "manual" o "automatic"
145
+
146
+ // Color de la barra de estado (status bar)
147
+ let ventana = ui.getView(self);
148
+ ventana.setStatusBarColor("#00FF00"); // Color RRGGBB
149
+ ventana.setStatusBarColor(null); // Restaurar color por defecto
150
+ ```
151
+
152
+ ##### Red y conectividad
153
+
154
+ ```javascript
155
+ let bAvion = systemSettings.isAirplaneMode(); // true si modo avion activo
156
+ let bDatosMov = systemSettings.isMobileDataEnabled(); // Puede mentir en algunos dispositivos
157
+ let bHttp = systemSettings.isClearTextTrafficAllowed(); // true si HTTP sin cifrar esta permitido
158
+
159
+ // Hora de red (NTP)
160
+ let fecha = systemSettings.getNetworkTime();
161
+ // Con servidor NTP personalizado:
162
+ // let fecha = systemSettings.getNetworkTime({ ntpServer: "time.google.com" });
163
+ ui.showToast(fecha.toString());
164
+
165
+ // Proveedores de localización disponibles
166
+ let bLocalizacion = systemSettings.hasLocationFeature();
167
+ let bRedLoc = systemSettings.hasNetworkLocationFeature();
168
+ let bGpsLoc = systemSettings.hasGpsLocationFeature();
169
+ ```
170
+
171
+ ##### Batería y optimizaciones
172
+
173
+ ```javascript
174
+ // Comprobar si la app esta exenta de optimizaciones de bateria
175
+ let bExenta = systemSettings.isIgnoringBatteryOptimizations();
176
+
177
+ // Pedir al usuario que exima la app (muestra dialogo del sistema)
178
+ if (!systemSettings.isIgnoringBatteryOptimizations()) {
179
+ systemSettings.requestIgnoreBatteryOptimizations(true);
180
+ }
181
+
182
+ // Optimizaciones especificas de fabricante (Xiaomi, Huawei, etc.)
183
+ // No se puede consultar el estado, solo solicitar la exencion
184
+ systemSettings.requestIgnoreSpecialBatteryOptimizations();
185
+ ```
186
+
187
+ ##### Permisos en runtime
188
+
189
+ ```javascript
190
+ // Consultar permisos declarados/concedidos/no concedidos
191
+ let aTodos = systemSettings.getDeclaredPermissions(); // array de strings
192
+ let aConcedidos = systemSettings.getGrantedPermissions();
193
+ let aNoConcedidos= systemSettings.getNotGrantedPermissions();
194
+
195
+ // Comprobar un permiso concreto (nombre corto XOne o nombre completo Android)
196
+ let bCamara = systemSettings.isPermissionGranted("camera");
197
+ let bBateria= systemSettings.isPermissionGranted("android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS");
198
+
199
+ // Solicitar permisos en runtime
200
+ let future = systemSettings.requestPermissions({
201
+ requestMessage: "Por favor habilite estos permisos para usar la aplicación",
202
+ mandatory : false, // false = puede continuar sin concederlos
203
+ permissions : ["bluetooth"] // nombres cortos XOne
204
+ });
205
+ let bConcedidos = future.get(); // bloquea hasta respuesta del usuario
206
+
207
+ // Revocar permisos (Android >= 13)
208
+ systemSettings.revokePermissions("microphone", "camera", "phone");
209
+
210
+ // Permiso de almacenamiento externo completo (Android >= 11)
211
+ let futureStorage = systemSettings.requestExternalStoragePermission();
212
+ let bStorage = futureStorage.get();
213
+
214
+ // Permiso overlay (dibujar sobre otras apps): consultar antes de solicitar
215
+ let bOverlay = systemSettings.hasOverlayPermission();
216
+ if (!bOverlay) {
217
+ let futureOverlay = systemSettings.requestOverlayPermission();
218
+ bOverlay = futureOverlay.get();
219
+ }
220
+
221
+ // Permiso alarmas exactas
222
+ let futureAlarm = systemSettings.requestScheduleExactAlarmPermission();
223
+ let bAlarm = futureAlarm.get();
224
+
225
+ // Auto-revocacion de permisos (Android apaga permisos de apps sin uso)
226
+ let bAutoRevoke = systemSettings.isPermissionAutoRevokeEnabled();
227
+ if (bAutoRevoke) {
228
+ systemSettings.requestDisablePermissionAutoRevoke();
229
+ }
230
+
231
+ // Comprobar si tiene gestion completa de almacenamiento externo
232
+ let bManager = systemSettings.isExternalStorageManager();
233
+ let bManagerPath = systemSettings.isExternalStorageManager("/sdcard/");
234
+ ```
235
+
236
+ ##### Memoria y rendimiento
237
+
238
+ ```javascript
239
+ // Nivel de memoria actual del dispositivo
240
+ let sLevel = systemSettings.getMemoryLevel();
241
+ // Valores posibles:
242
+ // "background" -> Uso muy ligero, app prescindible
243
+ // "moderate" -> Uso moderado, app prescindible
244
+ // "ui_hidden" -> Uso ligero, limpiar algunos recursos
245
+ // "running_moderate" -> Uso moderado, app visible
246
+ // "running_low" -> Uso alto, app visible
247
+ // "running_critical" -> Uso muy alto, app visible
248
+ // "complete" -> Dispositivo casi sin memoria
249
+
250
+ // Patron comun: solo actuar en niveles criticos
251
+ try {
252
+ let sNivel = systemSettings.getMemoryLevel();
253
+ if (sNivel === "running_low" || sNivel === "running_critical" || sNivel === "complete") {
254
+ ui.showToast("El dispositivo se esta quedando sin memoria");
255
+ }
256
+ } catch(err) {
257
+ // Puede no estar disponible en todas las versiones
258
+ }
259
+
260
+ // Memoria de la JVM (en bytes)
261
+ let nMax = systemSettings.getMaxMemory();
262
+ let nFree = systemSettings.getFreeMemory();
263
+ let sMsg = "Max: " + Math.round(nMax / 1024 / 1024) + " MB"
264
+ + " | Libre: " + Math.round(nFree / 1024 / 1024) + " MB";
265
+
266
+ // RAM física del dispositivo (en bytes)
267
+ let nRamTotal = systemSettings.getTotalMemory(); // RAM física total instalada
268
+ let nRamLibre = systemSettings.getAvailableMemory(); // RAM física disponible ahora
269
+
270
+ // Espacio en disco (en bytes) — comprobar antes de descargas/exportaciones grandes
271
+ let nDiscoLibre = systemSettings.getInternalFreeSpace(); // libre en almacenamiento interno (app + BD)
272
+ let nDiscoTotal = systemSettings.getInternalTotalSpace(); // total del almacenamiento interno
273
+ let nExtLibre = systemSettings.getExternalFreeSpace(); // libre en almacenamiento externo (0 si no está montado)
274
+ let nExtTotal = systemSettings.getExternalTotalSpace(); // total del almacenamiento externo
275
+
276
+ let nMbLibres = Math.round(systemSettings.getInternalFreeSpace() / 1024 / 1024);
277
+ if (nMbLibres < 100) {
278
+ ui.showToast("Quedan solo " + nMbLibres + " MB libres en disco");
279
+ }
280
+
281
+ // Forzar garbage collector (solicitud, no garantiza ejecución inmediata)
282
+ systemSettings.garbageCollect();
283
+
284
+ // Limpiar cache de todas las apps (requiere permiso de sistema)
285
+ systemSettings.clearAllAppsCache();
286
+
287
+ // Borrar todos los datos de la app (equivale a "Borrar datos" en ajustes)
288
+ systemSettings.clearApplicationData();
289
+
290
+ // Limpiar caches internas del framework
291
+ systemSettings.clearJavascriptCache();
292
+ systemSettings.clearBitmapCache();
293
+
294
+ // Compactar los .dex cacheados del motor JS (optimización del arranque tras muchos scripts nuevos)
295
+ systemSettings.mergeJavascriptCache();
296
+ ```
297
+
298
+ ##### Información del dispositivo y hardware
299
+
300
+ ```javascript
301
+ // IDs de hardware
302
+ let ids = systemSettings.getHardwareIds();
303
+ // ids.deviceIdCount -> número de IDs de dispositivo
304
+ // ids.deviceId0, ids.deviceId1, ... -> IMEI u otros IDs
305
+ // ids.wifiMacAddress -> MAC WiFi (puede ser null)
306
+ // ids.androidId -> Android ID unico por instalacion
307
+
308
+ // Device ID propio del framework XOne
309
+ let sDeviceId = systemSettings.getDeviceId();
310
+ systemSettings.setDeviceId("nuevo_id"); // Solo para casos especiales
311
+
312
+ // Tiempo encendido del dispositivo
313
+ let uptime = systemSettings.getDeviceUptime();
314
+ // uptime.ms, uptime.days, uptime.hours, uptime.minutes
315
+
316
+ // Features del hardware disponibles (array de strings tipo "android.hardware.camera")
317
+ let aFeatures = systemSettings.getFeatures();
318
+
319
+ // Teclado fisico
320
+ let bTeclado = systemSettings.hasHardwareKeyboard(); // Tiene teclado fisico
321
+ let bQwerty = systemSettings.hasQwertyKeyboard(); // Es estilo QWERTY
322
+ let b12Teclas = systemSettings.hasTwelveKeysKeyboard();// Es estilo 12 teclas
323
+ // Devuelven true si tiene el hardware, independientemente de si usa el virtual
324
+
325
+ // Arquitectura del proceso
326
+ let b64Bit = systemSettings.is64Bit(); // true en Android M+ con proceso 64 bits
327
+
328
+ // Nombres de la app
329
+ let sPackage = systemSettings.getPackageName(); // ej: "com.empresa.app"
330
+ let sSharedUserId= systemSettings.getSharedUserId();
331
+ ```
332
+
333
+ ##### Versiones de SO y de la app
334
+
335
+ ```javascript
336
+ let nApiLevel = systemSettings.getApiLevel(); // API level del SO (Build.VERSION.SDK_INT)
337
+ let sAndroidVer = systemSettings.getAndroidVersion(); // Versión Android (Build.VERSION.RELEASE, ej: "14")
338
+ let nTargetSdk = systemSettings.getTargetSdkVersion(); // targetSdk declarado por el APK
339
+ let nMinSdk = systemSettings.getMinSdkVersion(); // minSdk del APK (Android >= 7 / API 24, lanza si menor)
340
+ let nVersionCode = systemSettings.getVersionCode(); // versionCode entero del APK instalado
341
+ ```
342
+
343
+ ##### Proceso del sistema
344
+
345
+ ```javascript
346
+ let nPid = systemSettings.getPid(); // ID del proceso actual (Process.myPid)
347
+ let nUid = systemSettings.getUid(); // UID Linux del proceso (Process.myUid)
348
+ let nTid = systemSettings.getTid(); // ID del hilo actual (Process.myTid)
349
+ let nPriority = systemSettings.getThreadPriority(); // Prioridad nice del hilo actual
350
+
351
+ // Matar un proceso por PID (uso avanzado: tareas de mantenimiento, reinicios programáticos)
352
+ systemSettings.killProcess(nPid);
353
+ ```
354
+
355
+ ##### Seguridad del dispositivo
356
+
357
+ ```javascript
358
+ // Dispositivo con PIN/patron/password de bloqueo configurado.
359
+ // Si la app es Device Owner/Profile Owner consulta DevicePolicyManager;
360
+ // si no, usa KeyguardManager.isDeviceSecure().
361
+ let bSecured = systemSettings.isPasswordSecured();
362
+ ```
363
+
364
+ ##### Rutas del sistema de ficheros
365
+
366
+ ```javascript
367
+ let sExternal = systemSettings.getExternalStoragePath();
368
+ let sGaleria = systemSettings.getGalleryPath();
369
+ let sDocumentos = systemSettings.getDocumentsPath();
370
+ let sMusica = systemSettings.getMusicPath();
371
+ let sDescargas = systemSettings.getDownloadsPath();
372
+ let sCapturas = systemSettings.getScreenshotsPath();
373
+ let sTonos = systemSettings.getRingtonesPath();
374
+ let sAlarmas = systemSettings.getAlarmsPath();
375
+ ```
376
+
377
+ ##### Wallpaper
378
+
379
+ ```javascript
380
+ systemSettings.setWallpaper("wallpaper.png"); // Fichero en carpeta de la app
381
+ systemSettings.getWallpaper(appData.getAppPath() + "files/wallpaper_guardado.png");
382
+ // getWallpaper guarda el wallpaper actual en la ruta indicada
383
+ ```
384
+
385
+ ##### Acceso directo en pantalla de inicio (Pin Shortcut)
386
+
387
+ ```javascript
388
+ systemSettings.addPinShortcut({
389
+ id : 1000,
390
+ label: "Nombre del acceso directo",
391
+ icon : "icono.png", // Fichero PNG en carpeta de la app
392
+ extras: { // Datos extra que recibira la app al pulsar
393
+ parametro1: "valor1",
394
+ parametro2: "valor2"
395
+ }
396
+ });
397
+ ```
398
+
399
+ ##### Estado de la app y restricciones
400
+
401
+ ```javascript
402
+ let bRestringida = systemSettings.isBackgroundRestricted(); // Ejecución en background restringida
403
+ let bDatosRestr = systemSettings.isBackgroundDataDisabled(); // Datos en background restringidos
404
+ let bInactiva = systemSettings.isAppInactive(); // App marcada como inactiva por el SO
405
+ let sRestriction = systemSettings.getAppRestrictionStatus(); // Estado de restriccion de la app
406
+ systemSettings.showAppSettingsWindow(); // Abre los ajustes de la app en el sistema (devuelve el propio systemSettings, encadenable)
407
+
408
+ // Actualizacion desde Google Play
409
+ // Devuelve true si hay actualizacion pendiente (y lanza el dialogo de actualizacion)
410
+ // Detener el script si devuelve true para no continuar con la app desactualizada
411
+ // Parametro opcional: "immediate" (obligatoria) o "flexible" (se puede posponer)
412
+ let bUpdate = systemSettings.checkMarketUpdate();
413
+ // let bUpdate = systemSettings.checkMarketUpdate("flexible");
414
+ if (bUpdate) {
415
+ return; // Detener ejecución hasta que el usuario actualice
416
+ }
417
+ ```
418
+
419
+ ##### Perfil de trabajo y MDM
420
+
421
+ ```javascript
422
+ let bWorkProfile = systemSettings.isRunningInWorkProfile(); // MDM con perfil de trabajo XOne
423
+ let bDeviceOwner = systemSettings.isRunningWithDeviceOwner(); // MDM en modo kiosko XOne
424
+ let bHayMdm = systemSettings.isRunningInMdm(); // Cualquier MDM activo
425
+ let bIntune = systemSettings.isRunningInMdm("com.microsoft.windowsintune.companyportal");
426
+ let bXoneMdm = systemSettings.isRunningInMdm("com.xone.live.services");
427
+ // isRunningInMdm acepta el package name del MDM a comprobar
428
+ ```
429
+
430
+ ##### XOneLive: widgets y configuración
431
+
432
+ ```javascript
433
+ // Widgets de la barra de notificaciones
434
+ systemSettings.enableReplicatorWidget();
435
+ systemSettings.disableReplicatorWidget();
436
+ systemSettings.enableLiveWidget();
437
+ systemSettings.disableLiveWidget();
438
+
439
+ // Configuración actual de XOneLive (objeto JS con todos los parametros)
440
+ let jsConfig = systemSettings.getLiveConfig();
441
+ ```
442
+
443
+ ##### Depuracion e integridad
444
+
445
+ ```javascript
446
+ // Integridad del dispositivo (detecta root, emuladores, manipulacion)
447
+ let bIntegro = systemSettings.isDeviceIntegrityOk();
448
+
449
+ // Token de integridad de Google Play (para verificar en servidor)
450
+ let sToken = systemSettings.getIntegrityToken("nonce_unico_por_peticion");
451
+
452
+ // Depurador conectado (util para detectar manipulacion en produccion)
453
+ let bDebugger = systemSettings.isDebuggerConnected();
454
+
455
+ // Activar/desactivar modo debug del framework en tiempo de ejecución
456
+ let bDebugMode = !appData.isDebugMode();
457
+ appData.setDebugMode(bDebugMode);
458
+ ```
459
+
460
+ ##### Accesibilidad
461
+
462
+ ```javascript
463
+ let bAccesibilidad = systemSettings.isAccessibilityEnabled();
464
+ let bTalkBack = systemSettings.isTouchExplorationEnabled(); // TalkBack activo
465
+ let bAutoStart = systemSettings.isAutoStartEnabled(); // App en autoarranque
466
+ ```
467
+
468
+ ##### Ajustes del sistema (propiedades directas)
469
+
470
+ ```javascript
471
+ // AUTO_TIME: hora automática de red
472
+ // Solo se puede escribir en Android < 4.2 (SDK < 17). En versiones superiores es de solo lectura.
473
+ let nSdkVersion = appData.getGlobalMacro("##DEVICE_OSSDKCODE##");
474
+ if (nSdkVersion < 17) {
475
+ systemSettings.AUTO_TIME = 1; // Forzar hora automática
476
+ } else {
477
+ let nAutoTime = systemSettings.AUTO_TIME; // Solo lectura
478
+ // Equivalente: systemSettings.isNetworkAutoTimeEnabled()
479
+ }
480
+ ```
481
+
482
+ ##### Certificados (solo Android < 11)
483
+
484
+ ```javascript
485
+ systemSettings.installCertificate({
486
+ name: "Nombre descriptivo del certificado",
487
+ file: "certificado.pem" // Fichero en carpeta de la app
488
+ });
489
+ ```
490
+
491
+ ##### Intune (Microsoft Intune MDM)
492
+
493
+ ```javascript
494
+ let bIntune = systemSettings.isIntuneCompilation(); // App compilada con soporte Intune
495
+ let sPinRequired = systemSettings.isIntunePinRequired(); // PIN de Intune requerido
496
+ let sIntuneId = systemSettings.getIntuneId(); // ID del dispositivo en Intune
497
+ let bOutdated = systemSettings.isIntuneAgentOutdated(); // Agente Intune desactualizado
498
+ let sMsg = systemSettings.getIntuneAgentOutdatedMessage(); // Mensaje de actualizacion
499
+ ```
500
+
501
+ ##### Firebase Analytics
502
+
503
+ Sólo funciona en flavors compilados con Firebase Analytics. En builds sin Analytics ambos métodos devuelven `false` y registran un aviso en log.
504
+
505
+ ```javascript
506
+ // Activar / desactivar Analytics en runtime (cumplir RGPD/opt-out del usuario)
507
+ systemSettings.setAnalyticsEnabled(true);
508
+ systemSettings.setAnalyticsEnabled(false);
509
+
510
+ // Registrar evento personalizado:
511
+ // - La clave "eventTag" del objeto es el nombre del evento Firebase
512
+ // - El resto de claves se envían como parámetros del evento
513
+ systemSettings.logAnalyticsEvent({
514
+ eventTag : "purchase_completed",
515
+ sku : "item_001",
516
+ amount : 9.99,
517
+ currency : "EUR"
518
+ });
519
+ ```
520
+
521
+ #### 2.12.17 Tabla Resumen de Objetos Complementarios
522
+
523
+ | Objeto | Creación | Uso Principal |
524
+ |--------|----------|---------------|
525
+ | `FileManager` | `new FileManager()` | Descarga, lectura, escritura, compresión de archivos |
526
+ | `XOnePDF` | `new XOnePDF()` | Generación de documentos PDF |
527
+ | `XOnePrinter` | `new XOnePrinter()` | Impresion en impresoras Bluetooth |
528
+ | `BarcodeGenerator` | `new BarcodeGenerator()` | Generación de códigos de barras/QR |
529
+ | `XOneNFC` | `new XOneNFC()` | NFC y DNI electrónico |
530
+ | `XOneOCR` | `new XOneOCR()` | Reconocimiento optico de caracteres |
531
+ | `BluetoothSerialPort` | Singleton `bluetoothSerial` | Puerto serie Bluetooth |
532
+ | `WifiManager` | `new WifiManager()` | Gestion de redes WiFi |
533
+ | `Animation` | `new Animation()` | Animaciones de controles UI |
534
+ | `deviceInfo` | Singleton global | Información del dispositivo (batería, red, señal móvil) |
535
+ | `GpsTools` | `new GpsTools()` | Distancias, geocoding, poligonos |
536
+ | `OAuth2` | `new OAuth2()` | Autenticación OAuth 2.0 |
537
+ | `WebSocket` | `new WebSocket(config)` | Comunicación en tiempo real |
538
+ | `fingerprintManager` | Singleton global | Huella dactilar (legacy) |
539
+ | `ImageDrawing` | `new ImageDrawing()` | Edición básica de imágenes |
540
+ | `AndroidIntent` | `new AndroidIntent()` | Intents de Android |
541
+ | `systemSettings` | Singleton global | Brillo, permisos, memoria, MDM, batería, rutas, Intune |
542
+ | `IniParser` | `new IniParser()` | Archivos de configuración .ini |
543
+ | `DOMParser` | `new DOMParser()` | Parseo de XML |
544
+