Skip to content

Commit

Permalink
Merge branch 'feature/189-33-improve-rewind-forward'
Browse files Browse the repository at this point in the history
Close #189, close #33
  • Loading branch information
stantanasi committed Nov 8, 2024
2 parents 324ba64 + 53e0cf1 commit 30d02f7
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import androidx.media3.datasource.HttpDataSource
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
import androidx.media3.session.MediaSession
import androidx.media3.ui.PlayerView
import androidx.media3.ui.PlayerControlView
import androidx.media3.ui.SubtitleView
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
Expand Down Expand Up @@ -65,7 +65,7 @@ class PlayerMobileFragment : Fragment() {
private var _binding: FragmentPlayerMobileBinding? = null
private val binding get() = _binding!!

private val PlayerView.controller
private val PlayerControlView.binding
get() = ContentExoControllerMobileBinding.bind(this.findViewById(R.id.cl_exo_controller))

private val args by navArgs<PlayerMobileFragmentArgs>()
Expand Down Expand Up @@ -310,33 +310,33 @@ class PlayerMobileFragment : Fragment() {
setStyle(UserPreferences.captionStyle)
}

binding.pvPlayer.controller.btnExoBack.setOnClickListener {
binding.pvPlayer.controller.binding.btnExoBack.setOnClickListener {
findNavController().navigateUp()
}

binding.pvPlayer.controller.tvExoTitle.text = args.title
binding.pvPlayer.controller.binding.tvExoTitle.text = args.title

binding.pvPlayer.controller.tvExoSubtitle.text = args.subtitle
binding.pvPlayer.controller.binding.tvExoSubtitle.text = args.subtitle

binding.pvPlayer.controller.btnExoExternalPlayer.setOnClickListener {
binding.pvPlayer.controller.binding.btnExoExternalPlayer.setOnClickListener {
Toast.makeText(
requireContext(),
requireContext().getString(R.string.player_external_player_error_video),
Toast.LENGTH_SHORT
).show()
}

binding.pvPlayer.controller.btnExoLock.setOnClickListener {
binding.pvPlayer.controller.gControlsLock.visibility = View.GONE
binding.pvPlayer.controller.btnExoUnlock.visibility = View.VISIBLE
binding.pvPlayer.controller.binding.btnExoLock.setOnClickListener {
binding.pvPlayer.controller.binding.gControlsLock.visibility = View.GONE
binding.pvPlayer.controller.binding.btnExoUnlock.visibility = View.VISIBLE
}

binding.pvPlayer.controller.btnExoUnlock.setOnClickListener {
binding.pvPlayer.controller.gControlsLock.visibility = View.VISIBLE
binding.pvPlayer.controller.btnExoUnlock.visibility = View.GONE
binding.pvPlayer.controller.binding.btnExoUnlock.setOnClickListener {
binding.pvPlayer.controller.binding.gControlsLock.visibility = View.VISIBLE
binding.pvPlayer.controller.binding.btnExoUnlock.visibility = View.GONE
}

binding.pvPlayer.controller.btnExoPictureInPicture.setOnClickListener {
binding.pvPlayer.controller.binding.btnExoPictureInPicture.setOnClickListener {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
Toast.makeText(
requireContext(),
Expand All @@ -348,7 +348,7 @@ class PlayerMobileFragment : Fragment() {
}
}

binding.pvPlayer.controller.btnExoAspectRatio.setOnClickListener {
binding.pvPlayer.controller.binding.btnExoAspectRatio.setOnClickListener {
UserPreferences.playerResize = UserPreferences.playerResize.next()
binding.pvPlayer.controllerShowTimeoutMs = binding.pvPlayer.controllerShowTimeoutMs

Expand All @@ -360,7 +360,7 @@ class PlayerMobileFragment : Fragment() {
binding.pvPlayer.resizeMode = UserPreferences.playerResize.resizeMode
}

binding.pvPlayer.controller.exoSettings.setOnClickListener {
binding.pvPlayer.controller.binding.exoSettings.setOnClickListener {
binding.pvPlayer.controllerShowTimeoutMs = binding.pvPlayer.controllerShowTimeoutMs
binding.settings.show()
}
Expand Down Expand Up @@ -414,7 +414,7 @@ class PlayerMobileFragment : Fragment() {
.build()
)

binding.pvPlayer.controller.btnExoExternalPlayer.setOnClickListener {
binding.pvPlayer.controller.binding.btnExoExternalPlayer.setOnClickListener {
val intent = Intent(Intent.ACTION_VIEW).apply {
setDataAndType(Uri.parse(video.source), "video/*")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
import androidx.media3.session.MediaSession
import androidx.media3.ui.PlayerControlView
import androidx.media3.ui.PlayerView
import androidx.media3.ui.SubtitleView
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
Expand Down Expand Up @@ -61,14 +60,8 @@ class PlayerTvFragment : Fragment() {
private var _binding: FragmentPlayerTvBinding? = null
private val binding get() = _binding!!

private val PlayerView.controller
private val PlayerControlView.binding
get() = ContentExoControllerTvBinding.bind(this.findViewById(R.id.cl_exo_controller))
private val PlayerView.isControllerVisible
get() = this.javaClass.getDeclaredField("controller").let {
it.isAccessible = true
val controller = it.get(this) as PlayerControlView
controller.isVisible
}

private val args by navArgs<PlayerTvFragmentArgs>()
private val database by lazy { AppDatabase.getInstance(requireContext()) }
Expand Down Expand Up @@ -258,7 +251,7 @@ class PlayerTvFragment : Fragment() {
binding.settings.onBackPressed()
}

binding.pvPlayer.isControllerVisible -> {
binding.pvPlayer.controller.isVisible -> {
binding.pvPlayer.hideController()
true
}
Expand Down Expand Up @@ -295,21 +288,21 @@ class PlayerTvFragment : Fragment() {
setStyle(UserPreferences.captionStyle)
}

binding.pvPlayer.controller.tvExoTitle.text = args.title
binding.pvPlayer.controller.binding.tvExoTitle.text = args.title

binding.pvPlayer.controller.tvExoSubtitle.text = args.subtitle
binding.pvPlayer.controller.binding.tvExoSubtitle.text = args.subtitle

binding.pvPlayer.controller.btnExoExternalPlayer.setOnClickListener {
binding.pvPlayer.controller.binding.btnExoExternalPlayer.setOnClickListener {
Toast.makeText(
requireContext(),
requireContext().getString(R.string.player_external_player_error_video),
Toast.LENGTH_SHORT
).show()
}

binding.pvPlayer.controller.exoProgress.setKeyTimeIncrement(10_000)
binding.pvPlayer.controller.binding.exoProgress.setKeyTimeIncrement(10_000)

binding.pvPlayer.controller.btnExoAspectRatio.setOnClickListener {
binding.pvPlayer.controller.binding.btnExoAspectRatio.setOnClickListener {
UserPreferences.playerResize = UserPreferences.playerResize.next()
binding.pvPlayer.controllerShowTimeoutMs = binding.pvPlayer.controllerShowTimeoutMs

Expand All @@ -321,7 +314,7 @@ class PlayerTvFragment : Fragment() {
binding.pvPlayer.resizeMode = UserPreferences.playerResize.resizeMode
}

binding.pvPlayer.controller.exoSettings.setOnClickListener {
binding.pvPlayer.controller.binding.exoSettings.setOnClickListener {
binding.pvPlayer.controllerShowTimeoutMs = binding.pvPlayer.controllerShowTimeoutMs
binding.settings.show()
}
Expand Down Expand Up @@ -375,7 +368,7 @@ class PlayerTvFragment : Fragment() {
.build()
)

binding.pvPlayer.controller.btnExoExternalPlayer.setOnClickListener {
binding.pvPlayer.controller.binding.btnExoExternalPlayer.setOnClickListener {
val intent = Intent(Intent.ACTION_VIEW).apply {
setDataAndType(Uri.parse(video.source), "video/*")

Expand All @@ -398,7 +391,7 @@ class PlayerTvFragment : Fragment() {
super.onPlaybackStateChanged(playbackState)

if (playbackState == Player.STATE_READY) {
binding.pvPlayer.controller.exoPlayPause.nextFocusDownId = -1
binding.pvPlayer.controller.binding.exoPlayPause.nextFocusDownId = -1
}
}

Expand Down
21 changes: 21 additions & 0 deletions app/src/main/java/com/tanasi/streamflix/ui/PlayerMobileView.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.tanasi.streamflix.ui

import android.content.Context
import android.util.AttributeSet
import android.view.KeyEvent
import androidx.media3.common.Player
import androidx.media3.ui.PlayerControlView
import androidx.media3.ui.PlayerView

class PlayerMobileView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : PlayerView(context, attrs, defStyle) {

val controller: PlayerControlView
get() = PlayerView::class.java.getDeclaredField("controller").let {
it.isAccessible = true
it.get(this) as PlayerControlView
}
}
46 changes: 46 additions & 0 deletions app/src/main/java/com/tanasi/streamflix/ui/PlayerTvView.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.tanasi.streamflix.ui

import android.content.Context
import android.util.AttributeSet
import android.view.KeyEvent
import androidx.media3.common.Player
import androidx.media3.ui.PlayerControlView
import androidx.media3.ui.PlayerView

class PlayerTvView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : PlayerView(context, attrs, defStyle) {

val controller: PlayerControlView
get() = PlayerView::class.java.getDeclaredField("controller").let {
it.isAccessible = true
it.get(this) as PlayerControlView
}


override fun dispatchKeyEvent(event: KeyEvent): Boolean {
val player = player ?: return super.dispatchKeyEvent(event)

if (player.isCommandAvailable(Player.COMMAND_GET_CURRENT_MEDIA_ITEM) && player.isPlayingAd) {
return super.dispatchKeyEvent(event)
}

if (controller.isVisible) return super.dispatchKeyEvent(event)

return when (event.keyCode) {
KeyEvent.KEYCODE_DPAD_LEFT -> {
player.seekTo(player.currentPosition - 10_000)
true
}

KeyEvent.KEYCODE_DPAD_RIGHT -> {
player.seekTo(player.currentPosition + 10_000)
true
}

else -> super.dispatchKeyEvent(event)
}
}
}
2 changes: 1 addition & 1 deletion app/src/main/res/layout/fragment_player_mobile.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
android:background="#000000"
tools:context=".fragments.player.PlayerMobileFragment">

<androidx.media3.ui.PlayerView
<com.tanasi.streamflix.ui.PlayerMobileView
android:id="@+id/pv_player"
android:layout_width="0dp"
android:layout_height="0dp"
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/layout/fragment_player_tv.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
android:background="#000000"
tools:context=".fragments.player.PlayerTvFragment">

<androidx.media3.ui.PlayerView
<com.tanasi.streamflix.ui.PlayerTvView
android:id="@+id/pv_player"
android:layout_width="0dp"
android:layout_height="0dp"
Expand Down

0 comments on commit 30d02f7

Please sign in to comment.