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 5bfd0a55..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 @@ -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 @@ -560,7 +556,6 @@ class VideoDetailView : ConstraintLayout { _loaderGameVisible = b fragment.lifecycleScope.launch(Dispatchers.Main) { onShouldEnterPictureInPictureChanged.emit() - updateResumeVisibilityFor(lastPositionMilliseconds) } } _player.loaderGameVisibilityChanged.subscribe(handleLoaderGameVisibilityChanged) @@ -1848,7 +1843,6 @@ class VideoDetailView : ConstraintLayout { TAG, "Historical position: $_historicalPosition, last position: $lastPositionMilliseconds" ); - updateResumeVisibilityFor(lastPositionMilliseconds) } } } @@ -1899,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 @@ -1920,12 +1912,17 @@ 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 = "" } } + + fun updateResumeClickability(isClickable: Boolean) { + _layoutResume.isClickable = isClickable; + } + fun loadVODChat(video: IPlatformVideoDetails) { _liveChat?.stop(); _container_content_liveChat.cancel(); @@ -2213,6 +2210,8 @@ class VideoDetailView : ConstraintLayout { _layoutPlayerContainer.post { onShouldEnterPictureInPictureChanged.emit() } + + updateResumeVisibilityFor(lastPositionMilliseconds); } private var _didTriggerDatasourceErrorCount = 0; @@ -2843,6 +2842,7 @@ class VideoDetailView : ConstraintLayout { private fun fetchVideo() { Logger.i(TAG, "fetchVideo") video = null; + _layoutResume.visibility = View.GONE; cleanupPlaybackTracker(); val url = _url; @@ -2958,8 +2958,6 @@ class VideoDetailView : ConstraintLayout { _overlay_loading.visibility = View.GONE; (_overlay_loading_spinner.drawable as Animatable?)?.stop() } - - updateResumeVisibilityFor(lastPositionMilliseconds) } //UI Actions @@ -3252,7 +3250,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) { 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