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>
apps/mobile is a Matrix client for Android on the famedly Matrix Dart SDK,
with vodozemac (compiled from Rust during the build) for end-to-end
encryption. It speaks the plain Client-Server API and uses the web
client's design tokens, fonts and symbol.
- Sign in by server name (.well-known), homeserver address or full user ID;
sign up with the dummy and registration token stages. Sessions survive
restarts: SQLite in private storage, credentials also in the Keystore,
both excluded from backups and device transfers.
- Room list with unread and mention counts, invites, search and filters.
Timeline with grouping, day separators, notices, history on scroll,
links, images and files (authenticated media). Sending text, photos,
camera shots and files, with Sending/Sent/Read/Not sent and Retry.
Typing, receipts, deleting. New rooms and DMs, encrypted by default;
joining by address; room info with members, invite, rename, topic,
notification level, leave.
- Encryption: one-step setup behind a recovery key, verifying a new session
with the recovery key (restoring the backup) or another session, emoji
verification of people and sessions, reset. Undecryptable messages say
why. Session list with verify and sign out.
- Notifications while running, and push through UnifiedPush (no Firebase):
the distributor's endpoint becomes an event_id_only pusher, the gateway
is discovered, and a push starts the app headless to fetch, decrypt and
show the event.
Make targets: mobile (release APKs per ABI into bin/), mobile-run,
mobile-test. Kotlin incremental compilation is off (Windows, project and
pub cache on different drives), and Tink's JVM artifact is excluded in
favour of tink-android.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>