From d8611eb0e0ed4b82f8223352acdc0200c1445065 Mon Sep 17 00:00:00 2001 From: Nikita Kalugin Date: Wed, 25 Mar 2026 17:26:43 +0300 Subject: [PATCH 1/5] Remove unused imports --- .../fragment/mainactivity/main/VideoDetailView.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt index 5bfd0a55..f95880be 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt @@ -33,7 +33,6 @@ import android.widget.ImageButton import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView -import androidx.compose.ui.text.toLowerCase import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.lifecycleScope import androidx.media3.common.C @@ -43,7 +42,6 @@ import androidx.media3.datasource.HttpDataSource import androidx.media3.ui.PlayerControlView import androidx.media3.ui.TimeBar import com.bumptech.glide.Glide -import com.bumptech.glide.load.resource.bitmap.DownsampleStrategy import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.transition.Transition import com.futo.platformplayer.BuildConfig @@ -57,7 +55,6 @@ import com.futo.platformplayer.api.media.LiveChatManager import com.futo.platformplayer.api.media.PlatformID import com.futo.platformplayer.api.media.exceptions.ContentNotAvailableYetException import com.futo.platformplayer.api.media.exceptions.NoPlatformClientException -import com.futo.platformplayer.api.media.models.PlatformAuthorLink import com.futo.platformplayer.api.media.models.PlatformAuthorMembershipLink import com.futo.platformplayer.api.media.models.chapters.ChapterType import com.futo.platformplayer.api.media.models.chapters.IChapter @@ -180,7 +177,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext -import kotlinx.serialization.json.Json import userpackage.Protocol import java.time.OffsetDateTime import java.util.Locale From a4f3d4f333415bbe9de82d4c2d98a97995c3c78e Mon Sep 17 00:00:00 2001 From: Nikita Kalugin Date: Wed, 25 Mar 2026 17:28:56 +0300 Subject: [PATCH 2/5] Simplify resume show code. Just show in at the beginning of video playback, ignore loader and loaderGame --- .../fragment/mainactivity/main/VideoDetailView.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt index f95880be..e3699089 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt @@ -556,7 +556,6 @@ class VideoDetailView : ConstraintLayout { _loaderGameVisible = b fragment.lifecycleScope.launch(Dispatchers.Main) { onShouldEnterPictureInPictureChanged.emit() - updateResumeVisibilityFor(lastPositionMilliseconds) } } _player.loaderGameVisibilityChanged.subscribe(handleLoaderGameVisibilityChanged) @@ -1844,7 +1843,6 @@ class VideoDetailView : ConstraintLayout { TAG, "Historical position: $_historicalPosition, last position: $lastPositionMilliseconds" ); - updateResumeVisibilityFor(lastPositionMilliseconds) } } } @@ -1895,12 +1893,10 @@ class VideoDetailView : ConstraintLayout { } private fun shouldShowResume(positionMs: Long): Boolean { - if (_loaderGameVisible) return false val v = video ?: return false val resumeS = _historicalPosition val durS = v.duration - if (_overlay_loading.visibility == View.VISIBLE) return false if (resumeS <= 60) return false if (durS - resumeS <= 5) return false @@ -2209,6 +2205,8 @@ class VideoDetailView : ConstraintLayout { _layoutPlayerContainer.post { onShouldEnterPictureInPictureChanged.emit() } + + updateResumeVisibilityFor(lastPositionMilliseconds); } private var _didTriggerDatasourceErrorCount = 0; @@ -2839,6 +2837,7 @@ class VideoDetailView : ConstraintLayout { private fun fetchVideo() { Logger.i(TAG, "fetchVideo") video = null; + _layoutResume.visibility = View.GONE; cleanupPlaybackTracker(); val url = _url; @@ -2954,8 +2953,6 @@ class VideoDetailView : ConstraintLayout { _overlay_loading.visibility = View.GONE; (_overlay_loading_spinner.drawable as Animatable?)?.stop() } - - updateResumeVisibilityFor(lastPositionMilliseconds) } //UI Actions From 276c67d2bc262357e4beabc20373ef83267062a0 Mon Sep 17 00:00:00 2001 From: Nikita Kalugin Date: Wed, 25 Mar 2026 17:29:12 +0300 Subject: [PATCH 3/5] fix: prevent resume visibility update loops and manual state (pip/minimized) overrides --- .../fragment/mainactivity/main/VideoDetailView.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt index e3699089..de320ec8 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt @@ -3245,7 +3245,11 @@ class VideoDetailView : ConstraintLayout { } } - updateResumeVisibilityFor(positionMilliseconds) + // Hide resume only if visible to avoid overriding manual states (PiP/minimized) + // and to prevent infinite update loops. + if (_layoutResume.visibility == View.VISIBLE) { + updateResumeVisibilityFor(positionMilliseconds); + } } private fun updateTracker(positionMs: Long, isPlaying: Boolean, forceUpdate: Boolean = false) { From b131fa9c9fb53530b8109a2d2c6e39730d3c18e3 Mon Sep 17 00:00:00 2001 From: Nikita Kalugin Date: Wed, 25 Mar 2026 17:29:29 +0300 Subject: [PATCH 4/5] fix: restrict resume clickability to maximized player state --- .../fragment/mainactivity/main/VideoDetailFragment.kt | 1 + .../fragment/mainactivity/main/VideoDetailView.kt | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailFragment.kt index 0ef8bad1..843b7ce8 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailFragment.kt @@ -145,6 +145,7 @@ class VideoDetailFragment() : MainFragment() { _viewDetail?.setFullscreen(true) } + _viewDetail?.updateResumeClickability(state == State.MAXIMIZED) updateOrientation() } diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt index de320ec8..dc982902 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt @@ -1918,6 +1918,11 @@ class VideoDetailView : ConstraintLayout { _textResume.text = "" } } + + fun updateResumeClickability(isClickable: Boolean) { + _layoutResume.isClickable = isClickable; + } + fun loadVODChat(video: IPlatformVideoDetails) { _liveChat?.stop(); _container_content_liveChat.cancel(); From b00997017ef2772feaa506fac81b6d539a230948 Mon Sep 17 00:00:00 2001 From: Nikita Kalugin Date: Wed, 25 Mar 2026 17:29:48 +0300 Subject: [PATCH 5/5] feat: extract "Resume at" text to string res and add Russian translation --- .../fragment/mainactivity/main/VideoDetailView.kt | 2 +- app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt index dc982902..26c4bfdb 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt @@ -1912,7 +1912,7 @@ class VideoDetailView : ConstraintLayout { val visible = shouldShowResume(positionMs) if (visible) { _layoutResume.visibility = View.VISIBLE - _textResume.text = "Resume at ${_historicalPosition.toHumanTime(false)}" + _textResume.text = context.getString(R.string.resume_at, _historicalPosition.toHumanTime(false)) } else { _layoutResume.visibility = View.GONE _textResume.text = "" diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index cf66c21d..04f67bb3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -607,6 +607,7 @@ На прошлой неделе В прошлом году За все время + Продолжить с %1$s Рекомендации Подписки diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 962bef48..2107e334 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -953,6 +953,7 @@ Scan QR code Help Change Polycentric profile picture + Resume at %1$s Recommendations Subscriptions