diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a236cc653..0f2073702 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -39,6 +39,8 @@ { - if (autoplay) playNextVideo() + if (PlayerHelper.autoPlayEnabled) playNextVideo() } Player.STATE_IDLE -> { onDestroy() } Player.STATE_BUFFERING -> {} Player.STATE_READY -> {} - PlaybackState.STATE_PAUSED -> { - query { - DatabaseHelper.saveWatchPosition( - videoId, - player?.currentPosition ?: 0L - ) - } - } } } @@ -332,11 +319,7 @@ class BackgroundMode : Service() { val segmentEnd = (segment.segment[1] * 1000f).toLong() val currentPosition = player?.currentPosition if (currentPosition in segmentStart until segmentEnd) { - if (PreferenceHelper.getBoolean( - "sb_notifications_key", - true - ) - ) { + if (PlayerHelper.sponsorBlockNotifications) { try { Toast.makeText(this, R.string.segment_skipped, Toast.LENGTH_SHORT) .show() diff --git a/app/src/main/java/com/github/libretube/ui/activities/OfflinePlayerActivity.kt b/app/src/main/java/com/github/libretube/ui/activities/OfflinePlayerActivity.kt index fb4205e73..2e717ba73 100644 --- a/app/src/main/java/com/github/libretube/ui/activities/OfflinePlayerActivity.kt +++ b/app/src/main/java/com/github/libretube/ui/activities/OfflinePlayerActivity.kt @@ -1,8 +1,11 @@ package com.github.libretube.ui.activities +import android.app.PictureInPictureParams import android.content.pm.ActivityInfo import android.graphics.Color +import android.media.session.PlaybackState import android.net.Uri +import android.os.Build import android.os.Bundle import android.view.View import android.view.WindowManager @@ -14,6 +17,7 @@ import com.github.libretube.databinding.ActivityOfflinePlayerBinding import com.github.libretube.databinding.ExoStyledPlayerControlViewBinding import com.github.libretube.ui.base.BaseActivity import com.github.libretube.util.DownloadHelper +import com.github.libretube.util.PlayerHelper import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem import com.google.android.exoplayer2.source.MergingMediaSource @@ -43,6 +47,8 @@ class OfflinePlayerActivity : BaseActivity() { initializePlayer() playVideo() + + requestedOrientation = PlayerHelper.getOrientation(player.videoSize) } private fun initializePlayer() { @@ -153,4 +159,20 @@ class OfflinePlayerActivity : BaseActivity() { player.release() super.onDestroy() } + + override fun onUserLeaveHint() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return + + if (!PlayerHelper.pipEnabled) return + + if (player.playbackState == PlaybackState.STATE_PAUSED) return + + enterPictureInPictureMode( + PictureInPictureParams.Builder() + .setActions(emptyList()) + .build() + ) + + super.onUserLeaveHint() + } } diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt index d6a82c925..c924ef1a2 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt @@ -67,7 +67,6 @@ import com.github.libretube.ui.views.BottomSheet import com.github.libretube.util.AutoPlayHelper import com.github.libretube.util.BackgroundHelper import com.github.libretube.util.ImageHelper -import com.github.libretube.util.NetworkHelper import com.github.libretube.util.NowPlayingNotification import com.github.libretube.util.PlayerHelper import com.github.libretube.util.PlayingQueue @@ -150,25 +149,8 @@ class PlayerFragment : BaseFragment() { /** * user preferences */ - private var token = "" - private var relatedStreamsEnabled = true - private var autoRotationEnabled = true - private var pausePlayerOnScreenOffEnabled = false - private var fullscreenOrientationPref = "ratio" - private var watchHistoryEnabled = true - private var watchPositionsEnabled = true - private var useSystemCaptionStyle = true - private var videoFormatPreference = "webm" - private var defRes = "" - private var bufferingGoal = 50000 - private var defaultSubtitleCode = "" - private var sponsorBlockEnabled = true - private var sponsorBlockNotifications = true - private var skipButtonsEnabled = false - private var pipEnabled = true + private var token = PreferenceHelper.getToken() private var videoShownInExternalPlayer = false - private var skipSegmentsManually = false - private var progressiveLoadingIntervalSize = "64" /** * for autoplay @@ -214,7 +196,7 @@ class PlayerFragment : BaseFragment() { setUserPrefs() val mainActivity = activity as MainActivity - if (autoRotationEnabled) { + if (PlayerHelper.autoRotationEnabled) { // enable auto rotation mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR onConfigurationChanged(resources.configuration) @@ -245,102 +227,8 @@ class PlayerFragment : BaseFragment() { token = PreferenceHelper.getToken() // save whether auto rotation is enabled - autoRotationEnabled = PreferenceHelper.getBoolean( - PreferenceKeys.AUTO_FULLSCREEN, - false - ) // save whether related streams are enabled - relatedStreamsEnabled = PreferenceHelper.getBoolean( - PreferenceKeys.RELATED_STREAMS, - true - ) - - fullscreenOrientationPref = PreferenceHelper.getString( - PreferenceKeys.FULLSCREEN_ORIENTATION, - "ratio" - ) - - pausePlayerOnScreenOffEnabled = PreferenceHelper.getBoolean( - PreferenceKeys.PAUSE_ON_SCREEN_OFF, - false - ) - - watchPositionsEnabled = PreferenceHelper.getBoolean( - PreferenceKeys.WATCH_POSITION_TOGGLE, - true - ) - - watchHistoryEnabled = PreferenceHelper.getBoolean( - PreferenceKeys.WATCH_HISTORY_TOGGLE, - true - ) - - useSystemCaptionStyle = PreferenceHelper.getBoolean( - PreferenceKeys.SYSTEM_CAPTION_STYLE, - true - ) - - videoFormatPreference = PreferenceHelper.getString( - PreferenceKeys.PLAYER_VIDEO_FORMAT, - "webm" - ) - - defRes = if (NetworkHelper.isNetworkMobile(requireContext())) { - PreferenceHelper.getString( - PreferenceKeys.DEFAULT_RESOLUTION_MOBILE, - "" - ) - } else { - PreferenceHelper.getString( - PreferenceKeys.DEFAULT_RESOLUTION, - "" - ) - } - - bufferingGoal = PreferenceHelper.getString( - PreferenceKeys.BUFFERING_GOAL, - "50" - ).toInt() * 1000 - - sponsorBlockEnabled = PreferenceHelper.getBoolean( - "sb_enabled_key", - true - ) - - sponsorBlockNotifications = PreferenceHelper.getBoolean( - "sb_notifications_key", - true - ) - - defaultSubtitleCode = PreferenceHelper.getString( - PreferenceKeys.DEFAULT_SUBTITLE, - "" - ) - - if (defaultSubtitleCode.contains("-")) { - defaultSubtitleCode = defaultSubtitleCode.split("-")[0] - } - - skipButtonsEnabled = PreferenceHelper.getBoolean( - PreferenceKeys.SKIP_BUTTONS, - false - ) - - pipEnabled = PreferenceHelper.getBoolean( - PreferenceKeys.PICTURE_IN_PICTURE, - true - ) - - skipSegmentsManually = PreferenceHelper.getBoolean( - PreferenceKeys.SB_SKIP_MANUALLY, - false - ) - - progressiveLoadingIntervalSize = PreferenceHelper.getString( - PreferenceKeys.PROGRESSIVE_LOADING_INTERVAL_SIZE, - "64" - ) } @SuppressLint("ClickableViewAccessibility") @@ -522,7 +410,7 @@ class PlayerFragment : BaseFragment() { // FullScreen button trigger // hide fullscreen button if auto rotation enabled - playerBinding.fullscreen.visibility = if (autoRotationEnabled) View.GONE else View.VISIBLE + playerBinding.fullscreen.visibility = if (PlayerHelper.autoRotationEnabled) View.GONE else View.VISIBLE playerBinding.fullscreen.setOnClickListener { // hide player controller exoPlayerView.hideController() @@ -582,24 +470,9 @@ class PlayerFragment : BaseFragment() { playerBinding.exoTitle.visibility = View.VISIBLE val mainActivity = activity as MainActivity - if (!autoRotationEnabled) { + if (!PlayerHelper.autoRotationEnabled) { // different orientations of the video are only available when auto rotation is disabled - val orientation = when (fullscreenOrientationPref) { - "ratio" -> { - val videoSize = exoPlayer.videoSize - // probably a youtube shorts video - if (videoSize.height > videoSize.width) { - ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT - } // a video with normal aspect ratio - else { - ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE - } - } - "auto" -> ActivityInfo.SCREEN_ORIENTATION_SENSOR - "landscape" -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE - "portrait" -> ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT - else -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE - } + val orientation = PlayerHelper.getOrientation(exoPlayer.videoSize) mainActivity.requestedOrientation = orientation } @@ -619,7 +492,7 @@ class PlayerFragment : BaseFragment() { playerBinding.fullscreen.setImageResource(R.drawable.ic_fullscreen) playerBinding.exoTitle.visibility = View.INVISIBLE - if (!autoRotationEnabled) { + if (!PlayerHelper.autoRotationEnabled) { // switch back to portrait mode if auto rotation disabled val mainActivity = activity as MainActivity mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT @@ -673,7 +546,7 @@ class PlayerFragment : BaseFragment() { // pause player if screen off and setting enabled if ( - this::exoPlayer.isInitialized && !isScreenOn && pausePlayerOnScreenOffEnabled + this::exoPlayer.isInitialized && !isScreenOn && PlayerHelper.pausePlayerOnScreenOffEnabled ) { exoPlayer.pause() } @@ -701,19 +574,19 @@ class PlayerFragment : BaseFragment() { // save the watch position if video isn't finished and option enabled private fun saveWatchPosition() { - if (watchPositionsEnabled && exoPlayer.currentPosition != exoPlayer.duration) { + if (PlayerHelper.watchPositionsEnabled && exoPlayer.currentPosition != exoPlayer.duration) { DatabaseHelper.saveWatchPosition( videoId!!, exoPlayer.currentPosition ) - } else if (watchPositionsEnabled) { + } else if (PlayerHelper.watchPositionsEnabled) { // delete watch position if video has ended DatabaseHelper.removeWatchPosition(videoId!!) } } private fun checkForSegments() { - if (!exoPlayer.isPlaying || !sponsorBlockEnabled) return + if (!exoPlayer.isPlaying || !PlayerHelper.sponsorBlockEnabled) return Handler(Looper.getMainLooper()).postDelayed(this::checkForSegments, 100) @@ -726,7 +599,7 @@ class PlayerFragment : BaseFragment() { // show the button to manually skip the segment if (currentPosition in segmentStart until segmentEnd) { - if (skipSegmentsManually) { + if (PlayerHelper.skipSegmentsManually) { binding.sbSkipBtn.visibility = View.VISIBLE binding.sbSkipBtn.setOnClickListener { exoPlayer.seekTo(segmentEnd) @@ -734,7 +607,7 @@ class PlayerFragment : BaseFragment() { return } - if (sponsorBlockNotifications) { + if (PlayerHelper.sponsorBlockNotifications) { Toast .makeText( context, @@ -749,7 +622,7 @@ class PlayerFragment : BaseFragment() { } } - if (skipSegmentsManually) binding.sbSkipBtn.visibility = View.GONE + if (PlayerHelper.skipSegmentsManually) binding.sbSkipBtn.visibility = View.GONE } private fun playVideo() { @@ -789,14 +662,14 @@ class PlayerFragment : BaseFragment() { } // show the player notification initializePlayerNotification() - if (sponsorBlockEnabled) fetchSponsorBlockSegments() + if (PlayerHelper.sponsorBlockEnabled) fetchSponsorBlockSegments() // show comments if related streams disabled - if (!relatedStreamsEnabled) toggleComments() + if (!PlayerHelper.relatedStreamsEnabled) toggleComments() // prepare for autoplay if (binding.player.autoplayEnabled) setNextStream() // add the video to the watch history - if (watchHistoryEnabled) DatabaseHelper.addToWatchHistory(videoId!!, streams) + if (PlayerHelper.watchHistoryEnabled) DatabaseHelper.addToWatchHistory(videoId!!, streams) } } } @@ -902,7 +775,7 @@ class PlayerFragment : BaseFragment() { player = exoPlayer } - if (useSystemCaptionStyle) { + if (PlayerHelper.useSystemCaptionStyle) { // set the subtitle style val captionStyle = PlayerHelper.getCaptionStyle(requireContext()) exoPlayerView.subtitleView?.setApplyEmbeddedStyles(captionStyle == CaptionStyleCompat.DEFAULT) @@ -964,7 +837,7 @@ class PlayerFragment : BaseFragment() { // Listener for play and pause icon change exoPlayer.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { - if (isPlaying && sponsorBlockEnabled) { + if (isPlaying && PlayerHelper.sponsorBlockEnabled) { Handler(Looper.getMainLooper()).postDelayed( this@PlayerFragment::checkForSegments, 100 @@ -1070,7 +943,7 @@ class PlayerFragment : BaseFragment() { } } } - if (relatedStreamsEnabled) { + if (PlayerHelper.relatedStreamsEnabled) { // only show related streams if enabled binding.relatedRecView.adapter = TrendingAdapter( response.relatedStreams!!, @@ -1120,13 +993,13 @@ class PlayerFragment : BaseFragment() { // next and previous buttons playerBinding.skipPrev.visibility = if ( - skipButtonsEnabled && PlayingQueue.hasPrev() + PlayerHelper.skipButtonsEnabled && PlayingQueue.hasPrev() ) { View.VISIBLE } else { View.INVISIBLE } - playerBinding.skipNext.visibility = if (skipButtonsEnabled) View.VISIBLE else View.INVISIBLE + playerBinding.skipNext.visibility = if (PlayerHelper.skipButtonsEnabled) View.VISIBLE else View.INVISIBLE playerBinding.skipPrev.setOnClickListener { videoId = PlayingQueue.getPrev() @@ -1220,9 +1093,9 @@ class PlayerFragment : BaseFragment() { videoUri: Uri, audioUrl: String ) { - val checkIntervalSize = when (progressiveLoadingIntervalSize) { + val checkIntervalSize = when (PlayerHelper.progressiveLoadingIntervalSize) { "default" -> ProgressiveMediaSource.DEFAULT_LOADING_CHECK_INTERVAL_BYTES - else -> progressiveLoadingIntervalSize.toInt() * 1024 + else -> PlayerHelper.progressiveLoadingIntervalSize.toInt() * 1024 } val dataSourceFactory: DataSource.Factory = @@ -1270,7 +1143,7 @@ class PlayerFragment : BaseFragment() { for (vid in streams.videoStreams!!) { // append quality to list if it has the preferred format (e.g. MPEG) - val preferredMimeType = "video/$videoFormatPreference" + val preferredMimeType = "video/${PlayerHelper.videoFormatPreference}" if (vid.url != null && vid.mimeType == preferredMimeType) { // preferred format videosNameArray += vid.quality.toString() videosUrlArray += vid.url!!.toUri() @@ -1302,9 +1175,9 @@ class PlayerFragment : BaseFragment() { } // set the default subtitle if available - if (defaultSubtitleCode != "" && subtitleCodesList.contains(defaultSubtitleCode)) { + if (PlayerHelper.defaultSubtitleCode != "" && subtitleCodesList.contains(PlayerHelper.defaultSubtitleCode)) { val newParams = trackSelector.buildUponParameters() - .setPreferredTextLanguage(defaultSubtitleCode) + .setPreferredTextLanguage(PlayerHelper.defaultSubtitleCode) .setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION) trackSelector.setParameters(newParams) } @@ -1322,10 +1195,11 @@ class PlayerFragment : BaseFragment() { videosNameArray: Array, videosUrlArray: Array ) { - if (defRes != "") { + val defaultResolution = PlayerHelper.getDefaultResolution(requireContext()) + if (defaultResolution != "") { videosNameArray.forEachIndexed { index, pipedStream -> // search for quality preference in the available stream sources - if (pipedStream.contains(defRes)) { + if (pipedStream.contains(defaultResolution)) { val videoUri = videosUrlArray[index] val audioUrl = PlayerHelper.getAudioSource(requireContext(), streams.audioStreams!!) @@ -1371,7 +1245,7 @@ class PlayerFragment : BaseFragment() { .setBackBuffer(1000 * 60 * 3, true) .setBufferDurationsMs( 1000 * 10, // exo default is 50s - bufferingGoal, + PlayerHelper.bufferingGoal, DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS, DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS ) @@ -1526,7 +1400,7 @@ class PlayerFragment : BaseFragment() { } private fun shouldStartPiP(): Boolean { - if (!pipEnabled || + if (!PlayerHelper.pipEnabled || exoPlayer.playbackState == PlaybackState.STATE_PAUSED || videoShownInExternalPlayer ) { @@ -1558,14 +1432,12 @@ class PlayerFragment : BaseFragment() { override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - if (autoRotationEnabled) { - val orientation = newConfig.orientation - when (orientation) { - // go to fullscreen mode - Configuration.ORIENTATION_LANDSCAPE -> setFullscreen() - // exit fullscreen if not landscape - else -> unsetFullscreen() - } + if (!PlayerHelper.autoRotationEnabled) return + when (newConfig.orientation) { + // go to fullscreen mode + Configuration.ORIENTATION_LANDSCAPE -> setFullscreen() + // exit fullscreen if not landscape + else -> unsetFullscreen() } } } diff --git a/app/src/main/java/com/github/libretube/ui/views/CustomExoPlayerView.kt b/app/src/main/java/com/github/libretube/ui/views/CustomExoPlayerView.kt index 0c11f9a44..9d46b5a97 100644 --- a/app/src/main/java/com/github/libretube/ui/views/CustomExoPlayerView.kt +++ b/app/src/main/java/com/github/libretube/ui/views/CustomExoPlayerView.kt @@ -10,7 +10,6 @@ import android.view.MotionEvent import android.view.View import androidx.fragment.app.FragmentManager import com.github.libretube.R -import com.github.libretube.constants.PreferenceKeys import com.github.libretube.databinding.DoubleTapOverlayBinding import com.github.libretube.databinding.ExoStyledPlayerControlViewBinding import com.github.libretube.models.interfaces.DoubleTapInterface @@ -19,13 +18,12 @@ import com.github.libretube.obj.BottomSheetItem import com.github.libretube.ui.activities.MainActivity import com.github.libretube.ui.sheets.PlaybackSpeedSheet import com.github.libretube.util.DoubleTapListener -import com.github.libretube.util.PreferenceHelper +import com.github.libretube.util.PlayerHelper import com.google.android.exoplayer2.PlaybackParameters import com.google.android.exoplayer2.trackselection.TrackSelector import com.google.android.exoplayer2.ui.AspectRatioFrameLayout import com.google.android.exoplayer2.ui.StyledPlayerView import com.google.android.exoplayer2.util.RepeatModeUtil -import kotlin.math.roundToInt @SuppressLint("ClickableViewAccessibility") internal class CustomExoPlayerView( @@ -53,27 +51,9 @@ internal class CustomExoPlayerView( /** * Preferences */ - var autoplayEnabled = PreferenceHelper.getBoolean( - PreferenceKeys.AUTO_PLAY, - true - ) + var autoplayEnabled = PlayerHelper.autoPlayEnabled - private val playbackSpeed = PreferenceHelper.getString( - PreferenceKeys.PLAYBACK_SPEED, - "1" - ).replace("F", "") - - private val seekIncrement = PreferenceHelper.getString( - PreferenceKeys.SEEK_INCREMENT, - "10.0" - ).toFloat() - .roundToInt() - .toLong() * 1000 - - private var resizeModePref = PreferenceHelper.getString( - PreferenceKeys.PLAYER_RESIZE_MODE, - "fit" - ) + private var resizeModePref = PlayerHelper.resizeModePref private fun toggleController() { if (isControllerFullyVisible) hideController() else showController() @@ -108,7 +88,7 @@ internal class CustomExoPlayerView( initializeAdvancedOptions(context) player?.playbackParameters = PlaybackParameters( - playbackSpeed.toFloat(), + PlayerHelper.playbackSpeed.toFloat(), 1.0f ) @@ -250,7 +230,7 @@ internal class CustomExoPlayerView( private fun enableDoubleTapToSeek() { // set seek increment text - val seekIncrementText = (seekIncrement / 1000).toString() + val seekIncrementText = (PlayerHelper.seekIncrement / 1000).toString() doubleTapOverlayBinding?.rewindTV?.text = seekIncrementText doubleTapOverlayBinding?.forwardTV?.text = seekIncrementText doubleTapListener = @@ -265,7 +245,7 @@ internal class CustomExoPlayerView( } private fun rewind() { - player?.seekTo((player?.currentPosition ?: 0L) - seekIncrement) + player?.seekTo((player?.currentPosition ?: 0L) - PlayerHelper.seekIncrement) // show the rewind button doubleTapOverlayBinding?.rewindBTN.apply { @@ -289,7 +269,7 @@ internal class CustomExoPlayerView( } private fun forward() { - player?.seekTo(player!!.currentPosition + seekIncrement) + player?.seekTo(player!!.currentPosition + PlayerHelper.seekIncrement) // show the forward button doubleTapOverlayBinding?.forwardBTN.apply { diff --git a/app/src/main/java/com/github/libretube/util/PlayerHelper.kt b/app/src/main/java/com/github/libretube/util/PlayerHelper.kt index fc1396464..f096028dc 100644 --- a/app/src/main/java/com/github/libretube/util/PlayerHelper.kt +++ b/app/src/main/java/com/github/libretube/util/PlayerHelper.kt @@ -1,9 +1,12 @@ package com.github.libretube.util import android.content.Context +import android.content.pm.ActivityInfo import android.view.accessibility.CaptioningManager import com.github.libretube.constants.PreferenceKeys import com.google.android.exoplayer2.ui.CaptionStyleCompat +import com.google.android.exoplayer2.video.VideoSize +import kotlin.math.roundToInt object PlayerHelper { // get the audio source following the users preferences @@ -137,4 +140,163 @@ object PlayerHelper { } return categories } + + fun getOrientation(videoSize: VideoSize): Int { + val fullscreenOrientationPref = PreferenceHelper.getString( + PreferenceKeys.FULLSCREEN_ORIENTATION, + "ratio" + ) + + return when (fullscreenOrientationPref) { + "ratio" -> { + // probably a youtube shorts video + if (videoSize.height > videoSize.width) { + ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT + } // a video with normal aspect ratio + else { + ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE + } + } + "auto" -> ActivityInfo.SCREEN_ORIENTATION_SENSOR + "landscape" -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE + "portrait" -> ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT + else -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE + } + } + + val autoRotationEnabled: Boolean + get() = PreferenceHelper.getBoolean( + PreferenceKeys.AUTO_FULLSCREEN, + false + ) + + val relatedStreamsEnabled: Boolean + get() = PreferenceHelper.getBoolean( + PreferenceKeys.RELATED_STREAMS, + true + ) + + val pausePlayerOnScreenOffEnabled: Boolean + get() = PreferenceHelper.getBoolean( + PreferenceKeys.PAUSE_ON_SCREEN_OFF, + false + ) + + val watchPositionsEnabled: Boolean + get() = PreferenceHelper.getBoolean( + PreferenceKeys.WATCH_POSITION_TOGGLE, + true + ) + + val watchHistoryEnabled: Boolean + get() = PreferenceHelper.getBoolean( + PreferenceKeys.WATCH_HISTORY_TOGGLE, + true + ) + + val useSystemCaptionStyle: Boolean + get() = PreferenceHelper.getBoolean( + PreferenceKeys.SYSTEM_CAPTION_STYLE, + true + ) + + val videoFormatPreference: String + get() = PreferenceHelper.getString( + PreferenceKeys.PLAYER_VIDEO_FORMAT, + "webm" + ) + + val bufferingGoal: Int + get() = PreferenceHelper.getString( + PreferenceKeys.BUFFERING_GOAL, + "50" + ).toInt() * 1000 + + val sponsorBlockEnabled: Boolean + get() = PreferenceHelper.getBoolean( + "sb_enabled_key", + true + ) + + val sponsorBlockNotifications: Boolean + get() = PreferenceHelper.getBoolean( + "sb_notifications_key", + true + ) + + val defaultSubtitleCode: String + get() { + val code = PreferenceHelper.getString( + PreferenceKeys.DEFAULT_SUBTITLE, + "" + ) + + if (code.contains("-")) { + return code.split("-")[0] + } + return code + } + + val skipButtonsEnabled: Boolean + get() = PreferenceHelper.getBoolean( + PreferenceKeys.SKIP_BUTTONS, + false + ) + + val pipEnabled: Boolean get() = PreferenceHelper.getBoolean( + PreferenceKeys.PICTURE_IN_PICTURE, + true + ) + + val skipSegmentsManually: Boolean + get() = PreferenceHelper.getBoolean( + PreferenceKeys.SB_SKIP_MANUALLY, + false + ) + + val progressiveLoadingIntervalSize: String + get() = PreferenceHelper.getString( + PreferenceKeys.PROGRESSIVE_LOADING_INTERVAL_SIZE, + "64" + ) + + val autoPlayEnabled: Boolean + get() = PreferenceHelper.getBoolean( + PreferenceKeys.AUTO_PLAY, + true + ) + + val seekIncrement: Long + get() = PreferenceHelper.getString( + PreferenceKeys.SEEK_INCREMENT, + "10.0" + ).toFloat() + .roundToInt() + .toLong() * 1000 + + val playbackSpeed: String + get() = PreferenceHelper.getString( + PreferenceKeys.PLAYBACK_SPEED, + "1" + ).replace("F", "") + + val resizeModePref: String + get() = PreferenceHelper.getString( + PreferenceKeys.PLAYER_RESIZE_MODE, + "fit" + ) + + fun getDefaultResolution(context: Context): String { + return if (NetworkHelper.isNetworkMobile(context)) { + PreferenceHelper.getString( + PreferenceKeys.DEFAULT_RESOLUTION_MOBILE, + "" + ) + } else { + PreferenceHelper.getString( + PreferenceKeys.DEFAULT_RESOLUTION, + "" + ) + } + } }