[Android] TV audio player: close the player when the playback finishes
Nicolas Pomepuy
git at videolan.org
Fri Feb 28 12:55:10 UTC 2025
vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Wed Feb 26 11:29:18 2025 +0100| [a7f0dadbdc9ec283b8f78c32e675edb8225fbc88] | committer: Duncan McNamara
TV audio player: close the player when the playback finishes
> https://code.videolan.org/videolan/vlc-android/commit/a7f0dadbdc9ec283b8f78c32e675edb8225fbc88
---
.../ui/audioplayer/AudioPlayerActivity.kt | 34 +++++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)
diff --git a/application/television/src/main/java/org/videolan/television/ui/audioplayer/AudioPlayerActivity.kt b/application/television/src/main/java/org/videolan/television/ui/audioplayer/AudioPlayerActivity.kt
index f7ee0e28a0..ed41741430 100644
--- a/application/television/src/main/java/org/videolan/television/ui/audioplayer/AudioPlayerActivity.kt
+++ b/application/television/src/main/java/org/videolan/television/ui/audioplayer/AudioPlayerActivity.kt
@@ -27,6 +27,7 @@ import android.os.Build
import android.os.Bundle
import android.support.v4.media.session.PlaybackStateCompat
import android.text.format.DateFormat
+import android.util.Log
import android.view.InputDevice
import android.view.KeyEvent
import android.view.MotionEvent
@@ -41,8 +42,13 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.MainScope
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
+import org.videolan.libvlc.MediaPlayer
+import org.videolan.libvlc.interfaces.IMedia
import org.videolan.medialibrary.interfaces.media.Bookmark
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem
@@ -57,6 +63,7 @@ import org.videolan.tools.Settings
import org.videolan.tools.formatRateString
import org.videolan.tools.setGone
import org.videolan.tools.setVisible
+import org.videolan.vlc.BuildConfig
import org.videolan.vlc.PlaybackService
import org.videolan.vlc.gui.audio.EqualizerFragment
import org.videolan.vlc.gui.dialogs.CONFIRM_BOOKMARK_RENAME_DIALOG_RESULT
@@ -73,6 +80,7 @@ import org.videolan.vlc.gui.helpers.PlayerOptionsDelegate
import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.gui.helpers.UiTools.showPinIfNeeded
import org.videolan.vlc.media.MediaUtils
+import org.videolan.vlc.media.PlaylistManager
import org.videolan.vlc.util.getScreenWidth
import org.videolan.vlc.viewmodels.BookmarkModel
import org.videolan.vlc.viewmodels.PlayerState
@@ -80,7 +88,7 @@ import org.videolan.vlc.viewmodels.PlaylistModel
import kotlin.math.absoluteValue
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
-class AudioPlayerActivity : BaseTvActivity(),KeycodeListener {
+class AudioPlayerActivity : BaseTvActivity(),KeycodeListener, PlaybackService.Callback {
private lateinit var binding: TvAudioPlayerBinding
private lateinit var adapter: PlaylistAdapter
@@ -95,6 +103,8 @@ class AudioPlayerActivity : BaseTvActivity(),KeycodeListener {
lateinit var bookmarkModel: BookmarkModel
private lateinit var bookmarkListDelegate: BookmarkListDelegate
private val playerKeyListenerDelegate: PlayerKeyListenerDelegate by lazy(LazyThreadSafetyMode.NONE) { PlayerKeyListenerDelegate(this at AudioPlayerActivity) }
+ var playbackStarted = false
+ private var service: PlaybackService? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -164,11 +174,21 @@ class AudioPlayerActivity : BaseTvActivity(),KeycodeListener {
val name = bundle.getString(RENAME_DIALOG_NEW_NAME) ?: return at setFragmentResultListener
bookmarkListDelegate.renameBookmark(media as Bookmark, name)
}
+ PlaybackService.serviceFlow.onEach { onServiceChanged(it) }.launchIn(MainScope())
+ PlaylistManager.showAudioPlayer.observe(this) { showPlayer ->
+ if (!showPlayer && playbackStarted) finish()
+ }
+ }
+
+ private fun onServiceChanged(it: PlaybackService?) {
+ it?.addCallback(this)
+ service = it
}
override fun onDestroy() {
super.onDestroy()
optionsDelegate = null
+ service?.removeCallback(this)
}
private var timelineListener: SeekBar.OnSeekBarChangeListener = object : SeekBar.OnSeekBarChangeListener {
@@ -466,4 +486,16 @@ class AudioPlayerActivity : BaseTvActivity(),KeycodeListener {
//PAD navigation
private const val JOYSTICK_INPUT_DELAY = 300
}
+
+ override fun update() { }
+
+ override fun onMediaEvent(event: IMedia.Event) { }
+
+ override fun onMediaPlayerEvent(event: MediaPlayer.Event) {
+ when (event.type) {
+ MediaPlayer.Event.Playing -> {
+ playbackStarted = true
+ }
+ }
+ }
}
More information about the Android
mailing list