13/10/2026Core Review — reconexão de stream, crackling resolvido, mic picker
- Auto-reconnect do MediaLink: backoff exponencial + grace window no servidor (o mesmo streamId é re-anexado); encoder vivo durante a queda
- Mic picker: comandos mic.list/mic.set (allowlist 57) + roteamento real do microfone (setPreferredDevice) + troca ao vivo com restart da captura
- Crackling do áudio da câmera RESOLVIDO — causa raiz era o jitter buffer aplicado a cada chunk no painel; two-state buffer (só a 1ª chunk/gap)
- Áudio: chunks de 200 ms exatos (5 msg/s) + backpressure no envio
- Gallery cache: caminho explícito no .env da VPS (EACCES no ciclo de limpeza)
12–13/10/2026Migração para VPS Oracle (produção)
- Produção em VPS Oracle (São Paulo); o PC passa a ser instância DEV + hub ADB (a VPS não roda ADB)
- Hardening completo + systemd + backup diário automatizado
- Re-bind codes: aparelhos migraram mantendo nome, histórico e configurações
- Bootstrap com troca de senha obrigatória; deploy com janela de exposição zero
- Migração TLS: agentes com token aceitam o novo certificado (caso de migração TOFU)
08/10/2026Etapa 5 CONCLUÍDA — TYPES_ALL_MASK, ADB remoto, Device Info, PINs, QUERY_ALL
- TYPES_ALL_MASK (a descoberta): Samsung One UI esconde botões de dialogs da accessibility tree sem typeAllMask + canPerformGestures; com ALL_MASK tudo funciona (screen share auto-confirm, goHome, gesture injection, câmera em background)
- ADB over network via rede privada: deploy remoto sem USB (setup 1× USB, depois acesso pela VPN)
- Device Info: commercial name, idioma, timezone, screen, kernel, hardware, radio, watts, 3G/4G/5G
- PINs server-managed (AES-GCM + Keystore) + Safe Mode (app lock via PIN) + Settings gear via PIN
- Untethered Mode: consentimento no aparelho + ações ADB fixas (hide/restore dos indicadores câmera/mic)
- QUERY_ALL_PACKAGES (projeto privado, sem Google Play): 65 → 339 apps visíveis
- Per-device heartbeat + topbar com rede e bateria em tempo real
- Availability events: silent + debounce 30 min (zero falsos positivos)
- Camera FGS: SEM conteúdo na notificação; Gradle/Kotlin daemon OFF (~1GB RAM liberada)
- AjmApp crash handler: loga o stacktrace antes de morrer
07/10/2026Etapa 4 — Tela ao vivo, som do sistema, controle remoto
- MediaProjection com consentimento por sessão + auto-confirm assistido (auditado)
- H.264 → frames AJM2 → WebCodecs; perfis Low/Balanced/High; keyframe cache + CSD em todos os keyframes
- Som do sistema: AudioPlaybackCapture → PCM 48kHz cru → WebAudio (sem codec)
- Controle remoto via dispatchGesture (apps e system UI; launcher MIUI ignora)
- Screenshots híbridos (canvas do stream + accessibility) + Captures com retenção
- Viewer externo view-only com link tokenizado; watchdogs de VPN e de consentimento
- Stay-awake wake lock — sem ele a HyperOS revogava a projection no timeout da tela
07/10/2026One UI validada (aparelho-alvo) + notification.config toggle
- Aparelho-alvo validado: screen share two-step (~2s), listener, áudio PCM, viewer relay, reboot survival
- notification.config restaurado como toggle (custom title/text ou 💕)
- FGS notification: 💕 quando OK, texto custom só quando definido; estados críticos sempre sobrepõem
- GLOBAL DIALOG MATCH RULE: a busca da opção usa frases completas — termos genéricos quebram o confirm na HyperOS (regressão corrigida nas duas ROMs)
07/10/2026Round 3 — Untethered Mode + janela controlável + dual PIP
- UNTETHERED MODE (owner): consentimento no aparelho (aviso harmful) + ações adb FIXAS (hide/restore dos indicadores câmera/mic)
- E2E validado: check → hide → restore; gates NEEDS_LOCAL_ACTION/CONFLICT; audit total
- Janela controlável de câmera + dual: PIP redimensionável (swap por toque) ou lado a lado
- Fim do java.exe residente: gradle/kotlin daemons off
07/10/2026Etapa 5 — round 2: 16:9, rotação wide, janela exclusiva
- Aspect SEMPRE 16:9 (owner); pickSize mira largura 16:9
- Frontal de ponta-cabeça: base = sensorOrientation puro
- Stream desalinhado + layout no wide: canvas absoluto (translate+rotate)
- Rotação: 1º clique = WIDE 16:9 de pé; janela exclusiva de câmera com viewer tokenizado
- Tela e câmeras NUNCA se misturam nas janelas (filtro por streamId da fonte)
07/10/2026Etapa 5 — bugfixes + microfone Sound
- Flicker preto constante: decoders recriados a cada poll → estáveis (listener único + refs)
- Layout = Screen mirror: player vertical ajustável + controles à direita
- MICROFONE: restrição removida por decisão do owner; Sound switch igual ao screen share (PCM 48kHz)
- Validado: frames A exatos, zero erros; locked-start re-validado
07/10/2026Etapa 5 — Câmeras ao vivo
- Camera2 + FGS camera; start SEMPRE na frontal (regra do owner)
- Dual: front+back simultâneo (encoders por instância, AJM2 multi-stream)
- Flash/torch da traseira via capture session; perfis Low/Balanced/High
- START e STREAM com a tela TRAVADA (validado)
- pickSize: fallback Surface→MediaCodec→SurfaceTexture (quirk MediaTek)
06–07/10/2026Etapa 3 — Notificações
- NotificationListenerService com auto-sync
- Espelhamento posted/removed com dedup + fila offline
- Ativas × histórico, busca, filtro por app, pausa
- Som: tri-tone (notificações) + alert chime (dispositivo)
- Badge vermelho + sino de eventos no topbar
- Retenção configurável + clear com confirm
05–06/10/2026Etapa 2 — Arquivos e Aplicativos
- File Manager SAF (13 comandos, auto-sync, upload streaming)
- Gallery cache (TTL, limite, cache-stats/clear)
- App Manager + task manager honesto + App Usage
- Admin bootstrap + change password
- usage.query "today" reset à meia-noite (queryEvents)