From ddf1750025706810f0dbbe1492f42ee06cf10359 Mon Sep 17 00:00:00 2001 From: kalzEOS <49320606+kalzEOS@users.noreply.github.com> Date: Fri, 3 Jul 2026 23:02:57 -0400 Subject: [PATCH] Fix live playback queue restart --- app/build.gradle.kts | 4 ++-- .../com/example/xtreamplayer/MainActivityUi.kt | 15 +++++++++++++++ .../example/xtreamplayer/MainActivityUiPlayer.kt | 4 ++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a72d0d3..83914a3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,8 +3,8 @@ import java.util.Properties import org.gradle.api.provider.Property import org.jetbrains.kotlin.gradle.dsl.JvmTarget -val appVersionCode = 151 -val appVersionName = "3.5.5" +val appVersionCode = 152 +val appVersionName = "3.5.6" plugins { alias(libs.plugins.android.application) diff --git a/app/src/main/java/com/example/xtreamplayer/MainActivityUi.kt b/app/src/main/java/com/example/xtreamplayer/MainActivityUi.kt index 0b43f90..36c8e04 100644 --- a/app/src/main/java/com/example/xtreamplayer/MainActivityUi.kt +++ b/app/src/main/java/com/example/xtreamplayer/MainActivityUi.kt @@ -1183,8 +1183,23 @@ fun RootScreen( BufferProfile.VOD } playbackEngine.setBufferProfile(profile) + val prevQueue = activePlaybackQueue activePlaybackQueue = queue activePlaybackTitle = queue.items.getOrNull(queue.startIndex)?.title ?: startItem.title + // If the queue is structurally identical to the current one, Compose won't re-fire + // LaunchedEffect(activePlaybackQueue). This happens when switching back to the original + // channel after ExoPlayer has silently auto-advanced to a different queue position. + if (queue == prevQueue) { + playbackFallbackAttempts = queue.fallbackUris.mapValues { 0 } + playbackPrimaryRetries = queue.fallbackUris.mapValues { 0 } + playbackEngine.setQueue(queue.items, queue.startIndex) + val seekPosition = resumePositionMs + if (seekPosition != null && seekPosition > 0) { + playbackEngine.player.seekTo(seekPosition) + resumePositionMs = null + } + playbackEngine.player.playWhenReady = true + } } val handlePlayItem: (ContentItem, List) -> Unit = { item, items -> diff --git a/app/src/main/java/com/example/xtreamplayer/MainActivityUiPlayer.kt b/app/src/main/java/com/example/xtreamplayer/MainActivityUiPlayer.kt index d2875e5..362d162 100644 --- a/app/src/main/java/com/example/xtreamplayer/MainActivityUiPlayer.kt +++ b/app/src/main/java/com/example/xtreamplayer/MainActivityUiPlayer.kt @@ -2071,8 +2071,8 @@ internal fun PlayerOverlay( } } - DisposableEffect(isDualScreenActive) { - if (isDualScreenActive) { + DisposableEffect(isDualScreenActive, currentContentType) { + if (isDualScreenActive || currentContentType == ContentType.LIVE) { player.repeatMode = Player.REPEAT_MODE_ONE } else { player.repeatMode = Player.REPEAT_MODE_OFF