RemoteMediaClient GetMediaInfo for Android

This commit is contained in:
gianlucaparadise 2021-11-23 06:11:06 +01:00
parent d7a8bb5f90
commit b8f8b66c00
3 changed files with 125 additions and 8 deletions

View file

@ -9,6 +9,7 @@ import androidx.lifecycle.OnLifecycleEvent
import androidx.lifecycle.ProcessLifecycleOwner import androidx.lifecycle.ProcessLifecycleOwner
import com.gianlucaparadise.flutter_cast_framework.cast.CastDialogOpener import com.gianlucaparadise.flutter_cast_framework.cast.CastDialogOpener
import com.gianlucaparadise.flutter_cast_framework.cast.MessageCastingChannel import com.gianlucaparadise.flutter_cast_framework.cast.MessageCastingChannel
import com.gianlucaparadise.flutter_cast_framework.media.getFlutterMediaInfo
import com.gianlucaparadise.flutter_cast_framework.media.getMediaLoadRequestData import com.gianlucaparadise.flutter_cast_framework.media.getMediaLoadRequestData
import com.google.android.gms.cast.MediaError import com.google.android.gms.cast.MediaError
import com.google.android.gms.cast.framework.CastContext import com.google.android.gms.cast.framework.CastContext
@ -100,7 +101,7 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa
private val mSessionManagerListener = CastSessionManagerListener() private val mSessionManagerListener = CastSessionManagerListener()
private val remoteMediaClientListener = RemoteMediaClientListener() private val remoteMediaClientListener = RemoteMediaClientListener()
private var castApi : PlatformBridgeApis.CastHostApi? = null private var castApi: PlatformBridgeApis.CastHostApi? = null
private var flutterApi: PlatformBridgeApis.CastFlutterApi? = null private var flutterApi: PlatformBridgeApis.CastFlutterApi? = null
private var applicationContext: Context? = null private var applicationContext: Context? = null
private var activity: Activity? = null private var activity: Activity? = null
@ -171,43 +172,43 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa
override fun onStatusUpdated() { override fun onStatusUpdated() {
Log.d(TAG, "RemoteMediaClient - onStatusUpdated") Log.d(TAG, "RemoteMediaClient - onStatusUpdated")
super.onStatusUpdated() super.onStatusUpdated()
flutterApi?.onStatusUpdated { } flutterApi?.onStatusUpdated { }
} }
override fun onMetadataUpdated() { override fun onMetadataUpdated() {
Log.d(TAG, "RemoteMediaClient - onMetadataUpdated") Log.d(TAG, "RemoteMediaClient - onMetadataUpdated")
super.onMetadataUpdated() super.onMetadataUpdated()
flutterApi?.onMetadataUpdated { } flutterApi?.onMetadataUpdated { }
} }
override fun onQueueStatusUpdated() { override fun onQueueStatusUpdated() {
Log.d(TAG, "RemoteMediaClient - onQueueStatusUpdated") Log.d(TAG, "RemoteMediaClient - onQueueStatusUpdated")
super.onQueueStatusUpdated() super.onQueueStatusUpdated()
flutterApi?.onQueueStatusUpdated { } flutterApi?.onQueueStatusUpdated { }
} }
override fun onPreloadStatusUpdated() { override fun onPreloadStatusUpdated() {
Log.d(TAG, "RemoteMediaClient - onPreloadStatusUpdated") Log.d(TAG, "RemoteMediaClient - onPreloadStatusUpdated")
super.onPreloadStatusUpdated() super.onPreloadStatusUpdated()
flutterApi?.onPreloadStatusUpdated { } flutterApi?.onPreloadStatusUpdated { }
} }
override fun onSendingRemoteMediaRequest() { override fun onSendingRemoteMediaRequest() {
Log.d(TAG, "RemoteMediaClient - onSendingRemoteMediaRequest") Log.d(TAG, "RemoteMediaClient - onSendingRemoteMediaRequest")
super.onSendingRemoteMediaRequest() super.onSendingRemoteMediaRequest()
flutterApi?.onSendingRemoteMediaRequest { } flutterApi?.onSendingRemoteMediaRequest { }
} }
override fun onAdBreakStatusUpdated() { override fun onAdBreakStatusUpdated() {
Log.d(TAG, "RemoteMediaClient - onAdBreakStatusUpdated") Log.d(TAG, "RemoteMediaClient - onAdBreakStatusUpdated")
super.onAdBreakStatusUpdated() super.onAdBreakStatusUpdated()
flutterApi?.onAdBreakStatusUpdated { } flutterApi?.onAdBreakStatusUpdated { }
} }
override fun onMediaError(error: MediaError?) { override fun onMediaError(error: MediaError?) {
Log.d(TAG, "RemoteMediaClient - onMediaError $error") Log.d(TAG, "RemoteMediaClient - onMediaError $error")
super.onMediaError(error) super.onMediaError(error)
flutterApi?.onMediaError { } flutterApi?.onMediaError { }
} }
} }
@ -235,6 +236,15 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa
val mediaLoadRequest = getMediaLoadRequestData(request) val mediaLoadRequest = getMediaLoadRequestData(request)
remoteMediaClient.load(mediaLoadRequest) remoteMediaClient.load(mediaLoadRequest)
} }
override fun getMediaInfo(): PlatformBridgeApis.MediaInfo {
val remoteMediaClient: RemoteMediaClient = remoteMediaClient
?: return PlatformBridgeApis.MediaInfo()
val hostMediaInfo = remoteMediaClient.mediaInfo ?: return PlatformBridgeApis.MediaInfo()
return getFlutterMediaInfo(hostMediaInfo)
}
} }
private fun getOnNamespaceResult(oldSession: CastSession?, newSession: CastSession?) = PlatformBridgeApis.CastFlutterApi.Reply<MutableList<String>> { namespaces -> private fun getOnNamespaceResult(oldSession: CastSession?, newSession: CastSession?) = PlatformBridgeApis.CastFlutterApi.Reply<MutableList<String>> { namespaces ->

View file

@ -0,0 +1,107 @@
package com.gianlucaparadise.flutter_cast_framework.media
import com.gianlucaparadise.flutter_cast_framework.PlatformBridgeApis
import com.google.android.gms.cast.MediaInfo
import com.google.android.gms.cast.MediaMetadata
import com.google.android.gms.cast.MediaTrack
import com.google.android.gms.common.images.WebImage
fun getFlutterMediaInfo(mediaInfo: MediaInfo): PlatformBridgeApis.MediaInfo {
val flutterMediaMetadata = getFlutterMediaMetadata(mediaInfo.metadata)
val flutterMediaTracks = getFlutterMediaTracks(mediaInfo.mediaTracks)
val flutterStreamType = getFlutterStreamType(mediaInfo.streamType)
return PlatformBridgeApis.MediaInfo().apply {
contentId = mediaInfo.contentId
contentType = mediaInfo.contentType
customDataAsJson = mediaInfo.customData?.toString()
mediaMetadata = flutterMediaMetadata
mediaTracks = flutterMediaTracks
streamDuration = mediaInfo.streamDuration
streamType = flutterStreamType
}
}
fun getFlutterStreamType(streamType: Int): PlatformBridgeApis.StreamType {
return when (streamType) {
-1 -> PlatformBridgeApis.StreamType.invalid
0 -> PlatformBridgeApis.StreamType.none
1 -> PlatformBridgeApis.StreamType.buffered
2 -> PlatformBridgeApis.StreamType.live
else -> PlatformBridgeApis.StreamType.invalid
}
}
fun getFlutterMediaTracks(mediaTracks: List<MediaTrack>): List<PlatformBridgeApis.MediaTrack> {
return mediaTracks.map {
getFlutterMediaTrack(it)
}
}
fun getFlutterMediaTrack(mediaTrack: MediaTrack): PlatformBridgeApis.MediaTrack {
val flutterSubtype = getFlutterSubtype(mediaTrack.subtype)
val flutterType = getFlutterType(mediaTrack.type)
return PlatformBridgeApis.MediaTrack().apply {
contentId = mediaTrack.contentId
id = mediaTrack.id
language = mediaTrack.language
name = mediaTrack.name
trackSubtype = flutterSubtype
trackType = flutterType
}
}
fun getFlutterType(type: Int): PlatformBridgeApis.TrackType {
return when (type) {
0 -> PlatformBridgeApis.TrackType.unknown
1 -> PlatformBridgeApis.TrackType.text
2 -> PlatformBridgeApis.TrackType.audio
3 -> PlatformBridgeApis.TrackType.video
else -> PlatformBridgeApis.TrackType.unknown
}
}
fun getFlutterSubtype(subtype: Int): PlatformBridgeApis.TrackSubtype {
return when (subtype) {
-1 -> PlatformBridgeApis.TrackSubtype.unknown
0 -> PlatformBridgeApis.TrackSubtype.none
1 -> PlatformBridgeApis.TrackSubtype.subtitles
2 -> PlatformBridgeApis.TrackSubtype.captions
3 -> PlatformBridgeApis.TrackSubtype.descriptions
4 -> PlatformBridgeApis.TrackSubtype.chapters
5 -> PlatformBridgeApis.TrackSubtype.metadata
else -> PlatformBridgeApis.TrackSubtype.unknown
}
}
fun getFlutterMediaMetadata(mediaMetadata: MediaMetadata): PlatformBridgeApis.MediaMetadata {
val flutterMediaType = getFlutterMediaType(mediaMetadata.mediaType)
val flutterWebImages = getFlutterWebImages(mediaMetadata.images)
return PlatformBridgeApis.MediaMetadata().apply {
mediaType = flutterMediaType
webImages = flutterWebImages
}
}
fun getFlutterWebImages(images: List<WebImage>): List<PlatformBridgeApis.WebImage> {
return images.map {
PlatformBridgeApis.WebImage().apply {
url = it.url.toString()
}
}
}
fun getFlutterMediaType(mediaType: Int): PlatformBridgeApis.MediaType {
return when (mediaType) {
0 -> PlatformBridgeApis.MediaType.generic
1 -> PlatformBridgeApis.MediaType.movie
2 -> PlatformBridgeApis.MediaType.tvShow
3 -> PlatformBridgeApis.MediaType.musicTrack
4 -> PlatformBridgeApis.MediaType.photo
5 -> PlatformBridgeApis.MediaType.audiobookChapter
100 -> PlatformBridgeApis.MediaType.user
else -> PlatformBridgeApis.MediaType.generic
}
}