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 50122c0..3612a51 100644 --- a/android/app/src/main/kotlin/com/novasonic/app/MusicService.kt +++ b/android/app/src/main/kotlin/com/novasonic/app/MusicService.kt @@ -19,7 +19,6 @@ import androidx.media3.session.CacheBitmapLoader import androidx.media3.session.MediaSession import androidx.media3.session.MediaSessionService import com.google.common.util.concurrent.MoreExecutors -import com.google.common.util.concurrent.Futures import java.util.concurrent.Executors class MusicService : MediaSessionService() { @@ -113,17 +112,25 @@ class MusicService : MediaSessionService() { .setSessionActivity(notifTapPending) .setCallback(object : MediaSession.Callback { // Intercept notification next/prev so JS (not ExoPlayer) handles queue logic. - override fun onSkipToNextMediaItem( - session: MediaSession, controller: MediaSession.ControllerInfo - ) = Futures.immediateFuture(androidx.media3.session.SessionResult( - androidx.media3.session.SessionResult.RESULT_SUCCESS - )).also { stateListener?.onSkipToNext() } - - override fun onSkipToPreviousMediaItem( - session: MediaSession, controller: MediaSession.ControllerInfo - ) = Futures.immediateFuture(androidx.media3.session.SessionResult( - androidx.media3.session.SessionResult.RESULT_SUCCESS - )).also { stateListener?.onSkipToPrevious() } + // With single-track model ExoPlayer has no queue to advance — block the command + // and delegate to JS instead. + override fun onPlayerCommandRequest( + session: MediaSession, + controller: MediaSession.ControllerInfo, + playerCommand: Int + ): Int = when (playerCommand) { + Player.COMMAND_SEEK_TO_NEXT, + Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM -> { + stateListener?.onSkipToNext() + androidx.media3.session.SessionResult.RESULT_ERROR_NOT_SUPPORTED + } + Player.COMMAND_SEEK_TO_PREVIOUS, + Player.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM -> { + stateListener?.onSkipToPrevious() + androidx.media3.session.SessionResult.RESULT_ERROR_NOT_SUPPORTED + } + else -> androidx.media3.session.SessionResult.RESULT_SUCCESS + } }) .build()