diff --git a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/FlutterCastFrameworkPlugin.kt b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/FlutterCastFrameworkPlugin.kt index f899e0c..579335f 100644 --- a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/FlutterCastFrameworkPlugin.kt +++ b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/FlutterCastFrameworkPlugin.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.OnLifecycleEvent import androidx.lifecycle.ProcessLifecycleOwner import com.gianlucaparadise.flutter_cast_framework.cast.CastDialogOpener 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.google.android.gms.cast.MediaError import com.google.android.gms.cast.framework.CastContext @@ -100,7 +101,7 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa private val mSessionManagerListener = CastSessionManagerListener() private val remoteMediaClientListener = RemoteMediaClientListener() - private var castApi : PlatformBridgeApis.CastHostApi? = null + private var castApi: PlatformBridgeApis.CastHostApi? = null private var flutterApi: PlatformBridgeApis.CastFlutterApi? = null private var applicationContext: Context? = null private var activity: Activity? = null @@ -171,43 +172,43 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa override fun onStatusUpdated() { Log.d(TAG, "RemoteMediaClient - onStatusUpdated") super.onStatusUpdated() - flutterApi?.onStatusUpdated { } + flutterApi?.onStatusUpdated { } } override fun onMetadataUpdated() { Log.d(TAG, "RemoteMediaClient - onMetadataUpdated") super.onMetadataUpdated() - flutterApi?.onMetadataUpdated { } + flutterApi?.onMetadataUpdated { } } override fun onQueueStatusUpdated() { Log.d(TAG, "RemoteMediaClient - onQueueStatusUpdated") super.onQueueStatusUpdated() - flutterApi?.onQueueStatusUpdated { } + flutterApi?.onQueueStatusUpdated { } } override fun onPreloadStatusUpdated() { Log.d(TAG, "RemoteMediaClient - onPreloadStatusUpdated") super.onPreloadStatusUpdated() - flutterApi?.onPreloadStatusUpdated { } + flutterApi?.onPreloadStatusUpdated { } } override fun onSendingRemoteMediaRequest() { Log.d(TAG, "RemoteMediaClient - onSendingRemoteMediaRequest") super.onSendingRemoteMediaRequest() - flutterApi?.onSendingRemoteMediaRequest { } + flutterApi?.onSendingRemoteMediaRequest { } } override fun onAdBreakStatusUpdated() { Log.d(TAG, "RemoteMediaClient - onAdBreakStatusUpdated") super.onAdBreakStatusUpdated() - flutterApi?.onAdBreakStatusUpdated { } + flutterApi?.onAdBreakStatusUpdated { } } override fun onMediaError(error: MediaError?) { Log.d(TAG, "RemoteMediaClient - onMediaError $error") super.onMediaError(error) - flutterApi?.onMediaError { } + flutterApi?.onMediaError { } } } @@ -235,6 +236,15 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa val mediaLoadRequest = getMediaLoadRequestData(request) 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> { namespaces -> diff --git a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/FlutterMediaLoadRequestDataHelper.kt b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/FlutterMediaLoadRequestDataHelper.kt new file mode 100644 index 0000000..999899b --- /dev/null +++ b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/FlutterMediaLoadRequestDataHelper.kt @@ -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): List { + 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): List { + 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 + } +} diff --git a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/MediaLoadRequestDataHelper.kt b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/HostMediaLoadRequestDataHelper.kt similarity index 100% rename from android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/MediaLoadRequestDataHelper.kt rename to android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/HostMediaLoadRequestDataHelper.kt