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,
+ ""
+ )
+ }
+ }
}