From 0bba7fa37306fc4bcab52a2b87ac4129ad9cc22d Mon Sep 17 00:00:00 2001 From: Koen Date: Fri, 17 Nov 2023 16:44:16 +0100 Subject: [PATCH] Keep screen on fixes. --- .../java/com/futo/platformplayer/Settings.kt | 3 +++ .../dialogs/AutoUpdateDialog.kt | 3 +++ .../platformplayer/dialogs/ImportDialog.kt | 3 +++ .../platformplayer/dialogs/MigrateDialog.kt | 2 ++ .../mainactivity/main/VideoDetailFragment.kt | 3 --- .../mainactivity/main/VideoDetailView.kt | 26 +++++++++++++++++-- .../views/video/FutoVideoPlayer.kt | 2 +- .../views/video/FutoVideoPlayerBase.kt | 19 +++++++++++--- app/src/main/res/values/strings.xml | 2 ++ app/src/stable/assets/sources/youtube | 2 +- 10 files changed, 54 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/Settings.kt b/app/src/main/java/com/futo/platformplayer/Settings.kt index 6abe9216..dc8652d2 100644 --- a/app/src/main/java/com/futo/platformplayer/Settings.kt +++ b/app/src/main/java/com/futo/platformplayer/Settings.kt @@ -426,6 +426,9 @@ class Settings : FragmentedStorageFileJson() { @Serializable(with = FlexibleBooleanSerializer::class) var enabled: Boolean = true; + @FormField(R.string.keep_screen_on, FieldForm.TOGGLE, R.string.keep_screen_on_while_casting, 1) + @Serializable(with = FlexibleBooleanSerializer::class) + var keepScreenOn: Boolean = true; /*TODO: Should we have a different casting quality? @FormField("Preferred Casting Quality", FieldForm.DROPDOWN, "", 3) diff --git a/app/src/main/java/com/futo/platformplayer/dialogs/AutoUpdateDialog.kt b/app/src/main/java/com/futo/platformplayer/dialogs/AutoUpdateDialog.kt index b6bbc04d..b8e15806 100644 --- a/app/src/main/java/com/futo/platformplayer/dialogs/AutoUpdateDialog.kt +++ b/app/src/main/java/com/futo/platformplayer/dialogs/AutoUpdateDialog.kt @@ -95,6 +95,8 @@ class AutoUpdateDialog(context: Context?) : AlertDialog(context) { _buttonUpdate.visibility = Button.GONE; setCancelable(false); setCanceledOnTouchOutside(false); + + Logger.i(TAG, "Keep screen on set update") window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); _text.text = context.resources.getText(R.string.downloading_update); @@ -178,6 +180,7 @@ class AutoUpdateDialog(context: Context?) : AlertDialog(context) { } } finally { withContext(Dispatchers.Main) { + Logger.i(TAG, "Keep screen on unset install") window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } } diff --git a/app/src/main/java/com/futo/platformplayer/dialogs/ImportDialog.kt b/app/src/main/java/com/futo/platformplayer/dialogs/ImportDialog.kt index f12b1305..73995003 100644 --- a/app/src/main/java/com/futo/platformplayer/dialogs/ImportDialog.kt +++ b/app/src/main/java/com/futo/platformplayer/dialogs/ImportDialog.kt @@ -134,6 +134,8 @@ class ImportDialog : AlertDialog { setCancelable(false); setCanceledOnTouchOutside(false); + + Logger.i(TAG, "Keep screen on set import") window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); _updateSpinner.drawable?.assume()?.start(); @@ -201,6 +203,7 @@ class ImportDialog : AlertDialog { } catch (e: Throwable) { Logger.e(TAG, "Failed to update import UI.", e) } finally { + Logger.i(TAG, "Keep screen on unset update") window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } } diff --git a/app/src/main/java/com/futo/platformplayer/dialogs/MigrateDialog.kt b/app/src/main/java/com/futo/platformplayer/dialogs/MigrateDialog.kt index dd91a7eb..67e5443b 100644 --- a/app/src/main/java/com/futo/platformplayer/dialogs/MigrateDialog.kt +++ b/app/src/main/java/com/futo/platformplayer/dialogs/MigrateDialog.kt @@ -144,6 +144,7 @@ class MigrateDialog : AlertDialog { setCancelable(false); setCanceledOnTouchOutside(false); + Logger.i(TAG, "Keep screen on set restore") window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); _updateSpinner.drawable?.assume()?.start(); @@ -214,6 +215,7 @@ class MigrateDialog : AlertDialog { } catch (e: Throwable) { Logger.e(TAG, "Failed to update import UI.", e) } finally { + Logger.i(TAG, "Keep screen on unset restore") window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } } 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 176c6b73..41b8ade7 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 @@ -68,8 +68,6 @@ class VideoDetailFragment : MainFragment { super.onShownWithView(parameter, isBack); Logger.i(TAG, "onShownWithView parameter=$parameter") - activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - if(parameter is IPlatformVideoDetails) _viewDetail?.setVideoDetails(parameter, true); else if (parameter is IPlatformVideo) @@ -176,7 +174,6 @@ class VideoDetailFragment : MainFragment { _viewDetail?.onStop(); close(); - activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); StatePlayer.instance.clearQueue(); StatePlayer.instance.setPlayerClosed(); } 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 a6ce30d4..5a366550 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 @@ -22,6 +22,7 @@ import android.view.MotionEvent import android.view.View import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT +import android.view.WindowManager import android.widget.* import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.lifecycleScope @@ -59,6 +60,7 @@ import com.futo.platformplayer.casting.StateCasting import com.futo.platformplayer.constructs.Event0 import com.futo.platformplayer.constructs.Event1 import com.futo.platformplayer.constructs.TaskHandler +import com.futo.platformplayer.dialogs.AutoUpdateDialog import com.futo.platformplayer.downloads.VideoLocal import com.futo.platformplayer.engine.exceptions.ScriptAgeException import com.futo.platformplayer.engine.exceptions.ScriptException @@ -216,6 +218,9 @@ class VideoDetailView : ConstraintLayout { private var _lastAudioSource: IAudioSource? = null; private var _lastSubtitleSource: ISubtitleSource? = null; private var _isCasting: Boolean = false; + + var isPlaying: Boolean = false + private set; var lastPositionMilliseconds: Long = 0 private set; private var _historicalPosition: Long = 0; @@ -600,6 +605,8 @@ class VideoDetailView : ConstraintLayout { _lastSubtitleSource = null; video = null; _playbackTracker = null; + Logger.i(TAG, "Keep screen on unset onClose") + fragment.activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); }; _layoutResume.setOnClickListener { @@ -1680,14 +1687,28 @@ class VideoDetailView : ConstraintLayout { if(playing) { _minimize_controls_pause.visibility = View.VISIBLE; _minimize_controls_play.visibility = View.GONE; + + if (_isCasting) { + if (Settings.instance.casting.keepScreenOn) { + Logger.i(TAG, "Keep screen on set handlePlayChanged casting") + fragment.activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + } else { + Logger.i(TAG, "Keep screen on set handlePlayChanged player") + fragment.activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } } else { _minimize_controls_pause.visibility = View.GONE; _minimize_controls_play.visibility = View.VISIBLE; + + Logger.i(TAG, "Keep screen on unset handlePlayChanged") + fragment.activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } + isPlaying = playing; onPlayChanged.emit(playing); - updateTracker(_player.position, playing, true); + updateTracker(lastPositionMilliseconds, playing, true); } private fun handleSelectVideoTrack(videoSource: IVideoSource) { @@ -2031,7 +2052,8 @@ class VideoDetailView : ConstraintLayout { StatePlaylists.instance.updateHistoryPosition(v, true, (positionMilliseconds.toFloat() / 1000.0f).toLong()); _lastPositionSaveTime = currentTime; } - updateTracker(positionMilliseconds, _player.playing, false); + + updateTracker(positionMilliseconds, isPlaying, false); } private fun updateTracker(positionMs: Long, isPlaying: Boolean, forceUpdate: Boolean = false) { diff --git a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayer.kt b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayer.kt index f537232c..01eb189c 100644 --- a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayer.kt +++ b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayer.kt @@ -295,7 +295,7 @@ class FutoVideoPlayer : FutoVideoPlayerBase { Logger.i(TAG, "Updated chapter to [${_currentChapter?.name}] with speed ${delta}ms (${pos - (_currentChapter?.timeStart?.times(1000)?.toLong() ?: 0)}ms late [${_currentChapter?.timeStart}s])"); } } - if(playingCached) + if(playing) updateChaptersLoop(loopId); else _currentChapterLoopActive = false; diff --git a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt index c58b0908..3f873b8c 100644 --- a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt +++ b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt @@ -1,6 +1,7 @@ package com.futo.platformplayer.views.video import android.content.Context +import android.media.session.PlaybackState import android.net.Uri import android.util.AttributeSet import android.widget.RelativeLayout @@ -60,8 +61,7 @@ abstract class FutoVideoPlayerBase : RelativeLayout { private set; val exoPlayerStateName: String; - protected var playingCached: Boolean = false; - val playing: Boolean get() = exoPlayer?.player?.playWhenReady ?: false; + var playing: Boolean = false; val position: Long get() = exoPlayer?.player?.currentPosition ?: 0; val duration: Long get() = exoPlayer?.player?.duration ?: 0; @@ -99,12 +99,23 @@ abstract class FutoVideoPlayerBase : RelativeLayout { } } } + + updatePlaying(); } override fun onPlayWhenReadyChanged(playWhenReady: Boolean, reason: Int) { super.onPlayWhenReadyChanged(playWhenReady, reason) - onPlayChanged.emit(playWhenReady); - playingCached = playWhenReady; + updatePlaying(); + } + + fun updatePlaying() { + val newPlaying = exoPlayer?.let { it.player.playWhenReady && it.player.playbackState != Player.STATE_ENDED && it.player.playbackState != Player.STATE_IDLE } ?: false + if (newPlaying == playing) { + return; + } + + playing = newPlaying; + onPlayChanged.emit(playing); } override fun onVideoSizeChanged(videoSize: VideoSize) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c6da8040..069318e6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -60,6 +60,8 @@ View all Creators Enabled + Keep screen on + Keep screen on while casting Discover Find new video sources to add These sources have been disabled diff --git a/app/src/stable/assets/sources/youtube b/app/src/stable/assets/sources/youtube index 4f89b407..8f10daba 160000 --- a/app/src/stable/assets/sources/youtube +++ b/app/src/stable/assets/sources/youtube @@ -1 +1 @@ -Subproject commit 4f89b4072f4473ff0ffac1711023dffd20f0a868 +Subproject commit 8f10daba1ef9cbcd99f3c640d86808f8c94aa84a