From 6e160225bee5d445b8382a5b2ed35fce3f8807fb Mon Sep 17 00:00:00 2001 From: gianlucaparadise Date: Mon, 18 Jul 2022 07:47:56 +0200 Subject: [PATCH] Pigeon 3.x: Fix Android and iOS --- .../FlutterCastFrameworkPlugin.kt | 25 ++++--- .../media/HostMediaLoadRequestDataHelper.kt | 69 ++++++++++++------- .../SwiftFlutterCastFrameworkPlugin.swift | 8 +-- 3 files changed, 62 insertions(+), 40 deletions(-) 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 af1325b..16d67fd 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 @@ -312,20 +312,24 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa override fun itemsUpdatedAtIndexes(indexes: IntArray?) { Log.d(TAG, "MediaQueue - itemsUpdatedAtIndexes") super.itemsUpdatedAtIndexes(indexes) - val longIndexes = indexes?.map { it.toLong() } + if (indexes == null) return + + val longIndexes = indexes.map { it.toLong() } flutterApi?.itemsUpdatedAtIndexes(longIndexes) { } } override fun itemsRemovedAtIndexes(indexes: IntArray?) { Log.d(TAG, "MediaQueue itemsRemovedAtIndexeseWillChange") super.itemsRemovedAtIndexes(indexes) - val longIndexes = indexes?.map { it.toLong() } + if (indexes == null) return + + val longIndexes = indexes.map { it.toLong() } flutterApi?.itemsRemovedAtIndexes(longIndexes) { } } } private inner class MyApi : PlatformBridgeApis.CastHostApi { - override fun sendMessage(message: PlatformBridgeApis.CastMessage?) { + override fun sendMessage(message: PlatformBridgeApis.CastMessage) { mMessageCastingChannel?.sendMessage(mCastSession, message) } @@ -340,9 +344,7 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa CastDialogOpener.showCastDialog(context, activity) } - override fun loadMediaLoadRequestData(request: PlatformBridgeApis.MediaLoadRequestData?) { - if (request == null) return - + override fun loadMediaLoadRequestData(request: PlatformBridgeApis.MediaLoadRequestData) { val remoteMediaClient: RemoteMediaClient = remoteMediaClient ?: return val mediaLoadRequest = getMediaLoadRequestData(request) @@ -392,9 +394,7 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa remoteMediaClient.skipAd() } - override fun queueAppendItem(item: PlatformBridgeApis.MediaQueueItem?) { - if (item == null) return - + override fun queueAppendItem(item: PlatformBridgeApis.MediaQueueItem) { val remoteMediaClient: RemoteMediaClient = remoteMediaClient ?: return val mediaQueueItem = getMediaQueueItem(item) @@ -415,15 +415,14 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa return mediaQueue?.itemCount?.toLong() ?: -1 } - override fun getQueueItemAtIndex(index: Long?): PlatformBridgeApis.MediaQueueItem { - if (index == null || index < 0) return getFlutterMediaQueueItem(null) + override fun getQueueItemAtIndex(index: Long): PlatformBridgeApis.MediaQueueItem { + if (index < 0) return getFlutterMediaQueueItem(null) val mediaQueueItem = mediaQueue?.getItemAtIndex(index.toInt(), true) return getFlutterMediaQueueItem(mediaQueueItem) } - override fun setMute(muted: Boolean?) { - if (muted == null) return + override fun setMute(muted: Boolean) { val castSession = mCastSession ?: return castSession.isMute = muted } diff --git a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/HostMediaLoadRequestDataHelper.kt b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/HostMediaLoadRequestDataHelper.kt index 3bd29e8..522704b 100644 --- a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/HostMediaLoadRequestDataHelper.kt +++ b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/HostMediaLoadRequestDataHelper.kt @@ -9,29 +9,40 @@ import org.json.JSONObject fun getMediaLoadRequestData(request: PlatformBridgeApis.MediaLoadRequestData): MediaLoadRequestData { val mediaInfo = getMediaInfo(request.mediaInfo) - return MediaLoadRequestData.Builder() + val builder = MediaLoadRequestData.Builder() .setMediaInfo(mediaInfo) .setAutoplay(request.shouldAutoplay) - .setCurrentTime(request.currentTime) - .build() + + request.currentTime?.let { builder.setCurrentTime(it) } + + return builder.build() } fun getMediaInfo(mediaInfo: PlatformBridgeApis.MediaInfo?): MediaInfo? { if (mediaInfo == null) return null - val streamType = getStreamType(mediaInfo.streamType) - val metadata = getMediaMetadata(mediaInfo.mediaMetadata) - val mediaTracks = mediaInfo.mediaTracks.map { getMediaTrack(it) } + val streamType = getStreamType(mediaInfo.streamType + ?: throw IllegalArgumentException("streamType is a required field")) val customData = JSONObject(mediaInfo.customDataAsJson ?: "{}") - return MediaInfo.Builder(mediaInfo.contentId) + val builder = MediaInfo.Builder(mediaInfo.contentId) .setStreamType(streamType) .setContentType(mediaInfo.contentType) - .setMetadata(metadata) - .setMediaTracks(mediaTracks) - .setStreamDuration(mediaInfo.streamDuration) + .setStreamDuration(mediaInfo.streamDuration + ?: throw IllegalArgumentException("streamDuration is a required field")) .setCustomData(customData) - .build() + + mediaInfo.mediaMetadata?.let { + val metadata = getMediaMetadata(it) + builder.setMetadata(metadata) + } + + mediaInfo.mediaTracks?.let { + val mediaTracks = it.map { t -> getMediaTrack(t) } + builder.setMediaTracks(mediaTracks) + } + + return builder.build() } fun getStreamType(streamType: PlatformBridgeApis.StreamType): Int { @@ -44,15 +55,18 @@ fun getStreamType(streamType: PlatformBridgeApis.StreamType): Int { } fun getMediaMetadata(mediaMetadata: PlatformBridgeApis.MediaMetadata): MediaMetadata { - val mediaType = getMediaType(mediaMetadata.mediaType) - val result = MediaMetadata(mediaType) + val mediaType = mediaMetadata.mediaType + val result = if (mediaType == null) MediaMetadata() else { + val hostMediaType = getMediaType(mediaType) + MediaMetadata(hostMediaType) + } // mediaMetadata.strings.forEach { // val key = getMediaMetadataKey(it.key) // result.putString(key, it.value) // } - mediaMetadata.webImages.forEach { + mediaMetadata.webImages?.forEach { val uri = Uri.parse(it.url) val webImage = WebImage(uri) result.addImage(webImage) @@ -107,14 +121,21 @@ fun getMediaType(mediaType: PlatformBridgeApis.MediaType): Int { //} fun getMediaTrack(mediaTrack: PlatformBridgeApis.MediaTrack): MediaTrack { - val trackType = getTrackType(mediaTrack.trackType) - val trackSubtype = getTrackSubtype(mediaTrack.trackSubtype) + val trackId = mediaTrack.id + ?: throw IllegalArgumentException("mediaTrack ID is a required field") + val trackType = getTrackType(mediaTrack.trackType + ?: throw IllegalArgumentException("trackType is a required field")) - return MediaTrack.Builder(mediaTrack.id, trackType) + val builder = MediaTrack.Builder(trackId, trackType) .setName(mediaTrack.name) - .setSubtype(trackSubtype) .setContentId(mediaTrack.contentId) - .build() + + mediaTrack.trackSubtype?.let { + val trackSubtype = getTrackSubtype(it) + builder.setSubtype(trackSubtype) + } + + return builder.build() } fun getTrackType(trackType: PlatformBridgeApis.TrackType): Int { @@ -143,8 +164,10 @@ fun getMediaQueueItem(item: PlatformBridgeApis.MediaQueueItem?): MediaQueueItem? val mediaInfo = getMediaInfo(item.media) - return MediaQueueItem.Builder(mediaInfo) - .setAutoplay(item.autoplay) - .setPreloadTime(item.preloadTime) - .build() + val builder = MediaQueueItem.Builder(mediaInfo) + + item.autoplay?.let { builder.setAutoplay(it) } + item.preloadTime?.let { builder.setPreloadTime(it) } + + return builder.build() } \ No newline at end of file diff --git a/ios/Classes/SwiftFlutterCastFrameworkPlugin.swift b/ios/Classes/SwiftFlutterCastFrameworkPlugin.swift index 246bbbb..20da5b3 100644 --- a/ios/Classes/SwiftFlutterCastFrameworkPlugin.swift +++ b/ios/Classes/SwiftFlutterCastFrameworkPlugin.swift @@ -39,12 +39,12 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio remoteMediaClient = newValue?.remoteMediaClient flutterApi.getSessionMessageNamespaces { (namespaces, err) in - debugPrint("Updating castSession - getSessionMessageNamespaces success - param: \(namespaces.joined(separator: ", "))") + debugPrint("Updating castSession - getSessionMessageNamespaces success - param: \(String(describing: namespaces?.joined(separator: ", ")))") if (oldSession == nil && newSession == nil) { return // nothing to do here } - if (namespaces.count == 0) { + if (namespaces == nil || namespaces?.count == 0) { return // nothing to do here } @@ -55,7 +55,7 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio } } - namespaces.forEach({ (namespace) in + namespaces?.forEach({ (namespace) in let castingChannel = MessageCastingChannel.init(namespace: namespace, flutterApi: self.flutterApi) self.castingChannels[namespace] = castingChannel newSession?.add(castingChannel) @@ -372,7 +372,7 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio return NSNumber(value: itemCount) } - public func getQueueItemAtIndexIndex(_ index: NSNumber, error: AutoreleasingUnsafeMutablePointer) -> MediaQueueItem? { + public func getQueueItem(atIndexIndex index: NSNumber, error: AutoreleasingUnsafeMutablePointer) -> MediaQueueItem? { if (index.intValue < 0) { return getFlutterMediaQueueItem(item: nil) }