diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsCacheFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsCacheFragment.kt index f0586fb2..df97e1b7 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsCacheFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsCacheFragment.kt @@ -11,7 +11,7 @@ class SettingsCacheFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.fragment_settings_cache, rootKey) - findPreference("image_cache_size")?.setOnBindEditTextListener { editText -> + findPreference("pref_image_cache_size")?.setOnBindEditTextListener { editText -> editText.inputType = InputType.TYPE_CLASS_NUMBER } } diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsPlayerFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsPlayerFragment.kt index 95bf0d59..5587eecf 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsPlayerFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsPlayerFragment.kt @@ -1,6 +1,8 @@ package dev.jdtech.jellyfin.fragments import android.os.Bundle +import android.text.InputType +import androidx.preference.EditTextPreference import androidx.preference.PreferenceFragmentCompat import dev.jdtech.jellyfin.R @@ -8,5 +10,11 @@ import dev.jdtech.jellyfin.R class SettingsPlayerFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.fragment_settings_player, rootKey) + findPreference("pref_player_seek_back_inc")?.setOnBindEditTextListener { editText -> + editText.inputType = InputType.TYPE_CLASS_NUMBER + } + findPreference("pref_player_seek_forward_inc")?.setOnBindEditTextListener { editText -> + editText.inputType = InputType.TYPE_CLASS_NUMBER + } } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt b/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt index a08a1d3a..f7de2538 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt @@ -23,6 +23,7 @@ import com.google.android.exoplayer2.text.CueGroup import com.google.android.exoplayer2.trackselection.TrackSelectionParameters import com.google.android.exoplayer2.util.* import com.google.android.exoplayer2.video.VideoSize +import dev.jdtech.jellyfin.utils.AppPreferences import kotlinx.parcelize.Parcelize import org.json.JSONArray import org.json.JSONException @@ -36,7 +37,7 @@ class MPVPlayer( context: Context, requestAudioFocus: Boolean, preferredLanguages: Map, - disableHardwareDecoding: Boolean + private val appPreferences: AppPreferences ) : BasePlayer(), MPVLib.EventObserver, AudioManager.OnAudioFocusChangeListener { private val audioManager: AudioManager by lazy { context.getSystemService()!! } @@ -68,7 +69,7 @@ class MPVPlayer( MPVLib.setOptionString("ao", "audiotrack,opensles") // Hardware video decoding - if (disableHardwareDecoding) { + if (appPreferences.mpvDisableHwDec) { MPVLib.setOptionString("hwdec", "no") } else { MPVLib.setOptionString("hwdec", "mediacodec-copy") @@ -863,11 +864,11 @@ class MPVPlayer( } override fun getSeekBackIncrement(): Long { - return C.DEFAULT_SEEK_BACK_INCREMENT_MS + return appPreferences.playerSeekBackIncrement } override fun getSeekForwardIncrement(): Long { - return C.DEFAULT_SEEK_FORWARD_INCREMENT_MS + return appPreferences.playerSeekForwardIncrement } override fun getMaxSeekToPreviousPosition(): Long { diff --git a/app/src/main/java/dev/jdtech/jellyfin/utils/AppPreferences.kt b/app/src/main/java/dev/jdtech/jellyfin/utils/AppPreferences.kt index fbe41d71..acd14ed3 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/utils/AppPreferences.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/utils/AppPreferences.kt @@ -3,6 +3,8 @@ package dev.jdtech.jellyfin.utils import android.content.SharedPreferences import android.view.WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE import androidx.core.content.edit +import com.google.android.exoplayer2.C.DEFAULT_SEEK_BACK_INCREMENT_MS +import com.google.android.exoplayer2.C.DEFAULT_SEEK_FORWARD_INCREMENT_MS import javax.inject.Inject class AppPreferences @@ -27,4 +29,13 @@ constructor( putFloat(Constants.PREF_PLAYER_BRIGHTNESS, value) } } + val playerSeekBackIncrement = sharedPreferences.getString( + Constants.PREF_PLAYER_SEEK_BACK_INC, + DEFAULT_SEEK_BACK_INCREMENT_MS.toString() + )!!.toLong() + val playerSeekForwardIncrement = sharedPreferences.getString( + Constants.PREF_PLAYER_SEEK_FORWARD_INC, + DEFAULT_SEEK_FORWARD_INCREMENT_MS.toString() + )!!.toLong() + val mpvDisableHwDec = sharedPreferences.getBoolean("mpv_disable_hwdec", false) } diff --git a/app/src/main/java/dev/jdtech/jellyfin/utils/Constants.kt b/app/src/main/java/dev/jdtech/jellyfin/utils/Constants.kt index 74f8c190..d3999808 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/utils/Constants.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/utils/Constants.kt @@ -13,6 +13,8 @@ object Constants { const val PREF_PLAYER_GESTURES_ZOOM = "pref_player_gestures_zoom" const val PREF_PLAYER_BRIGHTNESS_REMEMBER = "pref_player_brightness_remember" 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" const val PREF_IMAGE_CACHE = "pref_image_cache" const val PREF_IMAGE_CACHE_SIZE = "pref_image_cache_size" diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt index 8f300bfa..2a009bab 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt @@ -19,6 +19,7 @@ import dev.jdtech.jellyfin.models.PlayerItem import dev.jdtech.jellyfin.mpv.MPVPlayer import dev.jdtech.jellyfin.mpv.TrackType import dev.jdtech.jellyfin.repository.JellyfinRepository +import dev.jdtech.jellyfin.utils.AppPreferences import dev.jdtech.jellyfin.utils.postDownloadPlaybackProgress import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -32,7 +33,8 @@ class PlayerActivityViewModel constructor( application: Application, private val jellyfinRepository: JellyfinRepository, - private val downloadDatabase: DownloadDatabaseDao + private val downloadDatabase: DownloadDatabaseDao, + appPreferences: AppPreferences, ) : ViewModel(), Player.Listener { val player: Player @@ -75,7 +77,7 @@ constructor( application, false, preferredLanguages, - sp.getBoolean("mpv_disable_hwdec", false) + appPreferences ) } else { val renderersFactory = @@ -90,6 +92,8 @@ constructor( ) player = ExoPlayer.Builder(application, renderersFactory) .setTrackSelector(trackSelector) + .setSeekBackIncrementMs(appPreferences.playerSeekBackIncrement) + .setSeekForwardIncrementMs(appPreferences.playerSeekForwardIncrement) .build() } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ca5aabdd..ea306351 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -125,4 +125,7 @@ Empty server address Display extended episode title including season and episode information (SXX:EXX - EpisodeName). Display extended title + Seeking + Seek back increment (ms) + Seek forward increment (ms) \ No newline at end of file diff --git a/app/src/main/res/xml/fragment_settings_player.xml b/app/src/main/res/xml/fragment_settings_player.xml index a43d33ae..1fc011e3 100644 --- a/app/src/main/res/xml/fragment_settings_player.xml +++ b/app/src/main/res/xml/fragment_settings_player.xml @@ -40,4 +40,17 @@ app:title="@string/player_brightness_remember" /> + + + + + \ No newline at end of file