The phone downloaded every attachment and drew none of them, so a photo note
looked empty. Now:
- Cards show a note's first image and name its other files; the editor shows
every image at full width and every file as a row. Tapping one opens it in
whatever app handles its type (a cache copy under its real name, through a
FileProvider that serves only those copies). Each can be removed, and a file
the server refused says why under it.
- The editor's toolbar has an Attach button (any type, several at once). Files
are stored on the phone straight away and upload on the next sync that
reaches a server, through the core's step-6 path. Link previews show in the
editor too, and can be dismissed.
- Share → Inkwell accepts one or several images, with or without a caption,
finishing #1899's deferred image/* target.
- The FFI gains add_attachment, delete_attachment, delete_preview and
blob_path. The sync summary counts uploads and failed uploads.
Images decode at the size they are drawn (BitmapFactory sampling plus EXIF
rotation, small LRU cache), so no image library is added. Files over 50 MB are
refused on the phone before they are read whole into memory.
Task #5169.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>