From c8c2ab02e21fb9ef06d9fbfedf57d261974ffd26 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sat, 29 Oct 2022 15:33:06 +0200 Subject: [PATCH] player view cleanup --- ...onsInterface.kt => OnlinePlayerOptions.kt} | 4 +- .../models/interfaces/PlayerOptions.kt | 11 ++ .../github/libretube/obj/BottomSheetItem.kt | 3 +- .../ui/adapters/BottomSheetAdapter.kt | 1 + .../libretube/ui/fragments/PlayerFragment.kt | 6 +- .../github/libretube/ui/views/BottomSheet.kt | 8 +- .../libretube/ui/views/CustomExoPlayerView.kt | 156 +++++++++--------- 7 files changed, 102 insertions(+), 87 deletions(-) rename app/src/main/java/com/github/libretube/models/interfaces/{PlayerOptionsInterface.kt => OnlinePlayerOptions.kt} (55%) create mode 100644 app/src/main/java/com/github/libretube/models/interfaces/PlayerOptions.kt diff --git a/app/src/main/java/com/github/libretube/models/interfaces/PlayerOptionsInterface.kt b/app/src/main/java/com/github/libretube/models/interfaces/OnlinePlayerOptions.kt similarity index 55% rename from app/src/main/java/com/github/libretube/models/interfaces/PlayerOptionsInterface.kt rename to app/src/main/java/com/github/libretube/models/interfaces/OnlinePlayerOptions.kt index 66d3d87d9..10a354921 100644 --- a/app/src/main/java/com/github/libretube/models/interfaces/PlayerOptionsInterface.kt +++ b/app/src/main/java/com/github/libretube/models/interfaces/OnlinePlayerOptions.kt @@ -1,7 +1,7 @@ package com.github.libretube.models.interfaces -interface PlayerOptionsInterface { - fun onCaptionClicked() +interface OnlinePlayerOptions { + fun onCaptionsClicked() fun onQualityClicked() } diff --git a/app/src/main/java/com/github/libretube/models/interfaces/PlayerOptions.kt b/app/src/main/java/com/github/libretube/models/interfaces/PlayerOptions.kt new file mode 100644 index 000000000..fe2a5db67 --- /dev/null +++ b/app/src/main/java/com/github/libretube/models/interfaces/PlayerOptions.kt @@ -0,0 +1,11 @@ +package com.github.libretube.models.interfaces + +interface PlayerOptions { + fun onAutoplayClicked() + + fun onPlaybackSpeedClicked() + + fun onResizeModeClicked() + + fun onRepeatModeClicked() +} diff --git a/app/src/main/java/com/github/libretube/obj/BottomSheetItem.kt b/app/src/main/java/com/github/libretube/obj/BottomSheetItem.kt index d9614e5f8..dad4c43f8 100644 --- a/app/src/main/java/com/github/libretube/obj/BottomSheetItem.kt +++ b/app/src/main/java/com/github/libretube/obj/BottomSheetItem.kt @@ -3,5 +3,6 @@ package com.github.libretube.obj data class BottomSheetItem( val title: String, val drawable: Int? = null, - val currentValue: String? = null + val currentValue: String? = null, + val onClick: () -> Unit = {} ) diff --git a/app/src/main/java/com/github/libretube/ui/adapters/BottomSheetAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/BottomSheetAdapter.kt index e694e8f5a..3b1b92a57 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/BottomSheetAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/BottomSheetAdapter.kt @@ -34,6 +34,7 @@ class BottomSheetAdapter( } root.setOnClickListener { + item.onClick.invoke() listener.invoke(position) } } 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 a2a1a2562..231a8f055 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 @@ -56,7 +56,7 @@ import com.github.libretube.extensions.query import com.github.libretube.extensions.toID import com.github.libretube.extensions.toStreamItem import com.github.libretube.models.PlayerViewModel -import com.github.libretube.models.interfaces.PlayerOptionsInterface +import com.github.libretube.models.interfaces.OnlinePlayerOptions import com.github.libretube.services.BackgroundMode import com.github.libretube.services.DownloadService import com.github.libretube.ui.activities.MainActivity @@ -105,7 +105,7 @@ import java.io.IOException import java.util.concurrent.Executors import kotlin.math.abs -class PlayerFragment : BaseFragment(), PlayerOptionsInterface { +class PlayerFragment : BaseFragment(), OnlinePlayerOptions { lateinit var binding: FragmentPlayerBinding private lateinit var playerBinding: ExoStyledPlayerControlViewBinding @@ -1319,7 +1319,7 @@ class PlayerFragment : BaseFragment(), PlayerOptionsInterface { } } - override fun onCaptionClicked() { + override fun onCaptionsClicked() { if (!this@PlayerFragment::streams.isInitialized || streams.subtitles == null || streams.subtitles!!.isEmpty() diff --git a/app/src/main/java/com/github/libretube/ui/views/BottomSheet.kt b/app/src/main/java/com/github/libretube/ui/views/BottomSheet.kt index 3fd8268cf..af1890c2e 100644 --- a/app/src/main/java/com/github/libretube/ui/views/BottomSheet.kt +++ b/app/src/main/java/com/github/libretube/ui/views/BottomSheet.kt @@ -32,18 +32,18 @@ open class BottomSheet : BottomSheetDialogFragment() { binding.optionsRecycler.adapter = BottomSheetAdapter(items, listener) } - fun setItems(items: List, listener: (index: Int) -> Unit) = apply { + fun setItems(items: List, listener: ((index: Int) -> Unit)?) = apply { this.items = items this.listener = { index -> - listener.invoke(index) + listener?.invoke(index) dialog?.dismiss() } } - fun setSimpleItems(titles: List, listener: (index: Int) -> Unit) = apply { + fun setSimpleItems(titles: List, listener: ((index: Int) -> Unit)?) = apply { this.items = titles.map { BottomSheetItem(it) } this.listener = { index -> - listener.invoke(index) + listener?.invoke(index) dialog?.dismiss() } } 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 f1a887f41..bebb7d4e7 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 @@ -14,7 +14,8 @@ import com.github.libretube.databinding.DoubleTapOverlayBinding import com.github.libretube.databinding.ExoStyledPlayerControlViewBinding import com.github.libretube.extensions.toDp import com.github.libretube.models.interfaces.DoubleTapInterface -import com.github.libretube.models.interfaces.PlayerOptionsInterface +import com.github.libretube.models.interfaces.OnlinePlayerOptions +import com.github.libretube.models.interfaces.PlayerOptions import com.github.libretube.obj.BottomSheetItem import com.github.libretube.ui.activities.MainActivity import com.github.libretube.ui.sheets.PlaybackSpeedSheet @@ -30,7 +31,7 @@ import com.google.android.exoplayer2.util.RepeatModeUtil internal class CustomExoPlayerView( context: Context, attributeSet: AttributeSet? = null -) : StyledPlayerView(context, attributeSet) { +) : StyledPlayerView(context, attributeSet), PlayerOptions { val binding: ExoStyledPlayerControlViewBinding = ExoStyledPlayerControlViewBinding.bind(this) private var doubleTapOverlayBinding: DoubleTapOverlayBinding? = null @@ -38,7 +39,7 @@ internal class CustomExoPlayerView( * Objects from the parent fragment */ private var doubleTapListener: DoubleTapInterface? = null - private var playerOptionsInterface: PlayerOptionsInterface? = null + private var playerOptionsInterface: OnlinePlayerOptions? = null private lateinit var childFragmentManager: FragmentManager private var trackSelector: TrackSelector? = null @@ -72,7 +73,7 @@ internal class CustomExoPlayerView( fun initialize( childFragmentManager: FragmentManager, - playerViewInterface: PlayerOptionsInterface?, + playerViewInterface: OnlinePlayerOptions?, doubleTapOverlayBinding: DoubleTapOverlayBinding, trackSelector: TrackSelector? ) { @@ -136,78 +137,79 @@ internal class CustomExoPlayerView( private fun initializeAdvancedOptions(context: Context) { binding.toggleOptions.setOnClickListener { - val bottomSheetFragment = BottomSheet().apply { - val items = mutableListOf( - BottomSheetItem( - context.getString(R.string.player_autoplay), - R.drawable.ic_play, - if (autoplayEnabled) { - context.getString(R.string.enabled) - } else { - context.getString(R.string.disabled) - } - ), - BottomSheetItem( - context.getString(R.string.repeat_mode), - R.drawable.ic_repeat, - if (player?.repeatMode == RepeatModeUtil.REPEAT_TOGGLE_MODE_NONE) { - context.getString(R.string.repeat_mode_none) - } else { - context.getString(R.string.repeat_mode_current) - } - ), - BottomSheetItem( - context.getString(R.string.player_resize_mode), - R.drawable.ic_aspect_ratio, - when (resizeMode) { - AspectRatioFrameLayout.RESIZE_MODE_FIT -> context.getString(R.string.resize_mode_fit) - AspectRatioFrameLayout.RESIZE_MODE_FILL -> context.getString(R.string.resize_mode_fill) - else -> context.getString(R.string.resize_mode_zoom) - } - ), - BottomSheetItem( - context.getString(R.string.playback_speed), - R.drawable.ic_speed, - "${ - player?.playbackParameters?.speed - .toString() - .replace(".0", "") - }x" - ) - ) - - if (playerOptionsInterface != null) { - items.add( - BottomSheetItem( - context.getString(R.string.quality), - R.drawable.ic_hd, - "${player?.videoSize?.height}p" - ) - ) - items.add( - BottomSheetItem( - context.getString(R.string.captions), - R.drawable.ic_caption, - if (trackSelector != null && trackSelector!!.parameters.preferredTextLanguages.isNotEmpty()) { - trackSelector!!.parameters.preferredTextLanguages[0] - } else { - context.getString(R.string.none) - } - ) - ) - } - - setItems(items) { index -> - when (index) { - 0 -> onAutoplayClicked() - 1 -> onRepeatModeClicked() - 2 -> onResizeModeClicked() - 3 -> onPlaybackSpeedClicked() - 4 -> playerOptionsInterface?.onQualityClicked() - 5 -> playerOptionsInterface?.onCaptionClicked() + val items = mutableListOf( + BottomSheetItem( + context.getString(R.string.player_autoplay), + R.drawable.ic_play, + if (autoplayEnabled) { + context.getString(R.string.enabled) + } else { + context.getString(R.string.disabled) } + ) { + onAutoplayClicked() + }, + BottomSheetItem( + context.getString(R.string.repeat_mode), + R.drawable.ic_repeat, + if (player?.repeatMode == RepeatModeUtil.REPEAT_TOGGLE_MODE_NONE) { + context.getString(R.string.repeat_mode_none) + } else { + context.getString(R.string.repeat_mode_current) + } + ) { + onRepeatModeClicked() + }, + BottomSheetItem( + context.getString(R.string.player_resize_mode), + R.drawable.ic_aspect_ratio, + when (resizeMode) { + AspectRatioFrameLayout.RESIZE_MODE_FIT -> context.getString(R.string.resize_mode_fit) + AspectRatioFrameLayout.RESIZE_MODE_FILL -> context.getString(R.string.resize_mode_fill) + else -> context.getString(R.string.resize_mode_zoom) + } + ) { + onResizeModeClicked() + }, + BottomSheetItem( + context.getString(R.string.playback_speed), + R.drawable.ic_speed, + "${ + player?.playbackParameters?.speed + .toString() + .replace(".0", "") + }x" + ) { + onPlaybackSpeedClicked() } + ) + + if (playerOptionsInterface != null) { + items.add( + BottomSheetItem( + context.getString(R.string.quality), + R.drawable.ic_hd, + "${player?.videoSize?.height}p" + ) { + playerOptionsInterface?.onQualityClicked() + } + ) + items.add( + BottomSheetItem( + context.getString(R.string.captions), + R.drawable.ic_caption, + if (trackSelector != null && trackSelector!!.parameters.preferredTextLanguages.isNotEmpty()) { + trackSelector!!.parameters.preferredTextLanguages[0] + } else { + context.getString(R.string.none) + } + ) { + playerOptionsInterface?.onCaptionsClicked() + } + ) } + + val bottomSheetFragment = BottomSheet().setItems(items, null) bottomSheetFragment.show(childFragmentManager, null) } } @@ -307,7 +309,7 @@ internal class CustomExoPlayerView( } } - private fun onAutoplayClicked() { + override fun onAutoplayClicked() { // autoplay options dialog BottomSheet() .setSimpleItems( @@ -324,11 +326,11 @@ internal class CustomExoPlayerView( .show(childFragmentManager) } - private fun onPlaybackSpeedClicked() { + override fun onPlaybackSpeedClicked() { player?.let { PlaybackSpeedSheet(it).show(childFragmentManager) } } - private fun onResizeModeClicked() { + override fun onResizeModeClicked() { // switching between original aspect ratio (black bars) and zoomed to fill device screen val aspectRatioModeNames = context.resources?.getStringArray(R.array.resizeMode) ?.toList().orEmpty() @@ -346,7 +348,7 @@ internal class CustomExoPlayerView( .show(childFragmentManager) } - private fun onRepeatModeClicked() { + override fun onRepeatModeClicked() { val repeatModeNames = listOf( context.getString(R.string.repeat_mode_none), context.getString(R.string.repeat_mode_current)