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.
62 lines
4.1 KiB
Plaintext
62 lines
4.1 KiB
Plaintext
The glyph in the status bar is the falcon, not a note.
|
|
`ic_soulstream_note.xml` is the logo kit's monochrome path verbatim
|
|
(`branding/soulstream-logo-kit/android/adaptive/ic_launcher_monochrome.svg`),
|
|
wrapped in a `<group>` that re-frames it for a 24dp box — an Android path
|
|
element has no `transform` attribute, so the SVG's own
|
|
`translate/scale/translate` chain is folded into the group's numbers and the
|
|
falcon lands x 4.91→19.09, y 2→22. The fill stays `#FFFFFFFF` on a
|
|
transparent viewport because Android composites a notification's small icon
|
|
from its ALPHA CHANNEL and tints it itself: a coloured export renders as a
|
|
white blob. Nothing in the walk can tell those two apart — `dumpsys
|
|
notification` prints the icon's RESOURCE ID and never a pixel — so the glyph
|
|
is a screenshot, and the only thing the walk can prove is the thing that
|
|
actually breaks. `media-card` proves it: after `resumed`, the card is still
|
|
posted, on the `playback` channel, carrying the playing track's own title,
|
|
and `media-keys` a line below still gets the transport back.
|
|
|
|
The card's large icon falls back to the app's own icon. `MediaHub.art` is
|
|
cleared the moment `artKey` changes and only refilled once the frontend has
|
|
decoded a cover into bytes, and a track with no cover never refills it at
|
|
all — so without a fallback every track change has a window where the lock
|
|
screen shows a grey hole. `MediaHub.appIcon()` decodes the icon ONCE and
|
|
keeps it (`refresh()` runs on every position tick, so a per-update decode
|
|
would be a real cost), through the PackageManager rather than a resource id
|
|
because a library module's own R has no `ic_launcher`. It is drawn at
|
|
`setBounds(0, 0, 512, 512)`, and that is less obvious than it looks: an
|
|
`AdaptiveIconDrawable`'s bounds are the **72** units the launcher shows, not
|
|
the 108 its layers are drawn in — it scales its own layers up by 3/2 and
|
|
masks them inside whatever box it is handed, which is why its intrinsic width
|
|
is two thirds of the layer PNG. So the plain call already IS the launcher's
|
|
view, and a box set outside the tile to "reveal the 18% bleed" does the
|
|
opposite: it crops into the safe zone. The kit's foreground inks y 20.5→86.5
|
|
of 108, so a box 128 units oversize on each side would have shown 30→78 —
|
|
the head and the tail cut off. The same bitmap serves
|
|
`METADATA_KEY_ALBUM_ART`.
|
|
|
|
`android:appCategory="audio"` is contributed by the media-session plugin's
|
|
own library manifest. The app manifest lives in gitignored `gen/` and cannot
|
|
be edited from the repo, and it declares no category — so the merger takes
|
|
the library's, which is the one route there is.
|
|
|
|
Android 12+ draws a splash whether we ask or not, and the platform's own is a
|
|
white flash; `Theme.App.Starting` puts the brand ground (`#05080B`, the kit's
|
|
`night`) and `@mipmap/ic_launcher` there instead, and takes the window
|
|
background with it so the frame before the WebView's first paint is not white
|
|
either. It is delivered as a tracked res overlay, `src-tauri/android/res/`,
|
|
laid over the generated project by `build.sh` and `dev.sh` — the same move
|
|
`build.sh` already makes for `proguard-soulstream.pro`, and for the same
|
|
reason: `gen/` is regenerated and gitignored, so nothing of ours survives in
|
|
it. The overlay carries BOTH `values-v31/themes.xml` and
|
|
`values-night-v31/themes.xml`, and that pair is not belt and braces: the
|
|
resource qualifier order puts NIGHT MODE ahead of PLATFORM VERSION, so on a
|
|
dark-mode Android 14 phone the generated `values-night/themes.xml` beats a
|
|
lone `values-v31/` and the splash is silently ignored — on this phone, most
|
|
likely always. The style IS `Theme.app` (its parent), not a theme nothing
|
|
references, because `androidx.core:core-splashscreen` is not a dependency of
|
|
the app module: the platform attributes are the whole mechanism, there is no
|
|
`postSplashScreenTheme`, and `Theme.app` already is the post-splash theme.
|
|
Both overlay files replace `Theme.app` outright on API 31+, so anything a
|
|
later round adds to the generated `values/themes.xml` has to be added to them
|
|
too. The splash is a screenshot as well — it is gone before the walk's first
|
|
frame and `dumpsys` has no word for it.
|