[Android] Refactor playback depending dialogs to the new PlaybackBottomSheetDialogFragment
Nicolas Pomepuy
git at videolan.org
Mon Feb 17 10:24:56 UTC 2025
vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Mon Feb 17 09:37:19 2025 +0100| [519a5c7daeeea877d104ec1cbfcc48d53948f05a] | committer: Duncan McNamara
Refactor playback depending dialogs to the new PlaybackBottomSheetDialogFragment
> https://code.videolan.org/videolan/vlc-android/commit/519a5c7daeeea877d104ec1cbfcc48d53948f05a
---
.../videolan/vlc/gui/dialogs/JumpToTimeDialog.kt | 14 ++++--
.../videolan/vlc/gui/dialogs/PickTimeFragment.kt | 15 +-----
.../vlc/gui/dialogs/SelectChapterDialog.kt | 54 +++++-----------------
.../videolan/vlc/gui/dialogs/SleepTimerDialog.kt | 4 ++
4 files changed, 26 insertions(+), 61 deletions(-)
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/JumpToTimeDialog.kt b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/JumpToTimeDialog.kt
index 56779df021..c95d47156d 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/JumpToTimeDialog.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/JumpToTimeDialog.kt
@@ -28,12 +28,18 @@ import org.videolan.vlc.R
class JumpToTimeDialog : PickTimeFragment() {
override fun executeAction() {
- val newTime = getTimeInMillis() //Time in ms
- playbackService.setTime(newTime)
- playbackService.playlistManager.player.updateProgress(newTime)
- dismiss()
+ playbackService?.let {
+ val newTime = getTimeInMillis() //Time in ms
+ it.setTime(newTime)
+ it.playlistManager.player.updateProgress(newTime)
+ dismiss()
+ }
}
+ override fun onServiceAvailable() { }
+
+ override fun onMediaChanged() { }
+
override fun showTimeOnly() = true
override fun getTitle(): Int {
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/PickTimeFragment.kt b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/PickTimeFragment.kt
index b531c4a972..93fd60b2f1 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/PickTimeFragment.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/PickTimeFragment.kt
@@ -28,19 +28,13 @@ import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.content.ContextCompat
-import androidx.lifecycle.lifecycleScope
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED
-import kotlinx.coroutines.flow.filterNotNull
-import kotlinx.coroutines.flow.onEach
import org.videolan.tools.setGone
-import org.videolan.vlc.PlaybackService
import org.videolan.vlc.R
-import org.videolan.vlc.databinding.AudioBrowserBinding
import org.videolan.vlc.databinding.DialogTimePickerBinding
import org.videolan.vlc.gui.helpers.TalkbackUtil
-import org.videolan.vlc.util.launchWhenStarted
-abstract class PickTimeFragment : VLCBottomSheetDialogFragment(), View.OnClickListener, View.OnFocusChangeListener {
+abstract class PickTimeFragment : PlaybackBottomSheetDialogFragment(), View.OnClickListener, View.OnFocusChangeListener {
lateinit var binding: DialogTimePickerBinding
private var mTextColor: Int = 0
@@ -52,8 +46,6 @@ abstract class PickTimeFragment : VLCBottomSheetDialogFragment(), View.OnClickLi
private var pickedRawTime = ""
var maxTimeSize = 6
- lateinit var playbackService: PlaybackService
-
abstract fun showTimeOnly(): Boolean
abstract fun getTitle(): Int
@@ -97,11 +89,6 @@ abstract class PickTimeFragment : VLCBottomSheetDialogFragment(), View.OnClickLi
return binding.timPic1
}
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- PlaybackService.serviceFlow.filterNotNull().onEach { playbackService = it }.launchWhenStarted(lifecycleScope)
- super.onViewCreated(view, savedInstanceState)
- }
-
override fun onFocusChange(v: View, hasFocus: Boolean) {
if (v is TextView) {
v.setTextColor(if (hasFocus) ContextCompat.getColor(requireActivity(), R.color.orange500) else mTextColor)
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/SelectChapterDialog.kt b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/SelectChapterDialog.kt
index e5940b5acb..b17ebf11b9 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/SelectChapterDialog.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/SelectChapterDialog.kt
@@ -28,22 +28,15 @@ import android.view.ViewGroup
import androidx.core.view.ViewCompat
import androidx.core.widget.NestedScrollView
import androidx.databinding.DataBindingUtil
-import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED
-import kotlinx.coroutines.flow.onCompletion
-import kotlinx.coroutines.flow.onEach
-import org.videolan.libvlc.MediaPlayer
-import org.videolan.libvlc.interfaces.IMedia
import org.videolan.medialibrary.Tools
-import org.videolan.vlc.PlaybackService
import org.videolan.vlc.R
import org.videolan.vlc.databinding.ChapterListItemBinding
import org.videolan.vlc.util.TextUtils
-import org.videolan.vlc.util.launchWhenStarted
-class SelectChapterDialog : VLCBottomSheetDialogFragment(), IOnChapterSelectedListener, PlaybackService.Callback {
+class SelectChapterDialog : PlaybackBottomSheetDialogFragment(), IOnChapterSelectedListener {
companion object {
@@ -56,8 +49,6 @@ class SelectChapterDialog : VLCBottomSheetDialogFragment(), IOnChapterSelectedLi
private lateinit var chapterAdapter: ChapterAdapter
private lateinit var nestedScrollView: NestedScrollView
- private var service: PlaybackService? = null
-
override fun initialFocusedView(): View = chapterList
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
@@ -69,15 +60,8 @@ class SelectChapterDialog : VLCBottomSheetDialogFragment(), IOnChapterSelectedLi
return view
}
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- PlaybackService.serviceFlow.onEach { onServiceChanged(it) }
- .onCompletion { onServiceChanged(null) }
- .launchWhenStarted(lifecycleScope)
- }
-
private fun initChapterList() {
- val svc = service ?: return
+ val svc = playbackService ?: return
val chapters = svc.getChapters(-1)
if (chapters == null || chapters.size <= 1) {
dismiss()
@@ -110,22 +94,18 @@ class SelectChapterDialog : VLCBottomSheetDialogFragment(), IOnChapterSelectedLi
}
override fun onChapterSelected(position: Int) {
- service?.chapterIdx = position
+ playbackService?.chapterIdx = position
dismiss()
}
- private fun onServiceChanged(service: PlaybackService?) {
- if (this.service == service) return
- if (service != null) {
- this.service = service
- service.addCallback(this)
- initChapterList()
- } else {
- this.service?.apply {
- removeCallback(this at SelectChapterDialog)
- }
- this.service = null
- }
+ override fun onServiceAvailable() {
+ initChapterList()
+ }
+
+ override fun onMediaChanged() {
+ initChapterList()
+ playbackService?.let { chapterAdapter.updateSelectedIndex(it.chapterIdx) }
+ chapterList.requestLayout()
}
override fun getDefaultState(): Int {
@@ -174,18 +154,6 @@ class SelectChapterDialog : VLCBottomSheetDialogFragment(), IOnChapterSelectedLi
listener.onChapterSelected(layoutPosition)
}
}
-
- override fun update() {
- service?.let { chapterAdapter.updateSelectedIndex(it.chapterIdx) }
- chapterList.requestLayout()
- }
-
- override fun onMediaEvent(event: IMedia.Event) {
- }
-
- override fun onMediaPlayerEvent(event: MediaPlayer.Event) {
- if (event.type == MediaPlayer.Event.Opening) initChapterList()
- }
}
interface IOnChapterSelectedListener {
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/SleepTimerDialog.kt b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/SleepTimerDialog.kt
index 1b00bee9ea..acb43e787a 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/SleepTimerDialog.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/SleepTimerDialog.kt
@@ -118,6 +118,10 @@ class SleepTimerDialog : PickTimeFragment() {
dismiss()
}
+ override fun onServiceAvailable() { }
+
+ override fun onMediaChanged() { }
+
override fun showDeleteCurrent() = true
override fun onClick(v: View) {
More information about the Android
mailing list