diff --git a/android/app/src/main/kotlin/com/novasonic/app/MusicService.kt b/android/app/src/main/kotlin/com/novasonic/app/MusicService.kt index 069e59e..260abd1 100644 --- a/android/app/src/main/kotlin/com/novasonic/app/MusicService.kt +++ b/android/app/src/main/kotlin/com/novasonic/app/MusicService.kt @@ -155,10 +155,6 @@ class MusicService : MediaSessionService() { private inner class PlayerListener : Player.Listener { - // Debounce JS-initiated transitions (seek / queue-replace) so rapid skips - // produce one onTrackChanged notification with the final settled state. - private var _pendingTrackChanged: Runnable? = null - override fun onIsPlayingChanged(isPlaying: Boolean) { val state = player.playbackState stateListener?.onPlaybackStateChanged( @@ -188,31 +184,16 @@ class MusicService : MediaSessionService() { Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED -> "queue" else -> "seek" } - // Always warm artwork immediately so the notification never shows a blank cover. + // Fire immediately — snapshot must always be fresh so the JS-side + // getState() reconciliation in onTrackChanged sees current native state. + stateListener?.onTrackChanged( + player.currentMediaItemIndex, + mediaItem?.mediaId ?: "", + reasonStr + ) + // Pre-warm artwork for current + next tracks so notification + // never shows a blank cover on auto-advance. warmArtworkCache() - - // Cancel any pending debounced dispatch from a previous transition. - _pendingTrackChanged?.let { handler.removeCallbacks(it) } - _pendingTrackChanged = null - - val dispatch = Runnable { - _pendingTrackChanged = null - stateListener?.onTrackChanged( - player.currentMediaItemIndex, - player.currentMediaItem?.mediaId ?: "", - reasonStr - ) - } - - if (reason == Player.MEDIA_ITEM_TRANSITION_REASON_AUTO) { - // Native auto-advance: JS didn't initiate this, notify immediately. - dispatch.run() - } else { - // JS-initiated (seek or setQueue): debounce 120 ms so rapid skips - // coalesce into one callback with the final settled index. - _pendingTrackChanged = dispatch - handler.postDelayed(dispatch, 120) - } } override fun onTimelineChanged(timeline: Timeline, reason: Int) {