Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
69 changes: 69 additions & 0 deletions docs/RELEASE_0.23.0-beta.1.md
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion docs/RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions lib/core/constants/app_constants.dart
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
75 changes: 75 additions & 0 deletions lib/features/whats_new/data/changelog_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<ChangelogEntry> 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',
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading