RemoteMediaClient Pigeons

This commit is contained in:
gianlucaparadise 2021-11-09 07:55:55 +01:00
parent a9b206e2cd
commit 278d98f69c
5 changed files with 910 additions and 136 deletions

View file

@ -19,6 +19,296 @@ import java.util.HashMap;
@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"}) @SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"})
public class PlatformBridgeApis { public class PlatformBridgeApis {
public enum StreamType {
invalid(0),
none(1),
buffered(2),
live(3);
private int index;
private StreamType(final int index) {
this.index = index;
}
}
public enum MediaType {
generic(0),
movie(1),
tvShow(2),
musicTrack(3),
photo(4),
audiobookChapter(5),
user(6);
private int index;
private MediaType(final int index) {
this.index = index;
}
}
public enum MediaMetadataKey {
albumArtist(0),
albumTitle(1),
artist(2),
bookTitle(3),
broadcastDate(4),
chapterNumber(5),
chapterTitle(6),
composer(7),
creationDate(8),
discNumber(9),
episodeNumber(10),
height(11),
locationLatitude(12),
locationLongitude(13),
locationName(14),
queueItemId(15),
releaseDate(16),
seasonNumber(17),
sectionDuration(18),
sectionStartAbsoluteTime(19),
sectionStartTimeInContainer(20),
sectionStartTimeInMedia(21),
seriesTitle(22),
studio(23),
subtitle(24),
title(25),
trackNumber(26),
width(27);
private int index;
private MediaMetadataKey(final int index) {
this.index = index;
}
}
public enum TrackType {
unknown(0),
text(1),
audio(2),
video(3);
private int index;
private TrackType(final int index) {
this.index = index;
}
}
public enum TrackSubtype {
unknown(0),
none(1),
subtitles(2),
captions(3),
descriptions(4),
chapters(5),
metadata(6);
private int index;
private TrackSubtype(final int index) {
this.index = index;
}
}
/** Generated class from Pigeon that represents data sent in messages. */
public static class MediaLoadRequestData {
private Boolean shouldAutoplay;
public Boolean getShouldAutoplay() { return shouldAutoplay; }
public void setShouldAutoplay(Boolean setterArg) { this.shouldAutoplay = setterArg; }
private Long currentTime;
public Long getCurrentTime() { return currentTime; }
public void setCurrentTime(Long setterArg) { this.currentTime = setterArg; }
private MediaInfo mediaInfo;
public MediaInfo getMediaInfo() { return mediaInfo; }
public void setMediaInfo(MediaInfo setterArg) { this.mediaInfo = setterArg; }
Map<String, Object> toMap() {
Map<String, Object> toMapResult = new HashMap<>();
toMapResult.put("shouldAutoplay", shouldAutoplay);
toMapResult.put("currentTime", currentTime);
toMapResult.put("mediaInfo", (mediaInfo == null) ? null : mediaInfo.toMap());
return toMapResult;
}
static MediaLoadRequestData fromMap(Map<String, Object> map) {
MediaLoadRequestData fromMapResult = new MediaLoadRequestData();
Object shouldAutoplay = map.get("shouldAutoplay");
fromMapResult.shouldAutoplay = (Boolean)shouldAutoplay;
Object currentTime = map.get("currentTime");
fromMapResult.currentTime = (currentTime == null) ? null : ((currentTime instanceof Integer) ? (Integer)currentTime : (Long)currentTime);
Object mediaInfo = map.get("mediaInfo");
fromMapResult.mediaInfo = MediaInfo.fromMap((Map)mediaInfo);
return fromMapResult;
}
}
/** Generated class from Pigeon that represents data sent in messages. */
public static class MediaInfo {
private String contentId;
public String getContentId() { return contentId; }
public void setContentId(String setterArg) { this.contentId = setterArg; }
private StreamType streamType;
public StreamType getStreamType() { return streamType; }
public void setStreamType(StreamType setterArg) { this.streamType = setterArg; }
private String contentType;
public String getContentType() { return contentType; }
public void setContentType(String setterArg) { this.contentType = setterArg; }
private MediaMetadata mediaMetadata;
public MediaMetadata getMediaMetadata() { return mediaMetadata; }
public void setMediaMetadata(MediaMetadata setterArg) { this.mediaMetadata = setterArg; }
private List<MediaTrack> mediaTracks;
public List<MediaTrack> getMediaTracks() { return mediaTracks; }
public void setMediaTracks(List<MediaTrack> setterArg) { this.mediaTracks = setterArg; }
private Long streamDuration;
public Long getStreamDuration() { return streamDuration; }
public void setStreamDuration(Long setterArg) { this.streamDuration = setterArg; }
private String customDataAsJson;
public String getCustomDataAsJson() { return customDataAsJson; }
public void setCustomDataAsJson(String setterArg) { this.customDataAsJson = setterArg; }
Map<String, Object> toMap() {
Map<String, Object> toMapResult = new HashMap<>();
toMapResult.put("contentId", contentId);
toMapResult.put("streamType", streamType.index);
toMapResult.put("contentType", contentType);
toMapResult.put("mediaMetadata", (mediaMetadata == null) ? null : mediaMetadata.toMap());
toMapResult.put("mediaTracks", mediaTracks);
toMapResult.put("streamDuration", streamDuration);
toMapResult.put("customDataAsJson", customDataAsJson);
return toMapResult;
}
static MediaInfo fromMap(Map<String, Object> map) {
MediaInfo fromMapResult = new MediaInfo();
Object contentId = map.get("contentId");
fromMapResult.contentId = (String)contentId;
Object streamType = map.get("streamType");
fromMapResult.streamType = StreamType.values()[(int)streamType];
Object contentType = map.get("contentType");
fromMapResult.contentType = (String)contentType;
Object mediaMetadata = map.get("mediaMetadata");
fromMapResult.mediaMetadata = MediaMetadata.fromMap((Map)mediaMetadata);
Object mediaTracks = map.get("mediaTracks");
fromMapResult.mediaTracks = (List<MediaTrack>)mediaTracks;
Object streamDuration = map.get("streamDuration");
fromMapResult.streamDuration = (streamDuration == null) ? null : ((streamDuration instanceof Integer) ? (Integer)streamDuration : (Long)streamDuration);
Object customDataAsJson = map.get("customDataAsJson");
fromMapResult.customDataAsJson = (String)customDataAsJson;
return fromMapResult;
}
}
/** Generated class from Pigeon that represents data sent in messages. */
public static class MediaMetadata {
private MediaType mediaType;
public MediaType getMediaType() { return mediaType; }
public void setMediaType(MediaType setterArg) { this.mediaType = setterArg; }
private Map<MediaMetadataKey, String> strings;
public Map<MediaMetadataKey, String> getStrings() { return strings; }
public void setStrings(Map<MediaMetadataKey, String> setterArg) { this.strings = setterArg; }
private List<WebImage> webImages;
public List<WebImage> getWebImages() { return webImages; }
public void setWebImages(List<WebImage> setterArg) { this.webImages = setterArg; }
Map<String, Object> toMap() {
Map<String, Object> toMapResult = new HashMap<>();
toMapResult.put("mediaType", mediaType.index);
toMapResult.put("strings", strings);
toMapResult.put("webImages", webImages);
return toMapResult;
}
static MediaMetadata fromMap(Map<String, Object> map) {
MediaMetadata fromMapResult = new MediaMetadata();
Object mediaType = map.get("mediaType");
fromMapResult.mediaType = MediaType.values()[(int)mediaType];
Object strings = map.get("strings");
fromMapResult.strings = (Map<MediaMetadataKey, String>)strings;
Object webImages = map.get("webImages");
fromMapResult.webImages = (List<WebImage>)webImages;
return fromMapResult;
}
}
/** Generated class from Pigeon that represents data sent in messages. */
public static class WebImage {
private String url;
public String getUrl() { return url; }
public void setUrl(String setterArg) { this.url = setterArg; }
Map<String, Object> toMap() {
Map<String, Object> toMapResult = new HashMap<>();
toMapResult.put("url", url);
return toMapResult;
}
static WebImage fromMap(Map<String, Object> map) {
WebImage fromMapResult = new WebImage();
Object url = map.get("url");
fromMapResult.url = (String)url;
return fromMapResult;
}
}
/** Generated class from Pigeon that represents data sent in messages. */
public static class MediaTrack {
private Long id;
public Long getId() { return id; }
public void setId(Long setterArg) { this.id = setterArg; }
private TrackType trackType;
public TrackType getTrackType() { return trackType; }
public void setTrackType(TrackType setterArg) { this.trackType = setterArg; }
private String name;
public String getName() { return name; }
public void setName(String setterArg) { this.name = setterArg; }
private TrackSubtype trackSubtype;
public TrackSubtype getTrackSubtype() { return trackSubtype; }
public void setTrackSubtype(TrackSubtype setterArg) { this.trackSubtype = setterArg; }
private String contentId;
public String getContentId() { return contentId; }
public void setContentId(String setterArg) { this.contentId = setterArg; }
private String language;
public String getLanguage() { return language; }
public void setLanguage(String setterArg) { this.language = setterArg; }
Map<String, Object> toMap() {
Map<String, Object> toMapResult = new HashMap<>();
toMapResult.put("id", id);
toMapResult.put("trackType", trackType.index);
toMapResult.put("name", name);
toMapResult.put("trackSubtype", trackSubtype.index);
toMapResult.put("contentId", contentId);
toMapResult.put("language", language);
return toMapResult;
}
static MediaTrack fromMap(Map<String, Object> map) {
MediaTrack fromMapResult = new MediaTrack();
Object id = map.get("id");
fromMapResult.id = (id == null) ? null : ((id instanceof Integer) ? (Integer)id : (Long)id);
Object trackType = map.get("trackType");
fromMapResult.trackType = TrackType.values()[(int)trackType];
Object name = map.get("name");
fromMapResult.name = (String)name;
Object trackSubtype = map.get("trackSubtype");
fromMapResult.trackSubtype = TrackSubtype.values()[(int)trackSubtype];
Object contentId = map.get("contentId");
fromMapResult.contentId = (String)contentId;
Object language = map.get("language");
fromMapResult.language = (String)language;
return fromMapResult;
}
}
/** Generated class from Pigeon that represents data sent in messages. */ /** Generated class from Pigeon that represents data sent in messages. */
public static class CastMessage { public static class CastMessage {
private String namespace; private String namespace;
@ -53,6 +343,21 @@ public class PlatformBridgeApis {
case (byte)128: case (byte)128:
return CastMessage.fromMap((Map<String, Object>) readValue(buffer)); return CastMessage.fromMap((Map<String, Object>) readValue(buffer));
case (byte)129:
return MediaInfo.fromMap((Map<String, Object>) readValue(buffer));
case (byte)130:
return MediaLoadRequestData.fromMap((Map<String, Object>) readValue(buffer));
case (byte)131:
return MediaMetadata.fromMap((Map<String, Object>) readValue(buffer));
case (byte)132:
return MediaTrack.fromMap((Map<String, Object>) readValue(buffer));
case (byte)133:
return WebImage.fromMap((Map<String, Object>) readValue(buffer));
default: default:
return super.readValueOfType(type, buffer); return super.readValueOfType(type, buffer);
@ -64,6 +369,26 @@ public class PlatformBridgeApis {
stream.write(128); stream.write(128);
writeValue(stream, ((CastMessage) value).toMap()); writeValue(stream, ((CastMessage) value).toMap());
} else } else
if (value instanceof MediaInfo) {
stream.write(129);
writeValue(stream, ((MediaInfo) value).toMap());
} else
if (value instanceof MediaLoadRequestData) {
stream.write(130);
writeValue(stream, ((MediaLoadRequestData) value).toMap());
} else
if (value instanceof MediaMetadata) {
stream.write(131);
writeValue(stream, ((MediaMetadata) value).toMap());
} else
if (value instanceof MediaTrack) {
stream.write(132);
writeValue(stream, ((MediaTrack) value).toMap());
} else
if (value instanceof WebImage) {
stream.write(133);
writeValue(stream, ((WebImage) value).toMap());
} else
{ {
super.writeValue(stream, value); super.writeValue(stream, value);
} }
@ -74,6 +399,7 @@ public class PlatformBridgeApis {
public interface CastHostApi { public interface CastHostApi {
void sendMessage(CastMessage message); void sendMessage(CastMessage message);
void showCastDialog(); void showCastDialog();
void loadMediaLoadRequestData(MediaLoadRequestData request);
/** The codec used by CastHostApi. */ /** The codec used by CastHostApi. */
static MessageCodec<Object> getCodec() { static MessageCodec<Object> getCodec() {
@ -125,6 +451,30 @@ public class PlatformBridgeApis {
channel.setMessageHandler(null); channel.setMessageHandler(null);
} }
} }
{
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.CastHostApi.loadMediaLoadRequestData", getCodec());
if (api != null) {
channel.setMessageHandler((message, reply) -> {
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>)message;
MediaLoadRequestData requestArg = (MediaLoadRequestData)args.get(0);
if (requestArg == null) {
throw new NullPointerException("requestArg unexpectedly null.");
}
api.loadMediaLoadRequestData(requestArg);
wrapped.put("result", null);
}
catch (Error | RuntimeException exception) {
wrapped.put("error", wrapError(exception));
}
reply.reply(wrapped);
});
} else {
channel.setMessageHandler(null);
}
}
} }
} }
private static class CastFlutterApiCodec extends StandardMessageCodec { private static class CastFlutterApiCodec extends StandardMessageCodec {

View file

@ -8,8 +8,113 @@
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSUInteger, StreamType) {
StreamTypeInvalid = 0,
StreamTypeNone = 1,
StreamTypeBuffered = 2,
StreamTypeLive = 3,
};
typedef NS_ENUM(NSUInteger, MediaType) {
MediaTypeGeneric = 0,
MediaTypeMovie = 1,
MediaTypeTvShow = 2,
MediaTypeMusicTrack = 3,
MediaTypePhoto = 4,
MediaTypeAudiobookChapter = 5,
MediaTypeUser = 6,
};
typedef NS_ENUM(NSUInteger, MediaMetadataKey) {
MediaMetadataKeyAlbumArtist = 0,
MediaMetadataKeyAlbumTitle = 1,
MediaMetadataKeyArtist = 2,
MediaMetadataKeyBookTitle = 3,
MediaMetadataKeyBroadcastDate = 4,
MediaMetadataKeyChapterNumber = 5,
MediaMetadataKeyChapterTitle = 6,
MediaMetadataKeyComposer = 7,
MediaMetadataKeyCreationDate = 8,
MediaMetadataKeyDiscNumber = 9,
MediaMetadataKeyEpisodeNumber = 10,
MediaMetadataKeyHeight = 11,
MediaMetadataKeyLocationLatitude = 12,
MediaMetadataKeyLocationLongitude = 13,
MediaMetadataKeyLocationName = 14,
MediaMetadataKeyQueueItemId = 15,
MediaMetadataKeyReleaseDate = 16,
MediaMetadataKeySeasonNumber = 17,
MediaMetadataKeySectionDuration = 18,
MediaMetadataKeySectionStartAbsoluteTime = 19,
MediaMetadataKeySectionStartTimeInContainer = 20,
MediaMetadataKeySectionStartTimeInMedia = 21,
MediaMetadataKeySeriesTitle = 22,
MediaMetadataKeyStudio = 23,
MediaMetadataKeySubtitle = 24,
MediaMetadataKeyTitle = 25,
MediaMetadataKeyTrackNumber = 26,
MediaMetadataKeyWidth = 27,
};
typedef NS_ENUM(NSUInteger, TrackType) {
TrackTypeUnknown = 0,
TrackTypeText = 1,
TrackTypeAudio = 2,
TrackTypeVideo = 3,
};
typedef NS_ENUM(NSUInteger, TrackSubtype) {
TrackSubtypeUnknown = 0,
TrackSubtypeNone = 1,
TrackSubtypeSubtitles = 2,
TrackSubtypeCaptions = 3,
TrackSubtypeDescriptions = 4,
TrackSubtypeChapters = 5,
TrackSubtypeMetadata = 6,
};
@class MediaLoadRequestData;
@class MediaInfo;
@class MediaMetadata;
@class WebImage;
@class MediaTrack;
@class CastMessage; @class CastMessage;
@interface MediaLoadRequestData : NSObject
@property(nonatomic, strong, nullable) NSNumber * shouldAutoplay;
@property(nonatomic, strong, nullable) NSNumber * currentTime;
@property(nonatomic, strong, nullable) MediaInfo * mediaInfo;
@end
@interface MediaInfo : NSObject
@property(nonatomic, copy, nullable) NSString * contentId;
@property(nonatomic, assign) StreamType streamType;
@property(nonatomic, copy, nullable) NSString * contentType;
@property(nonatomic, strong, nullable) MediaMetadata * mediaMetadata;
@property(nonatomic, strong, nullable) NSArray<MediaTrack *> * mediaTracks;
@property(nonatomic, strong, nullable) NSNumber * streamDuration;
@property(nonatomic, copy, nullable) NSString * customDataAsJson;
@end
@interface MediaMetadata : NSObject
@property(nonatomic, assign) MediaType mediaType;
@property(nonatomic, strong, nullable) NSDictionary<MediaMetadataKey *, NSString *> * strings;
@property(nonatomic, strong, nullable) NSArray<WebImage *> * webImages;
@end
@interface WebImage : NSObject
@property(nonatomic, copy, nullable) NSString * url;
@end
@interface MediaTrack : NSObject
@property(nonatomic, strong, nullable) NSNumber * id;
@property(nonatomic, assign) TrackType trackType;
@property(nonatomic, copy, nullable) NSString * name;
@property(nonatomic, assign) TrackSubtype trackSubtype;
@property(nonatomic, copy, nullable) NSString * contentId;
@property(nonatomic, copy, nullable) NSString * language;
@end
@interface CastMessage : NSObject @interface CastMessage : NSObject
@property(nonatomic, copy, nullable) NSString * namespace; @property(nonatomic, copy, nullable) NSString * namespace;
@property(nonatomic, copy, nullable) NSString * message; @property(nonatomic, copy, nullable) NSString * message;
@ -21,6 +126,7 @@ NSObject<FlutterMessageCodec> *CastHostApiGetCodec(void);
@protocol CastHostApi @protocol CastHostApi
- (void)sendMessageMessage:(CastMessage *)message error:(FlutterError *_Nullable *_Nonnull)error; - (void)sendMessageMessage:(CastMessage *)message error:(FlutterError *_Nullable *_Nonnull)error;
- (void)showCastDialogWithError:(FlutterError *_Nullable *_Nonnull)error; - (void)showCastDialogWithError:(FlutterError *_Nullable *_Nonnull)error;
- (void)loadMediaLoadRequestDataRequest:(MediaLoadRequestData *)request error:(FlutterError *_Nullable *_Nonnull)error;
@end @end
extern void CastHostApiSetup(id<FlutterBinaryMessenger> binaryMessenger, NSObject<CastHostApi> *_Nullable api); extern void CastHostApiSetup(id<FlutterBinaryMessenger> binaryMessenger, NSObject<CastHostApi> *_Nullable api);

View file

@ -22,11 +22,149 @@ static NSDictionary<NSString *, id> *wrapResult(id result, FlutterError *error)
}; };
} }
@interface MediaLoadRequestData ()
+ (MediaLoadRequestData *)fromMap:(NSDictionary *)dict;
- (NSDictionary *)toMap;
@end
@interface MediaInfo ()
+ (MediaInfo *)fromMap:(NSDictionary *)dict;
- (NSDictionary *)toMap;
@end
@interface MediaMetadata ()
+ (MediaMetadata *)fromMap:(NSDictionary *)dict;
- (NSDictionary *)toMap;
@end
@interface WebImage ()
+ (WebImage *)fromMap:(NSDictionary *)dict;
- (NSDictionary *)toMap;
@end
@interface MediaTrack ()
+ (MediaTrack *)fromMap:(NSDictionary *)dict;
- (NSDictionary *)toMap;
@end
@interface CastMessage () @interface CastMessage ()
+ (CastMessage *)fromMap:(NSDictionary *)dict; + (CastMessage *)fromMap:(NSDictionary *)dict;
- (NSDictionary *)toMap; - (NSDictionary *)toMap;
@end @end
@implementation MediaLoadRequestData
+ (MediaLoadRequestData *)fromMap:(NSDictionary *)dict {
MediaLoadRequestData *result = [[MediaLoadRequestData alloc] init];
result.shouldAutoplay = dict[@"shouldAutoplay"];
if ((NSNull *)result.shouldAutoplay == [NSNull null]) {
result.shouldAutoplay = nil;
}
result.currentTime = dict[@"currentTime"];
if ((NSNull *)result.currentTime == [NSNull null]) {
result.currentTime = nil;
}
result.mediaInfo = [MediaInfo fromMap:dict[@"mediaInfo"]];
if ((NSNull *)result.mediaInfo == [NSNull null]) {
result.mediaInfo = nil;
}
return result;
}
- (NSDictionary *)toMap {
return [NSDictionary dictionaryWithObjectsAndKeys:(self.shouldAutoplay ? self.shouldAutoplay : [NSNull null]), @"shouldAutoplay", (self.currentTime ? self.currentTime : [NSNull null]), @"currentTime", (self.mediaInfo ? [self.mediaInfo toMap] : [NSNull null]), @"mediaInfo", nil];
}
@end
@implementation MediaInfo
+ (MediaInfo *)fromMap:(NSDictionary *)dict {
MediaInfo *result = [[MediaInfo alloc] init];
result.contentId = dict[@"contentId"];
if ((NSNull *)result.contentId == [NSNull null]) {
result.contentId = nil;
}
result.streamType = [dict[@"streamType"] integerValue];
result.contentType = dict[@"contentType"];
if ((NSNull *)result.contentType == [NSNull null]) {
result.contentType = nil;
}
result.mediaMetadata = [MediaMetadata fromMap:dict[@"mediaMetadata"]];
if ((NSNull *)result.mediaMetadata == [NSNull null]) {
result.mediaMetadata = nil;
}
result.mediaTracks = dict[@"mediaTracks"];
if ((NSNull *)result.mediaTracks == [NSNull null]) {
result.mediaTracks = nil;
}
result.streamDuration = dict[@"streamDuration"];
if ((NSNull *)result.streamDuration == [NSNull null]) {
result.streamDuration = nil;
}
result.customDataAsJson = dict[@"customDataAsJson"];
if ((NSNull *)result.customDataAsJson == [NSNull null]) {
result.customDataAsJson = nil;
}
return result;
}
- (NSDictionary *)toMap {
return [NSDictionary dictionaryWithObjectsAndKeys:(self.contentId ? self.contentId : [NSNull null]), @"contentId", @(self.streamType), @"streamType", (self.contentType ? self.contentType : [NSNull null]), @"contentType", (self.mediaMetadata ? [self.mediaMetadata toMap] : [NSNull null]), @"mediaMetadata", (self.mediaTracks ? self.mediaTracks : [NSNull null]), @"mediaTracks", (self.streamDuration ? self.streamDuration : [NSNull null]), @"streamDuration", (self.customDataAsJson ? self.customDataAsJson : [NSNull null]), @"customDataAsJson", nil];
}
@end
@implementation MediaMetadata
+ (MediaMetadata *)fromMap:(NSDictionary *)dict {
MediaMetadata *result = [[MediaMetadata alloc] init];
result.mediaType = [dict[@"mediaType"] integerValue];
result.strings = dict[@"strings"];
if ((NSNull *)result.strings == [NSNull null]) {
result.strings = nil;
}
result.webImages = dict[@"webImages"];
if ((NSNull *)result.webImages == [NSNull null]) {
result.webImages = nil;
}
return result;
}
- (NSDictionary *)toMap {
return [NSDictionary dictionaryWithObjectsAndKeys:@(self.mediaType), @"mediaType", (self.strings ? self.strings : [NSNull null]), @"strings", (self.webImages ? self.webImages : [NSNull null]), @"webImages", nil];
}
@end
@implementation WebImage
+ (WebImage *)fromMap:(NSDictionary *)dict {
WebImage *result = [[WebImage alloc] init];
result.url = dict[@"url"];
if ((NSNull *)result.url == [NSNull null]) {
result.url = nil;
}
return result;
}
- (NSDictionary *)toMap {
return [NSDictionary dictionaryWithObjectsAndKeys:(self.url ? self.url : [NSNull null]), @"url", nil];
}
@end
@implementation MediaTrack
+ (MediaTrack *)fromMap:(NSDictionary *)dict {
MediaTrack *result = [[MediaTrack alloc] init];
result.id = dict[@"id"];
if ((NSNull *)result.id == [NSNull null]) {
result.id = nil;
}
result.trackType = [dict[@"trackType"] integerValue];
result.name = dict[@"name"];
if ((NSNull *)result.name == [NSNull null]) {
result.name = nil;
}
result.trackSubtype = [dict[@"trackSubtype"] integerValue];
result.contentId = dict[@"contentId"];
if ((NSNull *)result.contentId == [NSNull null]) {
result.contentId = nil;
}
result.language = dict[@"language"];
if ((NSNull *)result.language == [NSNull null]) {
result.language = nil;
}
return result;
}
- (NSDictionary *)toMap {
return [NSDictionary dictionaryWithObjectsAndKeys:(self.id ? self.id : [NSNull null]), @"id", @(self.trackType), @"trackType", (self.name ? self.name : [NSNull null]), @"name", @(self.trackSubtype), @"trackSubtype", (self.contentId ? self.contentId : [NSNull null]), @"contentId", (self.language ? self.language : [NSNull null]), @"language", nil];
}
@end
@implementation CastMessage @implementation CastMessage
+ (CastMessage *)fromMap:(NSDictionary *)dict { + (CastMessage *)fromMap:(NSDictionary *)dict {
CastMessage *result = [[CastMessage alloc] init]; CastMessage *result = [[CastMessage alloc] init];
@ -54,6 +192,21 @@ static NSDictionary<NSString *, id> *wrapResult(id result, FlutterError *error)
case 128: case 128:
return [CastMessage fromMap:[self readValue]]; return [CastMessage fromMap:[self readValue]];
case 129:
return [MediaInfo fromMap:[self readValue]];
case 130:
return [MediaLoadRequestData fromMap:[self readValue]];
case 131:
return [MediaMetadata fromMap:[self readValue]];
case 132:
return [MediaTrack fromMap:[self readValue]];
case 133:
return [WebImage fromMap:[self readValue]];
default: default:
return [super readValueOfType:type]; return [super readValueOfType:type];
@ -70,6 +223,26 @@ static NSDictionary<NSString *, id> *wrapResult(id result, FlutterError *error)
[self writeByte:128]; [self writeByte:128];
[self writeValue:[value toMap]]; [self writeValue:[value toMap]];
} else } else
if ([value isKindOfClass:[MediaInfo class]]) {
[self writeByte:129];
[self writeValue:[value toMap]];
} else
if ([value isKindOfClass:[MediaLoadRequestData class]]) {
[self writeByte:130];
[self writeValue:[value toMap]];
} else
if ([value isKindOfClass:[MediaMetadata class]]) {
[self writeByte:131];
[self writeValue:[value toMap]];
} else
if ([value isKindOfClass:[MediaTrack class]]) {
[self writeByte:132];
[self writeValue:[value toMap]];
} else
if ([value isKindOfClass:[WebImage class]]) {
[self writeByte:133];
[self writeValue:[value toMap]];
} else
{ {
[super writeValue:value]; [super writeValue:value];
} }
@ -137,6 +310,26 @@ void CastHostApiSetup(id<FlutterBinaryMessenger> binaryMessenger, NSObject<CastH
[channel setMessageHandler:nil]; [channel setMessageHandler:nil];
} }
} }
{
FlutterBasicMessageChannel *channel =
[FlutterBasicMessageChannel
messageChannelWithName:@"dev.flutter.pigeon.CastHostApi.loadMediaLoadRequestData"
binaryMessenger:binaryMessenger
codec:CastHostApiGetCodec()];
if (api) {
NSCAssert([api respondsToSelector:@selector(loadMediaLoadRequestDataRequest:error:)], @"CastHostApi api (%@) doesn't respond to @selector(loadMediaLoadRequestDataRequest:error:)", api);
[channel setMessageHandler:^(id _Nullable message, FlutterReply callback) {
NSArray *args = message;
MediaLoadRequestData *arg_request = args[0];
FlutterError *error;
[api loadMediaLoadRequestDataRequest:arg_request error:&error];
callback(wrapResult(nil, error));
}];
}
else {
[channel setMessageHandler:nil];
}
}
} }
@interface CastFlutterApiCodecReader : FlutterStandardReader @interface CastFlutterApiCodecReader : FlutterStandardReader
@end @end

View file

@ -8,6 +8,208 @@ import 'dart:typed_data' show Uint8List, Int32List, Int64List, Float64List;
import 'package:flutter/foundation.dart' show WriteBuffer, ReadBuffer; import 'package:flutter/foundation.dart' show WriteBuffer, ReadBuffer;
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
enum StreamType {
invalid,
none,
buffered,
live,
}
enum MediaType {
generic,
movie,
tvShow,
musicTrack,
photo,
audiobookChapter,
user,
}
enum MediaMetadataKey {
albumArtist,
albumTitle,
artist,
bookTitle,
broadcastDate,
chapterNumber,
chapterTitle,
composer,
creationDate,
discNumber,
episodeNumber,
height,
locationLatitude,
locationLongitude,
locationName,
queueItemId,
releaseDate,
seasonNumber,
sectionDuration,
sectionStartAbsoluteTime,
sectionStartTimeInContainer,
sectionStartTimeInMedia,
seriesTitle,
studio,
subtitle,
title,
trackNumber,
width,
}
enum TrackType {
unknown,
text,
audio,
video,
}
enum TrackSubtype {
unknown,
none,
subtitles,
captions,
descriptions,
chapters,
metadata,
}
class MediaLoadRequestData {
bool? shouldAutoplay;
int? currentTime;
MediaInfo? mediaInfo;
Object encode() {
final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
pigeonMap['shouldAutoplay'] = shouldAutoplay;
pigeonMap['currentTime'] = currentTime;
pigeonMap['mediaInfo'] = mediaInfo == null ? null : mediaInfo!.encode();
return pigeonMap;
}
static MediaLoadRequestData decode(Object message) {
final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
return MediaLoadRequestData()
..shouldAutoplay = pigeonMap['shouldAutoplay'] as bool?
..currentTime = pigeonMap['currentTime'] as int?
..mediaInfo = pigeonMap['mediaInfo'] != null
? MediaInfo.decode(pigeonMap['mediaInfo']!)
: null;
}
}
class MediaInfo {
String? contentId;
StreamType? streamType;
String? contentType;
MediaMetadata? mediaMetadata;
List<MediaTrack?>? mediaTracks;
int? streamDuration;
String? customDataAsJson;
Object encode() {
final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
pigeonMap['contentId'] = contentId;
pigeonMap['streamType'] = streamType == null ? null : streamType!.index;
pigeonMap['contentType'] = contentType;
pigeonMap['mediaMetadata'] = mediaMetadata == null ? null : mediaMetadata!.encode();
pigeonMap['mediaTracks'] = mediaTracks;
pigeonMap['streamDuration'] = streamDuration;
pigeonMap['customDataAsJson'] = customDataAsJson;
return pigeonMap;
}
static MediaInfo decode(Object message) {
final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
return MediaInfo()
..contentId = pigeonMap['contentId'] as String?
..streamType = pigeonMap['streamType'] != null
? StreamType.values[pigeonMap['streamType']! as int]
: null
..contentType = pigeonMap['contentType'] as String?
..mediaMetadata = pigeonMap['mediaMetadata'] != null
? MediaMetadata.decode(pigeonMap['mediaMetadata']!)
: null
..mediaTracks = (pigeonMap['mediaTracks'] as List<Object?>?)?.cast<MediaTrack?>()
..streamDuration = pigeonMap['streamDuration'] as int?
..customDataAsJson = pigeonMap['customDataAsJson'] as String?;
}
}
class MediaMetadata {
MediaType? mediaType;
Map<MediaMetadataKey?, String?>? strings;
List<WebImage?>? webImages;
Object encode() {
final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
pigeonMap['mediaType'] = mediaType == null ? null : mediaType!.index;
pigeonMap['strings'] = strings;
pigeonMap['webImages'] = webImages;
return pigeonMap;
}
static MediaMetadata decode(Object message) {
final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
return MediaMetadata()
..mediaType = pigeonMap['mediaType'] != null
? MediaType.values[pigeonMap['mediaType']! as int]
: null
..strings = (pigeonMap['strings'] as Map<Object?, Object?>?)?.cast<MediaMetadataKey?, String?>()
..webImages = (pigeonMap['webImages'] as List<Object?>?)?.cast<WebImage?>();
}
}
class WebImage {
String? url;
Object encode() {
final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
pigeonMap['url'] = url;
return pigeonMap;
}
static WebImage decode(Object message) {
final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
return WebImage()
..url = pigeonMap['url'] as String?;
}
}
class MediaTrack {
int? id;
TrackType? trackType;
String? name;
TrackSubtype? trackSubtype;
String? contentId;
String? language;
Object encode() {
final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
pigeonMap['id'] = id;
pigeonMap['trackType'] = trackType == null ? null : trackType!.index;
pigeonMap['name'] = name;
pigeonMap['trackSubtype'] = trackSubtype == null ? null : trackSubtype!.index;
pigeonMap['contentId'] = contentId;
pigeonMap['language'] = language;
return pigeonMap;
}
static MediaTrack decode(Object message) {
final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
return MediaTrack()
..id = pigeonMap['id'] as int?
..trackType = pigeonMap['trackType'] != null
? TrackType.values[pigeonMap['trackType']! as int]
: null
..name = pigeonMap['name'] as String?
..trackSubtype = pigeonMap['trackSubtype'] != null
? TrackSubtype.values[pigeonMap['trackSubtype']! as int]
: null
..contentId = pigeonMap['contentId'] as String?
..language = pigeonMap['language'] as String?;
}
}
class CastMessage { class CastMessage {
String? namespace; String? namespace;
String? message; String? message;
@ -35,6 +237,26 @@ class _CastHostApiCodec extends StandardMessageCodec {
buffer.putUint8(128); buffer.putUint8(128);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else } else
if (value is MediaInfo) {
buffer.putUint8(129);
writeValue(buffer, value.encode());
} else
if (value is MediaLoadRequestData) {
buffer.putUint8(130);
writeValue(buffer, value.encode());
} else
if (value is MediaMetadata) {
buffer.putUint8(131);
writeValue(buffer, value.encode());
} else
if (value is MediaTrack) {
buffer.putUint8(132);
writeValue(buffer, value.encode());
} else
if (value is WebImage) {
buffer.putUint8(133);
writeValue(buffer, value.encode());
} else
{ {
super.writeValue(buffer, value); super.writeValue(buffer, value);
} }
@ -45,6 +267,21 @@ class _CastHostApiCodec extends StandardMessageCodec {
case 128: case 128:
return CastMessage.decode(readValue(buffer)!); return CastMessage.decode(readValue(buffer)!);
case 129:
return MediaInfo.decode(readValue(buffer)!);
case 130:
return MediaLoadRequestData.decode(readValue(buffer)!);
case 131:
return MediaMetadata.decode(readValue(buffer)!);
case 132:
return MediaTrack.decode(readValue(buffer)!);
case 133:
return WebImage.decode(readValue(buffer)!);
default: default:
return super.readValueOfType(type, buffer); return super.readValueOfType(type, buffer);
@ -107,6 +344,29 @@ class CastHostApi {
return; return;
} }
} }
Future<void> loadMediaLoadRequestData(MediaLoadRequestData arg_request) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
'dev.flutter.pigeon.CastHostApi.loadMediaLoadRequestData', codec, binaryMessenger: _binaryMessenger);
final Map<Object?, Object?>? replyMap =
await channel.send(<Object>[arg_request]) as Map<Object?, Object?>?;
if (replyMap == null) {
throw PlatformException(
code: 'channel-error',
message: 'Unable to establish connection on channel.',
details: null,
);
} else if (replyMap['error'] != null) {
final Map<Object?, Object?> error = (replyMap['error'] as Map<Object?, Object?>?)!;
throw PlatformException(
code: (error['code'] as String?)!,
message: error['message'] as String?,
details: error['details'],
);
} else {
return;
}
}
} }
class _CastFlutterApiCodec extends StandardMessageCodec { class _CastFlutterApiCodec extends StandardMessageCodec {

View file

@ -38,21 +38,6 @@ enum StreamType {
live, live,
} }
// extension StreamTypeExtension on StreamType {
// int get intValue {
// switch (this) {
// case StreamType.invalid:
// return -1;
// case StreamType.none:
// return 0;
// case StreamType.buffered:
// return 1;
// case StreamType.live:
// return 2;
// }
// }
// }
/// Docs here: https://developers.google.com/android/reference/com/google/android/gms/cast/MediaMetadata /// Docs here: https://developers.google.com/android/reference/com/google/android/gms/cast/MediaMetadata
class MediaMetadata { class MediaMetadata {
MediaType? mediaType; MediaType? mediaType;
@ -84,27 +69,6 @@ enum MediaType {
user, user,
} }
// extension MediaTypeExtension on MediaType {
// int get intValue {
// switch (this) {
// case MediaType.generic:
// return 0;
// case MediaType.movie:
// return 1;
// case MediaType.tvShow:
// return 2;
// case MediaType.musicTrack:
// return 3;
// case MediaType.photo:
// return 4;
// case MediaType.audiobookChapter:
// return 5;
// case MediaType.user:
// return 100;
// }
// }
// }
/// Docs here: https://developers.google.com/android/reference/com/google/android/gms/common/images/WebImage /// Docs here: https://developers.google.com/android/reference/com/google/android/gms/common/images/WebImage
class WebImage { class WebImage {
String? url; String? url;
@ -197,69 +161,6 @@ enum MediaMetadataKey {
width, width,
} }
// extension MediaMetadataExtension on MediaMetadataKey {
// String get stringValue {
// switch (this) {
// case MediaMetadataKey.albumArtist:
// return "com.google.android.gms.cast.metadata.ALBUM_ARTIST";
// case MediaMetadataKey.albumTitle:
// return "com.google.android.gms.cast.metadata.ALBUM_TITLE";
// case MediaMetadataKey.artist:
// return "com.google.android.gms.cast.metadata.ARTIST";
// case MediaMetadataKey.bookTitle:
// return "com.google.android.gms.cast.metadata.BOOK_TITLE";
// case MediaMetadataKey.broadcastDate:
// return "com.google.android.gms.cast.metadata.BROADCAST_DATE";
// case MediaMetadataKey.chapterNumber:
// return "com.google.android.gms.cast.metadata.CHAPTER_NUMBER";
// case MediaMetadataKey.chapterTitle:
// return "com.google.android.gms.cast.metadata.CHAPTER_TITLE";
// case MediaMetadataKey.composer:
// return "com.google.android.gms.cast.metadata.COMPOSER";
// case MediaMetadataKey.creationDate:
// return "com.google.android.gms.cast.metadata.CREATION_DATE";
// case MediaMetadataKey.discNumber:
// return "com.google.android.gms.cast.metadata.DISC_NUMBER";
// case MediaMetadataKey.episodeNumber:
// return "com.google.android.gms.cast.metadata.EPISODE_NUMBER";
// case MediaMetadataKey.height:
// return "com.google.android.gms.cast.metadata.HEIGHT";
// case MediaMetadataKey.locationLatitude:
// return "com.google.android.gms.cast.metadata.LOCATION_LATITUDE";
// case MediaMetadataKey.locationLongitude:
// return "com.google.android.gms.cast.metadata.LOCATION_LONGITUDE";
// case MediaMetadataKey.locationName:
// return "com.google.android.gms.cast.metadata.LOCATION_NAME";
// case MediaMetadataKey.queueItemId:
// return "com.google.android.gms.cast.metadata.QUEUE_ITEM_ID";
// case MediaMetadataKey.releaseDate:
// return "com.google.android.gms.cast.metadata.RELEASE_DATE";
// case MediaMetadataKey.seasonNumber:
// return "com.google.android.gms.cast.metadata.SEASON_NUMBER";
// case MediaMetadataKey.sectionDuration:
// return "com.google.android.gms.cast.metadata.SECTION_DURATION";
// case MediaMetadataKey.sectionStartAbsoluteTime:
// return "com.google.android.gms.cast.metadata.SECTION_START_ABSOLUTE_TIME";
// case MediaMetadataKey.sectionStartTimeInContainer:
// return "com.google.android.gms.cast.metadata.SECTION_START_TIME_IN_CONTAINER";
// case MediaMetadataKey.sectionStartTimeInMedia:
// return "com.google.android.gms.cast.metadata.SECTION_START_TIME_IN_MEDIA";
// case MediaMetadataKey.seriesTitle:
// return "com.google.android.gms.cast.metadata.SERIES_TITLE";
// case MediaMetadataKey.studio:
// return "com.google.android.gms.cast.metadata.STUDIO";
// case MediaMetadataKey.subtitle:
// return "com.google.android.gms.cast.metadata.SUBTITLE";
// case MediaMetadataKey.title:
// return "com.google.android.gms.cast.metadata.TITLE";
// case MediaMetadataKey.trackNumber:
// return "com.google.android.gms.cast.metadata.TRACK_NUMBER";
// case MediaMetadataKey.width:
// return "com.google.android.gms.cast.metadata.WIDTH";
// }
// }
// }
/// Docs here: https://developers.google.com/android/reference/com/google/android/gms/cast/MediaTrack /// Docs here: https://developers.google.com/android/reference/com/google/android/gms/cast/MediaTrack
class MediaTrack { class MediaTrack {
int? id; int? id;
@ -267,7 +168,7 @@ class MediaTrack {
String? name; String? name;
TrackSubtype? trackSubtype; TrackSubtype? trackSubtype;
String? contentId; String? contentId;
String? langiage; String? language;
} }
/// Docs here: https://developers.google.com/android/reference/com/google/android/gms/cast/MediaTrack /// Docs here: https://developers.google.com/android/reference/com/google/android/gms/cast/MediaTrack
@ -285,21 +186,6 @@ enum TrackType {
video, video,
} }
// extension TrackTypeExtension on TrackType {
// int get intValue {
// switch (this) {
// case TrackType.unknown:
// return 0;
// case TrackType.text:
// return 1;
// case TrackType.audio:
// return 2;
// case TrackType.video:
// return 3;
// }
// }
// }
/// Docs here: https://developers.google.com/android/reference/com/google/android/gms/cast/MediaTrack /// Docs here: https://developers.google.com/android/reference/com/google/android/gms/cast/MediaTrack
enum TrackSubtype { enum TrackSubtype {
/// A media track subtype indicating an unknown subtype. /// A media track subtype indicating an unknown subtype.
@ -324,27 +210,6 @@ enum TrackSubtype {
metadata, metadata,
} }
// extension TrackSubtypeExtension on TrackSubtype {
// int get intValue {
// switch (this) {
// case TrackSubtype.unknown:
// return -1;
// case TrackSubtype.none:
// return 0;
// case TrackSubtype.subtitles:
// return 1;
// case TrackSubtype.captions:
// return 2;
// case TrackSubtype.descriptions:
// return 3;
// case TrackSubtype.chapters:
// return 4;
// case TrackSubtype.metadata:
// return 5;
// }
// }
// }
//#endregion //#endregion
class CastMessage { class CastMessage {