Everything written this session that has not been through the device: rounds 43 to 48 (each patch adversarially verified, 43's transient-notice expectation fixed), a partial round 49, the pipeline scripts, the Android Auto design and the icon comparison mock. Also the two harness changes that were never A/B'd — adaptive waits, which may only shorten a declared wait and never lengthen it, and a ship that runs the mock walk and the deploy at the same time. The A/B and its 255-step baseline are in handoff/tools; main stays at what the phone has actually walked.
21 lines
1.3 KiB
Plaintext
21 lines
1.3 KiB
Plaintext
android: a playlist, out of the phone
|
|
|
|
The desktop has had Export since playlists v2 and the phone had no door onto
|
|
it for one honest reason: `tauri-plugin-dialog` does open Android's
|
|
create-document sheet, but it answers with a `content://` URI and
|
|
`playlist_export` wrote with `std::fs::write`, which cannot take one. The
|
|
storage plugin grew a `create_document` whose Kotlin writes the bytes through
|
|
the ContentResolver — a plugin function called from Rust, not a command, so
|
|
the file never passes through the WebView and nothing was added to the ACL —
|
|
and `playlist_export` now builds the file above the platform fork with the
|
|
same `playlist_formats` writers, so the phone rebuilds no format and the two
|
|
exports cannot drift. The door is the playlist's own sheet, on the page and
|
|
on the shelf card, with the desktop's five profiles in the desktop's order; a
|
|
dismissed sheet says nothing, because nothing happened. The mock walk drives
|
|
it three ways — a file written where the sheet pointed, a sheet dismissed, a
|
|
refusal read back as a sentence — and the phone walk opens the real sheet and
|
|
dismisses it with BACK, writing nothing to the phone. The Kotlin is unbuilt:
|
|
nothing in this tree compiles it, though it is written against
|
|
tauri-android's own `PluginHandle`, `Invoke` and `JSObject` rather than
|
|
against a guess at them.
|