android: the repair sheet, browse, every long-press sheet, You's last sections, the lyrics tools — and the walk's audio check made honest
The playlist repair (Find a local match: the library searched by the row's name, a pick relinks it through playlist_relink_item; an unknown row takes the track's identity). A peer's sheet on the raw results (play or save the folder, browse their files, message, buddy) and the Browse screen — the hub's Browse tab: a user's whole share with sizes and totals, a folder played or saved whole; a share can hold thousands of folders, so it filters and renders 80 at a time. "Look up a user" on Community → Buddies. The sheets the phone lacked: a queue row's (Play now, Move to next, Remove from queue), a catalog song's, a catalog card's and the record page's own, a raw file's (in the results and in Browse), a room name's, a buddy's, the now-playing Save (the desktop's Save menu for a streamed track or record). The artwork viewer with pinch zoom, one layer the back gesture peels. Search's recent searches and its spelling suggestion from the names this phone knows. You → Streaming, Downloads, Sharing, Lyrics, Album artwork, and Clear play history; a record's Re-fetch the cover. The lyrics tools on the sheet's face: the offset nudged and kept per track, another LRCLIB candidate chosen, the lookup forgotten and done again (lyrics.svelte.js, shared by the face and the lyrics sheet). The harness: every CDP call times out and the reload step re-attaches (a WebView that stopped answering hung a walk for ten minutes); the audio check counts SoulStream's own tracks' underruns from the mixer dump instead of the thread-wide counters that any app's notification moves — the afternoon's "dropouts" were other apps' sounds, and the browse of a 49,544-file share measured at zero; __settle resets every tab to its root through the nav; an adb step kind; the walks cover all of the above on the mock and on the phone.
This commit is contained in:
1 parent
6e39dc43f3
commit
26928b706d
21 files changed
+1294
-92
No files matched your search
+81
-12
@@ -172,6 +172,46 @@ namesake), the catalog's released records minus the shelf's by loose title,
|
||||
dimmed cards that open the catalog record page, the totals remembered in
|
||||
`library.gaps.v1` so the line says its number before the lookup.
|
||||
|
||||
## A peer, and their shares
|
||||
|
||||
A raw result's ⋯ (or a long press on its head) is the peer's sheet: play
|
||||
the folder as a record, save it to the library as it is, browse their
|
||||
files, message them, add or remove them as a buddy. **Browse** is the
|
||||
hub's Browse tab as a screen (`screens/Browse.svelte`, `slsk_browse_user`)
|
||||
— the same sheet is a buddy's on Community → Buddies (a long press), and
|
||||
"Look up a user" there opens it for any name typed (the hub's browse by
|
||||
name):
|
||||
every folder they share with its files, sizes and formats, the totals in
|
||||
the header; a folder opens to its files, plays through the stream engine
|
||||
or saves whole. One request for the whole share, so a big one takes a
|
||||
moment — and a share can hold thousands of folders (the first peer the
|
||||
walk met: 7,511 folders, 158,937 files, 2.4 TB), so the screen shows a
|
||||
filter and renders 80 at a time with a "more" button; rendering all of
|
||||
them at once cost an audio dropout. The phone walk browses the first peer
|
||||
of its network search.
|
||||
|
||||
More long presses: a catalog song in the search results opens the catalog
|
||||
track's sheet (play, save, add to a playlist, the record, the artist); a
|
||||
row of the queue face opens the track's sheet with Play now, Move to next
|
||||
and Remove from queue on top; a raw result's file (and a file on the Browse
|
||||
screen) opens its own — play from here, save this one file, browse; a name
|
||||
in a room's list opens the peer sheet. The catalog record page's bar ⋯ is
|
||||
the record's sheet: play, save, add every track to a playlist as streams,
|
||||
the artist — and the same sheet is a long press on any catalog card (the
|
||||
results' Records rail, Home's feed, the Gaps shelf). The now-playing
|
||||
sheet's lyrics face has its tools on a long press or the link under the
|
||||
words (`lyrics.svelte.js`, the desktop's): the offset nudged half a
|
||||
second at a time and kept for the track, another LRCLIB candidate chosen
|
||||
when the words are wrong, the lookup forgotten and done again. A record's
|
||||
sheet re-fetches its cover (the desktop's per-record refresh); You →
|
||||
Library clears the play history behind a confirm. The now-playing
|
||||
sheet's ⋯ on a streamed track is the desktop's
|
||||
Save menu: Save to library (at once when the cache is byte-complete, else
|
||||
through the download pipeline) and Save this record for the streamed
|
||||
record the queue holds. Search corrects an obvious misspelling from the
|
||||
names this phone knows (the library, the searches that worked) — the desktop's rule,
|
||||
a word only when a real name is within two edits.
|
||||
|
||||
## Playlists
|
||||
|
||||
The desktop's two playlist pages (`src/views/Playlists.svelte`,
|
||||
@@ -203,7 +243,11 @@ describe / pin / duplicate / delete, `playlist_add_items`,
|
||||
slice starts at its cue (`t.startSecs`) and the player moves on at the
|
||||
next cue (`t.endSecs`); the scrubber still shows the whole recording.
|
||||
- **A row's sheet** (`pltrack`): Play from here, Play next, Add to queue,
|
||||
Save to library for a stream row, Go to artist, Remove from playlist.
|
||||
Save to library for a stream row, Find a local match for a row without
|
||||
a file (the desktop's repair panel as a sheet: the library searched by
|
||||
the row's name, a pick relinks the row through `playlist_relink_item`;
|
||||
an unknown placeholder adopts the track's identity), Go to artist,
|
||||
Remove from playlist.
|
||||
A removal is undoable for seven seconds from the neutral toast
|
||||
(`notice.svelte.js` — the desktop's undo pill); the stash pins the
|
||||
playlist it came from.
|
||||
@@ -240,8 +284,8 @@ describe / pin / duplicate / delete, `playlist_add_items`,
|
||||
itself (`adb shell am start -a android.intent.action.SEND …`).
|
||||
|
||||
Not on the phone yet: the file and folder import doors (the files are on
|
||||
the desktop), the listener door, the find-a-local-match repair panel, drag
|
||||
reorder, the cover picker, export, Share on SoulStream.
|
||||
the desktop), the listener door, drag reorder, the cover picker, export,
|
||||
Share on SoulStream.
|
||||
|
||||
## Settings that reach the config
|
||||
|
||||
@@ -254,6 +298,18 @@ back from the config). You → Sources is the desktop's Source quality
|
||||
section: per mode (streaming, downloads) the ceiling (no limit / lossy
|
||||
only), the floor (any … lossless only) and the priority (best quality /
|
||||
fastest transfer); the resolver re-reads them (`refreshSourcePrefs`).
|
||||
You → Streaming is the desktop's Streaming section: how long the stream
|
||||
cache keeps a track after its last play (or Forever — everything streamed
|
||||
goes to the library) and the cache's size limit. Downloads (the album
|
||||
folder format), Sharing (the library folder is always shared, the upload
|
||||
slots, extra shared folders picked on the phone), Lyrics (word-by-word
|
||||
fill) and Album artwork (canonical vs the uploader's art, the embedded
|
||||
cover size, the folder cover, re-fetch all covers) follow the same
|
||||
sections of the desktop's Settings. Not on the phone: the account (sign-in
|
||||
lives on Community), the networks, updates (the APK comes from the build),
|
||||
the lyric alignment models (a desktop runtime), artist artwork's upscaler.
|
||||
Search's empty page lists the recent searches this phone used (the last
|
||||
eight: Enter, or the screen left with a query in it), kept on the device.
|
||||
|
||||
## Background playback and the lock-screen card
|
||||
|
||||
@@ -430,9 +486,13 @@ shelf and a page with every row kind (a local row, the stream row through
|
||||
the resolver, the filter, a removal and its undo, unpin, rename, a new
|
||||
playlist, Add to playlist from a record's sheet, delete) → the import doors
|
||||
(a pasted tracklist, a link with its catalog verification, a share from
|
||||
another app) → You (the normalization switch and a source-quality chip,
|
||||
each read back from the config) → the sleep timer, asserts what each step
|
||||
should show, screenshots every step into `tests/mobile/out/`, and fails on
|
||||
another app) → the playlist repair (an unknown row relinked from the
|
||||
library) → the artwork viewer → a queue row's sheet → a catalog song's,
|
||||
a catalog card's and the record page's sheets → the now-playing Save →
|
||||
a peer's sheet, a raw file's sheet, a user's shares browsed and a folder
|
||||
of theirs streamed → a buddy's sheet → You (every switch and chip saved
|
||||
and read back from the config) → recent searches and a spelling
|
||||
suggestion → the sleep timer, asserts what each step should show, screenshots every step into `tests/mobile/out/`, and fails on
|
||||
any exception or console error. The mock answers every command the phone
|
||||
uses; one it does not know is named in the report (`[mock] no mock for X`)
|
||||
rather than surfacing as a TypeError toast, console warnings carry their top
|
||||
@@ -443,7 +503,11 @@ page after a confirmed delete was found).
|
||||
|
||||
The phone walk is the same driver on the real thing (plus a step kind of
|
||||
its own: `{ adb: [...] }` runs an adb command — the share-sheet intent, a
|
||||
key): a debug build's WebView
|
||||
key; every CDP call times out after 45 s and the reload step re-attaches
|
||||
to the page, since a WebView that stops answering once hung a walk for ten
|
||||
minutes; its audio check counts SoulStream's OWN tracks' underruns from the
|
||||
mixer dump — the thread-wide counters move with any app's notification
|
||||
sound, and sent the walk chasing dropouts that were not ours): a debug build's WebView
|
||||
exposes DevTools on `localabstract:webview_devtools_remote_<pid>`, `adb
|
||||
forward` puts it on a local port, and the steps run against the real library
|
||||
— real playback, real covers, the colour following the record — with the
|
||||
@@ -464,11 +528,16 @@ paused) without the walk.
|
||||
|
||||
## Not done yet
|
||||
|
||||
- Import (the desktop's import flow) on the phone.
|
||||
- Save and Transfers exist (You → Transfers, fed by `soulseek:download`; a
|
||||
live row cancels on tap; a long press on a catalog row offers the track's
|
||||
own Save).
|
||||
- Community's private layer (Spaces, holdings, the sealed inbox, friends by
|
||||
key) — Freenet on the phone is a later experiment; the network side is in.
|
||||
key, Who has it) — Freenet on the phone is a later experiment; the
|
||||
network side is in. Rooms and chat are built and mock-walked; a live room
|
||||
is Kyle's to join.
|
||||
- The desktop-only doors and tools: the file and folder playlist imports,
|
||||
the listener door and the lyric alignment models (a desktop runtime),
|
||||
playlist export and the cover picker, drag reorder, catalog track
|
||||
previews, the full discography page, the artist-artwork upscaler,
|
||||
updates and the account section (sign-in lives on Community).
|
||||
- Follows and the play history are per library folder, so the phone's own
|
||||
folder starts empty of both; they arrive with a shared library.
|
||||
- The artwork viewer: the cover at full size, pinch to zoom, one finger
|
||||
pans while zoomed, a tap on the unzoomed cover or the back gesture closes.
|
||||
Reference in new issue
Block a user