wiki: rehecha con capturas propias de la app funcionando

Cada funcion con su captura al lado, en vez de un muro de texto y las
imagenes aparte. Las capturas estan tomadas de la APK de la rama corriendo en
un Pixel 9 con Android 16, con el marco del dispositivo.

- Interfaz: los hexagonos, los filtros, el menu desplegable y la barra de
  accesos rapidos, uno por uno.
- Karvan y Llamadas: el recorrido entero, incluidos los dialogos de permisos
  de camara y microfono y la llamada en curso.
- Chats (nueva): la respuesta citada y el selector de ficheros.
- Modulos (nueva): la tabla de /modules y como esta declarado karvan.
- Limitaciones y Roadmap al dia: el selector de ficheros ya funciona y el
  envoltorio esta probado en emulador, no solo compilado.
- Barra lateral de navegacion.
SITO 2026-08-19 10:32:17 +02:00
parent 0a77ca87df
commit 55851825e9
40 changed files with 587 additions and 78 deletions

97
Chats.md Normal file

@ -0,0 +1,97 @@
# Chats
> ⚠ Rama experimental, no oficial. El Oasis oficial es
> https://github.com/epsylon/oasis · [Volver a la portada](Home)
Los chats de Oasis son **salas cifradas que sí se guardan**: cada mensaje se publica
firmado en tu registro SSB y se replica a quien te siga. Son lo contrario de
[Karvan](Karvan), que no guarda nada.
Esta rama no cambia cómo funcionan. Le añade una cosa: **responder citando** un
mensaje anterior.
---
## 1. La lista
<img src="img/16-chats-lista.png" width="300" align="right">
Está en la categoría **Network**, junto a Karvan.
Los seis botones de arriba son filtros: **ALL**, **MINE**, **RECENT**, **FAVORITES**,
**OPEN** y **CLOSED**. El activo se queda en amarillo claro.
Debajo, **Create Chat** y un buscador por texto.
<br clear="all">
## 2. Cada chat es una tarjeta
<img src="img/17-chat-tarjeta.png" width="300" align="right">
Con su imagen, su título, su descripción y tres etiquetas de estado:
- **✓ OPEN** — admite gente nueva. El otro estado es CLOSED.
- **🔒 E2E** — los mensajes van cifrados de extremo a extremo.
- **<2w** actividad reciente; sirve para ver de un vistazo qué chats están vivos.
Y **Participants**, cuánta gente hay dentro.
Arriba de la tarjeta están los botones de siempre de Oasis: propagar, favorito,
reportar, seguir.
<br clear="all">
## 3. Dentro del chat
<img src="img/18-chat-mensajes.png" width="300" align="right">
Los mensajes en burbujas, con la fecha separando los días y la hora en cada uno.
**La flecha ↩ de cada burbuja es lo que añade esta rama.** Al tocarla, el formulario
de abajo se prepara para responder a ese mensaje: aparece una cita con el autor y el
principio del texto, y una **✕** para cancelar.
Al enviar, la respuesta sale con la cita dentro —la barra amarilla de la última
burbuja de la captura—, así que se ve a qué contesta sin tener que buscarlo.
<br clear="all">
### Cómo está hecho
Sin JavaScript, como el resto de Oasis. El botón ↩ es un enlace a
`?replyTo=<id>#chat-compose`; el backend lee ese parámetro, la vista pinta la cita y
mete un campo oculto en el formulario; al enviar, el identificador viaja con el
mensaje y se guarda en él.
Al pintar el hilo, la vista arma un índice de mensajes por identificador y resuelve
cada cita contra él. Si el mensaje citado ya no está —se borró, o es más viejo que lo
que se carga—, la burbuja simplemente sale sin cita.
## 4. Adjuntar una imagen
<img src="img/19-selector-ficheros.png" width="300" align="right">
**Upload media (max-size: 50MB)** abre el selector de fotos de Android.
Que esto funcione depende de otro método del envoltorio,
`WebChromeClient.onShowFileChooser`. Sin él, tocar el botón no abre nada: es lo que le
pasaba a una versión anterior del envoltorio de esta rama, y está arreglado.
> **Cuidado con la ubicación.** Las fotos se suben **con sus metadatos EXIF**,
> incluida la posición GPS si la cámara la guarda. Ver [Limitaciones](Limitaciones).
<br clear="all">
---
## Cuándo usar cada cosa
| | [Chats](Chats) | [Karvan](Karvan) |
|---|---|---|
| Dónde viven los mensajes | En tu registro SSB, en disco | Solo en memoria |
| Cuánto duran | Para siempre | Hasta que vence la sala |
| Se replican a la red | Sí | No |
| Quién puede entrar | Miembros del chat | Quien tenga el enlace |
| Llamadas | No | Sí |
| Sirve para | Lo que quieres conservar | Lo que no |

@ -92,6 +92,37 @@ release. Una huella distinta significa que esa APK **no la hemos construido noso
JDK 17 o superior **con compilador**. Ojo: el OpenJDK de algunas distribuciones es
solo runtime y no trae `javac`; el proyecto apunta al JDK que trae Android Studio.
Si Gradle se queja con `JAVA_HOME is set to an invalid directory`, apúntalo a un JDK
que exista de verdad:
```sh
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
```
## Qué pesa y cuánto ocupa
| | |
|---|---|
| APK compilada | ~112 MB |
| De eso, `libnode.so` | 49 MB, sin comprimir |
| De eso, el backend empaquetado | 34 MB |
| Espacio necesario para instalar | ~350 MB (el backend se descomprime al primer arranque) |
Las bibliotecas nativas van **sin comprimir** dentro de la APK. Pesa más de descarga,
pero Android las mapea directamente desde el paquete en vez de extraer otra copia al
disco, así que **el móvil acaba usando menos espacio**.
## Probar en el emulador
```sh
adb install -r app/build/outputs/apk/debug/app-debug.apk
adb logcat -s OASIS-NODE:V
```
El log tiene que llegar a `[Oasis] Backend started on port 3000`. Si la instalación
falla por espacio, `adb shell pm clear net.laenre.oasis` libera los datos
descomprimidos —pero borra la identidad SSB de esa instalación.
## Mejoras del envoltorio propio
- `targetSdk 35`.
@ -102,3 +133,13 @@ solo runtime y no trae `javac`; el proyecto apunta al JDK que trae Android Studi
- El backend corre como servicio en primer plano, así que **sobrevive en segundo
plano**. Antes se declaraba el permiso pero no había servicio, y el backend moría al
salir de la app.
<img src="img/20-permiso-notificaciones.png" width="290" align="right">
Un servicio en primer plano tiene que enseñar una notificación, y desde Android 13 eso
requiere permiso del usuario. El envoltorio lo pide al primer arranque.
Si se deniega, el backend sigue funcionando: lo que se pierde es el aviso de que está
corriendo, y con él la garantía de que el sistema no lo mate al quedarse sin memoria.
<br clear="all">

40
Home.md

@ -22,23 +22,41 @@ Versión base: **Oasis 0.9.5**. Rama: `PRUEBAS`.
Una rama que sigue de cerca las versiones de epsylon y añade dos cosas: una interfaz
pensada para el móvil y un módulo de **salas efímeras con llamadas**.
| | |
Todas las capturas de esta wiki están tomadas de la APK de la rama funcionando en un
Pixel 9 (Android 16). No hay ningún montaje: es lo que se ve al usarla.
| Página | De qué va |
|---|---|
| **[La interfaz](Interfaz)** | Hexágonos, filtros, barra de accesos rápidos, botón por botón |
| **[Karvan](Karvan)** | Salas que viven solo en memoria y se autodestruyen |
| **[Llamadas](Llamadas)** | Audio y vídeo sobre WebRTC, sin servidores de terceros |
| **[La interfaz](Interfaz)** | Hexágonos, barra de accesos rápidos y por qué son así |
| **[Llamadas](Llamadas)** | Audio y vídeo sobre WebRTC, y por qué la APK oficial no puede hacerlo |
| **[Chats](Chats)** | Los chats cifrados de Oasis, con respuesta citada |
| **[Módulos](Modulos)** | Encender y apagar partes de la aplicación |
| **[Compilar la APK](Compilar)** | Cómo se construye, de dónde sale cada pieza |
| **[Estado y hoja de ruta](Roadmap)** | Qué funciona, qué no, y qué está bloqueado |
| **[Qué NO tiene](Limitaciones)** | Lo que falta respecto al oficial, sin adornos |
---
## La interfaz
## La pantalla principal
![La pantalla principal](img/01-home-hexagonos.png)
<img src="img/01-portada.png" width="300" align="right">
La navegación es una rejilla de hexágonos por categorías, con una barra de accesos
rápidos abajo que el usuario configura, y arriba los filtros Personal y Community.
Al abrir la aplicación hay tres zonas, y no cambian nunca de sitio:
**Arriba** — el logo (vuelve al inicio), los dos filtros **Personal** y **Community**,
y tu avatar (lleva a tu perfil).
**En medio** — el panal de hexágonos. Cada hexágono es una categoría; al tocarlo se
abre su rejilla de módulos. Debajo, el mismo menú en forma de lista desplegable, que
es el que aparece en el resto de páginas.
**Abajo** — la barra de accesos rápidos, con hasta cuatro módulos elegidos por ti, el
botón **Edit** para cambiarlos, y **Peers** e **Invites** siempre a mano.
Está explicado botón a botón en **[La interfaz](Interfaz)**.
<br clear="all">
---
@ -53,6 +71,14 @@ Se instala **junto al Oasis oficial** sin pisarlo: el identificador de aplicaci
> **Verifica siempre la huella de la firma** antes de instalar una APK descargada de
> un servidor propio. La huella de cada versión se publica en su release.
Necesita **unos 350 MB libres**: la APK ocupa 112 MB y el backend se descomprime
dentro de los datos de la aplicación la primera vez que arranca. Si no hay sitio, la
instalación falla con `INSTALL_FAILED_INSUFFICIENT_STORAGE`.
**El primer arranque tarda.** Se descomprime el backend y se levanta SSB: entre 10 y
60 segundos según el móvil. Mientras, la aplicación enseña una pantalla de estado con
los segundos que lleva esperando; no está colgada.
---
## Aviso sobre privacidad

@ -1,61 +1,190 @@
# La interfaz
> ⚠ Rama experimental, no oficial. El Oasis oficial es
> https://github.com/epsylon/oasis · [Volver a la portada](Home)
> Rama experimental del hacklab sobre [el Oasis de epsylon](https://github.com/epsylon/oasis).
> No es Oasis oficial. Ver [aviso completo](Home).
Es la diferencia más visible con el Oasis oficial. Está pensada para el pulgar, no
para el ratón.
Oasis tiene casi cincuenta módulos. En un escritorio caben en dos columnas laterales;
en un móvil, no. Esta rama los reorganiza en tres piezas: un **panal de categorías**,
dos **filtros** arriba y una **barra de accesos rápidos** abajo.
## La pantalla principal
Nada de esto usa JavaScript en el cliente: son enlaces, `<details>` y formularios,
igual que el resto de Oasis.
![Pantalla principal](img/01-home-hexagonos.png)
---
Tres piezas:
## 1. El panal de hexágonos
- **Arriba**: logo, los filtros **Personal** y **Community**, y tu avatar.
- **En medio**: la rejilla de **hexágonos**, diez categorías que se despliegan al
tocarlas. Las categorías son puro CSS: funcionan sin JavaScript.
- **Abajo**: la **barra de accesos rápidos**, configurable.
<img src="img/01-portada.png" width="300" align="right">
## Los filtros Personal y Community
Diez categorías, cada una con sus módulos dentro:
![Filtro Personal](img/06-filtro-personal.png)
| | |
|---|---|
| **Personal** | Avatar, CV, Agenda, Favorites, Modules, Settings |
| **Governance** | Votations, Parliament, Courts, Reports, Tribes |
| **Economy** | Market, Banking, Transfers, Wallet, Shops, Jobs |
| **Office** | Tasks, Projects, Calendars, Docs, Events |
| **Tools** | Cipher, Graphos, Maps, Torrents, Games, Dev |
| **Network** | Activity, Tags, Trending, Opinions, Pads, Forums, Chats, **Karvan** |
| **Media** | Images, Audios, Videos, Bookmarks, Documents |
| **Creative** | Pixelia, Melody, L.A.R.P., Timelines |
| **Blogs** | Blogs, Feed |
| **Fediverse** | Puente con el fediverso (apagado por defecto) |
Parten las diez categorías en dos mitades de cinco, para no tener que buscar entre
todas. Sin filtro se ven las diez.
El panal solo aparece en la pantalla de inicio. En el resto de páginas se usa el mismo
menú, pero en forma de lista desplegable debajo del contenido.
## La barra de accesos rápidos
<br clear="all">
![Personalizar la barra](img/04-barra-personalizar.png)
---
Cuatro atajos que eliges tú, más un par fijo a la derecha. Se configuran con el lápiz.
## 2. Tocar un hexágono abre su rejilla
## Módulos
<img src="img/04-hexagono-network.png" width="300" align="right">
![Módulos](img/05-modulos.png)
Al tocar **Network** el hexágono se rellena en amarillo y debajo aparecen sus módulos
en una rejilla de dos columnas, con el icono y el nombre de cada uno.
Cada módulo se enciende y se apaga por separado, igual que en el Oasis oficial.
Aquí están **Chats** y **Karvan**, que son las dos formas de hablar con alguien:
Chats guarda la conversación en tu feed SSB; Karvan no guarda nada.
## Por qué la interfaz vive aparte
Volver a tocar el hexágono cierra la rejilla.
Todo esto está en ficheros propios (`src/views/fork/hive_nav.js`) en vez de dentro de
los ficheros del proyecto original. No es manía: **epsylon publica una versión cada
dos a cuatro días** y reescribe a fondo justo los ficheros donde antes vivía esta
interfaz.
<br clear="all">
Con la separación, sobre los ficheros de upstream solo quedan **enganches de una
línea**, y una versión nueva se integra sin arrastrar nada. Antes eran unas 90
divergencias; ahora `backend.js` diverge en unas 30 líneas y `main_views.js` en unas
40, casi todas enganches.
<img src="img/05-hexagono-personal.png" width="300" align="right">
Es lo que permite ir al día sin perder la interfaz por el camino.
Lo mismo con **Personal**: Avatar, CV, Agenda, Favorites, **Modules** y **Settings**.
## Sin JavaScript en la navegación
Por aquí se llega a la pantalla de módulos, que es donde se encienden y apagan las
partes de la aplicación. Ver [Módulos](Modulos).
Se mantiene el criterio del proyecto original: la navegación no usa JavaScript. Los
desplegables son CSS, los filtros son formularios y los cambios de estado son envíos
con recarga.
<br clear="all">
La única excepción son las **llamadas**, que no pueden existir sin JavaScript. Van en
un fichero aparte servido desde el propio Oasis, del mismo modo que el visor de PDF
que el proyecto oficial ya incluye — y **solo se carga en la página de una sala**.
---
## 3. Los filtros Personal y Community
<img src="img/02-filtro-personal.png" width="300" align="right">
Los dos botones de arriba reducen el panal a la mitad, para no tener diez hexágonos
delante cuando sabes lo que buscas.
**Personal** deja las categorías que son cosa tuya: Personal, Governance, Office,
Economy y Tools.
<br clear="all">
<img src="img/03-filtro-community.png" width="300" align="right">
**Community** deja las que son de la red: Network, Blogs, Creative, Media y Fediverse.
El botón activo se queda relleno en amarillo. Tocarlo otra vez vuelve al panal
completo.
<br clear="all">
---
## 4. El menú desplegable
<img src="img/06-menu-desplegado.png" width="300" align="right">
En las páginas que no son el inicio, el panal se sustituye por esta lista. Cada
categoría es un desplegable; al abrirla salen sus módulos en fila, con el mismo icono
que en la rejilla.
Es la navegación de repuesto: siempre está al final de cualquier página, así que nunca
hace falta volver al inicio para cambiar de módulo.
<br clear="all">
---
## 5. La barra de accesos rápidos
<img src="img/09-barra-con-karvan.png" width="300" align="right">
Siempre visible, abajo del todo:
- **Cuatro módulos a tu elección** — en la captura: Search, Inbox, Write y Karvan. El
contador amarillo sobre Inbox es el número de mensajes sin leer.
- **Edit** (el lápiz amarillo, en el centro y más grande) — abre la pantalla de
personalización.
- **Peers** e **Invites** — en su propia cápsula a la derecha, fijos: son las dos
cosas que hacen falta para que la red funcione y no se pueden quitar.
<br clear="all">
---
## 6. Personalizar la barra
<img src="img/07-barra-personalizar.png" width="300" align="right">
El botón **Edit** lleva aquí.
Arriba, **YOUR BAR (3/4)**: los módulos que tienes puestos, cada uno con una **✕** para
quitarlo.
Debajo, **ADD**: todos los módulos que se pueden poner. En la captura la barra tiene
tres, así que se pueden añadir más.
<br clear="all">
<img src="img/08-barra-modulos.png" width="300" align="right">
La lista completa de módulos disponibles, en rejilla de tres columnas con su icono.
Al tocar uno se añade al final de la barra y se vuelve a esta misma pantalla. Con
cuatro puestos, la sección ADD dice **Maximum reached** y solo queda el botón
**Done**.
La elección se guarda en el servidor, no en el navegador: sigue ahí después de cerrar
la aplicación.
<br clear="all">
---
## 7. Tu perfil
<img src="img/21-perfil.png" width="300" align="right">
Se llega tocando el avatar de arriba a la derecha.
Tiene tu nombre, tu identificador de feed completo, la versión de Oasis, el **código QR
de tu identidad** para que otra persona te añada escaneándolo, y tres datos de estado:
KARMA, ECO Tax y **Device**.
**Device: MOBILE** indica que la aplicación está corriendo en modo móvil, que es lo que
activa la topbar, el panal y la barra inferior. En escritorio pone otra cosa y esas
tres piezas no se dibujan.
<br clear="all">
---
## Cómo está hecho
Todo lo de esta página vive en **un solo fichero nuevo**, `src/views/fork/hive_nav.js`,
que exporta las tres funciones de dibujo y la lista de módulos que se pueden anclar.
`main_views.js` lo llama en tres sitios.
Se hizo así a propósito: cuando epsylon publica una versión nueva, `main_views.js`
cambia mucho, y tener la interfaz de la rama en un fichero aparte evita rehacerla en
cada actualización.
Las tres funciones empiezan igual:
```js
if (process.env.OASIS_MOBILE !== '1') return "";
```
Así el mismo código sirve para las dos ramas: en escritorio no dibujan nada. Por eso
[OASIS_LINUX](https://gitea.laenre.net/hacklab/OASIS_LINUX) puede llevar el mismo
`main_views.js` sin heredar la interfaz de móvil.
Los textos propios de la rama están en `src/client/assets/translations/fork/i18n_fork.js`,
que se mezcla con el `i18n.js` de upstream mediante un enganche de tres líneas. Igual
que antes: si epsylon reescribe sus traducciones, las de la rama no se pierden.

@ -6,28 +6,83 @@
Salas de chat que **viven solo en memoria** y se destruyen solas. Nada se escribe en
disco ni en el registro de SSB.
![Lista de salas](img/03-lista-salas.png)
---
## Cómo funciona
## Recorrido completo, paso a paso
Al crear una sala eliges cuánto vive. A partir de ahí:
### 1. Llegar a Karvan
- **Se autodestruye por inactividad** (30 minutos por defecto) y **por tiempo
absoluto** (2 horas), lo que ocurra antes. El plazo absoluto no se renueva con la
actividad: la sala muere igual.
- Al vencer, **se borra todo**: mensajes, señales y la lista de miembros.
- Si reinicias Oasis, las salas desaparecen. Es lo correcto: solo existían en memoria.
<img src="img/04-hexagono-network.png" width="300" align="right">
## Quién puede entrar
Karvan está en la categoría **Network**. Desde la pantalla de inicio, toca el hexágono
Network y aparece su rejilla: es el último módulo, con un reloj de arena por icono.
**Quien tenga el enlace.** El identificador de la sala son 72 bits al azar y es la
única credencial que existe. No hay lista de miembros ni permisos.
También se puede anclar a la barra de accesos rápidos para tenerlo siempre abajo; está
explicado en [La interfaz](Interfaz).
Esto es deliberado —así una sala se comparte pegando un enlace— pero conviene tenerlo
claro: **cualquiera con el enlace entra**, y quien esté dentro puede pasárselo a otro.
<br clear="all">
Para invitar a un contacto sin pegar el enlace en ningún sitio, el botón de invitación
le manda un **mensaje privado de SSB** con el enlace dentro.
### 2. Crear una sala
<img src="img/10-karvan-salas.png" width="300" align="right">
La pantalla de Karvan tiene dos partes.
Arriba, el formulario: un **nombre opcional** para la sala y **cuánto vive**
30 minutos, 2 horas u 8 horas—, con el botón **Create ephemeral room**.
Debajo, **Active rooms**: las salas que existen ahora mismo en este nodo, cada una con
su nombre, el número de mensajes que tiene y lo que le queda de vida.
Sin nombre, la sala se llama por su identificador. El nombre no es una credencial: no
sirve para entrar, solo para reconocerla en la lista.
<br clear="all">
### 3. Dentro de la sala
<img src="img/11-karvan-sala.png" width="300" align="right">
De arriba abajo:
- ** Rooms** vuelve a la lista, el nombre de la sala en el centro y a la derecha el
tiempo que le queda (⌛ 1h 52m). Ese contador baja siempre; no se renueva porque
haya conversación.
- **server relay** con un punto gris: por dónde van los mensajes ahora mismo. Gris es
a través del servidor; se pone verde cuando hay un canal directo entre navegadores.
- Los **botones de llamada**: 📞 Call, micrófono, cámara y colgar. Ver
**[Llamadas](Llamadas)**.
- Los **mensajes**, con quién los escribió.
- Abajo (hay que bajar un poco) el campo **Temporary message…** con **Send**, y el
campo de invitación con **Invite**.
<br clear="all">
### 4. Invitar a alguien
Hay dos formas:
**Pasar el enlace.** El identificador de la sala son 72 bits al azar y es la única
credencial que existe. Quien tenga el enlace, entra.
**Invitar por identidad.** En el campo de abajo se pega el `@feed-id` de un contacto y
Oasis le manda un **mensaje privado de SSB** con el enlace dentro. Así no hace falta
publicar el enlace en ningún sitio.
---
## Cuánto vive una sala
Dos relojes corren a la vez, y se destruye con el que llegue antes:
| | |
|---|---|
| **Por inactividad** | 30 minutos sin actividad. Este sí se reinicia con cada mensaje |
| **Por tiempo absoluto** | El que elegiste al crearla. **No** se reinicia nunca |
| **Tope duro** | 24 horas, aunque se pida más |
Al vencer se borra todo: mensajes, señales y la lista de miembros. Si reinicias Oasis,
las salas desaparecen —es lo correcto: solo existían en memoria.
## Límites
@ -47,7 +102,8 @@ El chat es utilizable **con JavaScript desactivado**: escribir manda un formular
la página se recarga sola cada diez segundos para traer los mensajes nuevos.
Con JavaScript activado se añade un canal directo entre navegadores, y entonces los
mensajes llegan al instante sin pasar por el servidor.
mensajes llegan al instante sin pasar por el servidor. Es también lo que hace falta
para las llamadas.
## Qué protege y qué no
@ -67,3 +123,12 @@ desaparecen solos. No queda rastro que replicar ni que incautar después.
Karvan sirve para conversaciones que no quieres conservar. **No es una herramienta
contra un adversario que ya controla tu dispositivo o el servidor.**
---
## Lo mismo en el ordenador
Karvan está también en
[OASIS_LINUX](https://gitea.laenre.net/hacklab/OASIS_LINUX/wiki/Karvan), con las
mismas salas y el mismo módulo. Una sala creada en el móvil se puede abrir en el
ordenador si los dos nodos se replican.

@ -37,20 +37,21 @@ De las claves propias de la rama, **solo el castellano está completo**. Los otr
idiomas caen al inglés. No se han traducido a máquina a propósito: una traducción sin
alguien que la revise da una falsa sensación de cobertura.
## Cosas que aún no se han probado en un dispositivo real
## Probado en emulador, no en un móvil físico
El envoltorio propio de Android **compila y genera una APK correcta**, con los
permisos y el método que faltaba. Pero **no se ha probado todavía en un móvil
físico**: que arranque el backend, que la interfaz cargue y que la cámara funcione al
pulsar Llamar.
Todo lo que se enseña en esta wiki está comprobado en un **Pixel 9 con Android 16
(API 36) emulado**: el backend arranca, la interfaz carga, los permisos de cámara y
micrófono se piden y se conceden, la llamada abre la cámara y el selector de ficheros
funciona.
Hasta que eso esté comprobado, trátalo como lo que es: código que compila.
Lo que **no** se ha probado todavía:
## Subir ficheros desde el navegador interno
El envoltorio propio **todavía no implementa el diálogo de selección de ficheros** del
navegador interno. Los botones de subir imagen o documento pueden no abrir nada.
Es hermano del problema de los permisos de cámara, y se arregla igual.
- Un **móvil físico**, que es más lento arrancando y tiene menos memoria.
- Una llamada **entre dos dispositivos distintos**. Lo verificado es que el navegador
interno obtiene cámara y micrófono y publica su flujo; la otra mitad —que dos nodos
se encuentren y negocien— está probada en escritorio pero no de móvil a móvil.
- **Supervivencia larga en segundo plano.** El backend corre como servicio en primer
plano, que es lo que debe garantizarlo, pero no se ha medido tras horas.
## La contraseña de la copia de seguridad viaja en la dirección

@ -7,6 +7,57 @@ Dentro de una sala de [Karvan](Karvan) hay un botón de llamada. El audio y el v
van **directamente entre los participantes** por WebRTC, cifrados de extremo a extremo
por el propio protocolo.
## Cómo se llama, paso a paso
### 1. Pulsar Call
<img src="img/11-karvan-sala.png" width="290" align="right">
Los cuatro botones están dentro de la sala, encima de los mensajes: **📞 Call**,
micrófono, cámara y colgar. Antes de llamar están apagados y el estado dice
**server relay**.
<br clear="all">
### 2. Android pide la cámara
<img src="img/12-permiso-camara.png" width="290" align="right">
El sistema pregunta **la primera vez que pulsas Llamar**, no al instalar.
**While using the app** concede el permiso mientras la aplicación esté abierta.
**Only this time** lo concede solo para esta llamada.
<br clear="all">
### 3. Y el micrófono
<img src="img/13-permiso-microfono.png" width="290" align="right">
Segunda pregunta, la del micrófono. Son dos permisos independientes: se puede conceder
uno y negar el otro, y entonces la llamada sale solo con audio o solo con vídeo.
<br clear="all">
### 4. Llamada en curso
<img src="img/14-llamada-video.png" width="290" align="right">
Concedidos los permisos, aparece tu propia imagen. En la captura se ve el patrón de
prueba de la cámara virtual del emulador; en un móvil de verdad ahí está la cámara.
<br clear="all">
<img src="img/15-llamada-controles.png" width="290" align="right">
Los cuatro botones se ponen amarillos —encendidos— y debajo aparece el estado
**mic ON · cam ON**.
Tocar el micrófono o la cámara los apaga sin colgar; el botón rojo termina la llamada
y devuelve la sala a su estado inicial. Los mensajes siguen ahí abajo mientras hablas.
<br clear="all">
## Los permisos se piden al llamar, no al instalar
La app **declara** los permisos de cámara y micrófono porque Android obliga a que la
@ -16,9 +67,26 @@ permisos peligrosos y el sistema los pide **la primera vez que pulsas Llamar**.
Si nunca llamas, no se te pide nada y la aplicación no accede a la cámara ni al
micrófono.
Esto no era posible con la APK anterior: el envoltorio de Android que se venía usando
no implementaba el método que concede permisos al contenido web, así que el navegador
interno **denegaba siempre** el acceso por mucho que se declararan los permisos.
Esto **no era posible con la APK oficial**, y no por falta de ganas. Se comprobó sobre
el APK que se venía usando:
| | |
|---|---|
| Permisos declarados | `INTERNET`, `ACCESS_NETWORK_STATE`, `FOREGROUND_SERVICE` |
| Apariciones de `onPermissionRequest` en su código | **0** |
Son dos barreras independientes y ninguna se sortea desde fuera de la aplicación:
1. La lista de permisos del manifiesto es **fija, decidida al compilar**. Android no
deja conceder un permiso que la aplicación no declara: ni desde ajustes, ni con
`pm grant`, ni desde JavaScript. **Ni siquiera aparece como opción.**
2. Aunque estuvieran declarados y concedidos, el navegador interno **deniega por
defecto** las peticiones de cámara y micrófono si el envoltorio no implementa
`WebChromeClient.onPermissionRequest`. Eso es código Java, fuera del alcance del
backend.
Por eso esta rama trae su propio envoltorio Android, en `android/`, compilable con
Gradle. Ver [Compilar la APK](Compilar).
## Sin servidores de terceros

56
Modulos.md Normal file

@ -0,0 +1,56 @@
# Módulos
> ⚠ Rama experimental, no oficial. El Oasis oficial es
> https://github.com/epsylon/oasis · [Volver a la portada](Home)
Oasis trae 48 módulos y no todo el mundo quiere los 48. La pantalla de módulos los
enciende y apaga uno a uno; lo que apagas desaparece del menú y su ruta deja de
responder.
Se llega por el hexágono **Personal****Modules**.
---
## La pantalla
<img src="img/22-modules.png" width="300" align="right">
Arriba, dos botones que aplican un conjunto entero de golpe:
- **MOBILE** — deja encendido lo que tiene sentido en un móvil.
- **FULL** — enciende todo.
Debajo, la tabla: nombre, para qué sirve y una casilla. El nombre es un enlace a ese
módulo. Al final de la tabla está **Save settings**, que es lo que guarda los cambios.
<br clear="all">
## Karvan en la lista
<img src="img/23-modules-karvan.png" width="300" align="right">
**Karvan** aparece entre Jobs y L.A.R.P., en su sitio alfabético, con la misma forma
que los demás: *"Ephemeral rooms: messages live only in memory and self-destruct."*
Apagarlo hace desaparecer el módulo del menú y de la barra de accesos rápidos, y su
ruta pasa a devolver un error. Las salas que hubiera abiertas se pierden, como se
pierden al reiniciar.
<br clear="all">
---
## Cómo está declarado
Un módulo nuevo no se inventa una forma propia de existir: se declara donde están los
demás.
| Fichero | Qué se añadió |
|---|---|
| `src/views/modules_view.js` | Una línea en la lista, en orden alfabético |
| `src/configs/config-manager.js` | `"karvanMod": "on"` en la configuración por defecto |
| `src/views/main_views.js` | `renderKarvanLink()`, calcado de `renderPollsLink()` |
| `src/backend/fork_routes.js` | Las rutas, todas detrás de `checkMod(ctx, 'karvanMod')` |
Esa última comprobación es la que hace que apagarlo apague de verdad: cada ruta
pregunta por el módulo antes de responder, igual que hacen las rutas de upstream.

@ -16,11 +16,15 @@ Sin fechas: esto se hace cuando se puede.
videollamadas, y de paso mejora la seguridad del empaquetado.
- **Fuera el STUN de Google**, con configuración para TURN propio.
- **Traducción al castellano** de todo el módulo de salas, que antes salía en inglés.
- **Videollamada funcionando en el emulador**: se piden los permisos, se abre la
cámara y los controles responden. Ver [Llamadas](Llamadas).
- **Responder citando** en los [chats](Chats), sin JavaScript en el cliente.
- **Selector de ficheros** del navegador interno, que faltaba en el envoltorio propio.
## En curso
- Probar el envoltorio en un móvil real. Es lo único que separa a las videollamadas de
funcionar de verdad.
- Probar el envoltorio en un móvil real, y una llamada entre dos dispositivos
distintos. Es lo que separa a las videollamadas de estar terminadas.
- Poner en marcha un TURN en un pub para las llamadas fuera de la red local.
## Sin empezar
@ -32,7 +36,6 @@ Sin fechas: esto se hace cuando se puede.
- **Automatizar la construcción**: que una versión nueva del proyecto oficial genere
la APK firmada y publicada sola.
- **Limpiar los metadatos EXIF** en el móvil (ver [Limitaciones](Limitaciones)).
- **Diálogo de selección de ficheros** en el navegador interno.
## Bloqueado, y por qué

23
_Sidebar.md Normal file

@ -0,0 +1,23 @@
### Oasis Mobile · rama `PRUEBAS`
**⚠ No es Oasis oficial**
[El oficial es este](https://github.com/epsylon/oasis)
---
- [Portada](Home)
- [La interfaz](Interfaz)
- [Karvan · salas efímeras](Karvan)
- [Llamadas](Llamadas)
- [Chats](Chats)
- [Módulos](Modulos)
- [Compilar la APK](Compilar)
---
- [Qué NO tiene](Limitaciones)
- [Estado y hoja de ruta](Roadmap)
---
[Versión de escritorio](https://gitea.laenre.net/hacklab/OASIS_LINUX)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

BIN
img/01-portada.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

BIN
img/02-filtro-personal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
img/03-filtro-community.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

BIN
img/04-hexagono-network.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

BIN
img/06-menu-desplegado.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

BIN
img/08-barra-modulos.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

BIN
img/09-barra-con-karvan.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
img/10-karvan-salas.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

BIN
img/11-karvan-sala.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
img/12-permiso-camara.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
img/14-llamada-video.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
img/16-chats-lista.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
img/17-chat-tarjeta.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

BIN
img/18-chat-mensajes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
img/21-perfil.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

BIN
img/22-modules.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

BIN
img/23-modules-karvan.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB