diff --git a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt index 321223ad..a548cec0 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt @@ -16,6 +16,7 @@ import com.google.android.exoplayer2.trackselection.MappingTrackSelector import com.google.android.exoplayer2.ui.TrackSelectionDialogBuilder 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.mpv.TrackType @@ -65,6 +66,7 @@ class PlayerActivity : AppCompatActivity() { val audioButton = binding.playerView.findViewById(R.id.btn_audio_track) val subtitleButton = binding.playerView.findViewById(R.id.btn_subtitle) + val speedButton = binding.playerView.findViewById(R.id.btn_speed) audioButton.isEnabled = false audioButton.imageAlpha = 75 @@ -72,6 +74,9 @@ class PlayerActivity : AppCompatActivity() { subtitleButton.isEnabled = false subtitleButton.imageAlpha = 75 + speedButton.isEnabled = false + speedButton.imageAlpha = 75 + audioButton.setOnClickListener { when (viewModel.player) { is MPVPlayer -> { @@ -134,12 +139,21 @@ class PlayerActivity : AppCompatActivity() { } } + speedButton.setOnClickListener { + SpeedSelectionDialogFragment(viewModel).show( + supportFragmentManager, + "speedselectiondialog" + ) + } + viewModel.fileLoaded.observe(this, { if (it) { audioButton.isEnabled = true audioButton.imageAlpha = 255 subtitleButton.isEnabled = true subtitleButton.imageAlpha = 255 + speedButton.isEnabled = true + speedButton.imageAlpha = 255 } }) diff --git a/app/src/main/java/dev/jdtech/jellyfin/dialogs/SpeedSelectionDialogFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/dialogs/SpeedSelectionDialogFragment.kt new file mode 100644 index 00000000..b00fa6c6 --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/dialogs/SpeedSelectionDialogFragment.kt @@ -0,0 +1,35 @@ +package dev.jdtech.jellyfin.dialogs + +import android.app.Dialog +import android.os.Bundle +import androidx.fragment.app.DialogFragment +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel +import java.lang.IllegalStateException + +class SpeedSelectionDialogFragment( + private val viewModel: PlayerActivityViewModel +) : DialogFragment() { + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val speedTexts = listOf("0.5x", "0.75x", "1x", "1.25x", "1.5x", "1.75x", "2x") + val speedNumbers = listOf(0.5f, 0.75f, 1f, 1.25f, 1.5f, 1.75f, 2f) + + + return activity?.let { activity -> + val builder = MaterialAlertDialogBuilder(activity) + builder.setTitle("Select playback speed") + .setSingleChoiceItems( + speedTexts.toTypedArray(), + speedNumbers.indexOf(viewModel.playbackSpeed) + ) { dialog, which -> + viewModel.selectSpeed( + speedNumbers[which] + ) + dialog.dismiss() + } + builder.create() + } ?: throw IllegalStateException("Activity cannot be null") + + + } +} \ No newline at end of file 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 e45e4a0c..4d177982 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt @@ -49,6 +49,8 @@ constructor( private var currentWindow = 0 private var playbackPosition: Long = 0 + var playbackSpeed: Float = 1f + private val sp = PreferenceManager.getDefaultSharedPreferences(application) init { @@ -225,4 +227,9 @@ constructor( player.selectTrack(trackType, isExternal = false, index = track.ffIndex) } } + + fun selectSpeed(speed: Float) { + player.setPlaybackSpeed(speed) + playbackSpeed = speed + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_gauge.xml b/app/src/main/res/drawable/ic_gauge.xml new file mode 100644 index 00000000..928e0447 --- /dev/null +++ b/app/src/main/res/drawable/ic_gauge.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/exo_player_control_view.xml b/app/src/main/res/layout/exo_player_control_view.xml index 4003fe37..5fec8974 100644 --- a/app/src/main/res/layout/exo_player_control_view.xml +++ b/app/src/main/res/layout/exo_player_control_view.xml @@ -55,6 +55,20 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"> + + + +