Files
Android-247-Radio/chat-summaries/2026-03-09_ui-polish-and-pause.md
cottongin 5dd7a411ed fix: refactor player state machine to eliminate race conditions
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
2026-03-10 05:15:31 -04:00

2.3 KiB

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