diff --git a/android/src/main/java/com/gianlucaparadise/flutter_cast_framework/HostApis.java b/android/src/main/java/com/gianlucaparadise/flutter_cast_framework/HostApis.java index 02f4f1d..ec66206 100644 --- a/android/src/main/java/com/gianlucaparadise/flutter_cast_framework/HostApis.java +++ b/android/src/main/java/com/gianlucaparadise/flutter_cast_framework/HostApis.java @@ -130,6 +130,27 @@ public class HostApis { private static class CastFlutterApiCodec extends StandardMessageCodec { public static final CastFlutterApiCodec INSTANCE = new CastFlutterApiCodec(); private CastFlutterApiCodec() {} + @Override + protected Object readValueOfType(byte type, ByteBuffer buffer) { + switch (type) { + case (byte)128: + return CastMessage.fromMap((Map) readValue(buffer)); + + default: + return super.readValueOfType(type, buffer); + + } + } + @Override + protected void writeValue(ByteArrayOutputStream stream, Object value) { + if (value instanceof CastMessage) { + stream.write(128); + writeValue(stream, ((CastMessage) value).toMap()); + } else +{ + super.writeValue(stream, value); + } + } } /** Generated class from Pigeon that represents Flutter messages that can be called from Java.*/ @@ -224,6 +245,13 @@ public class HostApis { callback.reply(null); }); } + public void onMessageReceived(CastMessage messageArg, Reply callback) { + BasicMessageChannel channel = + new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.CastFlutterApi.onMessageReceived", getCodec()); + channel.send(new ArrayList(Arrays.asList(messageArg)), channelReply -> { + callback.reply(null); + }); + } } private static Map wrapError(Throwable exception) { Map errorMap = new HashMap<>(); diff --git a/ios/Classes/HostApis.h b/ios/Classes/HostApis.h index 54d99d3..ee25664 100644 --- a/ios/Classes/HostApis.h +++ b/ios/Classes/HostApis.h @@ -41,5 +41,6 @@ NSObject *CastFlutterApiGetCodec(void); - (void)onSessionResumedWithCompletion:(void(^)(NSError *_Nullable))completion; - (void)onSessionResumeFailedWithCompletion:(void(^)(NSError *_Nullable))completion; - (void)onSessionSuspendedWithCompletion:(void(^)(NSError *_Nullable))completion; +- (void)onMessageReceivedMessage:(CastMessage *)message completion:(void(^)(NSError *_Nullable))completion; @end NS_ASSUME_NONNULL_END diff --git a/ios/Classes/HostApis.m b/ios/Classes/HostApis.m index bda8fe6..12641d3 100644 --- a/ios/Classes/HostApis.m +++ b/ios/Classes/HostApis.m @@ -141,11 +141,32 @@ void CastApiSetup(id binaryMessenger, NSObject @interface CastFlutterApiCodecReader : FlutterStandardReader @end @implementation CastFlutterApiCodecReader +- (nullable id)readValueOfType:(UInt8)type +{ + switch (type) { + case 128: + return [CastMessage fromMap:[self readValue]]; + + default: + return [super readValueOfType:type]; + + } +} @end @interface CastFlutterApiCodecWriter : FlutterStandardWriter @end @implementation CastFlutterApiCodecWriter +- (void)writeValue:(id)value +{ + if ([value isKindOfClass:[CastMessage class]]) { + [self writeByte:128]; + [self writeValue:[value toMap]]; + } else +{ + [super writeValue:value]; + } +} @end @interface CastFlutterApiCodecReaderWriter : FlutterStandardReaderWriter @@ -294,4 +315,14 @@ NSObject *CastFlutterApiGetCodec() { completion(nil); }]; } +- (void)onMessageReceivedMessage:(CastMessage *)arg_message completion:(void(^)(NSError *_Nullable))completion { + FlutterBasicMessageChannel *channel = + [FlutterBasicMessageChannel + messageChannelWithName:@"dev.flutter.pigeon.CastFlutterApi.onMessageReceived" + binaryMessenger:self.binaryMessenger + codec:CastFlutterApiGetCodec()]; + [channel sendMessage:@[arg_message] reply:^(id reply) { + completion(nil); + }]; +} @end diff --git a/lib/src/HostApis.dart b/lib/src/HostApis.dart index c7d88a8..88a6918 100644 --- a/lib/src/HostApis.dart +++ b/lib/src/HostApis.dart @@ -111,6 +111,27 @@ class CastApi { class _CastFlutterApiCodec extends StandardMessageCodec { const _CastFlutterApiCodec(); + @override + void writeValue(WriteBuffer buffer, Object? value) { + if (value is CastMessage) { + buffer.putUint8(128); + writeValue(buffer, value.encode()); + } else +{ + super.writeValue(buffer, value); + } + } + @override + Object? readValueOfType(int type, ReadBuffer buffer) { + switch (type) { + case 128: + return CastMessage.decode(readValue(buffer)!); + + default: + return super.readValueOfType(type, buffer); + + } + } } abstract class CastFlutterApi { static const MessageCodec codec = _CastFlutterApiCodec(); @@ -126,6 +147,7 @@ abstract class CastFlutterApi { void onSessionResumed(); void onSessionResumeFailed(); void onSessionSuspended(); + void onMessageReceived(CastMessage message); static void setup(CastFlutterApi? api) { { const BasicMessageChannel channel = BasicMessageChannel( @@ -273,5 +295,21 @@ abstract class CastFlutterApi { }); } } + { + const BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.CastFlutterApi.onMessageReceived', codec); + if (api == null) { + channel.setMessageHandler(null); + } else { + channel.setMessageHandler((Object? message) async { + assert(message != null, 'Argument for dev.flutter.pigeon.CastFlutterApi.onMessageReceived was null.'); + final List args = (message as List?)!; + final CastMessage? arg_message = args[0] as CastMessage?; + assert(arg_message != null, 'Argument for dev.flutter.pigeon.CastFlutterApi.onMessageReceived was null, expected non-null CastMessage.'); + api.onMessageReceived(arg_message!); + return; + }); + } + } } } diff --git a/lib/src/HostApisDefinition.dart b/lib/src/HostApisDefinition.dart index 5207c16..d0b4a51 100644 --- a/lib/src/HostApisDefinition.dart +++ b/lib/src/HostApisDefinition.dart @@ -15,6 +15,7 @@ abstract class CastApi { abstract class CastFlutterApi { List getSessionMessageNamespaces(); void onCastStateChanged(int castState); + void onMessageReceived(CastMessage message); //region Session State handling void onSessionStarting();