Bernds Test 2026-10-08 (Streamen ging weder am PC noch am Handy, Ton kam
nicht an, Trenner blieb manchmal stehen) – mit neuem Live-Anruftest
(zwei Testkonten im selben Prozess) nachgestellt und behoben:
- Bildschirm teilen: Die Stromzuordnung rief ein SDK-getFeeds() auf, das es
nicht gibt; der Fehler wurde geschluckt → Übertragungen wurden nie
angezeigt und beim Sender nie als aktiv erkannt. Jetzt typisierte
Zugriffe (remote/localScreenSharingStream, 'stopped' beachtet).
- Verbindungsaufbau: matrix-SDK verwirft Kandidaten, die vor der fertig
verarbeiteten Einladung bzw. während des Annehmens eintreffen; unter
Windows wirft getRemoteDescription zudem statt null zu liefern. Pyramid
puffert alle Kandidaten der Gegenseite und reicht sie direkt an die
Verbindung nach. Test: vorher nie verbunden, jetzt ~0,5 s (angerufen)
bzw. ~2,7 s (anrufend), Ton beide Richtungen, Teilen beide Richtungen.
- SDK-Aufrufe in eigener Zone: harmlose Plugin-Fehler (Lautsprecher unter
Windows) werden protokolliert statt durchzuschlagen; Ergebnisse/Fehler
per Completer über die Zonengrenze (sonst ewiges Warten).
- Sprech-Ring auch bei 1:1-Anrufen (Pegel aus WebRTC-Statistiken) – zeigt,
ob das eigene Mikrofon Ton liefert und ob die Gegenseite ankommt; großes
Bild springt nicht mehr bei jedem Sprechwechsel.
- „Neue Nachrichten“ mitten in einer Gruppe (mehrere Nachrichten desselben
Absenders) blieb bis zum erneuten Öffnen stehen: Inline-Trenner jetzt nur
mit Ungelesenem, blendet aus und trägt den Sprungschlüssel. Live-Test.
- „Anruf läuft“-Leiste nicht schon beim Klingeln.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Bernds Anruftest Handy↔PC (2026-10-07):
- Teilen am Handy: App "verkleinerte sich", Anruf danach weg. Ursache:
Android 14+ verlangt vor MediaProjection einen Vordergrunddienst vom Typ
mediaProjection; flutter_webrtc startet keinen, der Manifest-Eintrag
verwies auf eine nicht mehr existierende Klasse. Neu: CallService
(microphone|mediaProjection) + CallForeground: Zustimmung → Dienst
(wartet auf echten startForeground) → Mitschnitt. Emulator-Test (Android
16): mit Fix 1080x2400@30 läuft; Gegenprobe ohne Dienst wirft genau
'Media projections require a foreground service ...'.
- Dienst läuft während jedes Anrufs: Mikrofon bleibt im Hintergrund aktiv,
Benachrichtigung "Anruf läuft" führt zurück. Mikrofon-Typ nur mit
Berechtigung, sonst schmalere Variante statt Dienst-Abbruch.
- Handy hörte nichts: SDK schaltet Sprachanrufe auf die Hörmuschel. Jetzt
Lautsprecher als Standard (wie Discord) + Umschalter in der Anrufleiste.
- LiveKit-Teilen am Handy öffnete den PC-Quellen-Auswähler → System-Dialog.
- Im offenen Chat (Handy) Leiste "Anruf läuft · Zurück".
- Einstellungen → Sprache & Video: Mikrofontest mit Pegel (PC-Diagnose:
das Standardgerät lieferte nur Stille – Voicemeeter/virtuelle Geräte).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Bernds Test mit der PC-Testinstanz:
- ✓✓ erschien erst nach erneutem Öffnen: eine Lesebestätigung ohne neue
Nachricht zeichnete nichts neu (Raum-Update kommt im SDK vor der
Bestätigung). Jetzt nach jedem Sync Fingerabdruck der Lesepositionen
prüfen und bei Änderung neu zeichnen.
- Einladung: Chat zeigte leeren Verlauf, Annehmen ging nur in der Liste, und
danach blieb der Chat leer bis zum App-Neustart. Jetzt Annehmen/Ablehnen
direkt im Chat; Annehmen wartet auf den Beitritts-Sync, der Verlauf baut
sich bei invite→join selbst neu auf.
- Trenner blieb stehen, wenn nach dem Öffnen/Zurückkommen nicht gescrollt
wurde. Jetzt: neueste Nachrichten sichtbar (≤ halbe Bildschirmhöhe
hochgescrollt) → nach 6 s weich ausblenden, auch ohne Scrollen.
- Live-Test mit beiden Testkonten (Gegenprobe: ohne Fix rot) in
scripts/test.ps1 -Ui; Testlauf-Sperre erkennt nur noch eigene Testläufe.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- "Neue Nachrichten"-Trenner verschwand beim Öffnen aus der Benachrichtigung
sofort (Bernd). Jetzt: bei den neuesten Nachrichten angekommen noch 6 s
stehen, dann weich ausblenden; wer hochscrollt, behält ihn.
- Windows: mit PYRAMID_PROFILE_DIR heißt das Fenster "Pyramid - TESTINSTANZ"
(Testinstanz mit Testkonto nicht mit der echten Pyramid verwechseln).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Gleiche API, gepflegter Nachfolger. Rendertest für die Markdown-Vorschau
(test/document_markdown_test.dart).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Die App signierte LiveKit-Tokens selbst – dafür steckte das SFU-Secret im
App-Code (jeder mit der APK konnte sich Tokens für beliebige Räume und
Identitäten ausstellen). Jetzt holt die App das Token von der bereits
vorhandenen Server-Route /api/livekit-token (whoami-Prüfung, Identität =
geprüfte Matrix-ID). Secret und JWT-Signieren sind aus dem Client entfernt.
- Lesbare Fehlermeldungen (offline, 401, Serverfehler) statt stiller Fehler.
- Gruppenanruf aus dem Chat-Kopf übergibt jetzt den Matrix-Client.
- Tests: Unit-Test mit Mock-HTTP + echter LiveKit-Beitritt (Testkonto).
- Offen: Handy-Anruftest; danach Secret-Rotation durch Bernd (Doku).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- Handy: Chat gleitet federnd über die Chatliste (Liste bleibt aufgebaut,
Scrollposition erhalten), beim Zurück wieder hinaus; Liste schon während
des Hinausgleitens bedienbar. Mitgliederleiste gleitet herein.
- Neue/gesendete Nachrichten ploppen weich auf (nur live, nicht beim Öffnen
oder Nachladen), Reaktionen ploppen auf und hüpfen beim Hochzählen,
Ungelesen-Zähler hüpft, Scroll-nach-unten-Knopf federt (Handy größer),
Antwort-Leiste klappt federnd auf/zu, Senden-Pfeil ploppt, Vollansicht
zoomt auf. Alles skaliert mit Einstellung „Animationen“ (0 % = aus).
- Fix: Beim Raumwechsel blieben Antwort-Ziel, Auswahl und getippter Text am
neuen Raum hängen (Antwort auf Raum A konnte in Raum B rausgehen). Jetzt
eigenes Eingabefeld je Raum mit Entwurf im Speicher.
- Antwort-Leiste: größeres Schließen-X auf dem Handy.
- Tests: test/spring_motion_test.dart, UI-Durchlauf mit Übergängen.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- Offener Chat meldete bei jedem Neuaufbau erneut "gelesen" – auch mit
App im Hintergrund; die gerade gezeigte Benachrichtigung verschwand dann
sofort wieder. Jetzt nur bei Fokus, je Event nur einmal.
- Zurück in der App: "Neue Nachrichten"-Trenner hinter dem zuletzt
gelesenen Stand, danach gelesen melden.
- "Lesebestätigungen senden" aus: nur noch private Bestätigung
(m.read.private) statt gar keiner – Ungelesen-Zähler stimmen wieder.
Gilt auch für "Gelesen" aus der Benachrichtigung.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Bernds Wunsch 2026-10-07: Die Nachrichtenliste reicht jetzt bis ganz unten;
Tipp-Anzeige und Eingabefeld schweben darueber. Um das Feld herum ist die
Flaeche klar (Chat sichtbar), aber beruehrungsdicht - dort reagiert nur die
Eingabe. Hinter dem Feld selbst Milchglas (Unschaerfe + 78 % Flaeche), Rahmen
und Fokus-Ring aussen. Die Liste bekommt unten genau die gemessene Hoehe der
Leiste als Abstand (MeasureSize; waechst mit Antwort-Leiste/mehrzeiligem
Text), damit die neueste Nachricht ganz ueber die Leiste scrollt; der
Nach-unten-Knopf sitzt darueber.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
_ReplyPreview nutzt den Sprung-Mechanismus der Suche (pendingJumpEventProvider).
Der Sprung scrollt jetzt schrittweise Richtung aeltere Nachrichten, wenn das
Ziel zwar geladen, aber in der lazy ListView noch nicht gezeichnet ist (vorher
gab er dann nach 40 Versuchen auf); dasselbe Zitat darf erneut angetippt
werden. UI-Durchlauf prueft den Sprung per Screenshot.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Bernds Feedback 2026-10-07:
- Schrift-Standard Handy 110 % (statt 115 %).
- PyrIconBtn: im Handy-Layout Symbol 22 px (vorher fest 16), Flaeche 40,
Tippflaeche 44; Farben aus dem Farbmodus statt fest verdrahtet.
- Eingabeleiste: Anhaengen/GIF/Emoji/Senden auf dem Handy 22-23 px statt
12-13 px.
- Chat-Kopf (Handy): Anrufen + Videoanruf sichtbar, Suchen + Mitglieder im
Drei-Punkte-Menue.
- Aufklappbarer DM-Kopf als Ebenen: Zurueck + Symbole bleiben oben,
Profilbereich gleitet darunter und nutzt die volle Breite (vorher Name zu
"p..." gekuerzt, Symbole rutschten in die Mitte); Kuerzel im Avatar
mittig, skaliert mit.
- SpringPress (widgets/spring_press.dart): federnde Druck-Rueckmeldung,
aus bei "Animationen 0 %".
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- rooms_mobile_tile.dart: auf dem Handy grosser Avatar, Name + Uhrzeit der
letzten Nachricht, Vorschau (gleiche Texte wie Push: Medien-Labels,
Antwort-Zitat entfernt; "Du:" bzw. Absender in Gruppen), Ungelesen-Zaehler.
PC behaelt die kompakte Liste, Voice-Kanaele ihre Darstellung.
- utils/date_labels.dart: chatListTime (heute Uhrzeit, Gestern, Wochentag,
Datum; sicher an Zeitumstellungs-Tagen) + 5 Tests.
- Sichtbare englische Texte eingedeutscht (Chats durchsuchen,
Direktnachrichten, Raeume, Nachricht..., Mitglieder, Suchen, ...).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Bernds Entscheidungen 2026-10-07:
- theme.dart: ThemeVariant (Dunkel = neues weiches Dunkelgrau als Standard,
Schwarz = bisheriges Fast-Schwarz, Hell) mit PyramidPalette; Nebentexte
kontrastreicher. Alte Einstellung theme_dark wird uebernommen
(dunkel -> weiches Dunkel). Fest verdrahtete Dunkelfarben im Profil-Popup
und GIF-Picker folgen jetzt dem Farbmodus.
- appearance.dart: Schriftgroesse = Pyramid-Regler x Systemeinstellung
(Handy-Standard 115 %, PC 100 %), MessageStyle Automatisch/Sprechblasen/
Liste, gemeinsame isMobileLayout-Regel.
- message_bubbles.dart: Sprechblasen-Darstellung (eigene rechts in
Akzentfarbe, Gruppen mit Name + Avatar, Bilder ohne Blase in voller Groesse);
Listen-Darstellung unveraendert, Weiche in MessageGroup.
- Formatierte Nachrichten (u. a. Antworten) nutzten RichText ohne
Schriftskalierung -> erschienen kleiner; jetzt Text.rich.
- Einstellungen auf dem Handy als ganze Seite, Schalter unter dem Text.
- UI-Durchlauf um Liste/Hell/Gruppe/Einstellungen erweitert; Tests fuer
Theme-Varianten, Uebernahme alter Werte, Schriftfaktor, Darstellung.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- 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)
Qualitäts-Review-Befund (a): Alle 6 part/part-of-Aufteilungen hatten Code
vollständig übernommen (Zeilen-Multiset-Vergleich Original vs. heutiger
Stand: keine Code-Zeile verloren, keine hinzugefügt), ABER erklärende
Kommentare über den Klassen gingen verloren (24 Blöcke, u. a. die
HTML-Subset-Doku über _MatrixHtmlText, die Selbst-Aussperr-Warnung über
updatePowerLevelsSafely, TURN-Verbrauchskarte, PDF-Cache/Viewer-Doku).
Alle an den richtigen Klassen wiederhergestellt; reine Trennlinien und
ALL-CAPS-Abschnittslabels bewusst nicht (Gott-Datei-Navigation, durch
die neuen Dateinamen ersetzt).
Co-Authored-By: Claude Fable 5 <[email protected]>
Sechster Durchgang derselben part/part-of-Technik wie bei den 5 vorigen
Umbauten - reine Verschiebung, keine Logikänderung. document_viewer.dart
schrumpft von 1773 auf 20 Zeilen (nur noch Bibliothekskopf), 34
Top-Level-Bloecke (31 Klassen/Enums + 3 lose Funktionen) auf 5 thematische
Dateien unter lib/features/chat/document/ verteilt. Verifiziert per
automatisiertem Blockvergleich gegen das Original und flutter analyze
(weiterhin nur 1 bekannter Hinweis).
voice_channel.dart und app_shell.dart bewusst nicht angefasst - haengen an
der noch unentschiedenen Call-Fassade bzw. dem Bootstrap/Login-Pfad.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Fünfter und letzter Durchgang der part/part-of-Aufteilung - reine
Verschiebung, keine Logikänderung. chat_view.dart schrumpft von 2116 auf
33 Zeilen (nur noch Bibliothekskopf). Verifiziert per automatisiertem
Blockvergleich gegen das Original und flutter analyze.
Damit sind alle 5 in der M2-Ist-Analyse gefundenen Gott-Dateien aufgeteilt;
ROADMAP-Punkt "Toten Code & Duplikate entfernen, Ordnerstruktur
vereinheitlichen" abgehakt.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Gleiche Technik wie bei settings_modal.dart: reine Verschiebung per Dart
part/part-of, keine Logikänderung. message_group.dart schrumpft von 2775
auf 30 Zeilen (nur noch Bibliothekskopf). Verifiziert per automatisiertem
Blockvergleich gegen das Original und flutter analyze (Baseline unverändert).
Co-Authored-By: Claude Sonnet 5 <[email protected]>
message_bubble.dart war vollständig unbenutzt (durch message_group.dart
abgelöst). Die zwei identischen _formatTime-Methoden in message_group.dart
zu einer Top-Level-Funktion zusammengeführt - reine Extraktion, keine
Verhaltensänderung. flutter analyze bleibt sauber.
- document_viewer: Matrix4.translate/scale durch translateByDouble/
scaleByDouble ersetzt (PDF-Zoom-Transformation, gleiches Verhalten)
- rooms_panel: onReorder durch onReorderItem ersetzt (Index-Korrektur
jetzt intern erledigt), implementation_imports-Hinweis kommentiert
(SpaceChild wird vom matrix-Paket nicht öffentlich exportiert)
- voip_manager: getSources()-Override kommentiert (erzwungen durch
abstrakte MediaDevices-Klasse, die die Methode selbst deprecated hat)
- settings_modal: BuildContext-Nutzung nach await mit context.mounted
abgesichert (Geräte umbenennen, Passwort-Abfrage bei Massenlogout)
Verbleibend: chat_provider.dart onUpdate (Timeline-Redecrypt-Pfad,
bewusst nicht angefasst ohne dedizierten E2EE-Test, siehe PROGRESS.md).
Ungenutzte Imports (dart:typed_data, flutter/services.dart), unnötige
String-Interpolations-Klammern, führender Unterstrich bei lokaler Funktion,
fehlende Blockklammern bei if-Statements und SCREAMING_CASE-Konstanten in
clipboard_image.dart auf lowerCamelCase umbenannt. Rein mechanisch, keine
Verhaltensänderung.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Dart 3 erlaubt mehrere Wildcard-Parameter mit demselben Namen "_" in
einem Scope, daher sind __ / ___ für ungenutzte Callback-Parameter
(pageBuilder, errorBuilder etc.) unnötig. Rein mechanische Änderung,
keine Verhaltensänderung.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
6 Wochen uncommittete Arbeit (Voice-Channels, LiveKit-Manager, Settings-Modal u.v.m.)
als ein WIP-Commit gesichert, damit nichts verloren geht und der Pi den aktuellen
Stand klonen kann. Thematische Aufarbeitung: siehe ROADMAP M0.
Co-Authored-By: Claude Fable 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01CPrAGBxBT6GfPXzeWQ4AXb
open_file_plus 3.4.1 uses deprecated PluginRegistry.Registrar API incompatible
with current Flutter. Replaced with a MethodChannel in MainActivity.kt that calls
FileProvider.getUriForFile() and launches the system package installer directly.
Also rework chat_input: 4px border radius on desktop, vPad 18px, 56px send button.
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>