Commit Graph
100 Commits
Author SHA1 Message Date
austinried 2552e1a10c match the disc header text case-insensitively in the screenshot test 2026-10-04 00:29:58 +00:00
austinried 64ec65d746 add a little more space above disc headers 2026-10-04 00:29:58 +00:00
austinried b8f8297c9b make disc headers read as section labels
The header was the same size as the track title, so render it uppercase
labelLarge with letter spacing to separate it from the tracks. Use the
outlined FiberSmartRecord icon.
2026-10-04 00:29:58 +00:00
austinried 5fe32c8766 show the disc icon on every disc header
DiscFull reads as an error icon, so use FiberSmartRecord, render it on
the "Disc N" fallback too, sit it 8dp from the edge with 8dp before the
text, and size it 20dp.
2026-10-04 00:29:58 +00:00
austinried 68a5787d9f add a disc icon next to disc titles
Use Icons.Rounded.DiscFull, which is distinct from the album tab's
Icons.Rounded.Album, and only beside a real title rather than the
"Disc N" fallback.
2026-10-04 00:29:57 +00:00
austinried 33e47e9654 suffix repeated disc titles with their disc number
When two discs of an album share a title, showing "Live" alone is
ambiguous, so render "Live: Disc 1"/"Live: Disc 2". Unique titles stay
as-is. Also drop the header from titleLarge to a semibold titleMedium so
longer titles fit on one line.
2026-10-04 00:29:57 +00:00
austinried 863c17be7d show album disc titles instead of generic disc numbers
Navidrome and gonic expose OpenSubsonic discTitles on the album response.
Parse them into a transient Album.discTitles map and persist each album's
titles in a child discs table (sourceId, albumId, disc, title) cascading
from albums. Songs keep only their disc number, and the album screen joins
by disc to render a title when one exists, falling back to "Disc N".

Titles are read opportunistically: a server that doesn't send discTitles
just leaves the table empty, so no API version negotiation is needed.
Titles apply to single- and multi-disc albums, are pruned when removed,
and are stored per album.

Schema 10 -> 11.
2026-10-04 00:29:57 +00:00
austinried d36c752c72 test the tab row reflows in a single direction during a switch
Drives the pager across the Artists to Playlists transition and asserts the
Songs icon only moves one way. Fails on the min-width clamp version (738-727-745)
and passes on the natural-48dp version. LibraryTabs is internal so the test can
drive its PagerState.
2026-10-04 00:29:57 +00:00
austinried 57957880d9 size the collapsed tab to 48dp so the label reflow never clamps
A min-width clamp kept an incoming tab at 48dp until its label passed ~4dp while the outgoing label shrank immediately, so the tab row dipped left and then grew right. With the tab naturally 48dp wide (8dp/16dp padding around the 24dp icon) the width tracks the label continuously and the row moves one way.
2026-10-04 00:29:57 +00:00
austinried 7009aa8ef5 keep the tab content left-aligned so min-size centring cannot shift the icons
Replace minimumInteractiveComponentSize (which centred the whole tab content and drifted as the active label expanded) with an explicit 48dp touch target whose content is aligned to the start. The icon position no longer depends on the label width.
2026-10-04 00:29:57 +00:00
austinried ef349f0346 revert the tab overlay clip measurement
Tracking the content position per frame made the inactive-tab colour split chase the layout instead of only following the indicator, so the icons jittered on a swipe. Go back to the stable tab-relative offset.
2026-10-04 00:29:57 +00:00
austinried 5b88792f72 address the code review findings
- offer a Sync button on a truly empty library tab so an empty library is not stranded (pull-to-refresh needs scrollable content)
- do not close the search field when it auto-syncs from a tab with an empty term
- make rememberArtworkColors nullable so the no-track fallbacks are live and the idle theme is the monochrome background
- measure the tab overlay content offset so the colour clip accounts for the touch-target centering
- put the pull indicator below the status-bar scrim, and seed the tab bar height estimate to avoid a first-frame inset jump
- collapse the two equal clearance constants, drop the redundant search imePadding, reuse the hoisted artwork for the mini player, and de-duplicate the mini player screenshots
2026-10-04 00:29:57 +00:00
austinried 60acdbeae3 theme the pull-to-refresh indicator from the artwork and stop the library reflow on search
- the indicator now uses the artwork primary and player surface instead of the default onSurfaceVariant
- keep the tab bar height in the list inset while searching so the content does not expand for a frame before the keyboard lands
2026-10-04 00:29:57 +00:00
austinried e031e92e2d pull to refresh, hide the bar while searching, animate the progress inset, circular warm damping
- replace the library sync button with pull-to-refresh on every tab
- hide the tab bar while searching so only the search field sits above the keyboard
- animate the mini player progress bar between full bleed and 8dp inset rounded ends as the tab bar comes and goes
- make the warm-hue saturation damping continuous across the 0/360 hue wrap
2026-10-04 00:29:57 +00:00
austinried 10b21303d2 address the adversarial review findings
- restore the library sync control removed when the tab bar was reworked, with a test that clicks it
- lift the search field above the tab bar instead of overlapping it
- give the tabs and settings/sync buttons 48dp touch targets
- drop the duplicated label semantics on tabs
- animate the library bottom inset so the bar does not jump when the mini player enters/exits
- remove imports and a parameter left dead by the header rework
2026-10-04 00:29:57 +00:00
austinried 13568b9bee raise the library fab elevation for a visible shadow 2026-10-04 00:29:57 +00:00
austinried 639c86bccc square the progress track ends, keep the rounded head 2026-10-04 00:29:57 +00:00
austinried c8231c88b4 make the mini player progress bar full width again 2026-10-04 00:29:57 +00:00
austinried 4e9932fc1e 3dp progress bar and 8/8/8/12 mini player padding 2026-10-04 00:29:57 +00:00
austinried 2a14f3bde5 try a 2dp mini player progress bar 2026-10-04 00:29:57 +00:00
austinried 675f235035 inset and round the mini player progress bar; align its cover art at 8dp 2026-10-04 00:29:57 +00:00
austinried 25aa7c2aea fill the tab bar safe area and keep the fab above the bar 2026-10-04 00:29:57 +00:00
austinried 4530335bd7 respect the nav bar inset for the tab bar and apply the artwork theme globally 2026-10-04 00:29:57 +00:00
austinried 9736d51955 restore the original mini player padding and tab bar height 2026-10-04 00:29:57 +00:00
austinried 7389316aa7 make the tab bar and mini player row both 64dp (8dp padding around the art) 2026-10-04 00:29:57 +00:00
austinried 1515cda836 match the mini player height to the tab bar 2026-10-04 00:29:57 +00:00
austinried 059016c64c make the mini player a little taller with a bigger album art 2026-10-04 00:29:57 +00:00
austinried ec7f525d42 move the library tab bar to the bottom above the mini player 2026-10-04 00:29:57 +00:00
austinried 018979909e let the tab bar wrap its content instead of filling the width 2026-10-04 00:29:57 +00:00
austinried 865366e755 line up the tab bar at 8dp, put the gear beside the tabs with a divider 2026-10-04 00:29:57 +00:00
austinried efd7518fc3 merge the settings into the tab bar and add a status bar scrim 2026-10-04 00:29:57 +00:00
austinried f07d1a66c9 make the edge-facing tab and settings corners square and flush 2026-10-04 00:29:57 +00:00
austinried 4fcdf7f5fb pad the tab container so it matches the settings container height 2026-10-04 00:29:57 +00:00
austinried e0ffb48715 put the tabs and settings in their own opaque rounded containers over a transparent header 2026-10-04 00:29:57 +00:00
austinried ab39fc259e overlay a translucent header onto the library content 2026-10-04 00:29:57 +00:00
austinried 40f20eaa40 clip the inactive tab copy out from under the indicator so the active colour is exact 2026-10-04 00:29:57 +00:00
austinried 938d7e0885 remove an accidentally committed jvm crash log and ignore them 2026-10-04 00:29:57 +00:00
austinried 29097711cf use a 3dp mini player progress bar 2026-10-04 00:29:57 +00:00
austinried a95236eb3e tighten the tab bar vertical padding 2026-10-04 00:29:57 +00:00
austinried 38f3766dd1 switch tab icon/text colour by hard overlay clipped to the indicator 2026-10-04 00:29:57 +00:00
austinried 76eb4a061d delay the tab icon and label colour transition 2026-10-04 00:29:57 +00:00
austinried 14f7f4c86e keep the indicator leading edge on the travel side to avoid a mid-swipe hitch; restore 12dp 2026-10-04 00:29:57 +00:00
austinried 9333cae0cc trim a hair off the tab label right padding 2026-10-04 00:29:57 +00:00
austinried 25d2e150e7 drive the tab label collapse and expansion from one transition 2026-10-04 00:29:57 +00:00
austinried 94a0326b4e stretch the leading edge of the tab indicator toward the target 2026-10-04 00:29:56 +00:00
austinried bad401b003 restore the single stretching tab indicator 2026-10-04 00:29:56 +00:00
austinried a780b4c2f4 tie the tab label reveal to the swipe and rebalance the pill padding 2026-10-04 00:29:56 +00:00
austinried 0825b8411c slim the active tab pill and reveal its label from the start 2026-10-04 00:29:56 +00:00
austinried 2464c26c79 replace the collapsing library title with expanding pill tabs 2026-10-04 00:29:56 +00:00
austinried 48235722db make the artwork primary brighter and more saturated 2026-10-04 00:29:56 +00:00
austinried ed4baf3c9b hold the active tab icon colour for the first part of a swipe 2026-10-04 00:29:56 +00:00
austinried 4a7a0aafca colour the selected tab from the artwork and raise the warm damping 2026-10-04 00:29:56 +00:00
austinried d1b5aaeeb7 smooth the warm damping so switching artwork does not flash 2026-10-04 00:29:56 +00:00
austinried 5e00bf86a8 lift warm tonal surfaces to the bright gradient tone 2026-10-04 00:29:56 +00:00
austinried 043c6201ba damp the saturation of warm tonal surfaces to avoid brown 2026-10-04 00:29:56 +00:00
austinried c56ae3f0ed revert the warm hue harmonisation 2026-10-04 00:29:56 +00:00
austinried a54a54ffa4 rotate warm artwork hues out of the brown/olive range for dark tones 2026-10-04 00:29:56 +00:00
austinried 97397e6e5e match the library header colour to the mini player 2026-10-04 00:29:56 +00:00
austinried 8ab4cbb0d0 tint the library background and fab from the current artwork 2026-10-04 00:29:56 +00:00
austinried a633a6c290 saturate the tonal mini player surface a little more 2026-10-04 00:29:56 +00:00
austinried c10aa2df8c make the mini player surface tonal instead of the saturated gradient colour 2026-10-04 00:29:56 +00:00
austinried 490ab8dbe4 address review: drop the stale duration carry, tint the split pill divider when disabled 2026-10-04 00:29:56 +00:00
austinried 6ae868c380 use 68 dp split pill segments 2026-10-04 00:29:56 +00:00
austinried 9299660bb2 widen the split pill segments a little more 2026-10-04 00:29:56 +00:00
austinried 521b11f9db optically centre the download icon and enlarge the split pill icons 2026-10-04 00:29:56 +00:00
austinried 3ea808e5cc widen the split pill segments and restore the 24 dp icons 2026-10-04 00:29:56 +00:00
austinried ebf0653ec4 join play and shuffle into one split pill 2026-10-04 00:29:56 +00:00
austinried a3de58b7b8 enlarge the play and shuffle button icons 2026-10-04 00:29:56 +00:00
austinried c1c7db71b0 widen the play and shuffle pills and inset the download and more buttons 2026-10-04 00:29:56 +00:00
austinried 0e55ce65f5 fix the restored position display, detail controls, mini player colour and source bar inset 2026-10-04 00:29:56 +00:00
austinried bd23f4369f update the architecture docs for the removed search index 2026-10-04 00:29:56 +00:00
austinried ef5bf40bf7 drop the unused FTS5 search index 2026-10-04 00:29:56 +00:00
austinried bf3afb9c17 drop the speculative legacy album sort migration 2026-10-04 00:29:56 +00:00
austinried f5948812bb address review round 3: keep the search bar across recomposition, fix tab landing, page the queried songs queue 2026-10-04 00:29:56 +00:00
austinried 605bd1a6c6 songs queue follows the applied sort and starred filter; clear a tab's search when leaving it 2026-10-04 00:29:56 +00:00
austinried d55406c85e address review: keep per-tab search visible and clearable, fix direction arrow, guard scroll reset, harden date parsing 2026-10-04 00:29:56 +00:00
austinried fc3beaee11 speed up the mini player animation 2026-10-04 00:29:56 +00:00
austinried 8fe6fb3282 animate the mini player with the keyboard instead of snapping 2026-10-04 00:29:56 +00:00
austinried d3c38604b5 delay the mini player's return until the keyboard has mostly slid away 2026-10-04 00:29:56 +00:00
austinried 92d9b8bbd5 bring the mini player back as soon as the keyboard starts to hide 2026-10-04 00:29:56 +00:00
austinried 187a4b3dff hide the mini player only while the keyboard is up 2026-10-04 00:29:56 +00:00
austinried 82b64c7bc7 seat the search bar above the keyboard 2026-10-04 00:29:56 +00:00
austinried 2161a6455d keep the search bar above the keyboard 2026-10-04 00:29:56 +00:00
austinried 448a211d88 polish library controls and song ordering 2026-10-04 00:29:56 +00:00
austinried f1c030f0e1 address review: play songs by id, reverse album sort, tab-scoped scroll reset, literal search and stable tiebreakers 2026-10-04 00:29:55 +00:00
austinried e99ed1dc45 song added sort, robust scroll reset, restyled search and filter controls 2026-10-04 00:29:55 +00:00
austinried 9326429e17 parse Subsonic dates with java.time via core library desugaring 2026-10-04 00:29:55 +00:00
austinried 266b677ece parse Subsonic dates without DatatypeFactory, reset list scroll on option change, fix search bar over the keyboard 2026-10-04 00:29:55 +00:00
austinried 63f0549181 tristate starred filter, filter-aware empty state, keyboard-safe search bar 2026-10-04 00:29:55 +00:00
austinried a2d42f7957 rework the library lists: inline filter, playlist updated, starred sort, clearer controls 2026-10-04 00:29:55 +00:00
austinried 9a99977342 add sort, filters and search to the library 2026-10-04 00:29:55 +00:00
austinried 120d180220 shrink the track numbers to bodySmall in an 18dp column 2026-10-04 00:29:55 +00:00
austinried b978e9cc37 center the track numbers in their column 2026-10-04 00:29:55 +00:00
austinried 0f9b72a364 left align the track numbers 2026-10-04 00:29:55 +00:00
austinried 31179f1287 use titleLarge for disc headings and number album tracks 2026-10-04 00:29:55 +00:00
austinried 9ca6273b82 show disc headings in multi-disc album track lists 2026-10-04 00:29:55 +00:00
austinried 21df098d2a stop the viewport fill growing when a short list is scrolled 2026-10-04 00:29:55 +00:00
austinried e7f8032250 address fourth review: reset the saved position per track and serialize cursor writes 2026-10-04 00:29:55 +00:00
austinried 20ab30920f persist and restore the playback position within the track 2026-10-04 00:29:55 +00:00
austinried 89376cef86 rescan the queue scroll to the current track on every open 2026-10-04 00:29:55 +00:00