PARITY: record the Android revert and what came back

This commit is contained in:
Paul Hitt
2026-09-03 19:24:10 -04:00
parent eff8cdb493
commit 22189bea93
+29 -5
View File
@@ -93,16 +93,16 @@ From `E2E/E2EInbox.swift`, which is the real feature list.
| Multi-device fan-out | ✅ one envelope per device, partial delivery reported |
| History at rest | ✅ encrypted, keyed by person not device |
| Session restore across restarts | ✅ credential and device both survive |
| Reactions | 🟡 codec done, no UI — blocked on the transcript carrying a `mid` |
| Edit a sent message (§6.15) | 🟡 codec done, in progress — an inbound edit is recognised and not drawn as a duplicate bubble; applying it needs the same `mid` |
| Reactions | ✅ transcript carries a `mid`; long-press gives a five-emoji row, one emoji per person |
| Edit a sent message (§6.15) | 🟡 codec back, and the `mid` it was blocked on now exists — applying an inbound edit and offering the control are UI work |
| Drafts that survive a relaunch | ✅ sealed in the vault, not SharedPreferences |
| Forwarding (§6.16) | 🟡 codec done, in progress — an inbound forward is recognised and shown as one; originating needs #10 |
| Forwarding (§6.16) | 🟡 codec back; originating needs the UI |
| Group message ids and quotes (§6.9) | ✅ transcript stores both; sent and queued copies share one id |
| Mentions (§6.18) | ✅ codec, an `@` picker in the group composer, and ids recorded at pick time rather than re-derived from the text |
| Per-message timers (§6.17) | ✅ combining rule and per-message pruning; composer control in progress |
| Reactions | 🟡 codec done, no UI |
| Search inside messages | ✅ scanned, never indexed |
| Search inside messages | ✅ scanned, never indexed — no plaintext index at rest |
| Pinned message (§6.19) | 🟡 codec done, in progress — an inbound pin is recognised and not drawn as an empty bubble |
| Pinned message (§6.19) | 🟡 codec back; the banner and the control are UI work |
| Photos | ✅ send via the system picker, render inline |
| Voice notes (record + play) | ✅ AAC/MP4, tap to record, tap to send |
| Stories, and seen-state | ✅ sent per-contact, expired bytes deleted |
@@ -150,6 +150,30 @@ emulator.
---
## The 2 September revert
Twenty-five Android merge requests landed that evening and `aebf41e`
reverted all of them — 5,016 lines across 41 files — for the same reason iOS
was reverted an hour earlier: the branches had never existed together, and
resolving them mechanically produced code that compiled and passed while
being wrong.
**All twenty-five are back**, reinstated one at a time on
`feat/files-and-wallet-parity`, each built and tested before the next was
started. Six of them could not be cherry-picked at all: the originals were cut
from a tree whose story features looked different from the versions rebuilt in
the meantime, so applying them whole would have left two implementations of
mute, text stories and story replies under different names — no compile error,
and exactly the kind of divergence that rots. Those were taken by hand, feature
by feature.
⚠️ One deliberate divergence from the originals: the mention wire key stays
`men`, not `ment`, and mentions are `List<Int>` rather than `List<Long>`. That
is what the iOS engine speaks and what the two were verified interoperating on;
switching to match the reverted commits would have broken iOS silently.
---
## Files and Wallet
From `Sources/Views/Files/*` and `Sources/Wallet/*`, both of which moved into