feat(ui): gemeinsame Chatliste, Gruppenanrufe mit Beitreten-Karte, Bubble-Anrufansicht
- Chats: Direktnachrichten + Gruppen ohne Server zusammen, Filter-Chips (Alle/Ungelesen/Personen/Gruppen), Leerzustaende mit Handlung; virtuelles 'Raeume'-Symbol entfaellt, Server-Kanaele nur noch im Server - Gruppen: runder Gruppen-Avatar, Kopf mit Mitgliederzahl, Anruf-/Video-Knopf - Gruppenanruf: LiveKit + Anwesenheit, Start-Nachricht (Push), Karte 'Gruppenanruf laeuft · Beitreten', Hinweis-Karte im Verlauf - Anrufansicht: aneinandergedrueckte Bubbles (Federphysik, Sprecher waechst), Kacheln umschaltbar, Bildschirm automatisch gross, Gespraechsdauer, Matrix-Namen/-Avatare statt LiveKit-IDs - Tests: test/bubble_physics_test.dart Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
87b472a373
commit
de24053167
@@ -6,6 +6,8 @@ import 'package:matrix/matrix.dart';
|
||||
import 'package:pyramid/core/app_state.dart';
|
||||
import 'package:pyramid/core/matrix_client.dart';
|
||||
import 'package:pyramid/core/theme.dart';
|
||||
import 'package:pyramid/features/group_call/group_call.dart'
|
||||
show allowVoicePresenceForAll;
|
||||
import 'package:pyramid/widgets/mxc_image.dart';
|
||||
|
||||
enum CreateJoinTab { create, join, discover }
|
||||
@@ -100,15 +102,7 @@ class _CreateJoinDialogState extends ConsumerState<CreateJoinDialog> {
|
||||
// weil Continuwuity power_level_content_override beim createRoom
|
||||
// ignoriert.
|
||||
try {
|
||||
final plRaw = await client.getRoomStateWithKey(
|
||||
roomId, EventTypes.RoomPowerLevels, '');
|
||||
final pl = Map<String, dynamic>.from(plRaw);
|
||||
final events =
|
||||
Map<String, dynamic>.from(pl['events'] as Map? ?? {});
|
||||
events['io.pyramid.voice.presence'] = 0;
|
||||
pl['events'] = events;
|
||||
await client.setRoomStateWithKey(
|
||||
roomId, EventTypes.RoomPowerLevels, '', pl);
|
||||
await allowVoicePresenceForAll(client, roomId);
|
||||
} catch (_) {
|
||||
// Nicht kritisch — Presence-Anzeige funktioniert dann nur für Admins.
|
||||
}
|
||||
@@ -123,6 +117,10 @@ class _CreateJoinDialogState extends ConsumerState<CreateJoinDialog> {
|
||||
? [StateEvent(content: {'algorithm': 'm.megolm.v1.aes-sha2'}, type: EventTypes.Encryption)]
|
||||
: null,
|
||||
);
|
||||
// Gruppenanrufe: alle Mitglieder dürfen ihre Anwesenheit zeigen.
|
||||
try {
|
||||
await allowVoicePresenceForAll(client, roomId);
|
||||
} catch (_) {}
|
||||
}
|
||||
if (mounted) {
|
||||
ref.read(activeRoomIdProvider.notifier).state = roomId;
|
||||
@@ -581,7 +579,7 @@ class _SpaceEditDialogState extends ConsumerState<SpaceEditDialog> {
|
||||
try {
|
||||
await widget.space.leave();
|
||||
if (mounted) {
|
||||
ref.read(activeSpaceIdProvider.notifier).state = 'rooms';
|
||||
ref.read(activeSpaceIdProvider.notifier).state = 'dms';
|
||||
Navigator.of(context).pop(true);
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
Reference in New Issue
Block a user