From fa59487666e9a9d2810b68639455090d143428a2 Mon Sep 17 00:00:00 2001 From: ultraelectronica Date: Mon, 19 Oct 2026 19:28:02 +0800 Subject: [PATCH] Prepare 0.23.0-beta.1 pre-release --- CHANGELOG.md | 47 ++++++++++++ docs/RELEASE_0.23.0-beta.1.md | 69 +++++++++++++++++ docs/RELEASING.md | 2 +- lib/core/constants/app_constants.dart | 6 +- .../whats_new/data/changelog_data.dart | 75 +++++++++++++++++++ pubspec.yaml | 2 +- 6 files changed, 196 insertions(+), 5 deletions(-) create mode 100644 docs/RELEASE_0.23.0-beta.1.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 51efafba..264400d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,52 @@ # Changelog +## 0.23.0-beta.1 (2026-10-19) + +### Localization & Typography +- **The app is now translatable**: a gen-l10n/ARB pipeline plus a language selector in Settings → Language. English and Simplified Chinese ship complete, and switching languages applies at runtime. +- **Localized throughout**: shared UI, player, settings, library browsing, playlists, queue, menus, manual, What's New, milestones, and Replay/Recap screens, with a Chinese layout sweep that pins dialog buttons. +- **Experimental Filipino-in-Baybayin (`tl-Tglg`)**: an opt-in pilot with 50 draft strings that only activates for an explicit script-specific locale, so existing devices are unaffected. +- **Typography**: a bundled Noto Sans SC subset keeps Chinese in a consistent typeface, and the proprietary Product Sans is replaced with the OFL-licensed Google Sans Flex. + +### Mini Player & Home Widgets +- **Embedded mini player**: configurable layout and visualizer, with reset-to-defaults for both the mini player and the navigation bar. +- **Flick Replay home widget**: listening time, play count, day-over-day deltas, and top albums at a glance; four looks (Acid, Night, Signal, Album) with contrast-aware tinting. Tap to open Recap. +- Responsive widget layouts, ripple feedback, and a shared artwork sleeve deck with a bounded cache. + +### Display & Visualizer +- **Adaptive refresh rate by default** for new installs; the 60 Hz option now targets a real ~60 Hz mode instead of the panel minimum. +- A single app-wide controller applies refresh-rate changes immediately, restores the saved mode after window recreation, and falls back when Android ignores a forced rate. +- **Visualizer** gains a blocks style and rainbow, monochrome, and album-art color modes. +- **Connection notices** for offline and reconnecting states, with a Settings toggle. + +### Replay & Recap +- **Replay Studio**: customize recap posters with a look, background, and details; choose overview, top songs, top artists, or top album; import artwork from the camera or gallery. +- **Export posters** at 420×760 to the gallery, or export listening data as CSV, with colors sampled from artwork. +- The recap is rebuilt on composable widgets that respect reduced motion. + +### USB & DSD Audio +- **Standards-correct UAC1/UAC2 AudioControl parsing**: terminals, Feature Units, and Clock Selectors; volume is discovered on the active playback topology, written with protocol-specific requests, and verified by readback. +- **Bounded DSD container decoding** and fail-closed transport; diagnostics now report the negotiated format rather than the requested preference. +- **DSD decoder respawns match the engine payload format**, fixing silent native-DSD playback after seeking or changing tracks on DAPs. +- DSD auto-mode fallback for DAPs without bit-perfect, plus corrected DoP packing, channel handling, and multichannel negotiation. + +### Playback Reliability +- **Oversized managed-output bursts render in bounded chunks**, fixing silent dropouts on Bluetooth and other managed-output devices without allocating on the audio path. +- **Crossfade across mismatched sample rates**, with seek-during-crossfade targeting the incoming track; fallback state is tracked through engine switches. +- Bluetooth routing respects the selected engine preference, and Rust-only output loss no longer stalls playback. +- Managed output failures keep reporting actionable burst and format details. + +### Library, Network & Artwork +- SAF songs now carry their **relative folder path**, so folder grouping and the folder tree are correct for whole-volume roots. +- **SMB IPv6 and Windows UNC URLs** parse correctly, and failed connection tests show an actionable reason such as authentication, missing share, DNS, timeout, or refusal. +- **Album artwork reset** plus stricter album identity validation; stale artwork pointers are dropped when files change. +- Recently Added and Recently Played headers are localized without losing section ordering. + +### Interface & Polish +- **Unified snackbars**: one glass-themed surface with deduplication, coalescing, queueing, and motion- and accessibility-aware lifetimes. +- **App Info shows the build flavor** (`play` or `full`), and bottom sheets extend under the system navigation bar. +- Dialog cancel buttons are localized everywhere, and the support screen has an animated coffee icon. + ## 0.22.2-beta.4 (2026-10-11) ### Display Modes diff --git a/docs/RELEASE_0.23.0-beta.1.md b/docs/RELEASE_0.23.0-beta.1.md new file mode 100644 index 00000000..b4c432db --- /dev/null +++ b/docs/RELEASE_0.23.0-beta.1.md @@ -0,0 +1,69 @@ +# Flick 0.23.0-beta.1 + +Localization, home widgets, and a Replay studio — plus hardened USB/DSD playback and more reliable managed audio. + +## Localization & Typography + +- **The app is now translatable** — a gen-l10n/ARB pipeline plus a language selector in Settings → Language. English and Simplified Chinese ship complete, and switching languages applies at runtime. +- **Localized throughout** — shared UI, player, settings, library browsing, playlists, queue, menus, manual, What's New, milestones, and Replay/Recap screens, with a Chinese layout sweep that pins dialog buttons. +- **Experimental Filipino-in-Baybayin (`tl-Tglg`)** — an opt-in pilot with 50 draft strings that only activates for an explicit script-specific locale, so existing devices are unaffected. +- **Typography** — a bundled Noto Sans SC subset keeps Chinese in a consistent typeface, and the proprietary Product Sans is replaced with the OFL-licensed Google Sans Flex. + +## Mini Player & Home Widgets + +- **Embedded mini player** — configurable layout and visualizer, with reset-to-defaults for both the mini player and the navigation bar. +- **Flick Replay home widget** — listening time, play count, day-over-day deltas, and top albums at a glance; four looks (Acid, Night, Signal, Album) with contrast-aware tinting. Tap to open Recap. +- Responsive widget layouts, ripple feedback, and a shared artwork sleeve deck with a bounded cache. + +## Display & Visualizer + +- **Adaptive refresh rate by default** for new installs; the 60 Hz option now targets a real ~60 Hz mode instead of the panel minimum. +- A single app-wide controller applies refresh-rate changes immediately, restores the saved mode after window recreation, and falls back when Android ignores a forced rate. +- **Visualizer** gains a blocks style and rainbow, monochrome, and album-art color modes. +- **Connection notices** for offline and reconnecting states, with a Settings toggle. + +## Replay & Recap + +- **Replay Studio** — customize recap posters with a look, background, and details; choose overview, top songs, top artists, or top album; import artwork from the camera or gallery. +- **Export posters** at 420×760 to the gallery, or export listening data as CSV, with colors sampled from artwork. +- The recap is rebuilt on composable widgets that respect reduced motion. + +## USB & DSD Audio + +- **Standards-correct UAC1/UAC2 AudioControl parsing** — terminals, Feature Units, and Clock Selectors; volume is discovered on the active playback topology, written with protocol-specific requests, and verified by readback. +- **Bounded DSD container decoding** and fail-closed transport; diagnostics now report the negotiated format rather than the requested preference. +- **DSD decoder respawns match the engine payload format**, fixing silent native-DSD playback after seeking or changing tracks on DAPs. +- DSD auto-mode fallback for DAPs without bit-perfect, plus corrected DoP packing, channel handling, and multichannel negotiation. + +## Playback Reliability + +- **Oversized managed-output bursts render in bounded chunks**, fixing silent dropouts on Bluetooth and other managed-output devices without allocating on the audio path. +- **Crossfade across mismatched sample rates**, with seek-during-crossfade targeting the incoming track; fallback state is tracked through engine switches. +- Bluetooth routing respects the selected engine preference, and Rust-only output loss no longer stalls playback. +- Managed output failures keep reporting actionable burst and format details. + +## Library, Network & Artwork + +- SAF songs now carry their **relative folder path**, so folder grouping and the folder tree are correct for whole-volume roots. +- **SMB IPv6 and Windows UNC URLs** parse correctly, and failed connection tests show an actionable reason such as authentication, missing share, DNS, timeout, or refusal. +- **Album artwork reset** plus stricter album identity validation; stale artwork pointers are dropped when files change. +- Recently Added and Recently Played headers are localized without losing section ordering. + +## Interface & Polish + +- **Unified snackbars** — one glass-themed surface with deduplication, coalescing, queueing, and motion- and accessibility-aware lifetimes. +- **App Info shows the build flavor** (`play` or `full`), and bottom sheets extend under the system navigation bar. +- Dialog cancel buttons are localized everywhere, and the support screen has an animated coffee icon. + +## Builds & Flavors + +- **This GitHub download uses the `full` flavor** — it declares **All Files Access** (`MANAGE_EXTERNAL_STORAGE`) for the raw Rust filesystem scanner and complete DSD/WavPack coverage. Build: `flutter build apk --flavor full --release`. +- **Google Play uses the `play` flavor** — no All Files Access (Play policy for media apps); it scans via MediaStore/SAF plus the DSD/DSF/WavPack reconciliation path. Build: `flutter build appbundle --flavor play --release`. +- Both flavors share `applicationId` `com.mossapps.flick`, so either installs over the other. + +## Getting Started + +1. Change language: Settings → Language +2. Mini player: Settings → Interface → Mini Player +3. Replay widget: long-press the home screen → Widgets → Flick Replay +4. Replay Studio: open Recap → customize and export a poster diff --git a/docs/RELEASING.md b/docs/RELEASING.md index f3bcd376..40201a24 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -11,7 +11,7 @@ flutter build appbundle --flavor play --release ``` - Output: `build/app/outputs/bundle/playRelease/app-play-release.aab` -- Upload the bundle and bump the version code (current: `0.22.1-beta.3+29`). +- Upload the bundle and bump the version code (current: `0.23.0-beta.1+30`). - The `play` flavor does **not** declare `MANAGE_EXTERNAL_STORAGE`. The All Files Access declaration no longer applies to this build — **do not resubmit it**. It was rejected twice (see diff --git a/lib/core/constants/app_constants.dart b/lib/core/constants/app_constants.dart index 09fdfb0f..3c9c9ee8 100644 --- a/lib/core/constants/app_constants.dart +++ b/lib/core/constants/app_constants.dart @@ -1,8 +1,8 @@ /// Current marketing version of the app (matches the `version` field in /// `pubspec.yaml`). Bump in lockstep with each release. -const String kAppVersion = '0.22.1-beta.3'; -const String kAppBuild = '29'; -/// Human-friendly version label, e.g. `0.22.1-beta.3 (build 29)`. +const String kAppVersion = '0.23.0-beta.1'; +const String kAppBuild = '30'; +/// Human-friendly version label, e.g. `0.23.0-beta.1 (build 30)`. const String kAppVersionLabel = '$kAppVersion (build $kAppBuild)'; /// App-wide constants for Flick Player. diff --git a/lib/features/whats_new/data/changelog_data.dart b/lib/features/whats_new/data/changelog_data.dart index 024799bc..4886bd14 100644 --- a/lib/features/whats_new/data/changelog_data.dart +++ b/lib/features/whats_new/data/changelog_data.dart @@ -43,6 +43,81 @@ class ChangelogSubsection { /// The "What's New" bottom sheet on first launch after an update will /// automatically surface the entry whose `version` equals `kAppVersion`. const List kChangelogEntries = [ + ChangelogEntry( + version: '0.23.0-beta.1', + date: '2026-10-19', + sections: [ + ChangelogSection( + title: 'Localization & Typography', + bullets: [ + '**The app is now translatable** — a gen-l10n/ARB pipeline plus a language selector in Settings → Language. English and Simplified Chinese ship complete, and switching languages applies at runtime.', + '**Localized throughout** — shared UI, player, settings, library browsing, playlists, queue, menus, manual, What\'s New, milestones, and Replay/Recap screens, with a Chinese layout sweep that pins dialog buttons.', + '**Experimental Filipino-in-Baybayin (`tl-Tglg`)** — an opt-in pilot with 50 draft strings that only activates for an explicit script-specific locale, so existing devices are unaffected.', + '**Typography** — a bundled Noto Sans SC subset keeps Chinese in a consistent typeface, and the proprietary Product Sans is replaced with the OFL-licensed Google Sans Flex.', + ], + ), + ChangelogSection( + title: 'Mini Player & Home Widgets', + bullets: [ + '**Embedded mini player** — configurable layout and visualizer, with reset-to-defaults for both the mini player and the navigation bar.', + '**Flick Replay home widget** — listening time, play count, day-over-day deltas, and top albums at a glance; four looks (Acid, Night, Signal, Album) with contrast-aware tinting. Tap to open Recap.', + 'Responsive widget layouts, ripple feedback, and a shared artwork sleeve deck with a bounded cache.', + ], + ), + ChangelogSection( + title: 'Display & Visualizer', + bullets: [ + '**Adaptive refresh rate by default** for new installs; the 60 Hz option now targets a real ~60 Hz mode instead of the panel minimum.', + 'A single app-wide controller applies refresh-rate changes immediately, restores the saved mode after window recreation, and falls back when Android ignores a forced rate.', + '**Visualizer** gains a blocks style and rainbow, monochrome, and album-art color modes.', + '**Connection notices** for offline and reconnecting states, with a Settings toggle.', + ], + ), + ChangelogSection( + title: 'Replay & Recap', + bullets: [ + '**Replay Studio** — customize recap posters with a look, background, and details; choose overview, top songs, top artists, or top album; import artwork from the camera or gallery.', + '**Export posters** at 420×760 to the gallery, or export listening data as CSV, with colors sampled from artwork.', + 'The recap is rebuilt on composable widgets that respect reduced motion.', + ], + ), + ChangelogSection( + title: 'USB & DSD Audio', + bullets: [ + '**Standards-correct UAC1/UAC2 AudioControl parsing** — terminals, Feature Units, and Clock Selectors; volume is discovered on the active playback topology, written with protocol-specific requests, and verified by readback.', + '**Bounded DSD container decoding** and fail-closed transport; diagnostics now report the negotiated format rather than the requested preference.', + '**DSD decoder respawns match the engine payload format**, fixing silent native-DSD playback after seeking or changing tracks on DAPs.', + 'DSD auto-mode fallback for DAPs without bit-perfect, plus corrected DoP packing, channel handling, and multichannel negotiation.', + ], + ), + ChangelogSection( + title: 'Playback Reliability', + bullets: [ + '**Oversized managed-output bursts render in bounded chunks**, fixing silent dropouts on Bluetooth and other managed-output devices without allocating on the audio path.', + '**Crossfade across mismatched sample rates**, with seek-during-crossfade targeting the incoming track; fallback state is tracked through engine switches.', + 'Bluetooth routing respects the selected engine preference, and Rust-only output loss no longer stalls playback.', + 'Managed output failures keep reporting actionable burst and format details.', + ], + ), + ChangelogSection( + title: 'Library, Network & Artwork', + bullets: [ + 'SAF songs now carry their **relative folder path**, so folder grouping and the folder tree are correct for whole-volume roots.', + '**SMB IPv6 and Windows UNC URLs** parse correctly, and failed connection tests show an actionable reason such as authentication, missing share, DNS, timeout, or refusal.', + '**Album artwork reset** plus stricter album identity validation; stale artwork pointers are dropped when files change.', + 'Recently Added and Recently Played headers are localized without losing section ordering.', + ], + ), + ChangelogSection( + title: 'Interface & Polish', + bullets: [ + '**Unified snackbars** — one glass-themed surface with deduplication, coalescing, queueing, and motion- and accessibility-aware lifetimes.', + '**App Info shows the build flavor** (`play` or `full`), and bottom sheets extend under the system navigation bar.', + 'Dialog cancel buttons are localized everywhere, and the support screen has an animated coffee icon.', + ], + ), + ], + ), ChangelogEntry( version: '0.22.2-beta.4', date: '2026-10-11', diff --git a/pubspec.yaml b/pubspec.yaml index 9c6d8449..f70cbf8b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 0.22.1-beta.3+29 +version: 0.23.0-beta.1+30 environment: sdk: ^3.10.4