Pigeon 3.x: Fix Android and iOS

This commit is contained in:
gianlucaparadise 2022-07-18 07:47:56 +02:00
parent 472174f3cc
commit 6e160225be
3 changed files with 62 additions and 40 deletions

View file

@ -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
}

View file

@ -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()
}

View file

@ -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<FlutterError?>) -> MediaQueueItem? {
public func getQueueItem(atIndexIndex index: NSNumber, error: AutoreleasingUnsafeMutablePointer<FlutterError?>) -> MediaQueueItem? {
if (index.intValue < 0) {
return getFlutterMediaQueueItem(item: nil)
}