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.
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 |
|
||||
41
Compilar.md
|
|
@ -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
|
||||
|
||||

|
||||
<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
|
||||
|
|
|
|||
205
Interfaz.md
|
|
@ -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.
|
||||
|
||||

|
||||
---
|
||||
|
||||
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:
|
||||
|
||||

|
||||
| | |
|
||||
|---|---|
|
||||
| **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">
|
||||
|
||||

|
||||
---
|
||||
|
||||
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">
|
||||
|
||||

|
||||
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.
|
||||
|
|
|
|||
97
Karvan.md
|
|
@ -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.
|
||||
|
||||

|
||||
---
|
||||
|
||||
## 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
|
||||
|
||||
|
|
|
|||
74
Llamadas.md
|
|
@ -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)
|
||||
|
Before Width: | Height: | Size: 49 KiB |
BIN
img/01-portada.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
img/02-filtro-personal.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
img/03-filtro-community.png
Normal file
|
After Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 42 KiB |
BIN
img/04-hexagono-network.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
img/05-hexagono-personal.png
Normal file
|
After Width: | Height: | Size: 128 KiB |
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 45 KiB |
BIN
img/06-menu-desplegado.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
img/07-barra-personalizar.png
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
img/07-chats.png
|
Before Width: | Height: | Size: 42 KiB |
BIN
img/08-barra-modulos.png
Normal file
|
After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 42 KiB |
BIN
img/09-barra-con-karvan.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
img/10-karvan-salas.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
img/11-karvan-sala.png
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
img/12-permiso-camara.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
img/13-permiso-microfono.png
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
img/14-llamada-video.png
Normal file
|
After Width: | Height: | Size: 80 KiB |
BIN
img/15-llamada-controles.png
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
img/16-chats-lista.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
img/17-chat-tarjeta.png
Normal file
|
After Width: | Height: | Size: 203 KiB |
BIN
img/18-chat-mensajes.png
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
img/19-selector-ficheros.png
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
img/20-permiso-notificaciones.png
Normal file
|
After Width: | Height: | Size: 107 KiB |
BIN
img/21-perfil.png
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
img/22-modules.png
Normal file
|
After Width: | Height: | Size: 133 KiB |
BIN
img/23-modules-karvan.png
Normal file
|
After Width: | Height: | Size: 139 KiB |