mirror of
https://github.com/jellyfin/jellyfin-android.git
synced 2026-09-03 05:10:27 +03:00
Include cast extension in proprietary flavor only (#250)
This commit is contained in:
@@ -120,7 +120,7 @@ dependencies {
|
||||
|
||||
// Cast
|
||||
implementation(Dependencies.Cast.mediaRouter)
|
||||
implementation(Dependencies.Cast.exoPlayerCastExtension)
|
||||
proprietaryImplementation(Dependencies.Cast.exoPlayerCastExtension)
|
||||
proprietaryImplementation(Dependencies.Cast.playServicesCast)
|
||||
proprietaryImplementation(Dependencies.Cast.playServicesCastFramework)
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package org.jellyfin.mobile.cast
|
||||
|
||||
import com.google.android.exoplayer2.Player
|
||||
import org.jellyfin.mobile.media.MediaService
|
||||
|
||||
class CastPlayerProvider(@Suppress("UNUSED_PARAMETER") mediaService: MediaService) : ICastPlayerProvider {
|
||||
override val isCastSessionAvailable: Boolean = false
|
||||
|
||||
override fun get(): Player = throw NotImplementedError("CastPlayer isn't implemented in libre flavor")
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package org.jellyfin.mobile.cast
|
||||
|
||||
import com.google.android.exoplayer2.Player
|
||||
|
||||
interface ICastPlayerProvider {
|
||||
val isCastSessionAvailable: Boolean
|
||||
|
||||
fun get(): Player
|
||||
}
|
||||
@@ -23,15 +23,14 @@ import androidx.mediarouter.media.MediaRouter
|
||||
import androidx.mediarouter.media.MediaRouterParams
|
||||
import com.google.android.exoplayer2.*
|
||||
import com.google.android.exoplayer2.audio.AudioAttributes
|
||||
import com.google.android.exoplayer2.ext.cast.CastPlayer
|
||||
import com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener
|
||||
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
|
||||
import com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator
|
||||
import com.google.android.exoplayer2.ui.PlayerNotificationManager
|
||||
import com.google.android.gms.cast.framework.CastContext
|
||||
import kotlinx.coroutines.*
|
||||
import org.jellyfin.apiclient.interaction.ApiClient
|
||||
import org.jellyfin.mobile.R
|
||||
import org.jellyfin.mobile.cast.CastPlayerProvider
|
||||
import org.jellyfin.mobile.cast.ICastPlayerProvider
|
||||
import org.jellyfin.mobile.controller.ServerController
|
||||
import org.jellyfin.mobile.media.car.LibraryBrowser
|
||||
import org.jellyfin.mobile.media.car.LibraryPage
|
||||
@@ -73,7 +72,8 @@ class MediaService : MediaBrowserServiceCompat() {
|
||||
.setUsage(C.USAGE_MEDIA)
|
||||
.build()
|
||||
|
||||
private val playerListener = PlayerEventListener()
|
||||
@Suppress("MemberVisibilityCanBePrivate")
|
||||
val playerListener: Player.EventListener = PlayerEventListener()
|
||||
|
||||
private val exoPlayer: SimpleExoPlayer by lazy {
|
||||
SimpleExoPlayer.Builder(this).build().apply {
|
||||
@@ -83,11 +83,8 @@ class MediaService : MediaBrowserServiceCompat() {
|
||||
}
|
||||
}
|
||||
|
||||
private val castPlayer: CastPlayer by lazy {
|
||||
CastPlayer(CastContext.getSharedInstance(this)).apply {
|
||||
setSessionAvailabilityListener(CastSessionAvailabilityListener())
|
||||
addListener(playerListener)
|
||||
}
|
||||
private val castPlayerProvider: ICastPlayerProvider by lazy {
|
||||
CastPlayerProvider(this)
|
||||
}
|
||||
|
||||
override fun onCreate() {
|
||||
@@ -138,7 +135,7 @@ class MediaService : MediaBrowserServiceCompat() {
|
||||
|
||||
switchToPlayer(
|
||||
previousPlayer = null,
|
||||
newPlayer = if (castPlayer.isCastSessionAvailable) castPlayer else exoPlayer
|
||||
newPlayer = if (castPlayerProvider.isCastSessionAvailable) castPlayerProvider.get() else exoPlayer
|
||||
)
|
||||
notificationManager.showNotificationForPlayer(currentPlayer)
|
||||
|
||||
@@ -203,7 +200,7 @@ class MediaService : MediaBrowserServiceCompat() {
|
||||
exoPlayer.prepare()
|
||||
exoPlayer.seekTo(initialPlaybackIndex, playbackStartPositionMs)
|
||||
} else /* currentPlayer == castPlayer */ {
|
||||
castPlayer.setMediaItems(
|
||||
castPlayerProvider.get().setMediaItems(
|
||||
mediaItems,
|
||||
initialPlaybackIndex,
|
||||
playbackStartPositionMs,
|
||||
@@ -242,14 +239,14 @@ class MediaService : MediaBrowserServiceCompat() {
|
||||
}.build())
|
||||
}
|
||||
|
||||
private inner class CastSessionAvailabilityListener : SessionAvailabilityListener {
|
||||
override fun onCastSessionAvailable() {
|
||||
switchToPlayer(currentPlayer, castPlayer)
|
||||
}
|
||||
@Suppress("unused")
|
||||
fun onCastSessionAvailable() {
|
||||
switchToPlayer(currentPlayer, castPlayerProvider.get())
|
||||
}
|
||||
|
||||
override fun onCastSessionUnavailable() {
|
||||
switchToPlayer(currentPlayer, exoPlayer)
|
||||
}
|
||||
@Suppress("unused")
|
||||
fun onCastSessionUnavailable() {
|
||||
switchToPlayer(currentPlayer, exoPlayer)
|
||||
}
|
||||
|
||||
private inner class MediaQueueNavigator(mediaSession: MediaSessionCompat) : TimelineQueueNavigator(mediaSession) {
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
package org.jellyfin.mobile.cast
|
||||
|
||||
import com.google.android.exoplayer2.Player
|
||||
import com.google.android.exoplayer2.ext.cast.CastPlayer
|
||||
import com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener
|
||||
import com.google.android.gms.cast.framework.CastContext
|
||||
import org.jellyfin.mobile.media.MediaService
|
||||
|
||||
class CastPlayerProvider(mediaService: MediaService) : ICastPlayerProvider {
|
||||
private val castPlayer: CastPlayer = CastPlayer(CastContext.getSharedInstance(mediaService)).apply {
|
||||
setSessionAvailabilityListener(CastSessionAvailabilityListener(mediaService))
|
||||
addListener(mediaService.playerListener)
|
||||
}
|
||||
|
||||
override val isCastSessionAvailable: Boolean
|
||||
get() = castPlayer.isCastSessionAvailable
|
||||
|
||||
override fun get(): Player = castPlayer
|
||||
|
||||
private class CastSessionAvailabilityListener(private val mediaService: MediaService) : SessionAvailabilityListener {
|
||||
override fun onCastSessionAvailable() {
|
||||
mediaService.onCastSessionAvailable()
|
||||
}
|
||||
|
||||
override fun onCastSessionUnavailable() {
|
||||
mediaService.onCastSessionUnavailable()
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user