android: the first run — a folder to keep music in, and an account to reach the network
Nobody had seen this app on a phone that has just installed it. On Android the library root is never missing — config.rs falls back to the app's own sandbox, a real folder nothing else can see — so "no folder yet" cannot be a null check, and setup_done has never been written by the phone, so every phone in existence reads as unstamped, Kyle's included. The tour therefore opens on three clauses, not one: no flag, no saved account, and no records, read only after the library and the credentials have both answered. Two cards, skippable, and no password anywhere in it — the Soulseek step goes to the card on Community and stops. Every screen that is empty because of those two things now says so with the row that fixes it: Home (whose copy predated the folder picker), Library → Albums, Library → Artists, which had no empty state at all, and Search, where a flat sentence about signing in became the row that does it. A row goes away because the config moved, so the two doors onto the same folder tell each other — You re-reads when the tour moves it, the tour's store is told when You's own picker does — and the all-files row re-reads the grant when the system screen hands the app back, the way You already did. You → This phone opens the tour again as a preview that reads the config and writes nothing, which is the door the phone walk drives on Kyle's own device. The mock can answer as a fresh install now — an empty database, no account, no permission, the sandbox root — so the whole thing is walked end to end, and two commands that had no mock at all (player_control, open_external) got one on the way past. It is the mock walk's first reload, which turned up two things a reload does not clear by itself: the player writes the session back on pagehide, so the fresh block clears it from a pagehide listener of its own, and the viewport emulation lives on the DevTools session, so the harness hands it back after the re-attach.
This commit is contained in:
1 parent
46cf6a98fe
commit
95c2bfeeba
13 files changed
+633
-14
No files matched your search
@@ -1563,3 +1563,29 @@ html[data-motion="off"] *, html[data-motion="off"] *::before, html[data-motion="
|
||||
(`.m mono`, which .row does not give a face — leave that as it is rather
|
||||
than making these two rows disagree). */
|
||||
.row.folder-gone .t { color: #ffb4b4; }
|
||||
|
||||
/* ── the first run ───────────────────────────────────────────────────────
|
||||
A phone that has just installed the app: the tour's sheet, and the note
|
||||
the screens that are empty BECAUSE of it carry. Both are the app's own
|
||||
parts — .sheet-sec, .sheet-rows, .row, .stub — so there is almost nothing
|
||||
here: the folder's path, the foot's button, and the note's rows pulled
|
||||
out to the card's own edge so they read as part of the message rather
|
||||
than as a second card floating under it. */
|
||||
.setup-path {
|
||||
padding: 0 var(--pad) 10px;
|
||||
font-family: ui-monospace, "Cascadia Mono", Consolas, monospace;
|
||||
font-size: 11.5px;
|
||||
color: var(--text-muted);
|
||||
word-break: break-all;
|
||||
}
|
||||
.setup-foot { padding: 10px var(--pad) 4px; }
|
||||
|
||||
/* the note: one message, with the rows that answer it under a hairline */
|
||||
.setup-note .setup-rows {
|
||||
margin: 12px -16px 0;
|
||||
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);
|
||||
}
|
||||
.setup-note .setup-rows .row { padding: 10px 16px; }
|
||||
.setup-note .setup-rows .row + .row { box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.055); }
|
||||
.setup-note .setup-rows .row .t { font-size: 13.5px; }
|
||||
.setup-note .setup-rows .row .m { font-size: 12px; }
|
||||
Reference in new issue
Block a user