[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