refactor: M2-Call-Pilot – Module call_signaling + voice_channel mit Fassaden (Entscheidung 2)

- CallSignalingService/callSignalingProvider und VoiceChannelService/
  voiceChannelProvider als einzige oeffentliche Schnittstellen
- voip_manager.dart / livekit_call_manager.dart in ihre Module verschoben,
  Logik unangetastet (nur Klassen-Koepfe, @override, Imports, Provider-Namen)
- Alle Konsumenten entkoppelt; Kompositions-Punkt matrix_client.dart als
  dokumentierte Ausnahme. analyze sauber, 29 Tests gruen, Windows-Start ok.
  Call-Klick-/Geraetetest steht aus (PROGRESS.md)
This commit is contained in:
Bernd Steckmeister
2026-07-06 12:42:59 +02:00
parent f64398d3c6
commit 3c7eb9ddca
20 changed files with 383 additions and 53 deletions
+55
View File
@@ -13,6 +13,61 @@ Schritt (und beim Abbruch mitten im Schritt den Zwischenstand). Format:
---
## 2026-07-06 M2-Call-Pilot: Module call_signaling + voice_channel mit Fassaden umgesetzt (Entscheidung 2)
**Erledigt:** Das erste M2-Umbau-Modul nach `docs/M2_MODULE_SCHNITT.md`
(Bernds Entscheidung 2: Call-Pilot zuerst, nicht settings_modal):
- **Zwei neue Module mit schmaler öffentlicher Schnittstelle:**
`lib/features/call_signaling/` (`CallSignalingService` +
`callSignalingProvider`; Implementierung `voip_manager.dart` hierher
verschoben) und `lib/features/voice_channel/` (`VoiceChannelService` +
`voiceChannelProvider`; Implementierung `livekit_call_manager.dart`
hierher verschoben). Die zwei Call-Mechanismen bleiben wie im Doc
begründet GETRENNT (Matrix-1:1-VoIP vs. LiveKit-SFU-Kanäle).
- **Alle Konsumenten entkoppelt:** app_shell, Call-UI (`voice_channel.dart`,
`mini_call_widget.dart`), Rooms-Panel (Join/Leave, Call-Dock),
Chat-Header (Call-Start), Settings (`_VoiceSection` ist jetzt
ConsumerStatefulWidget und nutzt die Provider statt der Singletons)
niemand importiert mehr die Implementierungsdateien, repo-weit verifiziert.
Einzige dokumentierte Ausnahme: `matrix_client.dart` als Kompositions-
Punkt, der `PyramidVoipManager(client)` konstruiert. Die alten Provider
`callStateProvider`/`voipStateProvider` in app_state.dart sind ersatzlos
durch die Modul-Provider ersetzt (reine Umbenennung + Typ = Interface).
- **Bewusste Abweichungen vom Schnitt-Entwurf** (Verhaltensgleichheit vor
Schönheit, heiliger Call-Pfad; im Doc-Status-Kopf dokumentiert):
ChangeNotifier statt Streams, Methodennamen wie im Bestand
(`startCall`/`hangUp` statt `join`/`leave`), `CallSession` und
LiveKit-`Room` bleiben in den Schnittstellen sichtbar (UI rendert direkt
Renderer/Tracks für die WebRTC-Renderer sieht das Doc das selbst vor).
Kein einziger Handler-/Logik-Block wurde verändert, nur Klassen-Köpfe
(`extends` + `@override`), Imports, Provider-Namen und Typ-Annotationen.
- **Geprüft:** `flutter analyze` sauber (nur bekannter onUpdate-Hinweis),
alle 29 Tests grün, `flutter run -d windows`: App startet, Login/Sync/E2EE
laufen, sauberer Quit. (Commit-Hash siehe git log dieses Eintrags.)
**UNGETESTET (interaktiv/Gerät deshalb ROADMAP-Punkt „Call-Schicht
entwirren" nur annotiert, nicht abgehakt):** echter Voice-Channel-Join per
Klick auf Windows und echter 1:1-Call zwischen zwei Geräten. Der Umbau ist
bewusst rein mechanisch (Fassade davor, Logik unangetastet), aber die
CLAUDE.md-Regel „nach Refactoring Kernflows prüfen" ist für die Call-Flows
erst nach einem Klick-/Gerätetest voll erfüllt steht im PC_TESTPLAN
(Abschnitt 8) bzw. braucht Bernd/Uta.
**Offen/Nächster Schritt:** Härtetest nach `docs/PC_TESTPLAN.md` (so weit
ohne Klick-Interaktion möglich); die inneren M2-Aufräumarbeiten der
Call-Schicht (UI-State aus den Managern, `call_ui`-Modul, storage-Fassade
für die voice_*-Prefs) folgen als eigene Schritte.
**Stolperfallen:** (1) Bei part-Dateien (settings, rooms_panel, chat_view)
hängen die Imports an der EINEN Owner-Datei wer eine part-Datei umstellt,
muss die Imports beim Owner ändern und findet Verwender nur per Repo-grep
auf den Provider-Namen. (2) Ein `ChangeNotifierProvider<Interface>` braucht
ein Interface, das ChangeNotifier ERWEITERT (abstract class X extends
ChangeNotifier), sonst passt der Typparameter nicht.
---
## 2026-07-06 SQLCipher-Migration UMGESETZT + auf Windows mit echter DB praxisgetestet (M1, Bernds Prio 1)
**Erledigt:** Der M1-Punkt „Sichere Speicherung von Access-Token & Krypto-DB"