From 208e2f19138b517c56051bf1c0ac8275a5ea5dab Mon Sep 17 00:00:00 2001 From: grakovne Date: Sun, 15 Dec 2024 15:17:27 +0100 Subject: [PATCH] fix Stackoverflow on next mediaitem is not found --- app/build.gradle.kts | 4 ++-- .../service/PlaybackNotificationService.kt | 19 ++++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8988be66..0062f973 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -25,8 +25,8 @@ android { applicationId = "org.grakovne.lissen" minSdk = 28 targetSdk = 35 - versionCode = 51 - versionName = "1.1.20" + versionCode = 52 + versionName = "1.1.21" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/java/org/grakovne/lissen/playback/service/PlaybackNotificationService.kt b/app/src/main/java/org/grakovne/lissen/playback/service/PlaybackNotificationService.kt index 76123f3f..5f2c6fe6 100644 --- a/app/src/main/java/org/grakovne/lissen/playback/service/PlaybackNotificationService.kt +++ b/app/src/main/java/org/grakovne/lissen/playback/service/PlaybackNotificationService.kt @@ -36,10 +36,10 @@ class PlaybackNotificationService @Inject constructor( false -> Direction.BACKWARD } - val nextTrack = findAvailableTrackIndex(exoPlayer.currentMediaItemIndex, direction, exoPlayer) - exoPlayer.seekTo(nextTrack, 0) + val nextTrack = findAvailableTrackIndex(exoPlayer.currentMediaItemIndex, direction, exoPlayer, 0) + nextTrack?.let { exoPlayer.seekTo(it, 0) } - if (nextTrack < currentIndex) { + if (nextTrack == null || nextTrack < currentIndex) { exoPlayer.pause() } } @@ -47,17 +47,26 @@ class PlaybackNotificationService @Inject constructor( }) } - private fun findAvailableTrackIndex(currentItem: Int, direction: Direction, exoPlayer: ExoPlayer): Int { + private fun findAvailableTrackIndex( + currentItem: Int, + direction: Direction, + exoPlayer: ExoPlayer, + iteration: Int, + ): Int? { if (exoPlayer.getMediaItemAt(currentItem).mediaId != SilenceMediaSource::class.simpleName) { return currentItem } + if (iteration > 4096) { + return null + } + val foundItem = when (direction) { Direction.FORWARD -> (currentItem + 1) % exoPlayer.mediaItemCount Direction.BACKWARD -> if (currentItem - 1 < 0) exoPlayer.mediaItemCount - 1 else currentItem - 1 } - return findAvailableTrackIndex(foundItem, direction, exoPlayer) + return findAvailableTrackIndex(foundItem, direction, exoPlayer, iteration + 1) } }