mirror of
https://github.com/antebudimir/tempus.git
synced 2026-01-01 09:53:33 +00:00
fix: When creating MediaService, restore player from previous queue
This commit is contained in:
parent
8d8087f2d6
commit
78e7032903
2 changed files with 63 additions and 1 deletions
|
|
@ -14,16 +14,19 @@ import androidx.media3.common.*
|
||||||
import androidx.media3.common.util.UnstableApi
|
import androidx.media3.common.util.UnstableApi
|
||||||
import androidx.media3.exoplayer.DefaultLoadControl
|
import androidx.media3.exoplayer.DefaultLoadControl
|
||||||
import androidx.media3.exoplayer.ExoPlayer
|
import androidx.media3.exoplayer.ExoPlayer
|
||||||
|
import androidx.media3.exoplayer.source.MediaSource
|
||||||
import androidx.media3.exoplayer.source.TrackGroupArray
|
import androidx.media3.exoplayer.source.TrackGroupArray
|
||||||
import androidx.media3.exoplayer.trackselection.TrackSelectionArray
|
import androidx.media3.exoplayer.trackselection.TrackSelectionArray
|
||||||
import androidx.media3.session.*
|
import androidx.media3.session.*
|
||||||
import androidx.media3.session.MediaSession.ControllerInfo
|
import androidx.media3.session.MediaSession.ControllerInfo
|
||||||
import com.cappielloantonio.tempo.R
|
import com.cappielloantonio.tempo.R
|
||||||
|
import com.cappielloantonio.tempo.repository.QueueRepository
|
||||||
import com.cappielloantonio.tempo.ui.activity.MainActivity
|
import com.cappielloantonio.tempo.ui.activity.MainActivity
|
||||||
import com.cappielloantonio.tempo.util.AssetLinkUtil
|
import com.cappielloantonio.tempo.util.AssetLinkUtil
|
||||||
import com.cappielloantonio.tempo.util.Constants
|
import com.cappielloantonio.tempo.util.Constants
|
||||||
import com.cappielloantonio.tempo.util.DownloadUtil
|
import com.cappielloantonio.tempo.util.DownloadUtil
|
||||||
import com.cappielloantonio.tempo.util.DynamicMediaSourceFactory
|
import com.cappielloantonio.tempo.util.DynamicMediaSourceFactory
|
||||||
|
import com.cappielloantonio.tempo.util.MappingUtil
|
||||||
import com.cappielloantonio.tempo.util.Preferences
|
import com.cappielloantonio.tempo.util.Preferences
|
||||||
import com.cappielloantonio.tempo.util.ReplayGainUtil
|
import com.cappielloantonio.tempo.util.ReplayGainUtil
|
||||||
import com.cappielloantonio.tempo.widget.WidgetUpdateManager
|
import com.cappielloantonio.tempo.widget.WidgetUpdateManager
|
||||||
|
|
@ -84,6 +87,7 @@ class MediaService : MediaLibraryService() {
|
||||||
initializeCustomCommands()
|
initializeCustomCommands()
|
||||||
initializePlayer()
|
initializePlayer()
|
||||||
initializeMediaLibrarySession()
|
initializeMediaLibrarySession()
|
||||||
|
restorePlayerFromQueue()
|
||||||
initializePlayerListener()
|
initializePlayerListener()
|
||||||
initializeEqualizerManager()
|
initializeEqualizerManager()
|
||||||
|
|
||||||
|
|
@ -226,7 +230,7 @@ class MediaService : MediaLibraryService() {
|
||||||
private fun initializePlayer() {
|
private fun initializePlayer() {
|
||||||
player = ExoPlayer.Builder(this)
|
player = ExoPlayer.Builder(this)
|
||||||
.setRenderersFactory(getRenderersFactory())
|
.setRenderersFactory(getRenderersFactory())
|
||||||
.setMediaSourceFactory(DynamicMediaSourceFactory(this))
|
.setMediaSourceFactory(getMediaSourceFactory())
|
||||||
.setAudioAttributes(AudioAttributes.DEFAULT, true)
|
.setAudioAttributes(AudioAttributes.DEFAULT, true)
|
||||||
.setHandleAudioBecomingNoisy(true)
|
.setHandleAudioBecomingNoisy(true)
|
||||||
.setWakeMode(C.WAKE_MODE_NETWORK)
|
.setWakeMode(C.WAKE_MODE_NETWORK)
|
||||||
|
|
@ -269,6 +273,33 @@ class MediaService : MediaLibraryService() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun restorePlayerFromQueue() {
|
||||||
|
if (player.mediaItemCount > 0) return
|
||||||
|
|
||||||
|
val queueRepository = QueueRepository()
|
||||||
|
val storedQueue = queueRepository.media
|
||||||
|
if (storedQueue.isNullOrEmpty()) return
|
||||||
|
|
||||||
|
val mediaItems = MappingUtil.mapMediaItems(storedQueue)
|
||||||
|
if (mediaItems.isEmpty()) return
|
||||||
|
|
||||||
|
val lastIndex = try {
|
||||||
|
queueRepository.lastPlayedMediaIndex
|
||||||
|
} catch (_: Exception) {
|
||||||
|
0
|
||||||
|
}.coerceIn(0, mediaItems.size - 1)
|
||||||
|
|
||||||
|
val lastPosition = try {
|
||||||
|
queueRepository.lastPlayedMediaTimestamp
|
||||||
|
} catch (_: Exception) {
|
||||||
|
0L
|
||||||
|
}.let { if (it < 0L) 0L else it }
|
||||||
|
|
||||||
|
player.setMediaItems(mediaItems, lastIndex, lastPosition)
|
||||||
|
player.prepare()
|
||||||
|
updateWidget()
|
||||||
|
}
|
||||||
|
|
||||||
private fun initializePlayerListener() {
|
private fun initializePlayerListener() {
|
||||||
player.addListener(object : Player.Listener {
|
player.addListener(object : Player.Listener {
|
||||||
override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
|
override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
|
||||||
|
|
@ -464,6 +495,7 @@ class MediaService : MediaLibraryService() {
|
||||||
|
|
||||||
private fun getRenderersFactory() = DownloadUtil.buildRenderersFactory(this, false)
|
private fun getRenderersFactory() = DownloadUtil.buildRenderersFactory(this, false)
|
||||||
|
|
||||||
|
private fun getMediaSourceFactory(): MediaSource.Factory = DynamicMediaSourceFactory(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
private const val WIDGET_UPDATE_INTERVAL_MS = 1000L
|
private const val WIDGET_UPDATE_INTERVAL_MS = 1000L
|
||||||
|
|
|
||||||
|
|
@ -21,11 +21,13 @@ import androidx.media3.exoplayer.ExoPlayer
|
||||||
import androidx.media3.session.MediaLibraryService
|
import androidx.media3.session.MediaLibraryService
|
||||||
import androidx.media3.session.MediaSession.ControllerInfo
|
import androidx.media3.session.MediaSession.ControllerInfo
|
||||||
import com.cappielloantonio.tempo.repository.AutomotiveRepository
|
import com.cappielloantonio.tempo.repository.AutomotiveRepository
|
||||||
|
import com.cappielloantonio.tempo.repository.QueueRepository
|
||||||
import com.cappielloantonio.tempo.ui.activity.MainActivity
|
import com.cappielloantonio.tempo.ui.activity.MainActivity
|
||||||
import com.cappielloantonio.tempo.util.AssetLinkUtil
|
import com.cappielloantonio.tempo.util.AssetLinkUtil
|
||||||
import com.cappielloantonio.tempo.util.Constants
|
import com.cappielloantonio.tempo.util.Constants
|
||||||
import com.cappielloantonio.tempo.util.DownloadUtil
|
import com.cappielloantonio.tempo.util.DownloadUtil
|
||||||
import com.cappielloantonio.tempo.util.DynamicMediaSourceFactory
|
import com.cappielloantonio.tempo.util.DynamicMediaSourceFactory
|
||||||
|
import com.cappielloantonio.tempo.util.MappingUtil
|
||||||
import com.cappielloantonio.tempo.util.Preferences
|
import com.cappielloantonio.tempo.util.Preferences
|
||||||
import com.cappielloantonio.tempo.util.ReplayGainUtil
|
import com.cappielloantonio.tempo.util.ReplayGainUtil
|
||||||
import com.cappielloantonio.tempo.widget.WidgetUpdateManager
|
import com.cappielloantonio.tempo.widget.WidgetUpdateManager
|
||||||
|
|
@ -73,6 +75,7 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
|
||||||
initializePlayer()
|
initializePlayer()
|
||||||
initializeCastPlayer()
|
initializeCastPlayer()
|
||||||
initializeMediaLibrarySession()
|
initializeMediaLibrarySession()
|
||||||
|
restorePlayerFromQueue()
|
||||||
initializePlayerListener()
|
initializePlayerListener()
|
||||||
initializeEqualizerManager()
|
initializeEqualizerManager()
|
||||||
|
|
||||||
|
|
@ -166,6 +169,33 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun restorePlayerFromQueue() {
|
||||||
|
if (player.mediaItemCount > 0) return
|
||||||
|
|
||||||
|
val queueRepository = QueueRepository()
|
||||||
|
val storedQueue = queueRepository.media
|
||||||
|
if (storedQueue.isNullOrEmpty()) return
|
||||||
|
|
||||||
|
val mediaItems = MappingUtil.mapMediaItems(storedQueue)
|
||||||
|
if (mediaItems.isEmpty()) return
|
||||||
|
|
||||||
|
val lastIndex = try {
|
||||||
|
queueRepository.lastPlayedMediaIndex
|
||||||
|
} catch (_: Exception) {
|
||||||
|
0
|
||||||
|
}.coerceIn(0, mediaItems.size - 1)
|
||||||
|
|
||||||
|
val lastPosition = try {
|
||||||
|
queueRepository.lastPlayedMediaTimestamp
|
||||||
|
} catch (_: Exception) {
|
||||||
|
0L
|
||||||
|
}.let { if (it < 0L) 0L else it }
|
||||||
|
|
||||||
|
player.setMediaItems(mediaItems, lastIndex, lastPosition)
|
||||||
|
player.prepare()
|
||||||
|
updateWidget()
|
||||||
|
}
|
||||||
|
|
||||||
private fun createLibrarySessionCallback(): MediaLibrarySessionCallback {
|
private fun createLibrarySessionCallback(): MediaLibrarySessionCallback {
|
||||||
return MediaLibrarySessionCallback(this, automotiveRepository)
|
return MediaLibrarySessionCallback(this, automotiveRepository)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue