Handoff

Listo para abrir Android Studio

Estructura de módulos, contratos de cada capa, pantallas y el checklist que sigue el equipo nativo desde el primer commit hasta la prueba A en verde.
PROTOTIPO WEB / ESPECIFICACIÓNNO DEMOSTRADO EN HARDWARE

Punto de partida

  • Android Studio con AGP y Kotlin recientes; JDK 17; minSdk 26 y targetSdk al último nivel estable.
  • Kotlin, Jetpack Compose, corrutinas y Flow; Hilt para inyección; WorkManager para la cola.
  • Dos teléfonos físicos de fabricantes distintos desde el día uno: la radio no se prueba en emulador.
  • Ninguna capa de negocio importa una API del sistema: solo las interfaces del módulo domain.

Estructura de módulos

conecta-android/
├── settings.gradle.kts
├── build-logic/                  convenciones de compilación compartidas
├── app/                          ensamblado, navegación e inyección
├── core/
│   ├── model/                    modelos puros, sin Android
│   ├── common/                   Result, corrutinas, tiempo, logging
│   └── designsystem/             tema, tipografía, componentes Compose
├── feature/
│   ├── needhelp/                 MODO 1 — necesito Internet
│   ├── offerhelp/                MODO 2 — quiero ayudar
│   ├── session/                  sesión activa y finalización
│   └── history/                  historial, seguridad y uso justo
├── domain/                       casos de uso + interfaces de las capas
└── data/
    ├── discovery-ble/            BLE advertising y scanning
    ├── transport-p2p/            GATT y sockets Wi-Fi Direct
    ├── security-crypto/          X25519, HKDF, AES-GCM, Keystore
    ├── network-config/           panel de Ajustes y WifiNetworkSpecifier
    ├── local-store/              SQLite cifrada y outbox
    └── sync/                     WorkManager, envío idempotente

Cada módulo de data implementa exactamente una interfaz de domain. Así el mismo diseño se traslada a iOS y una capa puede sustituirse sin tocar la lógica.

Interfaces de las capas

// domain/src/main/kotlin/.../ports

interface PeerDiscovery {
    fun advertise(profile: EphemeralProfile): Flow<AdvertiseState>
    fun scan(): Flow<List<DiscoveredPeer>>   // alias efímero + rango de distancia
    suspend fun stop()
}

interface PeerTransport {
    suspend fun connect(peer: DiscoveredPeer): TransportChannel
    fun incoming(): Flow<TransportChannel>
}

interface SecurityManager {
    fun newEphemeralIdentity(): EphemeralIdentity
    suspend fun handshake(channel: TransportChannel, id: EphemeralIdentity): SecureChannel
    fun wipe(sessionId: SessionId)
}

interface NetworkConfigurator {
    suspend fun openTetheringPanel(): PanelResult        // confirmación del sistema
    suspend fun joinNetwork(cred: OneTimeCredential): JoinResult  // WifiNetworkSpecifier
    fun hasRealInternet(): Flow<Boolean>                 // NetworkCapabilities + tráfico
}

interface SessionManager {
    val state: StateFlow<SessionState>   // IDLE, NEGOCIANDO, ACTIVA, TERMINADA
    suspend fun start(agreement: Agreement)
    suspend fun endNow(reason: EndReason)
}

interface FairUseManager { fun evaluate(history: List<SessionRecord>): FairUseVerdict }

interface LocalEventStore {
    suspend fun append(event: SessionEvent)   // nunca guarda secretos
    fun outbox(): Flow<List<SessionEvent>>
}

interface SyncManager { fun scheduleUpload() }
HIPÓTESIS TÉCNICA — REQUIERE VALIDACIÓN EN HARDWARE

Pantallas

PantallaContenidoCapa que la alimenta
InicioElegir necesito ayuda o quiero ayudar
MotivoMensaje, transporte, dirección, llamada, emergencia, otrodomain
NecesidadMB (100/250/500/1 GB) y minutos (5/15/30/60)domain
BuscandoEscaneo activo, aviso de permisos y radioPeerDiscovery
Ayudantes cercaAlias efímero, distancia por rangos, oferta, reputaciónPeerDiscovery
Solicitud enviadaEspera de respuesta con posibilidad de cancelarPeerTransport
Solicitud entranteMotivo y límites; aceptar o rechazarPeerTransport
Guía de hotspotExplicación y apertura del panel de AjustesNetworkConfigurator
UnirseDiálogo del sistema y verificación de Internet realNetworkConfigurator
Sesión activaTemporizador, MB estimados y FINALIZAR AHORASessionManager
ResumenCierre, borrado de secretos y aviso de uso justoFairUseManager
HistorialEventos locales y estado de la colaLocalEventStore
SeguridadConsentimiento, bloqueo, reporte y privacidaddomain

Checklist para el equipo nativo

PasoTerminado cuando
1Crear el proyecto y los módulos vacíos con las convenciones de buildCompila y arranca en los dos teléfonos
2Declarar las interfaces de domain y modelos purosdomain no depende de ningún artefacto de Android
3Pantallas Compose con datos falsos y etiquetas de estadoSe recorre el flujo completo sin radio
4Permisos en tiempo de ejecución y pantallas de denegaciónCada permiso tiene explicación y salida sin bloqueo
5BLE: anuncio y escaneo con identidad efímeraPrueba A en verde
6Distancia por rangos y rotación de aliasPruebas C y D en verde
7Canal GATT y handshake X25519 + HKDF + AES-GCMPrueba G en verde
8Negociación de límites y consentimiento de ambosPruebas E, F y K en verde
9Servicio en primer plano y comportamiento en segundo planoPrueba B en verde por fabricante
10Guía de hotspot y unión con WifiNetworkSpecifierPruebas H y J en verde
11Verificación de Internet real con tráfico registradoPrueba I en verde
12Finalización inmediata y borrado de secretosPruebas L, M y N en verde
13Cola local cifrada y envío idempotentePruebas O y P en verde
14Errores de alcance y bloqueo de operador con estado claroPruebas Q y R documentadas
15Ficha de compatibilidad por dispositivo y versiónPixel, Samsung y Xiaomi con registro

Ningún paso se marca como hecho sin registro de prueba física con dispositivo, versión, hora, resultado y evidencia.

Reglas que no se negocian

  • · La app nunca enciende el compartir de conexión: siempre lo confirma el ayudante.
  • · La app nunca lee ni muestra la contraseña del hotspot del sistema.
  • · La app no corta el tráfico del invitado: el límite es un acuerdo, no un control.
  • · Cero interacción física entre las personas en todo el flujo.
  • · Nada se presenta como funcional mientras su prueba diga NO PROBADO.

El orden de hitos está en Fase 1, las APIs y permisos exactos en el prototipo Android y las pruebas en el plan de pruebas.