Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
331 commits
Select commit Hold shift + click to select a range
300f92a
Add fast settling physics for horizontal page swipes
Jan 3, 2026
cff1edc
Optimize list scroll performance
Jan 3, 2026
0d09fb3
Add radio stations to search results
Jan 3, 2026
80a7848
Filter radio stations from loaded list during search
Jan 3, 2026
6e05a94
Add global radio station search via Music Assistant API
Jan 3, 2026
a59946c
Fix radio stations layout and add grid view support
Jan 3, 2026
c1837f5
Add basic podcast support
Jan 3, 2026
250d79b
Fix AppLocalizations reference in podcast details
Jan 3, 2026
29d14d9
Fix null safety for S.of(context) in podcast details
Jan 3, 2026
4521318
Add podcast details screen with episodes list
Jan 3, 2026
3667df5
Fix podcast detail screen compilation errors
Jan 3, 2026
0fad371
Fix podcast episodes and image resolution
Jan 3, 2026
a2327e5
Add detailed logging for podcast episode parsing
Jan 3, 2026
8476798
Fix MediaType parsing in podcast episode browse
Jan 3, 2026
aa6d616
Use podcast's actual URI for browsing episodes
Jan 3, 2026
752dd9a
Try multiple approaches for podcast episodes like audiobooks
Jan 3, 2026
0bec855
Use correct endpoint: music/podcasts/podcast_episodes
Jan 3, 2026
c655f79
Add podcast skip controls and fix artist display in expanded player
Jan 3, 2026
b2d3940
Fix localization: use podcasts instead of podcast
Jan 3, 2026
ef384fa
Fix duplicate podcast name and add debug logging
Jan 4, 2026
87a0b8c
Add podcast field extraction and detailed logging
Jan 4, 2026
0495e0c
Fix podcast name detection for episodes with split titles
Jan 4, 2026
8584353
Use episode covers for higher quality podcast library images
Jan 4, 2026
e74f59e
Use high-quality episode covers on podcast detail screen
Jan 4, 2026
eea675b
Redesign podcast episode list with covers, dates, and expandable actions
Jan 4, 2026
22b3526
Only use episode cover as fallback when podcast has no cover
Jan 4, 2026
c898ca5
Smart podcast cover selection based on image source comparison
Jan 4, 2026
7cdf303
Fix Track import - it's in media_item.dart not separate file
Jan 4, 2026
7deb5b7
Podcast improvements with iTunes high-res artwork
Jan 4, 2026
1b2fedb
Add podcasts to search results with colored type pills
Jan 4, 2026
90805c5
Fix: use 'podcasts' localization key instead of 'podcast'
Jan 4, 2026
5e0277a
Fix type pills and hero animation improvements
Jan 4, 2026
3a66834
Improve hero animations and search relevance scoring
Jan 4, 2026
081afb3
Fix podcast hero animations and search relevance
Jan 4, 2026
5a0b3e4
Fix podcast hero animations and further improve search ranking
Jan 4, 2026
3b4d1ad
Fix podcast hero animations - match audiobook pattern exactly
Jan 4, 2026
4cba2ba
Fix podcast hero: ensure all views have identical widget structure
Jan 4, 2026
9c293a6
Fix podcast hero: use stable URLs to prevent mid-session URL changes
Jan 4, 2026
74f1b0f
Persist podcast cover cache for smooth heroes + high-res
Jan 4, 2026
cbb67ea
Fix artist grid view hero animation
Jan 4, 2026
8f64a75
Bump version to 2.8.0-beta+37
Jan 4, 2026
cded364
Fix podcast, audiobook, and radio player issues
Jan 4, 2026
3edb6af
Add "Add to Library" button for search results
Jan 4, 2026
cdc6c5b
Add library management and expandable actions for search results
Jan 4, 2026
fba7091
Fix: use playArtistRadio instead of playRadio for Artist type
Jan 4, 2026
69bf288
Fix library add/remove buttons not working properly
Jan 4, 2026
07cb1f7
Fix library button UI not updating after add/remove
Jan 4, 2026
fc20309
Fix library not showing all artists (only album artists)
Jan 4, 2026
177d938
Add instant UI updates for favorites and library changes
Jan 4, 2026
08566d2
Fix Track constructor - remove invalid discNumber/trackNumber params
Jan 4, 2026
c7aea78
Fix library button getting stuck after navigation
Jan 4, 2026
5320ec6
Make library buttons update instantly with optimistic UI
Jan 4, 2026
5d8d7e4
Add event-driven library sync via MA server events
Jan 4, 2026
0843b8f
Remove verbose debug logging
Jan 4, 2026
8d07752
Audit: Fix deprecated APIs and optimize scroll performance
Jan 4, 2026
206ab7b
Revert background colors and fix search podcast Hero animation
Jan 4, 2026
6e5ab73
Fix Hero animations: context.select, memCacheWidth, precaching
Jan 5, 2026
8876a8b
fix: resolve undefined maProvider compile error
Jan 5, 2026
c563b1f
feat: add podcast action buttons and artist filter setting
Jan 5, 2026
f0bce58
debug: add logging for artist filter
Jan 5, 2026
b051e5a
debug: add in-app debug banner for artist filter
Jan 5, 2026
8396078
debug: use DebugLogger for artist filter logging
Jan 5, 2026
1d37502
debug: add more logging for artist filter setting
Jan 5, 2026
c382822
fix: reload artist filter setting when returning to library
Jan 5, 2026
63d857c
fix: read artist filter setting fresh on each tab view
Jan 5, 2026
038df11
fix: reload artist filter on tab change and return from settings
Jan 5, 2026
f5445db
Fix artist filter toggle not triggering UI rebuild
Jan 5, 2026
dbf066c
Use API-level filtering for artist library instead of UI filtering
Jan 5, 2026
e1acdb2
Fix: Use forceLibrarySync when artist filter setting changes
Jan 5, 2026
de8797a
Invalidate detail screen caches on library changes
Jan 5, 2026
26e2c12
feat: Add provider filter sync from Music Assistant
Jan 5, 2026
50e567c
fix: Make favoriteOnly nullable in getAudiobooks wrapper
Jan 5, 2026
19b653a
Add player_filter sync from MA user settings
Jan 5, 2026
79cadff
Add player filter and debug logging for recent albums
Jan 5, 2026
3c296e7
Merge feature/provider-filter-sync: Add provider and player filter sync
Jan 5, 2026
aa74fe9
Bump version to 2.8.1-beta+38
Jan 5, 2026
b9c7bc0
Fix Tailscale auth detection (issue #38)
Jan 5, 2026
b15f10a
Bump version to 2.8.2-beta+39
Jan 5, 2026
8e548da
Fix black screen bug when Material You theme enabled (#37)
Jan 5, 2026
f36d108
Fix radio stream metadata not displaying
Jan 5, 2026
252395d
Fix _currentTrack not updating for radio streams
Jan 5, 2026
f65e76e
fix: prevent radio metadata downgrade from bad events
Jan 5, 2026
aaeb210
chore: remove debug logging for radio metadata
Jan 5, 2026
8a38516
feat: overhaul search scoring with fuzzy matching and stopword removal
Jan 5, 2026
d6e759f
fix: remove non-existent Podcast type check
Jan 5, 2026
6661375
chore: bump version to 2.8.4-beta+42
Jan 5, 2026
4058169
Add great_list_view queue with drag-reorder and swipe-to-delete
Jan 6, 2026
03f9653
Add Alibaba Maven mirrors for faster builds
Jan 6, 2026
129a1c8
Fix build errors in queue_panel.dart
Jan 6, 2026
26fcd90
Add Gradle cache clear step to force mirror usage
Jan 6, 2026
01aca2e
Fix card colors and delete animation
Jan 6, 2026
29167dc
Add init.gradle to force Alibaba mirrors + Gradle caching
Jan 6, 2026
84bfcf7
Fix delete animation bug - remove by ID not index
Jan 6, 2026
c9eb3fb
Add instant drag handles (no long press required)
Jan 6, 2026
1324b23
Fix drag handle - use Builder context like overlay branch
Jan 6, 2026
b497a44
Fix delete animation - don't refresh after API call
Jan 6, 2026
88fe49d
Fix didUpdateWidget - only sync on queue/player change
Jan 6, 2026
ab734ac
Use consistent widget structure for measuring
Jan 6, 2026
9ebd49d
Don't update _items on delete - let Dismissible handle visual
Jan 6, 2026
0699523
Add Android back + swipe right navigation for queue
Jan 6, 2026
236698f
Fix queue panel navigation and back button handling
Jan 6, 2026
01ea219
Fix Android back button to close queue panel before collapsing player
Jan 6, 2026
8e5bfa3
Add defensive queue check in collapse() method
Jan 6, 2026
cd1ab6e
Add player animation audit prompt
Jan 6, 2026
6459f8b
fix: nav bar uses same adaptive color as expanded player
Jan 7, 2026
11faba7
debug: add volume swipe logging for diagnosis
Jan 7, 2026
e2f420d
fix: nav bar uses subtle tint instead of primaryContainer
Jan 7, 2026
9584f80
fix: nav bar uses scheme.surface to match expanded player
Jan 7, 2026
80996e3
fix: light theme improvements
Jan 7, 2026
9706444
feat: Add volume precision mode for fine-grained control
Jan 7, 2026
b75152d
fix: Improve volume precision mode with zoom range and dark overlay
Jan 7, 2026
ea5beec
fix: Use offset-based movement for precision mode
Jan 7, 2026
cde1386
feat: Darken and desaturate UI when in precision mode
Jan 7, 2026
96e6522
fix: Reduce desaturation to 50% for subtler effect
Jan 7, 2026
1796829
fix: Reduce darkness to 30% and desaturation to 25% for subtler effect
Jan 7, 2026
318a095
feat: Add optional Favorite Playlists and Favorite Radio Stations rows
Jan 7, 2026
29f2ff7
fix: Use correct API method to play radio stations
Jan 7, 2026
31a9f24
fix: Increase precision mode visual feedback to 50% darkness and desa…
Jan 7, 2026
f24c981
refactor: Replace visual feedback with haptic vibration for precision…
Jan 7, 2026
90f004e
chore: Bump version to 2.8.5-beta+43
Jan 7, 2026
1bb6a49
feat: Faster volume updates in precision mode (50ms vs 150ms)
Jan 7, 2026
f26548c
docs: Update screenshots
Jan 7, 2026
dd73812
docs: Add Home Assistant add-on setup instructions
Jan 7, 2026
1bc35a9
Revert "docs: Add Home Assistant add-on setup instructions"
Jan 7, 2026
d81a3ba
docs: Comprehensive README update
Jan 7, 2026
4a9923d
refactor: Replace great_list_view with custom drag-reorder implementa…
Jan 7, 2026
58e8265
fix: Improve drag tracking to follow finger smoothly
Jan 7, 2026
4577242
fix: use Stack-based overlay instead of OverlayEntry for drag
Jan 7, 2026
b19acda
fix: disable list scrolling while dragging to prevent gesture conflict
Jan 7, 2026
7d558ea
fix: use parent Listener to track drag pointer globally
Jan 7, 2026
eb8225b
fix: prevent queue panel collapse while dragging track
Jan 7, 2026
9542cdb
fix: preserve queue state when panel closes and block all gestures du…
Jan 7, 2026
7d47fa1
debug: add logging to queue move API call
Jan 7, 2026
ef68252
fix: correct API parameter name for queue move (item_id_or_index -> q…
Jan 7, 2026
999e56d
fix: increase pendingReorder delay to 2s for server propagation
Jan 7, 2026
05f44a6
fix: use pos_shift (relative) instead of new_index (absolute) for que…
Jan 7, 2026
1b669ae
fix: don't sync on order changes - trust local order after reorder
Jan 7, 2026
2721e83
feat: tap track in queue to skip to that track
Jan 7, 2026
5c79700
Add gesture-driven queue panel close (follow thumb)
Jan 7, 2026
bd3be91
Add optimistic update for tap-to-skip in queue
Jan 7, 2026
cd5bef0
Fix swipe-to-close gesture on queue track items
Jan 7, 2026
a3f0a47
Comprehensive queue panel gesture refactor
Jan 7, 2026
adc37c3
Fix drag position when scrolled + add clear queue button
Jan 7, 2026
00ccbf9
Improve drag handle touch target and remove refresh button
Jan 7, 2026
660c4d8
Fix Material You and adaptive color theming issues
Jan 7, 2026
1e64673
Theme nav bar icons during player expansion when adaptive is on
Jan 7, 2026
de0290c
Add rounded corners to current track highlight in queue
Jan 7, 2026
57e1a99
Fix drag handle touch area - reduce excessive padding
Jan 7, 2026
7bb1121
Fix drag handle with explicit 48x48 touch target
Jan 7, 2026
dc6bdae
Fix drag by reverting to Listener (bypasses gesture arena)
Jan 7, 2026
8e4014b
Move duration and drag handles to right side of queue items
Jan 8, 2026
b63d35b
Revert "Move duration and drag handles to right side of queue items"
Jan 8, 2026
3e91bbb
Reduce gap between drag handles and right screen edge in queue panel
Jan 8, 2026
2883899
Align drag handle icon to right edge of touch target
Jan 8, 2026
a8bb34f
Reduce drag handle touch target width to close gap with duration
Jan 8, 2026
36e5ee7
Fix queue item trailing alignment properly
Jan 8, 2026
a4c08ca
Fix right edge gap with conditional contentPadding
Jan 8, 2026
460f720
Fix left side alignment - compensate margin on both sides
Jan 8, 2026
2dcc6d5
Add responsive haptic feedback for queue drag reordering
Jan 8, 2026
7b372a7
Improve queue panel animations and swipe gesture
Jan 8, 2026
fea33a9
Fix queue panel only opening once after spring animation
Jan 8, 2026
1e64a6b
Fix queue panel double-close animation glitch
Jan 8, 2026
2e95cb6
Fix double close/haptic: remove competing gesture handler
Jan 8, 2026
07b2210
Fix swipe close jerk by removing CurvedAnimation distortion
Jan 8, 2026
9b38f4f
Remove finger-following from queue swipe gesture
Jan 8, 2026
751d317
Fix double haptic on Android back gesture
Jan 8, 2026
212a1e0
Fix edge zone detection to use screen coordinates
Jan 8, 2026
29ea825
Fix Android back gesture edge cases
Jan 8, 2026
a3af055
Use static position tracking for edge zone detection
Jan 8, 2026
db995c5
Add physical edge gesture absorbers to block Dismissible
Jan 8, 2026
66f93c9
Fix Android back gesture failures with target state tracking
Jan 8, 2026
9848399
Fix PopScope not rebuilding when queue panel opens
Jan 8, 2026
0124a95
Fix Android back: handle queue panel in didPopRoute
Jan 8, 2026
cfdef31
Fix rapid open-close timing: use target state not animation value
Jan 8, 2026
ba5d056
PERF: Isolate queue animation to prevent full player rebuilds
Jan 8, 2026
2636a09
Fix home screen row height calculation causing scroll
Jan 8, 2026
2669d05
Merge fix/queue-drag-reorder: Queue improvements and home screen fix
Jan 8, 2026
a39a45b
Redesign volume control: +/- buttons with floating indicator
Jan 8, 2026
7ca9b55
Add live volume updates, precision mode, and teardrop indicator
Jan 8, 2026
d39727e
Improve volume control: clamped indicator, adaptive color, precision …
Jan 8, 2026
fb90502
Show teardrop indicator on volume button taps
Jan 8, 2026
e7996bc
Fix volume button stepping and use standard SnackBar for hint
Jan 8, 2026
8b722ff
Fix precision hint: use custom overlay styled like snackbar
Jan 8, 2026
c3c9ff4
Move precision hint above slider to avoid nav bar obstruction
Jan 8, 2026
e160d12
Fix volume indicator to stay fixed with thumb at edges
Jan 8, 2026
5addb92
Fix indicator position to match Slider's internal thumb positioning
Jan 8, 2026
62f36a0
Add curved path animations for player expand transition
Jan 8, 2026
3b1a33d
Implement proper Hero-like animations for player expansion
Jan 8, 2026
377d2a5
perf: Optimize expandable player for 60-120fps animations
Jan 8, 2026
f7caf67
perf: Cache commonly used color opacities to reduce allocations
Jan 8, 2026
5cbca93
fix: Smooth shuffle/repeat button appearance to prevent control jerk
Jan 8, 2026
8408db3
perf: Optimize animations for butter-smooth 60-120fps
Jan 8, 2026
6d7e233
Merge branch 'feature/volume-control-redesign' into feature/curved-pl…
Jan 8, 2026
df38f8e
perf: Phase 5 - Cache animations and pre-compute lerp values
Jan 8, 2026
038fccc
Fix home screen sections not rendering after reconnection (#41)
Jan 9, 2026
036d74a
Fix TrackRow to use setState pattern for reconnection
Jan 9, 2026
28d9195
Eliminate spinner flash by loading cache synchronously in initState
Jan 9, 2026
7123898
Fix series cover hero animation showing wrong image
Jan 9, 2026
5d00705
Fix mini player text rows vertical centering
Jan 9, 2026
2e27485
Adjust mini player text: shift down while preserving gaps
Jan 9, 2026
4edcf85
Fix mini player: only lower primary row (9, 26, 46)
Jan 9, 2026
3bc8ef9
Fix nav bar using adaptive colors on home screen
Jan 9, 2026
fdd51af
DEBUG: Red nav bar to verify fix is active
Jan 9, 2026
440a02e
Fix nav bar using adaptive colors on home screen with collapsed player
Jan 9, 2026
9030a2b
Remove debug logging from nav bar fix
Jan 9, 2026
139ced9
Redesign library type bar as unified segmented control
Jan 9, 2026
e89a4e2
Library type bar: proportional flex based on label length
Jan 9, 2026
c009603
Add pastel colors for each library type
Jan 9, 2026
473f076
Fix library bar to fill full width with proportional flex
Jan 9, 2026
aff9cb1
Match library type bar font size to filter bar (14px)
Jan 9, 2026
e7c03c6
Theme-aware colors for library type bar
Jan 9, 2026
4643288
Library type bar: muted colors based on primaryContainer tone
Jan 9, 2026
46ab367
Add swipe between media types at category boundaries
Jan 9, 2026
05f09f7
Fix swipe direction for media type switching
Jan 9, 2026
b351cbd
Fix swipe for single-category types (Podcasts, Radio)
Jan 9, 2026
a7df388
Add sliding animation for library type tabs
Jan 9, 2026
cbb5c68
Full height highlight with small horizontal inset only
Jan 9, 2026
1970bbf
Add sliding animation to category filter bar
Jan 9, 2026
92333f8
Filter bar uses same color as parent media type
Jan 9, 2026
29eb716
Fix highlight alignment at bar edges
Jan 9, 2026
dedd1d2
Fix podcast player: correct podcast name and text overlap
Jan 9, 2026
6dbd0bb
Bump version to 2.8.6-beta+44
Jan 9, 2026
601dd8a
Add favorite podcasts row and fix home row conformity
Jan 10, 2026
02d7ea1
Increase row title bottom padding from 8px to 9px
Jan 10, 2026
73a2359
Revert "Increase row title bottom padding from 8px to 9px"
Jan 10, 2026
6a8a497
Add 1px spacing between home screen rows
Jan 10, 2026
5fcfe1d
Add debug colors to visualize row layout
Jan 10, 2026
b15de97
Increase margin between rows from 1px to 2px
Jan 10, 2026
ca7b5d8
Fix scroll overflow by accounting for margins in row height calculation
Jan 10, 2026
0dc069b
Fix 4th row peeking by only adjusting height for ≤3 rows
Jan 10, 2026
7798106
Add red debug bar at end of content with calculated values
Jan 10, 2026
2fdd3b4
Add blue debug color to content area of all rows
Jan 10, 2026
2f933da
Remove all debug coloring from rows and home screen
Jan 11, 2026
c5bcc50
Merge feature/home-row-conformity-and-favorite-podcasts: Row conformi…
Jan 11, 2026
9dbcf99
Upgrade PlaylistDetailsScreen to match AlbumDetailsScreen quality
Jan 11, 2026
49077b9
Add hero animations to playlist displays across all screens
Jan 11, 2026
beeebeb
Fix language fallback to English and add French translation
Jan 11, 2026
49e8bbb
Add long-press to favorite on PlaylistCard
Jan 11, 2026
6a78405
Revert "Add long-press to favorite on PlaylistCard"
Jan 11, 2026
e5274ca
Fix favorite artists not showing on startup (issue #41)
Jan 11, 2026
9817571
Add animated sliding highlight to search filter bar
Jan 11, 2026
cd43ad0
Fix queue sync issues and add error handling (issue #30)
Jan 11, 2026
2770206
Bump version to 2.8.7-beta+45
Jan 11, 2026
cc34f4f
Initial plan
Copilot Jan 12, 2026
f0fa709
Complete comparison analysis and email drafts
Copilot Jan 12, 2026
386df40
Add user guide for comparison documents
Copilot Jan 12, 2026
7637215
Simplify email drafts: remove formatting, soften language about impos…
Copilot Jan 12, 2026
d4e4635
Merge remote-tracking branch 'upstream/master' into copilot/compare-u…
Copilot Jan 12, 2026
150709e
Backport upstream v2.8.7-beta+45 changes with remote access preserved
Copilot Jan 12, 2026
41d24b6
Fix CI build failure: make keystore signing optional
Copilot Jan 12, 2026
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
24 changes: 23 additions & 1 deletion .github/workflows/build-apk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,16 @@ jobs:
channel: 'stable'
cache: true

- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
gradle-${{ runner.os }}-

- name: Get dependencies
run: flutter pub get

Expand All @@ -52,6 +62,7 @@ jobs:
continue-on-error: true

- name: Setup signing keystore
if: ${{ secrets.KEYSTORE_BASE64 != '' }}
run: |
# Decode keystore from secret (persistent key for consistent signatures)
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > android/app/upload-keystore.jks
Expand All @@ -64,8 +75,19 @@ jobs:
storeFile=upload-keystore.jks
EOF

- name: Note about signing
if: ${{ secrets.KEYSTORE_BASE64 == '' }}
run: |
echo "⚠️ No signing keystore configured - APK will be signed with debug key"
echo "This is normal for forks. The APK will still work for testing."

- name: Build APK
run: flutter build apk --release
run: |
# Use init.gradle to force Maven mirrors (workaround for Maven Central 403)
mkdir -p ~/.gradle
cp android/init.gradle ~/.gradle/init.gradle

flutter build apk --release

- name: Upload APK artifact
uses: actions/upload-artifact@v4
Expand Down
182 changes: 182 additions & 0 deletions .prompts/player-animation-audit.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
# Player System Animation & Polish Audit

## Context

This is a Music Assistant client app (Ensemble) built with Flutter. The player system has undergone extensive development and now needs a comprehensive polish audit. The goal is buttery smooth 60fps animations and a premium user experience.

## Architecture Overview

The player system consists of three interconnected components:

1. **Mini Player** (collapsed state) - Floating card at bottom, shows current track
2. **Expanded Player** - Full-screen player with album art, controls, progress
3. **Queue Panel** - Slides in from right of expanded player, shows playback queue

Additionally:
- **Player Selector** - Horizontal swipe between multiple players (collapsed mode)
- **Device Reveal** - Swipe down from mini player to show available players

## Key Files

```
lib/widgets/
├── expandable_player.dart # Main player widget (1800+ lines)
├── global_player_overlay.dart # Overlay wrapper, static accessors
├── player/
│ ├── queue_panel.dart # Queue list with great_list_view
│ ├── chapters_panel.dart # Audiobook chapters
│ └── mini_player_content.dart
```

## CRITICAL CONSTRAINTS

1. **DO NOT MODIFY the queue list implementation** - It uses `great_list_view` package with `AutomaticAnimatedListView`. This was chosen specifically to avoid Flutter's grey screen overlay bug (#103804). The current implementation works correctly.

2. **Preserve all existing functionality** - Focus on polish, not rewrites

3. **Test changes incrementally** - This system is complex with many interdependencies

## Audit Areas

### 1. Animation Performance Audit

Use sub-agents to analyze each animation system:

**Agent 1: Expand/Collapse Animation**
- Analyze `_controller` and `_expandAnimation`
- Check for jank during morphing transition
- Verify lerp functions are efficient
- Look for unnecessary rebuilds during animation
- Check `RepaintBoundary` placement

**Agent 2: Queue Panel Animation**
- Analyze `_queuePanelController` and `_queuePanelAnimation`
- Verify slide-in/out is smooth
- Check interaction with expanded player state
- Verify the Listener-based swipe detection doesn't cause issues

**Agent 3: Player Selector Animation**
- Analyze horizontal swipe between players
- Check `_slideOffset` and peek player animations
- Verify finger-following feels natural
- Look for edge cases with rapid swipes

**Agent 4: Micro-interactions**
- Play/pause button animations
- Progress bar interactions
- Volume swipe overlay
- Favorite button feedback
- Skip button responsiveness

### 2. State Management Audit

**Check for:**
- Unnecessary `setState` calls during animations
- ValueNotifier usage efficiency
- Animation listener cleanup
- Memory leaks from subscriptions
- State synchronization between components

### 3. Visual Polish Audit

**Check for:**
- Color transitions during expand/collapse
- Text fade/scale animations
- Image loading placeholders
- Shadow/elevation consistency
- Border radius morphing smoothness
- Safe area handling

### 4. Gesture Conflict Resolution

**Verify:**
- Vertical drag (expand/collapse) vs horizontal drag (player switch)
- Queue panel swipe-right-to-close vs Dismissible swipe-left-to-delete
- Edge dead zones for Android back gesture
- Tap vs drag disambiguation

### 5. Edge Cases

**Test scenarios:**
- Rapid expand/collapse
- Swipe during animation
- Back button during animations
- Track change during queue scroll
- Network image loading failures
- Very long track/artist names

## Execution Strategy

```
ultrathink: true
```

### Phase 1: Discovery (Read-Only)
Launch parallel sub-agents to analyze each file:
- Read and understand the animation architecture
- Map all animation controllers and their relationships
- Identify potential performance bottlenecks
- Document current RepaintBoundary usage

### Phase 2: Analysis Report
Compile findings into categories:
- **Critical**: Causes visible jank or bugs
- **Important**: Noticeable but not breaking
- **Nice-to-have**: Minor polish improvements

### Phase 3: Implementation Plan
For each finding:
- Specific file and line numbers
- Proposed change
- Risk assessment
- Testing approach

### Phase 4: Incremental Fixes
- One fix at a time
- Build and test after each change
- Verify no regressions

## Output Format

Provide a structured audit report:

```markdown
## Animation Audit Report

### Executive Summary
[2-3 sentences on overall state]

### Critical Issues
1. [Issue]: [File:Line] - [Description] - [Proposed Fix]

### Important Issues
1. [Issue]: [File:Line] - [Description] - [Proposed Fix]

### Polish Opportunities
1. [Issue]: [File:Line] - [Description] - [Proposed Fix]

### Architecture Observations
[Notes on overall structure, patterns noticed]

### Recommended Priority Order
1. [First fix]
2. [Second fix]
...
```

## Success Criteria

After this audit and fixes:
- All animations run at consistent 60fps
- No jank during any transition
- Gestures feel responsive and natural
- State transitions are seamless
- No visual glitches or flickers
- Memory usage is stable during interactions

## Notes

- The app uses adaptive theming (colors extracted from album art)
- There's an `AnimationDebugger` utility for profiling
- Position tracking uses a shared `PositionTracker` singleton
- The player supports both music and audiobooks (different UI modes)
Loading