39 lines
2.3 KiB
Markdown
39 lines
2.3 KiB
Markdown
|
|
# UI polish: navigation, pause, artwork, scrollability
|
||
|
|
|
||
|
|
**Date:** 2026-03-09
|
||
|
|
|
||
|
|
## Task description
|
||
|
|
Five UI/UX improvements after manual testing.
|
||
|
|
|
||
|
|
## Changes made
|
||
|
|
|
||
|
|
### 1. Auto-navigate to Now Playing on station tap (StationListScreen.kt)
|
||
|
|
- `onPlay` callback now calls `onNavigateToNowPlaying()` immediately after `viewModel.playStation()`.
|
||
|
|
|
||
|
|
### 2. Auto-navigate back to station list on stop (NowPlayingScreen.kt)
|
||
|
|
- `LaunchedEffect(playbackState)` watches for `PlaybackState.Idle` and calls `onBack()`.
|
||
|
|
- Removed the "Nothing playing" dead-end screen.
|
||
|
|
|
||
|
|
### 3. Pause/resume support
|
||
|
|
- **PlaybackState.kt**: Added `Paused(station, metadata, sessionStartedAt)` state.
|
||
|
|
- **RadioController.kt**: Added `pause()` method sending `ACTION_PAUSE`.
|
||
|
|
- **RadioPlaybackService.kt**: `handlePause()` sets `pauseRequested = true` and stops engine. In `handlePlay`'s finally block, if paused: updates state to `Paused`, keeps listening session alive, doesn't cleanup service. On resume (ACTION_PLAY with same station while paused), reuses the session.
|
||
|
|
- **NowPlayingViewModel.kt**: Added `pause()` and `resume()`. Session timer keeps ticking during pause.
|
||
|
|
- **NowPlayingScreen.kt**: Transport controls adapt to state — paused shows large play/resume button + stop; playing shows skip-ahead + pause + stop.
|
||
|
|
|
||
|
|
### 4. Artwork in mini player and station list
|
||
|
|
- **MiniPlayer.kt**: Shows 40dp rounded artwork thumbnail from ICY StreamUrl or station's `defaultArtworkUrl`. Shows "Paused"/"Reconnecting..." subtitle as appropriate.
|
||
|
|
- **StationListScreen.kt**: Station rows show a 36dp circular artwork thumbnail from `defaultArtworkUrl` (EXTIMG) when available.
|
||
|
|
|
||
|
|
### 5. Scrollability / drag-n-drop readiness
|
||
|
|
- LazyColumn was already scrollable. Added `padding(vertical = 4.dp)` to station rows for better touch targets. All items have stable keys (`station.id`, `"playlist_header_${playlist.id}"`) ready for reorderable integration.
|
||
|
|
|
||
|
|
## Files changed
|
||
|
|
- `app/src/main/java/.../service/PlaybackState.kt`
|
||
|
|
- `app/src/main/java/.../service/RadioController.kt`
|
||
|
|
- `app/src/main/java/.../service/RadioPlaybackService.kt`
|
||
|
|
- `app/src/main/java/.../ui/screens/nowplaying/NowPlayingScreen.kt`
|
||
|
|
- `app/src/main/java/.../ui/screens/nowplaying/NowPlayingViewModel.kt`
|
||
|
|
- `app/src/main/java/.../ui/screens/stationlist/StationListScreen.kt`
|
||
|
|
- `app/src/main/java/.../ui/components/MiniPlayer.kt`
|