From c396b673ac3ed9fa5df3890b90bc02a962b9f439 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Tue, 26 May 2026 14:02:06 -0400 Subject: [PATCH] feat(android): surface queue source on PlayerUiState Reads MINSTREL_SOURCE_KEY from the current MediaItem's extras and projects it as PlayerUiState.currentSource. PlayEventsReporter needs this to tag plays with their originating system playlist ('for_you'/'discover'/'radio:') so the server advances the right rotation. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../java/com/fabledsword/minstrel/player/PlayerController.kt | 5 +++++ .../java/com/fabledsword/minstrel/player/PlayerUiState.kt | 1 + 2 files changed, 6 insertions(+) diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerController.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerController.kt index 68aca185..35fb5909 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerController.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerController.kt @@ -156,6 +156,10 @@ class PlayerController @Inject constructor( override fun onEvents(player: Player, events: Player.Events) { val idx = player.currentMediaItemIndex val current = queueRefs.getOrNull(idx) + val source = player.currentMediaItem + ?.mediaMetadata + ?.extras + ?.getString(MINSTREL_SOURCE_KEY) uiStateInternal.value = PlayerUiState( currentTrack = current, @@ -167,6 +171,7 @@ class PlayerController @Inject constructor( durationMs = player.duration.coerceAtLeast(0), bufferedPositionMs = player.bufferedPosition.coerceAtLeast(0), playbackError = player.playerError?.message, + currentSource = source, ) } }, diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerUiState.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerUiState.kt index 6d1253b2..1a40daf8 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerUiState.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerUiState.kt @@ -18,4 +18,5 @@ data class PlayerUiState( val durationMs: Long = 0, val bufferedPositionMs: Long = 0, val playbackError: String? = null, + val currentSource: String? = null, )