From 512844805a4eb562cdd021d936f3813cb8df304e Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 7 Oct 2022 19:09:44 +0200 Subject: [PATCH 1/4] add PiP support for offline player --- app/src/main/AndroidManifest.xml | 2 ++ .../ui/activities/OfflinePlayerActivity.kt | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+) 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 @@ Date: Fri, 7 Oct 2022 19:18:04 +0200 Subject: [PATCH 2/4] respect orientation pref for downloaded videos --- .../ui/activities/OfflinePlayerActivity.kt | 3 +++ .../libretube/ui/fragments/PlayerFragment.kt | 23 +---------------- .../com/github/libretube/util/PlayerHelper.kt | 25 +++++++++++++++++++ 3 files changed, 29 insertions(+), 22 deletions(-) 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 97f82433c..c199f1998 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 @@ -18,6 +18,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.github.libretube.util.PreferenceHelper import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem @@ -48,6 +49,8 @@ class OfflinePlayerActivity : BaseActivity() { initializePlayer() playVideo() + + requestedOrientation = PlayerHelper.getOrientation(player.videoSize) } private fun initializePlayer() { 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..504d9da45 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 @@ -154,7 +154,6 @@ class PlayerFragment : BaseFragment() { 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 @@ -256,11 +255,6 @@ class PlayerFragment : BaseFragment() { true ) - fullscreenOrientationPref = PreferenceHelper.getString( - PreferenceKeys.FULLSCREEN_ORIENTATION, - "ratio" - ) - pausePlayerOnScreenOffEnabled = PreferenceHelper.getBoolean( PreferenceKeys.PAUSE_ON_SCREEN_OFF, false @@ -584,22 +578,7 @@ class PlayerFragment : BaseFragment() { val mainActivity = activity as MainActivity if (!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 } 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..24f62b86b 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,11 @@ 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 object PlayerHelper { // get the audio source following the users preferences @@ -137,4 +139,27 @@ 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 + } + } } From ef4e48e3470181462edaf39537c4ff0fd927a7e1 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 7 Oct 2022 19:30:59 +0200 Subject: [PATCH 3/4] player cleanup --- .../libretube/ui/fragments/PlayerFragment.kt | 179 ++++-------------- .../com/github/libretube/util/PlayerHelper.kt | 110 +++++++++++ 2 files changed, 146 insertions(+), 143 deletions(-) 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 504d9da45..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,24 +149,8 @@ class PlayerFragment : BaseFragment() { /** * user preferences */ - private var token = "" - private var relatedStreamsEnabled = true - private var autoRotationEnabled = true - private var pausePlayerOnScreenOffEnabled = false - 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 @@ -213,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) @@ -244,97 +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 - ) - - 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") @@ -516,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() @@ -576,7 +470,7 @@ 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 = PlayerHelper.getOrientation(exoPlayer.videoSize) mainActivity.requestedOrientation = orientation @@ -598,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 @@ -652,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() } @@ -680,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) @@ -705,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) @@ -713,7 +607,7 @@ class PlayerFragment : BaseFragment() { return } - if (sponsorBlockNotifications) { + if (PlayerHelper.sponsorBlockNotifications) { Toast .makeText( context, @@ -728,7 +622,7 @@ class PlayerFragment : BaseFragment() { } } - if (skipSegmentsManually) binding.sbSkipBtn.visibility = View.GONE + if (PlayerHelper.skipSegmentsManually) binding.sbSkipBtn.visibility = View.GONE } private fun playVideo() { @@ -768,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) } } } @@ -881,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) @@ -943,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 @@ -1049,7 +943,7 @@ class PlayerFragment : BaseFragment() { } } } - if (relatedStreamsEnabled) { + if (PlayerHelper.relatedStreamsEnabled) { // only show related streams if enabled binding.relatedRecView.adapter = TrendingAdapter( response.relatedStreams!!, @@ -1099,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() @@ -1199,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 = @@ -1249,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() @@ -1281,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) } @@ -1301,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!!) @@ -1350,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 ) @@ -1505,7 +1400,7 @@ class PlayerFragment : BaseFragment() { } private fun shouldStartPiP(): Boolean { - if (!pipEnabled || + if (!PlayerHelper.pipEnabled || exoPlayer.playbackState == PlaybackState.STATE_PAUSED || videoShownInExternalPlayer ) { @@ -1537,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/util/PlayerHelper.kt b/app/src/main/java/com/github/libretube/util/PlayerHelper.kt index 24f62b86b..cafdb5055 100644 --- a/app/src/main/java/com/github/libretube/util/PlayerHelper.kt +++ b/app/src/main/java/com/github/libretube/util/PlayerHelper.kt @@ -162,4 +162,114 @@ object PlayerHelper { 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" + ) + + fun getDefaultResolution(context: Context): String { + return if (NetworkHelper.isNetworkMobile(context)) { + PreferenceHelper.getString( + PreferenceKeys.DEFAULT_RESOLUTION_MOBILE, + "" + ) + } else { + PreferenceHelper.getString( + PreferenceKeys.DEFAULT_RESOLUTION, + "" + ) + } + } } From e718937dd678824360eb1e44daa849f75cf0f2f5 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 7 Oct 2022 19:39:41 +0200 Subject: [PATCH 4/4] more cleanup + more features for the offline player --- .../libretube/services/BackgroundMode.kt | 23 ++----------- .../ui/activities/OfflinePlayerActivity.kt | 10 +----- .../libretube/ui/views/CustomExoPlayerView.kt | 34 ++++--------------- .../com/github/libretube/util/PlayerHelper.kt | 27 +++++++++++++++ 4 files changed, 38 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/com/github/libretube/services/BackgroundMode.kt b/app/src/main/java/com/github/libretube/services/BackgroundMode.kt index f7473b96f..d52b80b76 100644 --- a/app/src/main/java/com/github/libretube/services/BackgroundMode.kt +++ b/app/src/main/java/com/github/libretube/services/BackgroundMode.kt @@ -5,7 +5,6 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.app.Service import android.content.Intent -import android.media.session.PlaybackState import android.os.Build import android.os.Handler import android.os.IBinder @@ -18,8 +17,6 @@ import com.github.libretube.constants.BACKGROUND_CHANNEL_ID import com.github.libretube.constants.IntentData import com.github.libretube.constants.PLAYER_NOTIFICATION_ID import com.github.libretube.constants.PreferenceKeys -import com.github.libretube.db.DatabaseHelper -import com.github.libretube.extensions.query import com.github.libretube.extensions.toID import com.github.libretube.util.AutoPlayHelper import com.github.libretube.util.NowPlayingNotification @@ -89,8 +86,6 @@ class BackgroundMode : Service() { /** * Autoplay Preference */ - private val autoplay = PreferenceHelper.getBoolean(PreferenceKeys.AUTO_PLAY, true) - private val handler = Handler(Looper.getMainLooper()) /** @@ -191,7 +186,7 @@ class BackgroundMode : Service() { fetchSponsorBlockSegments() - if (autoplay) setNextStream() + if (PlayerHelper.autoPlayEnabled) setNextStream() } /** @@ -217,21 +212,13 @@ class BackgroundMode : Service() { override fun onPlaybackStateChanged(state: Int) { when (state) { Player.STATE_ENDED -> { - 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 c199f1998..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 @@ -13,13 +13,11 @@ import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat import com.github.libretube.constants.IntentData -import com.github.libretube.constants.PreferenceKeys 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.github.libretube.util.PreferenceHelper import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem import com.google.android.exoplayer2.source.MergingMediaSource @@ -165,13 +163,7 @@ class OfflinePlayerActivity : BaseActivity() { override fun onUserLeaveHint() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return - if (!PreferenceHelper.getBoolean( - PreferenceKeys.PICTURE_IN_PICTURE, - true - ) - ) { - return - } + if (!PlayerHelper.pipEnabled) return if (player.playbackState == PlaybackState.STATE_PAUSED) return 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 cafdb5055..f096028dc 100644 --- a/app/src/main/java/com/github/libretube/util/PlayerHelper.kt +++ b/app/src/main/java/com/github/libretube/util/PlayerHelper.kt @@ -6,6 +6,7 @@ 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 @@ -259,6 +260,32 @@ object PlayerHelper { "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(