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.
- package/README.md +167 -0
- package/dist/agent/authEnDisco.js +56 -0
- package/dist/agent/authEnDisco.js.map +1 -0
- package/dist/agent/configEnDisco.js +109 -0
- package/dist/agent/configEnDisco.js.map +1 -0
- package/dist/agent/crearProyecto.js +34 -0
- package/dist/agent/crearProyecto.js.map +1 -0
- package/dist/agent/entorno.js +124 -0
- package/dist/agent/entorno.js.map +1 -0
- package/dist/agent/guionizado.js +53 -0
- package/dist/agent/guionizado.js.map +1 -0
- package/dist/agent/instantanea.js +129 -0
- package/dist/agent/instantanea.js.map +1 -0
- package/dist/agent/interrupts.js +83 -0
- package/dist/agent/interrupts.js.map +1 -0
- package/dist/agent/mensajes.js +24 -0
- package/dist/agent/mensajes.js.map +1 -0
- package/dist/agent/modelos.js +42 -0
- package/dist/agent/modelos.js.map +1 -0
- package/dist/agent/normalizar.js +20 -0
- package/dist/agent/normalizar.js.map +1 -0
- package/dist/agent/perfiles.js +103 -0
- package/dist/agent/perfiles.js.map +1 -0
- package/dist/agent/proyecto.js +107 -0
- package/dist/agent/proyecto.js.map +1 -0
- package/dist/agent/puente.js +142 -0
- package/dist/agent/puente.js.map +1 -0
- package/dist/agent/resumenDeTool.js +48 -0
- package/dist/agent/resumenDeTool.js.map +1 -0
- package/dist/agent/skills.js +65 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/textoDeTool.js +113 -0
- package/dist/agent/textoDeTool.js.map +1 -0
- package/dist/agent/turnoReal.js +173 -0
- package/dist/agent/turnoReal.js.map +1 -0
- package/dist/agent/verificador.js +65 -0
- package/dist/agent/verificador.js.map +1 -0
- package/dist/agent/xoneAgent.js +106 -0
- package/dist/agent/xoneAgent.js.map +1 -0
- package/dist/bin.js +9 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/aprobar.js +82 -0
- package/dist/cli/aprobar.js.map +1 -0
- package/dist/cli/config.js +133 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/consola.js +346 -0
- package/dist/cli/consola.js.map +1 -0
- package/dist/cli/describe.js +53 -0
- package/dist/cli/describe.js.map +1 -0
- package/dist/cli/doctor.js +45 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/main.js +520 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/markdown.js +90 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/run.js +164 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/spinner.js +89 -0
- package/dist/cli/spinner.js.map +1 -0
- package/dist/cli/stdio.js +193 -0
- package/dist/cli/stdio.js.map +1 -0
- package/dist/cli/tema.js +40 -0
- package/dist/cli/tema.js.map +1 -0
- package/dist/cli/verify.js +62 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/core/bitacora.js +30 -0
- package/dist/core/bitacora.js.map +1 -0
- package/dist/core/config.js +236 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/contextos.js +56 -0
- package/dist/core/contextos.js.map +1 -0
- package/dist/core/deps.js +51 -0
- package/dist/core/deps.js.map +1 -0
- package/dist/core/diff.js +79 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/esqueleto.js +366 -0
- package/dist/core/esqueleto.js.map +1 -0
- package/dist/core/events.js +2 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/modelos.js +85 -0
- package/dist/core/modelos.js.map +1 -0
- package/dist/core/notify.js +106 -0
- package/dist/core/notify.js.map +1 -0
- package/dist/core/ports.js +114 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/turno.js +127 -0
- package/dist/core/turno.js.map +1 -0
- package/dist/vendor/hitl.js +103 -0
- package/dist/vendor/hitl.js.map +1 -0
- package/dist/vendor/skillLoaders/catalog.js +74 -0
- package/dist/vendor/skillLoaders/catalog.js.map +1 -0
- package/dist/vendor/tokenTracking.js +58 -0
- package/dist/vendor/tokenTracking.js.map +1 -0
- package/package.json +41 -0
- package/skills/xone-debugging/SKILL.md +52 -0
- package/skills/xone-debugging/references/faq.md +561 -0
- package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
- package/skills/xone-development/SKILL.md +105 -0
- package/skills/xone-development/references/anti-patrones.md +94 -0
- package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
- package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
- package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
- package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
- package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
- package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
- package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
- package/skills/xone-development/references/datos/appdata.md +611 -0
- package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
- package/skills/xone-development/references/datos/http.md +366 -0
- package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
- package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
- package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
- package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
- package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
- package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
- package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
- package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
- package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
- package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
- package/skills/xone-development/references/indice-completo.md +77 -0
- package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
- package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
- package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
- package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
- package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
- package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
- package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
- package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
- package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
- package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
- package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
- package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
- package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
- package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
- package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
- package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
- package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
- package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
- package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
- package/skills/xone-development/references/tipos-de-prop.md +28 -0
- package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
- package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
- package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
- package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
- package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
- package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
- package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
- package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
- package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
- package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
- package/skills/xone-development/references/xml-ui/mapas.md +685 -0
- package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
- package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
- package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
- package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
- package/skills/xone-plan-builder/SKILL.md +183 -0
- package/skills/xone-plan-builder/agents/openai.yaml +5 -0
- package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
- package/skills/xone-project-generator/SKILL.md +111 -0
- package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
- package/skills/xone-project-generator/references/colecciones-base.md +16 -0
- package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
- package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
- package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
- package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
- package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
- package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
- package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
- package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
- package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
- package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
- package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
- package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
- package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
- package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
- package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
- package/skills/xone-review/SKILL.md +189 -0
- package/skills/xone-spec-builder/SKILL.md +235 -0
- package/skills/xone-spec-builder/agents/openai.yaml +5 -0
- package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
- package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
- package/skills/xone-spec-builder/references/PLAN-FORMAT.md +120 -0
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
# XOne JavaScript — Objetos creables (FileManager a Animation)
|
|
2
|
+
|
|
3
|
+
> Fuente: `xone/v2/xone-help-docs/topics/06-javascript-runtime-objects.md` L301–821. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
|
|
4
|
+
|
|
5
|
+
Contenido: §5.1 FileManager · §5.2 GpsTools · §5.3 SqlManager · §5.4 IniParser · §5.5 EncodingUtils · §5.6 AndroidIntent · §5.7 DeviceManager · §5.8 WifiManager · §5.9 BluetoothSerialPort · §5.10 OAuth2 · §5.11 Worker · §5.12 Animation
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 5. Objetos Creables con `new` o `createObject()`
|
|
10
|
+
|
|
11
|
+
XOne expone una serie de objetos que se instancian con `new NombreClase()` (forma preferida e idiomatica en JavaScript) o, alternativamente, con `appData.createObject("NombreClase")`. Ambas formas son equivalentes — `createObject` hace match **case-insensitive** internamente, pero los ejemplos usan PascalCase canonico.
|
|
12
|
+
|
|
13
|
+
```js
|
|
14
|
+
// Forma preferida — new
|
|
15
|
+
var fm = new FileManager();
|
|
16
|
+
|
|
17
|
+
// Alternativa equivalente
|
|
18
|
+
var fm = appData.createObject("FileManager");
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
> **IMPORTANTE:** Los objetos `crypto`, `clipboard`, `deviceInfo`, `systemSettings`, `biometricsManager`, `fingerprintManager`, `bleManager`, `sensorManager`, `packageManager`, `paymentManager`, `pushMessage`, `appBroadcastManager`, `$http` y otros **NO** son creables — son **singletons globales** y se acceden directamente por su nombre. Ver §6.
|
|
22
|
+
|
|
23
|
+
Además de estos objetos del runtime, **todas las colecciones de la aplicación** son creables con `new`: `new NombreColeccion()` crea un objeto nuevo de esa colección, con un parámetro opcional de valores iniciales. Es el patrón preferido para crear dataobjects:
|
|
24
|
+
|
|
25
|
+
```js
|
|
26
|
+
var obj = new Usuarios({ ID: 5, MAP_TITULO: "El titulo" });
|
|
27
|
+
// (legacy) Equivale a:
|
|
28
|
+
// var obj = appData.getCollection("Usuarios").createObject();
|
|
29
|
+
// obj.ID = 5; obj.MAP_TITULO = "El titulo";
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Excepciones donde se mantiene el patrón clásico: contents anidados (`self.Contents("X").createObject()` vincula la línea al objeto padre; el constructor no) y nombres de colección dinámicos (`appData.getCollection(variable).createObject()`).
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
### 5.1 FileManager
|
|
37
|
+
|
|
38
|
+
Gestión completa de ficheros y directorios en el dispositivo. Convención: las funciones que retornan `int` siguen estilo C → **`0` = OK / existe**, **`-1` = error / no existe**.
|
|
39
|
+
|
|
40
|
+
| Método | Descripción |
|
|
41
|
+
|---|---|
|
|
42
|
+
| `readFile(path, [encoding])` → `String` | Lee texto del fichero (UTF-8 por defecto). |
|
|
43
|
+
| `saveFile(path, content, [append], [encoding])` → `boolean` | Escribe / añade contenido (acepta texto o `byte[]`). |
|
|
44
|
+
| `fileExists(path)` → `int` | **`0` si existe**, `-1` si no. |
|
|
45
|
+
| `directoryExists(path)` → `int` | **`0` si existe**, `-1` si no. |
|
|
46
|
+
| `getFileInfo(path)` → `Map` | `{size, creationDate, modificationDate, isHidden, canRead, canWrite, canExecute}`. |
|
|
47
|
+
| `getLastModifiedDate(path)` → `Date` | Fecha de última modificación. |
|
|
48
|
+
| `getSize(path)` → `long` | Tamaño del fichero o del árbol (si es directorio). |
|
|
49
|
+
| `isDirectoryEmpty(path)` → `boolean` | `true` si la carpeta no tiene contenido. |
|
|
50
|
+
| `listFiles(path \| {source, fileTypes, orderBy, dateFrom, dateTo})` → `Object[]` | Lista paths de ficheros con filtros opcionales. |
|
|
51
|
+
| `listDirectories(path)` → `Object[]` | Lista subdirectorios. |
|
|
52
|
+
| `createDirectory(path)` → `int` | `0` OK, `1` ya existe (dir), `2` existe como fichero, `-1` error. |
|
|
53
|
+
| `deleteDirectory(path)` → `int` | Borrado recursivo. |
|
|
54
|
+
| `copy(src, dst)` / `move(src, dst)` / `rename(src, dst)` → `int` | Operaciones de fichero. |
|
|
55
|
+
| `delete(path, ...)` → `int` | Borra uno o varios ficheros. |
|
|
56
|
+
| `zip(src, [dst])` → `int` | Comprime fichero o carpeta. |
|
|
57
|
+
| `zipAll(target \| {targetZip, password, files}, ...)` → `int` | Zip de múltiples ficheros (con password opcional). |
|
|
58
|
+
| `unzip(src, [dstDir], [password])` → `int` | Descomprime ZIP (con password si lo tiene). |
|
|
59
|
+
| `toBase64(path)` → `String` | Codifica fichero a Base64. |
|
|
60
|
+
| `toFile(base64, path)` → `int` | Decodifica Base64 a fichero. |
|
|
61
|
+
| `getChecksum(path, [type], [urlSafe])` → `String` | Tipos: `crc32` (default), `adler32`, `sha1`, `sha2`, `sha256`, `sha512`. |
|
|
62
|
+
| `download(url, dest) \| download({source, target, method, headers, parameters, onSuccess, onProgress, onError, ...})` → `int \| Future` | Síncrono (legacy) o asíncrono con Future. |
|
|
63
|
+
| `uploadFile({url, file, headers, parameters, onSuccess, onProgress, onError, ...})` → `Object` | Sube fichero multipart. |
|
|
64
|
+
| `downloadDatabase(url)` → `int` | Reemplaza atómicamente la BD por la remota. |
|
|
65
|
+
| `deleteDatabase(name)` → `int` | Borra `.db`, `.db-wal` y `.db-shm`. |
|
|
66
|
+
| `openFile(path)` → `int` | Abre con la app del sistema (ACTION_VIEW). |
|
|
67
|
+
| `getRootDirectory()` → `String` | `/data/data/<package>/`. |
|
|
68
|
+
| `getCacheDirectory()` → `String` | `/data/data/<package>/cache`. |
|
|
69
|
+
| `getCodeCacheDirectory()` → `String` | `/data/data/<package>/code_cache`. |
|
|
70
|
+
| `clearCache({maxSize?, olderThan?})` | Limpia caché por tamaño o por fecha. |
|
|
71
|
+
| `addOnDirectoryChangedListener(path, cb)` / `removeOnDirectoryChangedListener(path)` | Watcher de cambios (`cb(sEvent, sPath)`). |
|
|
72
|
+
|
|
73
|
+
Catálogo completo con ejemplos por área (lectura, listado, compresión, descarga/subida, watchers, etc.) en 03d-js-createobject.md §8.1.
|
|
74
|
+
|
|
75
|
+
```js
|
|
76
|
+
var fm = new FileManager();
|
|
77
|
+
var ruta = appData.getFilesPath() + "/backup.txt";
|
|
78
|
+
if (fm.fileExists(ruta) === 0) {
|
|
79
|
+
var contenido = fm.readFile(ruta);
|
|
80
|
+
appData.writeConsoleString(contenido);
|
|
81
|
+
} else {
|
|
82
|
+
fm.saveFile(ruta, "datos iniciales");
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
### 5.2 GpsTools
|
|
89
|
+
|
|
90
|
+
Utilidades de calculo y gestion GPS avanzadas.
|
|
91
|
+
|
|
92
|
+
| Método | Descripción |
|
|
93
|
+
|---|---|
|
|
94
|
+
| `startGps(params)` → `boolean` | Inicia la escucha GPS con parámetros de precisión. |
|
|
95
|
+
| `stopGps(...)` → `boolean` | Detiene la escucha GPS. |
|
|
96
|
+
| `getLastKnownLocation()` → `Map` | Posición actual como mapa `{lat, lng, alt, accuracy, ...}`. |
|
|
97
|
+
| `distanceBetweenCoordinates(lat1, lng1, lat2, lng2)` → `double` | Distancia en metros entre dos puntos (4 args posicionales). |
|
|
98
|
+
| `distanceTo([{latitude, longitude}, {latitude, longitude}])` → `double` | Distancia en metros entre dos puntos (variante con un array de 2 coordenadas; equivalente a `distanceBetweenCoordinates`). |
|
|
99
|
+
| `bearingBetweenCoordinates(lat1, lng1, lat2, lng2)` → `double` | Rumbo (ángulo) entre dos puntos. |
|
|
100
|
+
| `simplifyPolyline(points, tolerance)` → `Object[]` | Simplifica una polilinia (algoritmo Douglas-Peucker). |
|
|
101
|
+
| `getArea(polygon)` → `double` | Calcula el área de un poligono (en m2). |
|
|
102
|
+
| `encode(points)` → `String` | Codifica puntos en formato Polyline encoded (Google). |
|
|
103
|
+
| `decode(polyline)` → `Object[]` | Decodifica un Polyline encoded a array de puntos. |
|
|
104
|
+
| `containsLocation(point, polygon)` → `boolean` | Comprueba si un punto esta dentro de un poligono. |
|
|
105
|
+
| `getAddressFromPosition({latitude, longitude})` → `Map` | Geocoding inverso. Toma **1 NativeObject** o un string `"lat,lng"`, NO dos argumentos posicionales. |
|
|
106
|
+
| `getPositionFromAddress(address)` → `Map` | Geocoding directo (dirección a coordenadas). |
|
|
107
|
+
| `launchMaps(...)` | Lanza la app de mapas del sistema. |
|
|
108
|
+
| `addExifLocationToFile({file, latitude, longitude, date?})` | Anade metadatos EXIF GPS a una imagen. Toma **1 NativeObject**, no `(file, lat, lng)`. |
|
|
109
|
+
|
|
110
|
+
```js
|
|
111
|
+
var gps = new GpsTools();
|
|
112
|
+
var dist = gps.distanceBetweenCoordinates(40.416775, -3.703790, 40.453191, -3.688344);
|
|
113
|
+
appData.writeConsoleString("Distancia: " + Math.round(dist) + " m");
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
### 5.3 SqlManager
|
|
119
|
+
|
|
120
|
+
Acceso a bases de datos SQLite a bajo nivel, para operaciones que la API de colecciones no cubre.
|
|
121
|
+
|
|
122
|
+
**Importante**: la mayoría de métodos toman **un único `NativeObject` de configuración** (no argumentos posicionales). Las claves son las que se indican en la columna "Firma".
|
|
123
|
+
|
|
124
|
+
| Método | Firma |
|
|
125
|
+
|---|---|
|
|
126
|
+
| `openDatabase({databasePath, enableWal?, readOnly?, createIfNeeded?, noLocalizedCollators?, useExistingConnection?, password?, onDatabaseCorrupted?})` | Abre la BD SQLite. **No** acepta `(path)` posicional. |
|
|
127
|
+
| `close()` | Cierra la base de datos. |
|
|
128
|
+
| `isOpen()` → `boolean` | `true` si la conexión esta abierta. |
|
|
129
|
+
| `doRawQuery(sql, [args])` → `Cursor` | Ejecuta una sentencia SQL (sí acepta argumentos posicionales: SQL + varargs). |
|
|
130
|
+
| `doBatchRawQueries(sqls)` / `doBatchParseSqls(sqls)` | Ejecución en lote. |
|
|
131
|
+
| `insert({tableName, fields})` → `long` | Inserta una fila. Devuelve el `rowid`. `fields` es un objeto `{col1: val1, col2: val2}`. |
|
|
132
|
+
| `update({tableName, fields, whereClause?, whereArguments?})` → `long` | Actualiza filas. |
|
|
133
|
+
| `delete({tableName, whereClause?, whereArguments?})` → `long` | Borra filas. |
|
|
134
|
+
| `getVersion()` / `setVersion(n)` | PRAGMA user_version. |
|
|
135
|
+
| `isReadOnly()` / `isInTransaction()` / `isDatabaseIntegrityOk()` → `boolean` | Estado de la BD. |
|
|
136
|
+
| `getAttachedDbs()` → `Object[]` | Lista de BDs adjuntadas (ATTACH). |
|
|
137
|
+
| `setLocale(locale)` / `setMaxSqlCacheSize(n)` / `setForeignKeyConstraintsEnabled(bool)` | Configuración. |
|
|
138
|
+
| `enableWriteAheadLogging()` / `disableWriteAheadLogging()` / `isWriteAheadLoggingEnabled()` / `doWalCheckpoint()` | Gestión del modo WAL. |
|
|
139
|
+
| `doVacuum()` → `boolean` | Ejecuta `VACUUM` para compactar la BD. |
|
|
140
|
+
| `dropIndex(name)` / `dropAllIndexes()` | Borrado de índices. |
|
|
141
|
+
|
|
142
|
+
**`Cursor`** expone: `getCount()`, `moveToFirst()`/`moveToNext()`/`moveToPrevious()`/`moveToLast()`/`moveToPosition(n)`, `getColumnNames()`, `getString(colName)`, `getInteger(colName)`, `getLong(colName)`, `getShort(colName)`, `getFloat(colName)`, `getDouble(colName)`, `getBlob(colName)`, `close()`.
|
|
143
|
+
|
|
144
|
+
> **AVISO**: los getters reciben el **nombre de columna como String**, NO el índice numérico. Y el método entero se llama `getInteger`, NO `getInt` (que es el nombre que usa la API Android `Cursor`).
|
|
145
|
+
|
|
146
|
+
```js
|
|
147
|
+
var db = new SqlManager();
|
|
148
|
+
// Apertura: SIEMPRE un objeto con `databasePath` (NO un string posicional)
|
|
149
|
+
db.openDatabase({
|
|
150
|
+
databasePath : appData.getFilesPath() + "/cache.db",
|
|
151
|
+
createIfNeeded: true,
|
|
152
|
+
enableWal : true
|
|
153
|
+
});
|
|
154
|
+
try {
|
|
155
|
+
var cursor = db.doRawQuery("SELECT id, nombre FROM articulos WHERE activo = ?", 1);
|
|
156
|
+
if (cursor.moveToFirst()) {
|
|
157
|
+
do {
|
|
158
|
+
appData.writeConsoleString(cursor.getInteger("id") + ": " + cursor.getString("nombre"));
|
|
159
|
+
} while (cursor.moveToNext());
|
|
160
|
+
}
|
|
161
|
+
cursor.close();
|
|
162
|
+
|
|
163
|
+
// Insert / update / delete: NativeObject con `tableName` + `fields` + `whereClause` opcional
|
|
164
|
+
var rowid = db.insert({
|
|
165
|
+
tableName: "articulos",
|
|
166
|
+
fields : { nombre: "Nuevo", activo: 1 }
|
|
167
|
+
});
|
|
168
|
+
db.update({
|
|
169
|
+
tableName : "articulos",
|
|
170
|
+
fields : { activo: 0 },
|
|
171
|
+
whereClause : "id = ?",
|
|
172
|
+
whereArguments: [rowid]
|
|
173
|
+
});
|
|
174
|
+
db.delete({
|
|
175
|
+
tableName : "articulos",
|
|
176
|
+
whereClause : "id = ?",
|
|
177
|
+
whereArguments: [rowid]
|
|
178
|
+
});
|
|
179
|
+
} finally {
|
|
180
|
+
db.close();
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
### 5.4 IniParser
|
|
187
|
+
|
|
188
|
+
Lectura y escritura de ficheros de configuración en formato INI.
|
|
189
|
+
|
|
190
|
+
| Método | Descripción |
|
|
191
|
+
|---|---|
|
|
192
|
+
| `parseFromString(text)` | Parsea contenido INI desde un String. |
|
|
193
|
+
| `parseFromFile(path)` | Parsea desde un fichero. |
|
|
194
|
+
| `serialize()` → `String` | Vuelca el contenido a String INI. |
|
|
195
|
+
| `save(path)` | Guarda el contenido en un fichero. |
|
|
196
|
+
| `getValue(key)` → `String` | Lee el valor de una clave (sin sección). |
|
|
197
|
+
| `setValue(key, value)` | Asigna una clave. |
|
|
198
|
+
| `getValueBySection(section, key)` → `String` | Lee el valor de una clave dentro de una sección. |
|
|
199
|
+
|
|
200
|
+
```js
|
|
201
|
+
var ini = new IniParser();
|
|
202
|
+
ini.parseFromFile(appData.getFilesPath() + "/config.ini");
|
|
203
|
+
var servidor = ini.getValueBySection("Conexión", "servidor");
|
|
204
|
+
var puerto = ini.getValueBySection("Conexión", "puerto");
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
### 5.5 EncodingUtils
|
|
210
|
+
|
|
211
|
+
Codificación y decodificacion Base64 y otros formatos.
|
|
212
|
+
|
|
213
|
+
| Método | Descripción |
|
|
214
|
+
|---|---|
|
|
215
|
+
| `toBase64(data, [opts])` → `String` | Codifica datos a Base64. |
|
|
216
|
+
| `fromBase64(text, [opts])` → `String` | Decodifica Base64 a datos. |
|
|
217
|
+
|
|
218
|
+
```js
|
|
219
|
+
var enc = new EncodingUtils();
|
|
220
|
+
var codificado = enc.toBase64("usuario:password");
|
|
221
|
+
// resultado: "dXN1YXJpbzpwYXNzd29yZA=="
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
> Para hashing (MD5, SHA, etc.) usar el singleton global `crypto`. Ver §6.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
### 5.6 AndroidIntent
|
|
229
|
+
|
|
230
|
+
Wrapper sobre `android.content.Intent` para componer y lanzar intents desde JS. La mayoría de setters devuelven la propia instancia (encadenable); los lanzadores (`startActivity`, `startService`, broadcasts) devuelven `int` (siempre 0).
|
|
231
|
+
|
|
232
|
+
| Método | Parámetros | Retorno | Descripción |
|
|
233
|
+
|---|---|---|---|
|
|
234
|
+
| `setPackage(packageName)` | 1 String | `AndroidIntent` | Fija el paquete destino. |
|
|
235
|
+
| `setClassName(packageName, className)` | 2 Strings | `AndroidIntent` | Fija el componente destino (FQDN). |
|
|
236
|
+
| `setAction(action)` o `setAction(className, fieldName)` | 1 o 2 Strings | `AndroidIntent` | Fija acción. Con 2 args resuelve por reflexión el valor de la constante estática `className.fieldName`. |
|
|
237
|
+
| `setData(uriString)` | 1 String | `AndroidIntent` | Fija URI mediante `Uri.parse`. |
|
|
238
|
+
| `setDataFromFile(filePath)` | 1 String | `AndroidIntent` | Resuelve `filePath` dentro de la app y genera un FileProvider URI. |
|
|
239
|
+
| `setType(mimeType)` | 1 String | `AndroidIntent` | Fija el tipo MIME. |
|
|
240
|
+
| `setDataAndType(uriOrFile, mimeType)` | 2 Strings | `AndroidIntent` | Si el path existe como fichero usa FileProvider; si no, `Uri.parse`. |
|
|
241
|
+
| `addCategory(category)` o `addCategory(className, fieldName)` | 1 o 2 Strings | `AndroidIntent` | Añade categoría (literal o por reflexión). |
|
|
242
|
+
| `addFlag(flag)` o `addFlag(className, fieldName)` | 1 int o 2 Strings | `AndroidIntent` | Añade flag (literal int o por reflexión). |
|
|
243
|
+
| `putStringExtra(name, value)` | 2 Strings | `AndroidIntent` | Extra String. |
|
|
244
|
+
| `putStringArrayExtra(name, array)` | String + NativeArray | `AndroidIntent` | Extra `String[]`. |
|
|
245
|
+
| `putStringArrayListExtra(name, array)` | String + NativeArray | `AndroidIntent` | Extra `ArrayList<String>`. |
|
|
246
|
+
| `putCharSequenceArrayListExtra(name, array)` | String + NativeArray | `AndroidIntent` | Extra `ArrayList<CharSequence>`. |
|
|
247
|
+
| `putParcelableArrayListExtra(name, array)` | String + NativeArray | `AndroidIntent` | Extra `ArrayList<Parcelable>`. |
|
|
248
|
+
| `putIntegerExtra(name, value)` | String + int | `AndroidIntent` | Extra int. |
|
|
249
|
+
| `putIntegerArrayExtra(name, array)` | String + NativeArray | `AndroidIntent` | Extra `int[]`. |
|
|
250
|
+
| `putIntegerArrayListExtra(name, array)` | String + NativeArray | `AndroidIntent` | Extra `ArrayList<Integer>`. |
|
|
251
|
+
| `putLongExtra(name, value)` | String + long | `AndroidIntent` | Extra long. |
|
|
252
|
+
| `putFloatExtra(name, value)` | String + float | `AndroidIntent` | Extra float. |
|
|
253
|
+
| `putFloatArrayExtra(name, array)` | String + NativeArray | `AndroidIntent` | Extra `float[]`. |
|
|
254
|
+
| `putDoubleExtra(name, value)` | String + double | `AndroidIntent` | Extra double. |
|
|
255
|
+
| `putDoubleArrayExtra(name, array)` | String + NativeArray | `AndroidIntent` | Extra `double[]`. |
|
|
256
|
+
| `putBooleanExtra(name, value)` | String + String/boolean | `AndroidIntent` | Extra boolean (acepta string `"true"/"false"`). |
|
|
257
|
+
| `putBooleanArrayExtra(name, array)` | String + NativeArray | `AndroidIntent` | Extra `boolean[]`. |
|
|
258
|
+
| `putBundleExtra(name, bundleWrapper)` | String + `ScriptBundleWrapper` | `AndroidIntent` | Extra Bundle. El segundo arg debe ser un Bundle (`new Bundle()`). |
|
|
259
|
+
| `putFileExtra(name, filePath)` | 2 Strings | `AndroidIntent` | Localiza el fichero en la app y mete su FileProvider URI como extra. |
|
|
260
|
+
| `putExtra(name, value)` | String + Object | `AndroidIntent` | Extra genérico (auto-detecta tipo: String, Integer, Float, Double, Boolean, Parcelable, Serializable, etc.). |
|
|
261
|
+
| `getLaunchIntentForPackage(packageName)` | 1 String | `AndroidIntent` | Reemplaza el intent interno con el de lanzamiento del paquete. |
|
|
262
|
+
| `getMyPackageName()` | ninguno | `String` | Nombre de paquete del proceso actual. |
|
|
263
|
+
| `startActivity()` | ninguno | `int` (0) | Lanza el intent como Activity. |
|
|
264
|
+
| `startActivityForResult(callback)` / `startActivityForResult(callback, bundleExtras?)` / `startActivityForResult(dataObject, nodeName, bundleExtras?)` | 1..3 args | `int` (0) | Lanza esperando resultado. Si el primer arg es Function se invoca al volver con `(resultCode, ScriptBundleWrapper)`; si es un dataObject se ejecuta el nodo `nodeName`. |
|
|
265
|
+
| `startService()` | ninguno | `int` (0) | Llama `Context.startService`. |
|
|
266
|
+
| `stopService()` | ninguno | `int` (0) | Llama `Context.stopService`. |
|
|
267
|
+
| `sendBroadcast(receiverPermission?)` | 0 o 1 String | `int` (0) | Envía broadcast (opcionalmente con permission). |
|
|
268
|
+
| `sendOrderedBroadcast(receiverPermission?)` | 0 o 1 String | `int` (0) | Envía broadcast ordenado. |
|
|
269
|
+
| `registerBroadcastReceiver({action, permission?, exported?, onReceive})` | 1 NativeObject | `int` (0) | Registra `ScriptBroadcastReceiver` para la `action` (única por action). `exported` por defecto `true` (Android 13+). |
|
|
270
|
+
| `unregisterBroadcastReceiver(action)` | 1 String | `int` (0) | Desregistra el receiver de esa action. |
|
|
271
|
+
| `isReceiverRegistered(action)` | 1 String | `boolean` | Indica si hay receiver registrado para la action. |
|
|
272
|
+
|
|
273
|
+
```js
|
|
274
|
+
// Marcar teléfono
|
|
275
|
+
new AndroidIntent()
|
|
276
|
+
.setAction("android.intent.action.DIAL")
|
|
277
|
+
.setData("tel:" + self.getValue("TELEFONO"))
|
|
278
|
+
.startActivity();
|
|
279
|
+
|
|
280
|
+
// Abrir URL con flag (resolución por reflexión)
|
|
281
|
+
new AndroidIntent()
|
|
282
|
+
.setAction("android.intent.action.VIEW")
|
|
283
|
+
.setData("https://www.xone.es")
|
|
284
|
+
.addFlag("android.content.Intent", "FLAG_ACTIVITY_NEW_TASK")
|
|
285
|
+
.startActivity();
|
|
286
|
+
|
|
287
|
+
// Pedir foto a la cámara y recoger el resultado
|
|
288
|
+
new AndroidIntent()
|
|
289
|
+
.setAction("android.media.action.IMAGE_CAPTURE")
|
|
290
|
+
.startActivityForResult(function(resultCode, extras) {
|
|
291
|
+
appData.writeConsoleString("resultado: " + resultCode);
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
// Registrar receiver de broadcast
|
|
295
|
+
new AndroidIntent().registerBroadcastReceiver({
|
|
296
|
+
action : "com.miempresa.MI_EVENTO",
|
|
297
|
+
onReceive: function(intent) {
|
|
298
|
+
ui.showToast("Evento recibido");
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
### 5.7 DeviceManager
|
|
306
|
+
|
|
307
|
+
Funciones de administración del dispositivo (Device Owner / MDM): visibilidad de paquetes, certificados CA, gestión de claves criptográficas. Requiere que la app sea Device Owner o Profile Owner. Muchos métodos devuelven `false` silenciosamente en versiones de Android antiguas.
|
|
308
|
+
|
|
309
|
+
| Método | Parámetros | Retorno | Descripción |
|
|
310
|
+
|---|---|---|---|
|
|
311
|
+
| `setAppVisibility(packageName, visible)` | 2 (String, boolean) | `boolean` | Oculta o muestra un paquete (DPM `setApplicationHidden`). |
|
|
312
|
+
| `toggleAppVisibility(packageName)` | 1 String | `boolean` | Invierte el estado oculto del paquete. |
|
|
313
|
+
| `setSuspendedApps({packageNames, suspended})` | 1 NativeObject | `boolean` | Suspende/reanuda un array de paquetes (requiere API 24+). |
|
|
314
|
+
| `setUninstallBlocked({packageNames, blocked})` | 1 NativeObject | `boolean` | Bloquea o permite desinstalar los paquetes indicados (plural). |
|
|
315
|
+
| `getInstalledCaCerts()` | ninguno | `ScriptCertificate[]` | Lista certificados CA instalados por el DPM. |
|
|
316
|
+
| `installCaCertificates(value)` | 1 (String nombre fichero, NativeArrayBufferView, `ScriptCertificate` o `NativeArray` de cualquiera de los anteriores) | `boolean` | Instala uno o varios certificados CA. |
|
|
317
|
+
| `uninstallCaCertificates(value)` | 1 (mismas formas que install) | `boolean` | Desinstala certificados CA. |
|
|
318
|
+
| `getEnrollmentId()` | ninguno | `String` | ID de enrollment del DPM (Android 12+); en versiones previas devuelve `""`. |
|
|
319
|
+
| `generateKeyPair({alias, algorithm, keySize, purposes})` | 1 NativeObject | `ScriptKeyPairCertificate` o `null` | Genera par de claves en KeyStore. `purposes` es array con valores `"encrypt"`, `"decrypt"`, `"sign"`, `"verify"`, `"agree"` (API 31+), `"attest"` (API 31+), `"wrap"`. Requiere API 28+. |
|
|
320
|
+
| `installKeyPair({alias, privateKey, certificateChain, userSelectable?, requestAccess?})` | 1 NativeObject | `boolean` | Instala una clave privada con su cadena. `userSelectable` y `requestAccess` por defecto `true`. |
|
|
321
|
+
| `removeKeyPair({alias})` | 1 NativeObject | `boolean` | Elimina la clave del alias indicado. |
|
|
322
|
+
| `grantKeyPair({alias, packageName})` | 1 NativeObject | `boolean` | Concede a `packageName` acceso a la clave (API 30+). |
|
|
323
|
+
| `revokeKeyPair({alias, packageName})` | 1 NativeObject | `boolean` | Revoca el acceso (API 30+). |
|
|
324
|
+
|
|
325
|
+
```js
|
|
326
|
+
var dm = new DeviceManager();
|
|
327
|
+
dm.setAppVisibility("com.ejemplo.app", false);
|
|
328
|
+
|
|
329
|
+
// Suspender varias apps a la vez (NativeObject con packageNames PLURAL)
|
|
330
|
+
dm.setSuspendedApps({
|
|
331
|
+
packageNames: ["com.facebook.katana", "com.instagram.android"],
|
|
332
|
+
suspended : true
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
// Bloquear desinstalación (también packageNames plural)
|
|
336
|
+
dm.setUninstallBlocked({
|
|
337
|
+
packageNames: ["com.xone.android.framework"],
|
|
338
|
+
blocked : true
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
// Generar par de claves RSA 2048 para firma
|
|
342
|
+
dm.generateKeyPair({
|
|
343
|
+
alias : "miFirma",
|
|
344
|
+
algorithm: "RSA",
|
|
345
|
+
keySize : 2048,
|
|
346
|
+
purposes : ["sign", "verify"]
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
// Gestionar acceso de otras apps a la clave (API 30+)
|
|
350
|
+
dm.grantKeyPair({ alias: "miFirma", packageName: "com.ejemplo.app" });
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
### 5.8 WifiManager
|
|
356
|
+
|
|
357
|
+
Gestion de conexiones WiFi.
|
|
358
|
+
|
|
359
|
+
| Método | Descripción |
|
|
360
|
+
|---|---|
|
|
361
|
+
| `getAdapterMacAddress()` → `String` | Dirección MAC del adaptador WiFi. |
|
|
362
|
+
| `connect(ssid)` → `Object` | Conecta a la red WiFi cuyo SSID se pasa como **string** (NO un objeto de opciones). |
|
|
363
|
+
| `disconnect()` → `boolean` | Desconecta de la red WiFi actual. |
|
|
364
|
+
| `listSavedNetworks()` → `Object[]` | Lista las redes WiFi guardadas en el dispositivo. |
|
|
365
|
+
| `scanAvailableNetworks(...)` → `boolean` | Escanea redes WiFi disponibles. |
|
|
366
|
+
| `enableWifiAdapter()` | Enciende el adaptador WiFi. |
|
|
367
|
+
| `disableWifiAdapter()` | Apaga el adaptador WiFi. |
|
|
368
|
+
| `isWifiAdapterEnabled()` → `boolean` | `true` si el adaptador WiFi esta encendido. |
|
|
369
|
+
| `getActiveWifiInfo()` → `XOneWifiInfo` | Info de la conexión WiFi actual. |
|
|
370
|
+
| `getVpnInfo()` → `XOneVpnInfo` | Info de VPN activa. |
|
|
371
|
+
| `addNetwork(...)` / `removeNetwork(...)` / `enableNetwork(...)` / `disableNetwork(...)` | Gestion de redes guardadas. |
|
|
372
|
+
| `startLocalOnlyNetwork(...)` | Crea red local sin internet. |
|
|
373
|
+
|
|
374
|
+
```js
|
|
375
|
+
var wifi = new WifiManager();
|
|
376
|
+
var redes = wifi.listSavedNetworks();
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
### 5.9 BluetoothSerialPort
|
|
382
|
+
|
|
383
|
+
Cliente Bluetooth clásico (RFCOMM SPP, UUID `00001101-...`). Mantiene conexión persistente con un dispositivo. Operaciones síncronas con timeout configurable. La mayoría de métodos devuelven la propia instancia para encadenado.
|
|
384
|
+
|
|
385
|
+
| Método | Parámetros | Retorno | Descripción |
|
|
386
|
+
|---|---|---|---|
|
|
387
|
+
| `setMacAddress(mac)` | 1 String | `BluetoothSerialPort` | Fija la MAC objetivo (validada por `BluetoothAdapter.checkBluetoothAddress`). |
|
|
388
|
+
| `isDevicePaired()` | ninguno | `boolean` | Comprueba si la MAC actual (o la guardada en SharedPreferences `BluetoothSerialPort/address`) está emparejada. |
|
|
389
|
+
| `pairDevice()` | ninguno | `BluetoothSerialPort` | Inicia emparejamiento (`createBond`). |
|
|
390
|
+
| `removePairing()` | ninguno | `BluetoothSerialPort` | Elimina el emparejamiento (`removeBond` por reflexión). |
|
|
391
|
+
| `isEnabled()` | ninguno | `boolean` | Estado del adaptador Bluetooth. |
|
|
392
|
+
| `enable()` | ninguno | `BluetoothSerialPort` | Activa el adaptador (en Android 14+ lanza si no está ya activado). |
|
|
393
|
+
| `disable()` | ninguno | `BluetoothSerialPort` | Desactiva el adaptador. |
|
|
394
|
+
| `toggle()` | ninguno | `boolean` | Conmuta el estado del adaptador. |
|
|
395
|
+
| `connect(macAddress?)` | 0 o 1 String | `BluetoothSerialPort` | Abre socket RFCOMM inseguro al dispositivo (usa la MAC dada, la previamente fijada o la guardada). Persiste la última MAC en SharedPreferences. |
|
|
396
|
+
| `isConnected()` | ninguno | `boolean` | Si el socket está conectado. |
|
|
397
|
+
| `getSavedAddress()` | ninguno | `String` | MAC del último dispositivo conectado (puede ser `""`). |
|
|
398
|
+
| `setTimeout(timeoutSeconds)` | 1 long | `BluetoothSerialPort` | Timeout en **segundos** para read/write (`-1` = espera infinita). |
|
|
399
|
+
| `selectDevice()` | ninguno | `BluetoothSerialPort` | Lanza la actividad `BluetoothDeviceSelector` para elegir un dispositivo emparejado. |
|
|
400
|
+
| `selectBluetoothDevice()` | ninguno | `BluetoothSerialPort` | Alias obsoleto de `selectDevice`. |
|
|
401
|
+
| `getDiscoverableDevices()` | ninguno | `BluetoothDeviceScript[]` | Lanza descubrimiento BT clásico y devuelve la lista (espera a que termine). |
|
|
402
|
+
| `getDiscoverableBluetoothDevices()` | ninguno | `Object[]` | Alias obsoleto del anterior. |
|
|
403
|
+
| `write(data)` | 1 (String o `{data, offset?, endIndex?}`) | `boolean` | Escribe en el socket. Si es objeto, `data` es byte array; `endIndex` por defecto = longitud. |
|
|
404
|
+
| `read(size?)` | 0 o 1 int | `String` | Lee hasta `size` bytes (default 1) decodificados como String. |
|
|
405
|
+
| `readAll()` | ninguno | `String` | Lee todos los bytes disponibles (o bloquea hasta EOF). |
|
|
406
|
+
| `readBuffer(size)` | 1 int | `NativeInt8Array` o `null` | Lee `size` bytes y los devuelve como buffer JS. |
|
|
407
|
+
| `getAvailableBytes()` | ninguno | `int` | Bytes en buffer de entrada (0 si no hay conexión). |
|
|
408
|
+
| `sleep(ms)` | 1 long | `BluetoothSerialPort` | `Thread.sleep` en el hilo actual (default 100 ms). |
|
|
409
|
+
| `isOpen()` | ninguno | `boolean` | Si los streams están abiertos. |
|
|
410
|
+
| `setReadCallback(callback)` | 1 (callback o `null`) | `BluetoothSerialPort` | Registra callback JS que recibe los datos entrantes como String. Pasar `null` cancela. |
|
|
411
|
+
| `disconnect()` | ninguno | `BluetoothSerialPort` | Cierra streams y socket. |
|
|
412
|
+
| `requestEnableBluetooth({onEnabled, onDenied})` | 1 NativeObject | `BluetoothSerialPort` | Muestra el diálogo del sistema para activar Bluetooth e invoca el callback correspondiente. |
|
|
413
|
+
|
|
414
|
+
```js
|
|
415
|
+
var bt = new BluetoothSerialPort();
|
|
416
|
+
bt.setTimeout(5)
|
|
417
|
+
.connect("00:11:22:33:44:55")
|
|
418
|
+
.write("HOLA\r\n");
|
|
419
|
+
var resp = bt.readAll();
|
|
420
|
+
appData.writeConsoleString("Respuesta: " + resp);
|
|
421
|
+
bt.disconnect();
|
|
422
|
+
|
|
423
|
+
// Recepción asíncrona con callback
|
|
424
|
+
bt.setReadCallback(function(data) {
|
|
425
|
+
appData.writeConsoleString("RX: " + data);
|
|
426
|
+
});
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
---
|
|
430
|
+
|
|
431
|
+
### 5.10 OAuth2
|
|
432
|
+
|
|
433
|
+
Autenticación OAuth2 y manejo de tokens JWT.
|
|
434
|
+
|
|
435
|
+
| Método | Descripción |
|
|
436
|
+
|---|---|
|
|
437
|
+
| `withOptions({clientId, oauthUri, tokenUri, redirectUri, scope, ...})` | Configura el cliente OAuth2. **Obligatorio antes de `authenticate`.** Las claves de URL son `oauthUri`/`tokenUri` (NO `authUrl`/`tokenUrl`). |
|
|
438
|
+
| `authenticate({onSuccess, onError, noHistory?})` | Lanza el flujo. **Solo lee onSuccess/onError/noHistory**; el resto de config se toma de `withOptions`. |
|
|
439
|
+
| `register(...)` | Registro de cliente dinamico. |
|
|
440
|
+
| `requestToken(opts)` | Solicita un token de acceso (refresh, etc.). |
|
|
441
|
+
| `parseJwt(jwt)` → `JSONObject` | Decodifica el payload de un token JWT (sin verificar firma). |
|
|
442
|
+
| `verifyJwt({token, key})` → `boolean` | Verifica firma JWT. Toma **1 NativeObject** con `token` y `key`/`publicKey`, NO `(jwt, key)`. |
|
|
443
|
+
| `logout(callback)` | Cierra sesion. Exige **1 callback**. |
|
|
444
|
+
| `isBrowserPresent()` / `getBrowserInfo()` / `fetchConfiguration(...)` | Utilidades del browser custom tab. |
|
|
445
|
+
|
|
446
|
+
```js
|
|
447
|
+
var oauth = new OAuth2();
|
|
448
|
+
oauth.withOptions({
|
|
449
|
+
clientId : "mi-client-id",
|
|
450
|
+
oauthUri : "https://auth.proveedor.com/oauth/authorize", // NO "authUrl"
|
|
451
|
+
tokenUri : "https://auth.proveedor.com/oauth/token", // NO "tokenUrl"
|
|
452
|
+
redirectUri: "miapp://callback",
|
|
453
|
+
scope : "openid profile email"
|
|
454
|
+
});
|
|
455
|
+
oauth.authenticate({
|
|
456
|
+
onSuccess: function(token) {
|
|
457
|
+
appData.setGlobalMacro("##ACCESS_TOKEN##", token.access_token);
|
|
458
|
+
},
|
|
459
|
+
onError: function(e) {
|
|
460
|
+
ui.showToast("Error OAuth2: " + e);
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
---
|
|
466
|
+
|
|
467
|
+
### 5.11 Worker
|
|
468
|
+
|
|
469
|
+
Ejecuta funciones JavaScript en un hilo separado (worker), evitando bloquear la UI.
|
|
470
|
+
|
|
471
|
+
| Método | Descripción |
|
|
472
|
+
|---|---|
|
|
473
|
+
| `setCallback(fn)` | Define la **función a ejecutar** en el worker (es el callback, NO `setExecutor`). También se puede pasar al constructor: `new Worker(fn)`. |
|
|
474
|
+
| `setExecutor(name, [threadCount])` | Define un **nombre de pool de hilos** (string) compartido entre workers. Opcionalmente un `int` con el número de hilos. NO acepta una función. |
|
|
475
|
+
| `setSelfObject(obj)` | Define el objeto `self` disponible dentro del worker. |
|
|
476
|
+
| `start()` → `Future` | Lanza el worker. Devuelve un `Future` con el resultado. Lanza `IllegalStateException` si no se ha hecho `setCallback` y `setExecutor` antes. |
|
|
477
|
+
|
|
478
|
+
```js
|
|
479
|
+
// Forma recomendada: pasar la función al constructor
|
|
480
|
+
var worker = new Worker(function() {
|
|
481
|
+
return calcularTotales();
|
|
482
|
+
});
|
|
483
|
+
worker.setExecutor("poolCalculo"); // nombre del pool (string)
|
|
484
|
+
var future = worker.start();
|
|
485
|
+
future.then(function(res) {
|
|
486
|
+
self.setValue("MAP_TOTAL", res);
|
|
487
|
+
ui.relayout();
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
// Forma equivalente con setCallback explícito
|
|
491
|
+
var worker2 = new Worker();
|
|
492
|
+
worker2.setCallback(function() { return calcularTotales(); });
|
|
493
|
+
worker2.setExecutor("poolCalculo", 2); // 2 hilos en el pool
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
---
|
|
497
|
+
|
|
498
|
+
### 5.12 Animation
|
|
499
|
+
|
|
500
|
+
Animaciones programaticas sobre controles. API fluida (todos los setters devuelven la propia `Animation`).
|
|
501
|
+
|
|
502
|
+
| Método | Descripción |
|
|
503
|
+
|---|------------------------------------------------------------------------------------------|
|
|
504
|
+
| `setTarget(propName)` | Nombre del prop a animar (String). |
|
|
505
|
+
| `setX(v)` / `setY(v)` / `setZ(v)` | Translación absoluta (no existe `setXY`). |
|
|
506
|
+
| `setRelativeX(v)` / `setRelativeY(v)` / `setRelativeZ(v)` | Translacion relativa (1 parametro, no rango from/to). |
|
|
507
|
+
| `setAlpha(v)`, `setRotation(grados)`, `setRelativeRotation(grados)` | Opacidad y rotacion. |
|
|
508
|
+
| `setScaleX(v)` / `setScaleY(v)` / `setRelativeScaleX(v)` / `setRelativeScaleY(v)` | Escala. |
|
|
509
|
+
| `setWidth(v)` / `setHeight(v)` | Dimensiones. |
|
|
510
|
+
| `setBackgroundColor(color)` / `setBgcolor(color)` | Color de fondo. |
|
|
511
|
+
| `setCircularReveal(cx, cy, bReveal)` | Reveal circular UNICO (`bReveal`=true muestra, false oculta). |
|
|
512
|
+
| `setInterpolation(name)` | Tipo de interpolador (`BounceInterpolator`, etc.). |
|
|
513
|
+
| `setDuration(ms)` | Duración en milisegundos. |
|
|
514
|
+
| `setRepeatCount(n)` / `setRepeatMode(mode)` | Repeticiones. `setRepeatMode` espera **int**: `1` = restart, `2` = reverse (NO strings). |
|
|
515
|
+
| `setStartCallback(fn)` / `setEndCallback(fn)` | Callbacks. |
|
|
516
|
+
| `setEffect({effect})` | Efectos predefinidos (toma NativeObject con clave `effect`, NO un string suelto). |
|
|
517
|
+
| `cancel()` / `stop(bCompleteFirst)` | `cancel()` cancela inmediatamente. `stop` requiere 1 boolean: `true` = completar la animación antes de cancelar, `false` = corte inmediato. |
|
|
518
|
+
| `start()` | Lanza la animación. |
|
|
519
|
+
|
|
520
|
+
```js
|
|
521
|
+
var anim = new Animation();
|
|
522
|
+
anim.setTarget("MAP_BTN_ACEPTAR");
|
|
523
|
+
anim.setRelativeX(100); // 1 parámetro (no from/to)
|
|
524
|
+
anim.setDuration(300);
|
|
525
|
+
anim.start();
|
|
526
|
+
```
|
|
527
|
+
|