Skip to content

Clean-room Android — Ship Checklist (live)

The remaining path to ship astradial-astracall-android (GPL-free, own engine) to Play Store. [x] = done + verified. Ticked one-by-one. Branch phase3/app-module. Last updated 2026-07-11.

Core thesis PROVEN on real hardware (V2037, 2026-07-11): clean install → app self-requests mic → sign in → REGISTER on our engine → 2-way audio + mute/speaker/DTMF/hangup, all zero-linphone.

A. Proven on-device (V2037, clean install, zero adb)

  • App self-requests RECORD_AUDIO on a clean install
  • Sign in (Firebase → JWT) on Staging + wss line picker
  • REGISTER over wss://stagesip:8089/ws on our own engine
  • Outbound call → 2-way audio (*43 echo)
  • In-call Mute / Speaker / DTMF / Hangup
  • Compose UI renders (login #24, tab shell, keypad, #37 call, Pulse, Tickets)

B. Contract parity (verified in code 2026-07-11)

  • wss picker gate — getOrgSipUsers filters sip_port=='wss'
  • Manual-entry wss reject — "This SIP user is not provisioned"
  • Caller-ID in the in-call UI — splitParty(Engine.call.remoteParty)
  • VoIP-push-on-open (register / status GET / revoke, permission-gated) — VOIP-PUSH-ON-OPEN-HANDOFF.md
  • Recents → GET /calls?extension=mine (after the endpoint reaches prod)

C. On-device to verify (needs the phone)

  • Call audio clean — no buzz after AEC/NS/AGC + hardware-AEC fix
  • Portrait-lock — rotating mid-call no longer drops the call UI
  • Pulse shows real /analytics/pulse numbers (no 0%/106%, no "13/day")
  • Inbound call — ring (foreground + locked) → answer → 2-way audio
  • Killed-app FCM wake rings (cold-start cred-restore)

D. Platform (staging → prod)

  • /analytics/pulse on staging (#529)
  • extension-CDR (?extension=mine) on staging (#530)
  • Promote both to prod
  • Enable more sip_port='wss' lines as users adopt (via the editor Mobile toggle)

E. Finish line

  • Fable-5 audits of the hand-written fixes (mic-perm, reactive tabs, ringing controls, audio APM)
  • Cutover — clean-room app becomes the shipping app; retire the fork; LICENSE → proprietary (the GPL-free finish)
  • Verify built AAB: no liblinphone*.so, no org.linphone.core, no linphone-sdk
  • Release eng — upload signing key / AAB, Play Console listing + screenshots, privacy policy, data-safety
  • Closed testing → staged production rollout

Next unchecked, in order

  1. On-device verify (B/C) — call audio + Pulse (needs you on the phone)
  2. Inbound call test (C) — flip ext 1003 → ext routing + a 2nd endpoint
  3. VoIP-push-on-open (B) — build the wake-registration feature
  4. Promote platform endpoints to prod (D) → wire Recents to extension=mine
  5. Audits (E) → Cutover → release