Add play and pause functionality

This commit is contained in:
Bnyro 2023-01-13 18:35:38 +01:00
parent 59697caebf
commit 186925dfa1
4 changed files with 69 additions and 4 deletions

View File

@ -5,6 +5,7 @@ import android.app.NotificationChannel
import android.app.NotificationManager import android.app.NotificationManager
import android.app.Service import android.app.Service
import android.content.Intent import android.content.Intent
import android.os.Binder
import android.os.Build import android.os.Build
import android.os.Handler import android.os.Handler
import android.os.IBinder import android.os.IBinder
@ -87,6 +88,11 @@ class BackgroundMode : Service() {
*/ */
private val handler = Handler(Looper.getMainLooper()) private val handler = Handler(Looper.getMainLooper())
/**
* Used for connecting to the AudioPlayerFragment
*/
private val binder = LocalBinder()
/** /**
* Setting the required [Notification] for running as a foreground service * Setting the required [Notification] for running as a foreground service
*/ */
@ -381,7 +387,24 @@ class BackgroundMode : Service() {
super.onDestroy() super.onDestroy()
} }
override fun onBind(p0: Intent?): IBinder? { inner class LocalBinder : Binder() {
return null // Return this instance of [BackgroundMode] so clients can call public methods
fun getService(): BackgroundMode = this@BackgroundMode
}
override fun onBind(p0: Intent?): IBinder {
return binder
}
fun getCurrentPosition() = player?.currentPosition
fun seekToPosition(position: Long) = player?.seekTo(position)
fun pause() {
player?.pause()
}
fun play() {
player?.play()
} }
} }

View File

@ -1,12 +1,19 @@
package com.github.libretube.ui.fragments package com.github.libretube.ui.fragments
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.os.Bundle import android.os.Bundle
import android.os.IBinder
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.github.libretube.R
import com.github.libretube.api.obj.StreamItem import com.github.libretube.api.obj.StreamItem
import com.github.libretube.databinding.FragmentAudioPlayerBinding import com.github.libretube.databinding.FragmentAudioPlayerBinding
import com.github.libretube.extensions.toID import com.github.libretube.extensions.toID
import com.github.libretube.services.BackgroundMode
import com.github.libretube.ui.base.BaseFragment import com.github.libretube.ui.base.BaseFragment
import com.github.libretube.util.ImageHelper import com.github.libretube.util.ImageHelper
import com.github.libretube.util.NavigationHelper import com.github.libretube.util.NavigationHelper
@ -17,6 +24,31 @@ class AudioPlayerFragment : BaseFragment() {
private val onTrackChangeListener: (StreamItem) -> Unit = { private val onTrackChangeListener: (StreamItem) -> Unit = {
updateStreamInfo() updateStreamInfo()
} }
private var isPaused: Boolean = false
private lateinit var playerService: BackgroundMode
private var mBound: Boolean = false
/** Defines callbacks for service binding, passed to bindService() */
private val connection = object : ServiceConnection {
override fun onServiceConnected(className: ComponentName, service: IBinder) {
// We've bound to LocalService, cast the IBinder and get LocalService instance
val binder = service as BackgroundMode.LocalBinder
playerService = binder.getService()
mBound = true
}
override fun onServiceDisconnected(arg0: ComponentName) {
mBound = false
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Intent(activity, BackgroundMode::class.java).also { intent ->
activity?.bindService(intent, connection, Context.BIND_AUTO_CREATE)
}
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -42,6 +74,13 @@ class AudioPlayerFragment : BaseFragment() {
PlayingQueue.addOnTrackChangedListener(onTrackChangeListener) PlayingQueue.addOnTrackChangedListener(onTrackChangeListener)
binding.playPause.setOnClickListener {
if (mBound == false) return@setOnClickListener
if (isPaused) playerService.play() else playerService.pause()
binding.playPause.setIconResource(if (isPaused) R.drawable.ic_pause else R.drawable.ic_play)
isPaused = !isPaused
}
updateStreamInfo() updateStreamInfo()
} }
@ -61,6 +100,7 @@ class AudioPlayerFragment : BaseFragment() {
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
activity?.unbindService(connection)
// unregister the listener // unregister the listener
PlayingQueue.removeOnTrackChangedListener(onTrackChangeListener) PlayingQueue.removeOnTrackChangedListener(onTrackChangeListener)
} }

View File

@ -68,8 +68,10 @@ object PlayingQueue {
fun updateCurrent(streamItem: StreamItem) { fun updateCurrent(streamItem: StreamItem) {
currentStream = streamItem currentStream = streamItem
onTrackChangedListeners.forEach { onTrackChangedListeners.forEach {
runCatching {
it.invoke(streamItem) it.invoke(streamItem)
} }
}
if (!contains(streamItem)) queue.add(streamItem) if (!contains(streamItem)) queue.add(streamItem)
} }

View File

@ -81,7 +81,7 @@
android:insetTop="0dp" android:insetTop="0dp"
android:insetRight="0dp" android:insetRight="0dp"
android:insetBottom="0dp" android:insetBottom="0dp"
app:icon="@drawable/ic_play" app:icon="@drawable/ic_pause"
app:iconSize="24dp" app:iconSize="24dp"
app:shapeAppearanceOverlay="@style/ShapeAppearance.Material3.Corner.Full" /> app:shapeAppearanceOverlay="@style/ShapeAppearance.Material3.Corner.Full" />