Skip to content

Add adaptive landscape layouts, playback customization, SAF metadata writes, and DSP telemetry - #360

Merged
ultraelectronica merged 14 commits into
mainfrom
versionF
Nov 5, 2026
Merged

ultraelectronica merged 14 commits into
mainfrom
versionF

Conversation

@ultraelectronica

Copy link
Copy Markdown
Member

Summary

  • Let Flick rotate into landscape and adapt the shell instead of locking portrait: side navigation becomes a vertical FlickNavRail on wide screens, the full player switches to a bounded artwork/controls layout, and short landscape windows use a compact side mini player.
  • Make bottom sheets and dialogs usable in landscape: shared AppBottomSheetSurface caps height and width, scrolls when needed, and keeps actions above the keyboard.
  • Add configurable seek-bar sizing with a live preview, separate waveform-height and line-thickness preferences, and a 48dp minimum touch target.
  • Add a Blur gradient immersive background option alongside the existing color gradient, with the same treatment in the player and layout preview.
  • Make metadata editing work for SAF content:// documents: stage the document to private cache, edit with the Rust tagger, stream the result back, re-read it to verify, then persist the database change.
  • Add real-time DSP and output telemetry: callback lock misses, starvation, skipped stages, peaks/clipping, non-finite samples, callback duration/overruns, burst chunking, and xrun support, exposed through managed_output_debug_json() without logging or blocking in the audio callback.
  • Move equalizer updates to a coalesced mailbox applied at block boundaries, publish playback progress through a seqlock snapshot, and skip inactive effects without taking their locks.
  • Keep the new progress-bar and background labels in the English copy role in Taglish while translating the new metadata errors in Taglish and Chinese.

Related issue

none

Checklist

  • flutter analyze passes
  • flutter test passes
  • Rust changes: cargo test --manifest-path rust/Cargo.toml passes
  • Built and ran the app if the change touches a playback path (flutter run --flavor full)
  • Generated code regenerated and committed if bridge/drift/freezed models changed
  • CHANGELOG.md updated for user-facing changes
  • No secrets, keys, tokens, or machine-local files committed
  • One change per PR; no unrelated reformatting in the same diff
  • Hardware tested if the Rust audio engine or USB/DAC output changed

Surface managed-output callback stats (counts, durations, overruns,
xruns, buffer sizing) and PCM callback counters (lock misses, starved
samples, skipped DSP stages, peak/clipping, non-finite samples) in the
diagnostics report.
Extend PcmCallbackStats and ManagedOutputStats with lock contention,
DSP skips, peak/clipping, callback timing, and xrun counters, all
published through atomics so the audio callback never logs or blocks.

Replace the EQ mutex path with a coalesced mailbox of precomputed
EqParams applied at block boundaries, and add lock-free enabled
mirrors for fx, convolver, dynamics, and crossfade to skip inactive
stages without contention. Publish playback progress via a seqlock
snapshot instead of locking.
Stage content:// documents into a private cache copy so the Rust
tagger can open them by path, and stream edited copies back over the
original URI. "wt" truncation is retried with "w" for providers that
reject it, and stale edit copies older than 24h are pruned.
Inject the Rust tagger, DB persistence, and temp directory so the
content:// staging and SAF fallback paths can be unit tested. Add
coverage for content URI write-back, permission failures, path
normalization, and read staging.
Make AmbientBackground opacity configurable so the full player can
render un-scrimmed blurred artwork under a dstIn shader mask that
fades into the foreground, with a softer gradient overlay. Add a
background style selector to the player layout sheet and mirror the
style in its immersive and full-screen previews.
Persist the choice in SharedPreferences, defaulting to the
color gradient and falling back to it for unknown or missing
values.
Add metadata editor strings for missing files and lost edit
permission.
Add a slider and preview in UI customization for waveform
height and line thickness, with per-style reset to defaults.
Seek bars scale their painted size while keeping a 48dp
touch area.
Persist waveform height and line thickness independently,
clamping saved values to supported ranges. Queue rapid
edits so the final state is written, and show a
non-interactive preview at the current size.
Remove forced portrait lock and add progress bar size
localization strings.
Add a side navigation rail and compact side mini player for
wide/landscape layouts. Unlock the bottom sheet width cap so
sheets use the full window on tablets and landscape, and
ignore horizontal scroll notifications when toggling the nav
bar.
Document that Track Thumbnails, Progress Bar and Album Colors
sections use the English role catalog in Taglish, mirroring
the Player Layout pattern.
Introduce a shared AdaptiveLayout policy keyed off window size
rather than MediaQuery.orientation, and use it to split the
player into a stage/controls side-by-side composition, swap
bottom navigation for a scrollable side rail, and render a
vertical side mini player in short landscape windows.

Rework bottom sheets onto AppBottomSheetSurface so they fill
more of the window, scroll under enlarged text, and respect
keyboard insets. Also localize UI Customization descriptions
via the English copy role so Taglish uses English copy.
Add descriptionFor helpers to the progress bar and thumbnail
label extensions so callers can resolve copy from a specific
locale, and mark the progress bar style strings English-only in
the Taglish catalog.
@ultraelectronica ultraelectronica self-assigned this Nov 5, 2026
@ultraelectronica
ultraelectronica merged commit c5724a0 into main Nov 5, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant