Introduce a Connecting state so the UI reflects user intent immediately, centralize navigation in MainActivity via state transitions, and replace the pauseRequested volatile flag with controller state as single source of truth. Made-with: Cursor
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`
|