- Calls keep going with the app in the background: a foreground service
(CallService.kt, driven from lib/matrix/call_service.dart) declares the
microphone, the camera while it's on and the screen while it's shared.
Its notification (CallStyle) shows the call's length, opens the call
and hangs up. Swiping the app away ends the call.
- Screen sharing on Android: consent, then media projection on the
service, then LiveKit publishes a screen-share track. A shared screen
replaces the sharer's camera on their tile, shown whole and unmirrored;
stopping it from Android's controls stops the share.
- Read receipts per thread (MSC3771): an open thread sends receipts with
thread_id, "Read" under replies comes from receipts in the thread, and
threads with unread replies get a dot on "N replies" and in the list.
Not tested on a device yet. README updated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mobile:
- The room list's title picks a space: All chats, or one space, which
narrows the list to its rooms (and its subspaces' rooms).
- A space browser over /hierarchy: the rooms of a space and of its
subspaces, joined or joinable, with Join; for those who may, adding an
existing room or a new one to the space.
- New space in the new-chat sheet; invites to spaces show with the other
invites and open the space when joined.
- Fixes several setState calls that were handed a Future (reloading the
members, sessions, push distributor, threads), which Flutter rejects.
Server: /hierarchy left out children_state for a room without children.
The spec requires it on every room (an empty list), and SpaceRoom's
omitempty dropped empty lists too, despite its comment. The famedly Dart
SDK fails to parse such a response. The client API now wraps each room so
the field is always written; the federation response, which wants it left
out of the children it lists, is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Replies: Reply on a message's long press puts it above the composer;
sent replies quote the message they answer (sender and first line),
with the reply fallback left out of the body.
- Reactions: six quick ones and any other on long press, chips under the
message with counts, the user's own highlighted; tapping a chip adds or
takes back a reaction, a long press lists who reacted.
- Threads: Reply in thread opens a thread view (the root, then its
replies, older ones fetched from /relations, new ones live from the room
timeline) with a composer that sends into the thread. Thread replies
are hidden from the main timeline; the root shows "N replies". Room info
lists the room's threads (/threads).
The composer moved out of the room screen into widgets/composer.dart so
the room and thread views share it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>