No description
Find a file
Bruno Deanoz 965f1876bf simplify Live Call audio: remove MODE_IN_COMMUNICATION
MODE_IN_COMMUNICATION activates the telephony DSP pipeline which
degrades audio quality and requires setCommunicationDevice hacks for
speaker routing. The Gemini reference implementation doesn't use it.

Echo protection now relies on:
1. VOICE_COMMUNICATION AudioSource (built-in AEC/AGC/NS)
2. AcousticEchoCanceler on AudioRecord session (hardware AEC)
3. Hard ducking (zero mic chunks during model speech)

AudioTrack stays USAGE_ASSISTANT for full-quality speaker output.
This matches the WebRTC.ventures Gemini prototype architecture.
2026-06-24 13:55:46 +02:00
app simplify Live Call audio: remove MODE_IN_COMMUNICATION 2026-06-24 13:55:46 +02:00
gradle feat: KaizenIcons system — Lucide base, full Material Icons migration 2026-06-22 14:11:34 +02:00
.gitignore Remove temporary bug screenshots + ignore bugs/ dir 2026-06-24 03:27:53 +02:00
build.gradle.kts feat: offline-first cache layer with Room 2026-06-21 12:50:46 +02:00
CLAUDE.md Update CLAUDE.md with ChatScreenViewModel architecture 2026-06-24 10:10:43 +02:00
DESIGN.md feat: design system v2 — P3 colors, squircle shapes, glass surfaces, multi-theme, motion tokens 2026-06-21 14:32:25 +02:00
gradle.properties feat: offline-first cache layer with Room 2026-06-21 12:50:46 +02:00
gradlew fix: set gradlew execute permission 2026-06-23 07:15:17 +02:00
gradlew.bat Initial commit - Kaizen App 2026-06-18 15:08:09 +02:00
LATER.md feat: wire chat to the real Kaizen backend (in-app login + streaming) 2026-06-19 01:04:55 +02:00
OFFLINE_CACHE_ADD.md feat: offline-first cache layer with Room 2026-06-21 12:50:46 +02:00
PASSKEY_PLAN.md docs: passkey registration plan (WebAuthn/FIDO2 via Credential Manager) 2026-06-23 01:53:04 +02:00
README.md feat: wire chat to the real Kaizen backend (in-app login + streaming) 2026-06-19 01:04:55 +02:00
settings.gradle.kts Initial commit - Kaizen App 2026-06-18 15:08:09 +02:00

Kaizen — Android

Native Android-App für Kaizen (Jetpack Compose + Kotlin). Kein WebView, kein Tauri.

Phase 1 — echtes Backend (aktiv)

Der Feel-Prototyp redet jetzt mit dem echten Kaizen-Backend — echte, gestreamte Antworten statt fakeReply. Die App ist deployment-agnostisch: ein Binary, das auf die offizielle Instanz ODER jeden Self-Host zeigt, über einen einheitlichen Authorization: Bearer-Contract. SaaS vs. Self-Host ist nur „welche Base-URL".

Drin:

  • In-App-Login (auth/LoginScreen.kt): Server-URL (Default = offizielle Instanz, editierbar = die „offiziell/Self-Host"-Adresse) + E-Mail + Passwort → POST {baseUrl}/api/v1/auth/tokenkzn_-Token. Kein Token-Copy-Paste.
  • Sichere Token-Ablage (net/SecureStore.kt): EncryptedSharedPreferences (AES-256-GCM, Schlüssel im Android-KeyStore/StrongBox) — der Token liegt nie im Klartext, auch nicht auf gerooteten Geräten.
  • Modell vom Server (net/SessionViewModel.kt): nach dem Login holt die App per GET /api/v1/me das vom Nutzer unter /settings/models gewählte Default-Modell — kein hartgecodetes Modell.
  • Echtes Streaming (net/KaizenApi.kt + net/StreamConsumer.kt): POST /api/v1/chat, liest den text/plain-Chunked-Stream inkrementell und strippt die Sentinels (Port von lib/chat/stream-consumer.ts aus dem Backend, JVM-unit-getestet).
  • Design + Haptik + Orb unverändert — nur die Datenquelle hat sich geändert.

Bewusst noch nicht drin (siehe LATER.md): Conversation-History vom Server, Passkey-Login nativ, Bild/Video, Biometric-Lock, WebSocket-Streaming.

Bauen & laufen

Wichtig: Auf dem echten S25 Ultra laufen lassen, nicht im Emulator — der Emulator kann keine echte Haptik, und genau die wollen wir fühlen.

  1. Projekt in Android Studio öffnen, Gradle syncen (neue Deps: OkHttp, kotlinx-serialization, security-crypto + INTERNET-Permission).
  2. S25 Ultra per Wireless Debugging oder USB verbinden.
  3. Run ▶ auf das Gerät → Login-Screen erscheint. Server-URL prüfen, einloggen.

DEFAULT_BASE_URL (net/ServerConfig.kt) ist die vorausgefüllte Instanz-Adresse — bei Domainwechsel hier anpassen.

Der Test

Eine Woche nutzen. Geht der Finger anfangen hierher statt zu Gemini → wir bauen voll aus (History, Passkey, Medien = Phase 2). Wenn nicht → wir wissen billig, woran's liegt.