From 060eab0183cc0526669015d7dcaf18155800a746 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 14:21:14 +0100 Subject: [PATCH 01/49] fix(deps): update androidx.lifecycle to v2.7.0 (#631) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a117c56a..85660e25 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,7 +8,7 @@ androidx-compose-ui = "1.6.0-alpha07" androidx-constraintlayout = "2.1.4" androidx-core = "1.12.0" androidx-hilt = "1.1.0" -androidx-lifecycle = "2.6.2" +androidx-lifecycle = "2.7.0" androidx-media3 = "1.2.1" androidx-navigation = "2.7.6" androidx-paging = "3.2.1" From 0ecf6d4c0eade032644f0c41882a740fe437b584 Mon Sep 17 00:00:00 2001 From: peerless2012 Date: Mon, 22 Jan 2024 22:31:50 +0800 Subject: [PATCH 02/49] feat: add long press for 2x speed (#596) * Add long press for 2x speed. * Fix resource hard code warn. * Fix lint warn. * refactor: use `player.setPlaybackSpeed` * refactor: make playback speed increase easily adjustable later --------- Co-authored-by: jarnedemeulemeester --- .../jellyfin/utils/PlayerGestureHelper.kt | 20 ++++++++++++ .../src/main/res/layout/activity_player.xml | 31 +++++++++++++++++++ .../main/res/drawable/ic_speed_forward.xml | 27 ++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 core/src/main/res/drawable/ic_speed_forward.xml diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt index 8c11ba3a..9591abef 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt @@ -55,6 +55,9 @@ class PlayerGestureHelper( private var lastScaleEvent: Long = 0 + private var playbackSpeedIncrease: Float = 2f + private var lastPlaybackSpeed: Float = 0f + private val screenWidth = Resources.getSystem().displayMetrics.widthPixels private val screenHeight = Resources.getSystem().displayMetrics.heightPixels @@ -69,6 +72,18 @@ class PlayerGestureHelper( return true } + @SuppressLint("SetTextI18n") + override fun onLongPress(e: MotionEvent) { + playerView.player?.let { + if (it.isPlaying) { + lastPlaybackSpeed = it.playbackParameters.speed + it.setPlaybackSpeed(playbackSpeedIncrease) + activity.binding.gestureSpeedText.text = playbackSpeedIncrease.toString() + "x" + activity.binding.gestureSpeedLayout.visibility = View.VISIBLE + } + } + } + override fun onDoubleTap(e: MotionEvent): Boolean { // Disables double tap gestures if view is locked if (isControlsLocked) return false @@ -362,6 +377,11 @@ class PlayerGestureHelper( } } } + if (lastPlaybackSpeed > 0 && (event.action == MotionEvent.ACTION_UP || event.action == MotionEvent.ACTION_CANCEL)) { + playerView.player?.setPlaybackSpeed(lastPlaybackSpeed) + lastPlaybackSpeed = 0f + activity.binding.gestureSpeedLayout.visibility = View.GONE + } } private fun longToTimestamp(duration: Long, noSign: Boolean = false): String { diff --git a/app/phone/src/main/res/layout/activity_player.xml b/app/phone/src/main/res/layout/activity_player.xml index ee2e8977..c2c1f5b7 100644 --- a/app/phone/src/main/res/layout/activity_player.xml +++ b/app/phone/src/main/res/layout/activity_player.xml @@ -113,6 +113,37 @@ tools:ignore="ContentDescription" /> + + + + + + + + + + + From a16f910ee39d76bdf6a8aaddc7c5fa08299fd6f3 Mon Sep 17 00:00:00 2001 From: jarnedemeulemeester Date: Tue, 23 Jan 2024 14:48:15 +0100 Subject: [PATCH 03/49] feat(mpv): default to `gpu-next` and `mediacodec` and use `fast` profile --- core/src/main/res/xml/fragment_settings_player.xml | 2 +- .../src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt | 6 +++--- .../src/main/java/dev/jdtech/jellyfin/AppPreferences.kt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/main/res/xml/fragment_settings_player.xml b/core/src/main/res/xml/fragment_settings_player.xml index fcc8aeb4..ac367054 100644 --- a/core/src/main/res/xml/fragment_settings_player.xml +++ b/core/src/main/res/xml/fragment_settings_player.xml @@ -19,7 +19,7 @@ app:title="@string/pref_player_mpv_hwdec" app:useSimpleSummaryProvider="true" /> Date: Thu, 25 Jan 2024 23:12:51 +0100 Subject: [PATCH 04/49] chore(deps): update android.plugin to v8.2.2 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 85660e25..490448ff 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] aboutlibraries = "10.10.0" -android-plugin = "8.2.1" +android-plugin = "8.2.2" androidx-activity = "1.8.2" androidx-appcompat = "1.6.1" androidx-compose-material3 = "1.2.0-alpha09" From 785c83b8c9c44f47c44a2a7c181606a04a0d1ea0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 23:37:14 +0100 Subject: [PATCH 05/49] fix(deps): update androidx.compose.ui to v1.6.0 (#610) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 490448ff..a711e533 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ android-plugin = "8.2.2" androidx-activity = "1.8.2" androidx-appcompat = "1.6.1" androidx-compose-material3 = "1.2.0-alpha09" -androidx-compose-ui = "1.6.0-alpha07" +androidx-compose-ui = "1.6.0" androidx-constraintlayout = "2.1.4" androidx-core = "1.12.0" androidx-hilt = "1.1.0" From f44d9b465ef04b94a4b0541a55c46648625f9d49 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 23:37:57 +0100 Subject: [PATCH 06/49] fix(deps): update dependency androidx.compose.material3:material3 to v1.2.0-rc01 (#611) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a711e533..45cf5e49 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ aboutlibraries = "10.10.0" android-plugin = "8.2.2" androidx-activity = "1.8.2" androidx-appcompat = "1.6.1" -androidx-compose-material3 = "1.2.0-alpha09" +androidx-compose-material3 = "1.2.0-rc01" androidx-compose-ui = "1.6.0" androidx-constraintlayout = "2.1.4" androidx-core = "1.12.0" From c7849a70c3c723d2a5bad9b0acfe335bf0f137e4 Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Fri, 26 Jan 2024 00:00:56 +0100 Subject: [PATCH 07/49] feat(mpv,tv): default to `gpu-next` --- .../java/dev/jdtech/jellyfin/viewmodels/SettingsViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsViewModel.kt index 8e622ec7..c9725050 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsViewModel.kt @@ -97,7 +97,7 @@ constructor( nameStringResource = R.string.pref_player_mpv_vo, dependencies = listOf(Constants.PREF_PLAYER_MPV), backendName = Constants.PREF_PLAYER_MPV_VO, - backendDefaultValue = "gpu", + backendDefaultValue = "gpu-next", options = R.array.mpv_vos, optionValues = R.array.mpv_vos, ), From 07c58accf00e0d5dd497f1e74a0138639777fcd0 Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Fri, 26 Jan 2024 23:29:03 +0100 Subject: [PATCH 08/49] fix(mpv): loading item immediately restarts the playback causing duplicate external subtitle entries --- .../src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt b/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt index 6fb7a402..5d556183 100644 --- a/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt @@ -869,8 +869,11 @@ class MPVPlayer( ) } currentIndex = index - MPVLib.command(arrayOf("playlist-play-index", "$index")) - MPVLib.setPropertyBoolean("pause", true) + // Only set the playlist index when the index is not the currently playing item. Otherwise playback will be restarted. + // This is a problem on initial load when the first item is still loading causing duplicate external subtitle entries. + if (MPVLib.getPropertyInt("playlist-current-pos") != index) { + MPVLib.command(arrayOf("playlist-play-index", "$index")) + } listeners.sendEvent(Player.EVENT_TIMELINE_CHANGED) { listener -> listener.onTimelineChanged(timeline, Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED) } From 61ec1edb35d73580504806d11b19100651435b07 Mon Sep 17 00:00:00 2001 From: Natanel Shitrit <65548905+Natanel-Shitrit@users.noreply.github.com> Date: Sun, 28 Jan 2024 15:01:29 +0200 Subject: [PATCH 09/49] feat: start player maximized pref (#637) --- .../java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt | 2 ++ core/src/main/res/values/strings.xml | 2 ++ core/src/main/res/xml/fragment_settings_player.xml | 5 +++++ .../src/main/java/dev/jdtech/jellyfin/AppPreferences.kt | 3 +++ preferences/src/main/java/dev/jdtech/jellyfin/Constants.kt | 1 + 5 files changed, 13 insertions(+) diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt index 9591abef..e647e9cd 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt @@ -418,6 +418,8 @@ class PlayerGestureHelper( activity.window.attributes.screenBrightness = appPreferences.playerBrightness } + updateZoomMode(appPreferences.playerStartMaximized) + @Suppress("ClickableViewAccessibility") playerView.setOnTouchListener { _, event -> if (playerView.useController) { diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index ec8684c0..1ce1def7 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -107,6 +107,8 @@ Pinch to fill the screen with the video Swipe horizontally to seek forwards or backwards Remember brightness level + Start maximized + Open video in maximized mode by default Title IMDB Rating Parental Rating diff --git a/core/src/main/res/xml/fragment_settings_player.xml b/core/src/main/res/xml/fragment_settings_player.xml index ac367054..495e0388 100644 --- a/core/src/main/res/xml/fragment_settings_player.xml +++ b/core/src/main/res/xml/fragment_settings_player.xml @@ -63,6 +63,11 @@ app:dependency="pref_player_gestures_vb" app:key="pref_player_brightness_remember" app:title="@string/player_brightness_remember" /> + diff --git a/preferences/src/main/java/dev/jdtech/jellyfin/AppPreferences.kt b/preferences/src/main/java/dev/jdtech/jellyfin/AppPreferences.kt index 155b23fc..132e3c5d 100644 --- a/preferences/src/main/java/dev/jdtech/jellyfin/AppPreferences.kt +++ b/preferences/src/main/java/dev/jdtech/jellyfin/AppPreferences.kt @@ -51,6 +51,9 @@ constructor( val playerBrightnessRemember get() = sharedPreferences.getBoolean(Constants.PREF_PLAYER_BRIGHTNESS_REMEMBER, false) + val playerStartMaximized get() = + sharedPreferences.getBoolean(Constants.PREF_PLAYER_START_MAXIMIZED, false) + var playerBrightness: Float get() = sharedPreferences.getFloat( Constants.PREF_PLAYER_BRIGHTNESS, diff --git a/preferences/src/main/java/dev/jdtech/jellyfin/Constants.kt b/preferences/src/main/java/dev/jdtech/jellyfin/Constants.kt index b34d6313..89403118 100644 --- a/preferences/src/main/java/dev/jdtech/jellyfin/Constants.kt +++ b/preferences/src/main/java/dev/jdtech/jellyfin/Constants.kt @@ -17,6 +17,7 @@ object Constants { const val PREF_PLAYER_GESTURES_ZOOM = "pref_player_gestures_zoom" const val PREF_PLAYER_GESTURES_SEEK = "pref_player_gestures_seek" const val PREF_PLAYER_BRIGHTNESS_REMEMBER = "pref_player_brightness_remember" + const val PREF_PLAYER_START_MAXIMIZED = "pref_player_start_maximized" const val PREF_PLAYER_BRIGHTNESS = "pref_player_brightness" const val PREF_PLAYER_SEEK_BACK_INC = "pref_player_seek_back_inc" const val PREF_PLAYER_SEEK_FORWARD_INC = "pref_player_seek_forward_inc" From c67f6c265b059f8f461d8a91c185c9841e0c141d Mon Sep 17 00:00:00 2001 From: Cd16d <98320806+cd16b@users.noreply.github.com> Date: Sun, 28 Jan 2024 14:11:34 +0100 Subject: [PATCH 10/49] fix: pip remember zoom and auto-brightness (#638) --- .../dev/jdtech/jellyfin/PlayerActivity.kt | 25 ++++++++++++++----- .../jellyfin/utils/PlayerGestureHelper.kt | 4 +-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt index 84982dbb..33862cb3 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt @@ -12,6 +12,7 @@ import android.media.AudioManager import android.os.Build import android.os.Bundle import android.os.Process +import android.provider.Settings import android.util.Rational import android.view.View import android.view.WindowManager @@ -27,7 +28,6 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.media3.common.C -import androidx.media3.ui.AspectRatioFrameLayout import androidx.media3.ui.DefaultTimeBar import androidx.media3.ui.PlayerView import androidx.navigation.navArgs @@ -35,7 +35,6 @@ import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.databinding.ActivityPlayerBinding import dev.jdtech.jellyfin.dialogs.SpeedSelectionDialogFragment import dev.jdtech.jellyfin.dialogs.TrackSelectionDialogFragment -import dev.jdtech.jellyfin.mpv.MPVPlayer import dev.jdtech.jellyfin.utils.PlayerGestureHelper import dev.jdtech.jellyfin.utils.PreviewScrubListener import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel @@ -309,10 +308,11 @@ class PlayerActivity : BasePlayerActivity() { binding.playerView.useController = false binding.playerView.findViewById