From e2aab9b278d6f74dc460e744c3829a615e0e555e Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 11:34:58 +0000 Subject: [PATCH 01/52] Generated constants for realtimeTime --- bin/codegen_context.dart | 1 + ios/Classes/codec/AblyPlatformConstants.h | 1 + ios/Classes/codec/AblyPlatformConstants.m | 1 + lib/src/generated/platform_constants.dart | 7 +++---- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/bin/codegen_context.dart b/bin/codegen_context.dart index c77988a3b..dc665ddc5 100644 --- a/bin/codegen_context.dart +++ b/bin/codegen_context.dart @@ -94,6 +94,7 @@ const List> _platformMethods = [ }, {'name': 'releaseRealtimeChannel', 'value': 'releaseRealtimeChannel'}, {'name': 'realtimeHistory', 'value': 'realtimeHistory'}, + {'name': 'realtimeTime', 'value': 'realtimeTime'}, // Push Notifications {'name': 'pushActivate', 'value': 'pushActivate'}, diff --git a/ios/Classes/codec/AblyPlatformConstants.h b/ios/Classes/codec/AblyPlatformConstants.h index 5aecd2570..cb6efb68c 100644 --- a/ios/Classes/codec/AblyPlatformConstants.h +++ b/ios/Classes/codec/AblyPlatformConstants.h @@ -64,6 +64,7 @@ extern NSString *const AblyPlatformMethod_onRealtimePresenceMessage; extern NSString *const AblyPlatformMethod_publishRealtimeChannelMessage; extern NSString *const AblyPlatformMethod_releaseRealtimeChannel; extern NSString *const AblyPlatformMethod_realtimeHistory; +extern NSString *const AblyPlatformMethod_realtimeTime; extern NSString *const AblyPlatformMethod_pushActivate; extern NSString *const AblyPlatformMethod_pushDeactivate; extern NSString *const AblyPlatformMethod_pushSubscribeDevice; diff --git a/ios/Classes/codec/AblyPlatformConstants.m b/ios/Classes/codec/AblyPlatformConstants.m index 1bc8cd010..533bf1f5c 100644 --- a/ios/Classes/codec/AblyPlatformConstants.m +++ b/ios/Classes/codec/AblyPlatformConstants.m @@ -34,6 +34,7 @@ NSString *const AblyPlatformMethod_publishRealtimeChannelMessage= @"publishRealtimeChannelMessage"; NSString *const AblyPlatformMethod_releaseRealtimeChannel= @"releaseRealtimeChannel"; NSString *const AblyPlatformMethod_realtimeHistory= @"realtimeHistory"; +NSString *const AblyPlatformMethod_realtimeTime= @"realtimeTime"; NSString *const AblyPlatformMethod_pushActivate= @"pushActivate"; NSString *const AblyPlatformMethod_pushDeactivate= @"pushDeactivate"; NSString *const AblyPlatformMethod_pushSubscribeDevice= @"pushSubscribeDevice"; diff --git a/lib/src/generated/platform_constants.dart b/lib/src/generated/platform_constants.dart index 2da94d152..fa36c6b27 100644 --- a/lib/src/generated/platform_constants.dart +++ b/lib/src/generated/platform_constants.dart @@ -64,6 +64,7 @@ class PlatformMethod { 'publishRealtimeChannelMessage'; static const String releaseRealtimeChannel = 'releaseRealtimeChannel'; static const String realtimeHistory = 'realtimeHistory'; + static const String realtimeTime = 'realtimeTime'; static const String pushActivate = 'pushActivate'; static const String pushDeactivate = 'pushDeactivate'; static const String pushSubscribeDevice = 'pushSubscribeDevice'; @@ -381,8 +382,7 @@ class TxPushRequestPermission { static const String alert = 'alert'; static const String carPlay = 'carPlay'; static const String criticalAlert = 'criticalAlert'; - static const String providesAppNotificationSettings = - 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; static const String provisional = 'provisional'; static const String announcement = 'announcement'; } @@ -398,8 +398,7 @@ class TxUNNotificationSettings { static const String alertStyle = 'alertStyle'; static const String showPreviewsSetting = 'showPreviewsSetting'; static const String criticalAlertSetting = 'criticalAlertSetting'; - static const String providesAppNotificationSettings = - 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; static const String announcementSetting = 'announcementSetting'; static const String scheduledDeliverySetting = 'scheduledDeliverySetting'; static const String timeSensitiveSetting = 'timeSensitiveSetting'; From 8022b67d1387b428cdb17232ea0840980acbd1cd Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 11:41:05 +0000 Subject: [PATCH 02/52] Time function implemenation in Dart side --- lib/src/platform/src/realtime/realtime.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/src/platform/src/realtime/realtime.dart b/lib/src/platform/src/realtime/realtime.dart index 63b51b533..c820c784d 100644 --- a/lib/src/platform/src/realtime/realtime.dart +++ b/lib/src/platform/src/realtime/realtime.dart @@ -110,9 +110,10 @@ class Realtime extends PlatformObject { /// returns server time /// /// https://docs.ably.com/client-lib-development-guide/features/#RSC16 - // Future time() { - // throw UnimplementedError(); - // } + Future time() async{ + final time = await invokeRequest(PlatformMethod.realtimeTime); + return DateTime.fromMillisecondsSinceEpoch(time); + } /// represents the current state of the device in respect of it being a /// target for push notifications. From d56ff4dba7903d3a97f9897a41f4ca0167972837 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 12:17:50 +0000 Subject: [PATCH 03/52] Java / Android side implementation of time --- .../flutter/plugin/AblyMethodCallHandler.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java index 04bc36760..84fedd2a8 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java @@ -87,6 +87,7 @@ public AblyMethodCallHandler(final MethodChannel methodChannel, _map.put(PlatformConstants.PlatformMethod.realtimePresenceUpdate, this::updateRealtimePresence); _map.put(PlatformConstants.PlatformMethod.realtimePresenceLeave, this::leaveRealtimePresence); _map.put(PlatformConstants.PlatformMethod.releaseRealtimeChannel, this::releaseRealtimeChannel); + _map.put(PlatformConstants.PlatformMethod.realtimeTime, this::realtimeTime); // Push Notifications _map.put(PlatformConstants.PlatformMethod.pushActivate, this::pushActivate); @@ -600,7 +601,24 @@ private void releaseRealtimeChannel(@NonNull MethodCall call, @NonNull MethodCha }); } - private void getRealtimeHistory(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { + private void realtimeTime(@NonNull MethodCall methodCall, @NonNull MethodChannel.Result result) { + final AblyFlutterMessage message = (AblyFlutterMessage) methodCall.arguments; + Callback callback = new Callback() { + @Override + public void onSuccess(Long timeResult) { + result.success(timeResult); + } + + @Override + public void onError(ErrorInfo reason) { + result.error("40000", reason.message, reason); + } + }; + instanceStore.getRealtime((int) message.message).timeAsync(callback); + } + + + private void getRealtimeHistory(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { final AblyFlutterMessage message = (AblyFlutterMessage) call.arguments; this.>>ablyDo(message, (ablyLibrary, messageData) -> { final Map map = messageData.message; From 95942a54c5461a76c689d6753cb3f067c83ce11b Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 12:21:08 +0000 Subject: [PATCH 04/52] IOS/objective C implementation of realtimeTime --- ios/Classes/AblyFlutter.m | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ios/Classes/AblyFlutter.m b/ios/Classes/AblyFlutter.m index eec9428ae..3ca63e5f9 100644 --- a/ios/Classes/AblyFlutter.m +++ b/ios/Classes/AblyFlutter.m @@ -549,6 +549,20 @@ -(void)reset; result(nil); }; +static const FlutterHandler _realtimeTime = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { + AblyFlutterMessage *const message = call.arguments; + AblyInstanceStore *const instanceStore = [ably instanceStore]; + + ARTRealtime *const realtime = [instanceStore realtimeFrom:message.message]; + [realtime time:^(NSDate * _Nullable dateTimeResult, NSError * _Nullable error) { + if(error){ + result(error); + }else{ + result(@([@(dateTimeResult.timeIntervalSince1970 *1000) longValue])); + } + }]; +}; + static const FlutterHandler _getNextPage = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { AblyFlutterMessage *const message = call.arguments; AblyInstanceStore *const instanceStore = [ably instanceStore]; @@ -665,6 +679,7 @@ -(instancetype)initWithChannel:(FlutterMethodChannel *const)channel AblyPlatformMethod_realtimePresenceUpdate: _updateRealtimePresence, AblyPlatformMethod_realtimePresenceLeave: _leaveRealtimePresence, AblyPlatformMethod_releaseRealtimeChannel: _releaseRealtimeChannel, + AblyPlatformMethod_realtimeTime:_realtimeTime, // Push Notifications AblyPlatformMethod_pushActivate: PushHandlers.activate, AblyPlatformMethod_pushRequestPermission: PushHandlers.requestPermission, From 5463f49f45bfd0ab9c4ef2428812523f4abf96cd Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 12:28:06 +0000 Subject: [PATCH 05/52] Added time information to realtime_sliver.dart --- example/lib/ui/realtime_sliver.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/example/lib/ui/realtime_sliver.dart b/example/lib/ui/realtime_sliver.dart index 5e2666049..f9f0085d4 100644 --- a/example/lib/ui/realtime_sliver.dart +++ b/example/lib/ui/realtime_sliver.dart @@ -153,8 +153,10 @@ class RealtimeSliver extends HookWidget { final latestMessage = useState(null); final channelSubscription = useState?>(null); + final realtimeTime = useState(null); useEffect(() { + realtime.time().then((value) => realtimeTime.value = value); setupListeners(connectionState, channelState); return dispose; }, []); @@ -166,6 +168,7 @@ class RealtimeSliver extends HookWidget { 'Realtime', style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), ), + Text('Realtime time: ${realtimeTime.value}'), Text('Connection State: ${connectionState.value}'), Row( children: [ From 5b7c6847cd5a8336c6666f52a916012a4ccd82ab Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 14:55:53 +0000 Subject: [PATCH 06/52] Replaced realtimeTime with time (codegen) --- bin/codegen_context.dart | 2 +- ios/Classes/codec/AblyPlatformConstants.h | 2 +- ios/Classes/codec/AblyPlatformConstants.m | 2 +- lib/src/generated/platform_constants.dart | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/codegen_context.dart b/bin/codegen_context.dart index dc665ddc5..344ed4102 100644 --- a/bin/codegen_context.dart +++ b/bin/codegen_context.dart @@ -94,7 +94,7 @@ const List> _platformMethods = [ }, {'name': 'releaseRealtimeChannel', 'value': 'releaseRealtimeChannel'}, {'name': 'realtimeHistory', 'value': 'realtimeHistory'}, - {'name': 'realtimeTime', 'value': 'realtimeTime'}, + {'name': 'time', 'value': 'time'}, // Push Notifications {'name': 'pushActivate', 'value': 'pushActivate'}, diff --git a/ios/Classes/codec/AblyPlatformConstants.h b/ios/Classes/codec/AblyPlatformConstants.h index cb6efb68c..9d18c926d 100644 --- a/ios/Classes/codec/AblyPlatformConstants.h +++ b/ios/Classes/codec/AblyPlatformConstants.h @@ -64,7 +64,7 @@ extern NSString *const AblyPlatformMethod_onRealtimePresenceMessage; extern NSString *const AblyPlatformMethod_publishRealtimeChannelMessage; extern NSString *const AblyPlatformMethod_releaseRealtimeChannel; extern NSString *const AblyPlatformMethod_realtimeHistory; -extern NSString *const AblyPlatformMethod_realtimeTime; +extern NSString *const AblyPlatformMethod_time; extern NSString *const AblyPlatformMethod_pushActivate; extern NSString *const AblyPlatformMethod_pushDeactivate; extern NSString *const AblyPlatformMethod_pushSubscribeDevice; diff --git a/ios/Classes/codec/AblyPlatformConstants.m b/ios/Classes/codec/AblyPlatformConstants.m index 533bf1f5c..a2f259ecd 100644 --- a/ios/Classes/codec/AblyPlatformConstants.m +++ b/ios/Classes/codec/AblyPlatformConstants.m @@ -34,7 +34,7 @@ NSString *const AblyPlatformMethod_publishRealtimeChannelMessage= @"publishRealtimeChannelMessage"; NSString *const AblyPlatformMethod_releaseRealtimeChannel= @"releaseRealtimeChannel"; NSString *const AblyPlatformMethod_realtimeHistory= @"realtimeHistory"; -NSString *const AblyPlatformMethod_realtimeTime= @"realtimeTime"; +NSString *const AblyPlatformMethod_time= @"time"; NSString *const AblyPlatformMethod_pushActivate= @"pushActivate"; NSString *const AblyPlatformMethod_pushDeactivate= @"pushDeactivate"; NSString *const AblyPlatformMethod_pushSubscribeDevice= @"pushSubscribeDevice"; diff --git a/lib/src/generated/platform_constants.dart b/lib/src/generated/platform_constants.dart index fa36c6b27..694ad1116 100644 --- a/lib/src/generated/platform_constants.dart +++ b/lib/src/generated/platform_constants.dart @@ -64,7 +64,7 @@ class PlatformMethod { 'publishRealtimeChannelMessage'; static const String releaseRealtimeChannel = 'releaseRealtimeChannel'; static const String realtimeHistory = 'realtimeHistory'; - static const String realtimeTime = 'realtimeTime'; + static const String time = 'time'; static const String pushActivate = 'pushActivate'; static const String pushDeactivate = 'pushDeactivate'; static const String pushSubscribeDevice = 'pushSubscribeDevice'; From 1a1f961f20c5da2e59a4cb61c2507a86bbcb47af Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 16:21:38 +0000 Subject: [PATCH 07/52] Updated platform references to time --- .../main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java | 2 +- ios/Classes/AblyFlutter.m | 2 +- lib/src/platform/src/realtime/realtime.dart | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java index 84fedd2a8..e1acfd756 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java @@ -87,7 +87,7 @@ public AblyMethodCallHandler(final MethodChannel methodChannel, _map.put(PlatformConstants.PlatformMethod.realtimePresenceUpdate, this::updateRealtimePresence); _map.put(PlatformConstants.PlatformMethod.realtimePresenceLeave, this::leaveRealtimePresence); _map.put(PlatformConstants.PlatformMethod.releaseRealtimeChannel, this::releaseRealtimeChannel); - _map.put(PlatformConstants.PlatformMethod.realtimeTime, this::realtimeTime); + _map.put(PlatformConstants.PlatformMethod.time, this::realtimeTime); // Push Notifications _map.put(PlatformConstants.PlatformMethod.pushActivate, this::pushActivate); diff --git a/ios/Classes/AblyFlutter.m b/ios/Classes/AblyFlutter.m index 3ca63e5f9..d283092c5 100644 --- a/ios/Classes/AblyFlutter.m +++ b/ios/Classes/AblyFlutter.m @@ -679,7 +679,7 @@ -(instancetype)initWithChannel:(FlutterMethodChannel *const)channel AblyPlatformMethod_realtimePresenceUpdate: _updateRealtimePresence, AblyPlatformMethod_realtimePresenceLeave: _leaveRealtimePresence, AblyPlatformMethod_releaseRealtimeChannel: _releaseRealtimeChannel, - AblyPlatformMethod_realtimeTime:_realtimeTime, + AblyPlatformMethod_time:_realtimeTime, // Push Notifications AblyPlatformMethod_pushActivate: PushHandlers.activate, AblyPlatformMethod_pushRequestPermission: PushHandlers.requestPermission, diff --git a/lib/src/platform/src/realtime/realtime.dart b/lib/src/platform/src/realtime/realtime.dart index c820c784d..02d9bad4e 100644 --- a/lib/src/platform/src/realtime/realtime.dart +++ b/lib/src/platform/src/realtime/realtime.dart @@ -111,7 +111,7 @@ class Realtime extends PlatformObject { /// /// https://docs.ably.com/client-lib-development-guide/features/#RSC16 Future time() async{ - final time = await invokeRequest(PlatformMethod.realtimeTime); + final time = await invokeRequest(PlatformMethod.time); return DateTime.fromMillisecondsSinceEpoch(time); } From 78c76218cde3885127674f569058c5258f900d08 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 16:22:47 +0000 Subject: [PATCH 08/52] Renamed method to time in Java --- .../java/io/ably/flutter/plugin/AblyMethodCallHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java index e1acfd756..9ff9f0c4d 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java @@ -87,7 +87,7 @@ public AblyMethodCallHandler(final MethodChannel methodChannel, _map.put(PlatformConstants.PlatformMethod.realtimePresenceUpdate, this::updateRealtimePresence); _map.put(PlatformConstants.PlatformMethod.realtimePresenceLeave, this::leaveRealtimePresence); _map.put(PlatformConstants.PlatformMethod.releaseRealtimeChannel, this::releaseRealtimeChannel); - _map.put(PlatformConstants.PlatformMethod.time, this::realtimeTime); + _map.put(PlatformConstants.PlatformMethod.time, this::time); // Push Notifications _map.put(PlatformConstants.PlatformMethod.pushActivate, this::pushActivate); @@ -601,7 +601,7 @@ private void releaseRealtimeChannel(@NonNull MethodCall call, @NonNull MethodCha }); } - private void realtimeTime(@NonNull MethodCall methodCall, @NonNull MethodChannel.Result result) { + private void time(@NonNull MethodCall methodCall, @NonNull MethodChannel.Result result) { final AblyFlutterMessage message = (AblyFlutterMessage) methodCall.arguments; Callback callback = new Callback() { @Override From 26626121754d44101813cb5950c5cd2fe0c7de32 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 16:33:07 +0000 Subject: [PATCH 09/52] Updated refercen name to _time --- ios/Classes/AblyFlutter.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/Classes/AblyFlutter.m b/ios/Classes/AblyFlutter.m index d283092c5..e2a7a490d 100644 --- a/ios/Classes/AblyFlutter.m +++ b/ios/Classes/AblyFlutter.m @@ -549,7 +549,7 @@ -(void)reset; result(nil); }; -static const FlutterHandler _realtimeTime = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { +static const FlutterHandler _time = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { AblyFlutterMessage *const message = call.arguments; AblyInstanceStore *const instanceStore = [ably instanceStore]; @@ -679,7 +679,7 @@ -(instancetype)initWithChannel:(FlutterMethodChannel *const)channel AblyPlatformMethod_realtimePresenceUpdate: _updateRealtimePresence, AblyPlatformMethod_realtimePresenceLeave: _leaveRealtimePresence, AblyPlatformMethod_releaseRealtimeChannel: _releaseRealtimeChannel, - AblyPlatformMethod_time:_realtimeTime, + AblyPlatformMethod_time:_time, // Push Notifications AblyPlatformMethod_pushActivate: PushHandlers.activate, AblyPlatformMethod_pushRequestPermission: PushHandlers.requestPermission, From 7b83e0fa6e972ff1299b2d66800cd38346149277 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 16:36:30 +0000 Subject: [PATCH 10/52] Implemented time function in rest.dart --- lib/src/platform/src/rest/rest.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/src/platform/src/rest/rest.dart b/lib/src/platform/src/rest/rest.dart index 6235f5654..a664ce719 100644 --- a/lib/src/platform/src/rest/rest.dart +++ b/lib/src/platform/src/rest/rest.dart @@ -65,9 +65,10 @@ class Rest extends PlatformObject { /// returns server time /// /// https://docs.ably.com/client-lib-development-guide/features/#RSC16 - // Future time() { - // throw UnimplementedError(); - // } + Future time() async{ + final time = await invokeRequest(PlatformMethod.time); + return DateTime.fromMillisecondsSinceEpoch(time); + } /// a push object interacting with Push API, such as /// subscribing for push notifications by clientId. From f6fafebf1fdbc09c130a3aa931fd480e0d936032 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 16:43:19 +0000 Subject: [PATCH 11/52] Added rest time to UI --- example/lib/ui/rest_sliver.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/example/lib/ui/rest_sliver.dart b/example/lib/ui/rest_sliver.dart index 62f1ea224..78195594a 100644 --- a/example/lib/ui/rest_sliver.dart +++ b/example/lib/ui/rest_sliver.dart @@ -38,7 +38,9 @@ class RestSliver extends HookWidget { Widget build(BuildContext context) { final messageCount = useState(1); final messageName = useState('Message ${messageCount.value}'); + final restTime = useState(null); useEffect(() { + rest.time().then((value) => restTime.value = value); messageName.value = 'Message ${messageCount.value}'; }, [messageCount]); @@ -49,6 +51,7 @@ class RestSliver extends HookWidget { 'Rest', style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), ), + Text('Rest time: ${restTime.value}'), Row( children: [ Expanded( From 2a3b4c8c4fcdaa370ce3399f392d0231365c44fd Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 16:56:26 +0000 Subject: [PATCH 12/52] Used getAblyClient to get the rest instance --- .../main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java index 9ff9f0c4d..e6d58901e 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java @@ -614,7 +614,7 @@ public void onError(ErrorInfo reason) { result.error("40000", reason.message, reason); } }; - instanceStore.getRealtime((int) message.message).timeAsync(callback); + instanceStore.getAblyClient((int) message.message).timeAsync(callback); } From f99dcca08ecb3edd5c0dfc832b2e652d58841f3d Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 17:08:07 +0000 Subject: [PATCH 13/52] Add code to be able to switch between rest/realtime for objective-c code --- ios/Classes/AblyFlutter.m | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ios/Classes/AblyFlutter.m b/ios/Classes/AblyFlutter.m index e2a7a490d..c87d75fe0 100644 --- a/ios/Classes/AblyFlutter.m +++ b/ios/Classes/AblyFlutter.m @@ -552,15 +552,22 @@ -(void)reset; static const FlutterHandler _time = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { AblyFlutterMessage *const message = call.arguments; AblyInstanceStore *const instanceStore = [ably instanceStore]; - - ARTRealtime *const realtime = [instanceStore realtimeFrom:message.message]; - [realtime time:^(NSDate * _Nullable dateTimeResult, NSError * _Nullable error) { + + ARTDateTimeCallback callback = ^(NSDate * _Nullable dateTimeResult, NSError * _Nullable error) { if(error){ result(error); }else{ result(@([@(dateTimeResult.timeIntervalSince1970 *1000) longValue])); } - }]; + }; + ARTRealtime *const realtime = [instanceStore realtimeFrom:message.message]; + if(realtime){ + [realtime time:callback]; + }else{ + ARTRest *const rest = [instanceStore restFrom:message.message]; + [rest time:callback]; + } + }; static const FlutterHandler _getNextPage = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { From a16be43749822a2a01a9ed302dce943a7d3b757a Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 14 Dec 2021 17:13:22 +0000 Subject: [PATCH 14/52] Code formatting --- lib/src/generated/platform_constants.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/src/generated/platform_constants.dart b/lib/src/generated/platform_constants.dart index 694ad1116..4bdcf5628 100644 --- a/lib/src/generated/platform_constants.dart +++ b/lib/src/generated/platform_constants.dart @@ -382,7 +382,8 @@ class TxPushRequestPermission { static const String alert = 'alert'; static const String carPlay = 'carPlay'; static const String criticalAlert = 'criticalAlert'; - static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = + 'providesAppNotificationSettings'; static const String provisional = 'provisional'; static const String announcement = 'announcement'; } @@ -398,7 +399,8 @@ class TxUNNotificationSettings { static const String alertStyle = 'alertStyle'; static const String showPreviewsSetting = 'showPreviewsSetting'; static const String criticalAlertSetting = 'criticalAlertSetting'; - static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = + 'providesAppNotificationSettings'; static const String announcementSetting = 'announcementSetting'; static const String scheduledDeliverySetting = 'scheduledDeliverySetting'; static const String timeSensitiveSetting = 'timeSensitiveSetting'; From f23f52302ea89f37649e808e08b6d258d85403da Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Wed, 15 Dec 2021 09:40:26 +0000 Subject: [PATCH 15/52] Code formatting for rest.dart and realtime.dart --- lib/src/platform/src/realtime/realtime.dart | 4 ++-- lib/src/platform/src/rest/rest.dart | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/src/platform/src/realtime/realtime.dart b/lib/src/platform/src/realtime/realtime.dart index 02d9bad4e..4977ef19f 100644 --- a/lib/src/platform/src/realtime/realtime.dart +++ b/lib/src/platform/src/realtime/realtime.dart @@ -110,10 +110,10 @@ class Realtime extends PlatformObject { /// returns server time /// /// https://docs.ably.com/client-lib-development-guide/features/#RSC16 - Future time() async{ + Future time() async { final time = await invokeRequest(PlatformMethod.time); return DateTime.fromMillisecondsSinceEpoch(time); - } + } /// represents the current state of the device in respect of it being a /// target for push notifications. diff --git a/lib/src/platform/src/rest/rest.dart b/lib/src/platform/src/rest/rest.dart index a664ce719..a996f37b7 100644 --- a/lib/src/platform/src/rest/rest.dart +++ b/lib/src/platform/src/rest/rest.dart @@ -65,10 +65,10 @@ class Rest extends PlatformObject { /// returns server time /// /// https://docs.ably.com/client-lib-development-guide/features/#RSC16 - Future time() async{ - final time = await invokeRequest(PlatformMethod.time); - return DateTime.fromMillisecondsSinceEpoch(time); - } + Future time() async { + final time = await invokeRequest(PlatformMethod.time); + return DateTime.fromMillisecondsSinceEpoch(time); + } /// a push object interacting with Push API, such as /// subscribing for push notifications by clientId. From 1719a4a1aaf3f41d8265627c9acb88d5b1d8126b Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Thu, 16 Dec 2021 11:49:00 +0000 Subject: [PATCH 16/52] Made explicit differences between restTime and realtimeTime --- bin/codegen_context.dart | 3 ++- ios/Classes/codec/AblyPlatformConstants.h | 3 ++- ios/Classes/codec/AblyPlatformConstants.m | 3 ++- lib/src/generated/platform_constants.dart | 9 ++++----- lib/src/platform/src/realtime/realtime.dart | 2 +- lib/src/platform/src/rest/rest.dart | 2 +- 6 files changed, 12 insertions(+), 10 deletions(-) diff --git a/bin/codegen_context.dart b/bin/codegen_context.dart index 344ed4102..e360ac433 100644 --- a/bin/codegen_context.dart +++ b/bin/codegen_context.dart @@ -94,7 +94,8 @@ const List> _platformMethods = [ }, {'name': 'releaseRealtimeChannel', 'value': 'releaseRealtimeChannel'}, {'name': 'realtimeHistory', 'value': 'realtimeHistory'}, - {'name': 'time', 'value': 'time'}, + {'name': 'realtimeTime', 'value': 'realtimeTime'}, + {'name': 'restTime', 'value': 'restTime'}, // Push Notifications {'name': 'pushActivate', 'value': 'pushActivate'}, diff --git a/ios/Classes/codec/AblyPlatformConstants.h b/ios/Classes/codec/AblyPlatformConstants.h index 9d18c926d..3e70044cc 100644 --- a/ios/Classes/codec/AblyPlatformConstants.h +++ b/ios/Classes/codec/AblyPlatformConstants.h @@ -64,7 +64,8 @@ extern NSString *const AblyPlatformMethod_onRealtimePresenceMessage; extern NSString *const AblyPlatformMethod_publishRealtimeChannelMessage; extern NSString *const AblyPlatformMethod_releaseRealtimeChannel; extern NSString *const AblyPlatformMethod_realtimeHistory; -extern NSString *const AblyPlatformMethod_time; +extern NSString *const AblyPlatformMethod_realtimeTime; +extern NSString *const AblyPlatformMethod_restTime; extern NSString *const AblyPlatformMethod_pushActivate; extern NSString *const AblyPlatformMethod_pushDeactivate; extern NSString *const AblyPlatformMethod_pushSubscribeDevice; diff --git a/ios/Classes/codec/AblyPlatformConstants.m b/ios/Classes/codec/AblyPlatformConstants.m index a2f259ecd..7f3f0acf3 100644 --- a/ios/Classes/codec/AblyPlatformConstants.m +++ b/ios/Classes/codec/AblyPlatformConstants.m @@ -34,7 +34,8 @@ NSString *const AblyPlatformMethod_publishRealtimeChannelMessage= @"publishRealtimeChannelMessage"; NSString *const AblyPlatformMethod_releaseRealtimeChannel= @"releaseRealtimeChannel"; NSString *const AblyPlatformMethod_realtimeHistory= @"realtimeHistory"; -NSString *const AblyPlatformMethod_time= @"time"; +NSString *const AblyPlatformMethod_realtimeTime= @"realtimeTime"; +NSString *const AblyPlatformMethod_restTime= @"restTime"; NSString *const AblyPlatformMethod_pushActivate= @"pushActivate"; NSString *const AblyPlatformMethod_pushDeactivate= @"pushDeactivate"; NSString *const AblyPlatformMethod_pushSubscribeDevice= @"pushSubscribeDevice"; diff --git a/lib/src/generated/platform_constants.dart b/lib/src/generated/platform_constants.dart index 4bdcf5628..5983aa8da 100644 --- a/lib/src/generated/platform_constants.dart +++ b/lib/src/generated/platform_constants.dart @@ -64,7 +64,8 @@ class PlatformMethod { 'publishRealtimeChannelMessage'; static const String releaseRealtimeChannel = 'releaseRealtimeChannel'; static const String realtimeHistory = 'realtimeHistory'; - static const String time = 'time'; + static const String realtimeTime = 'realtimeTime'; + static const String restTime = 'restTime'; static const String pushActivate = 'pushActivate'; static const String pushDeactivate = 'pushDeactivate'; static const String pushSubscribeDevice = 'pushSubscribeDevice'; @@ -382,8 +383,7 @@ class TxPushRequestPermission { static const String alert = 'alert'; static const String carPlay = 'carPlay'; static const String criticalAlert = 'criticalAlert'; - static const String providesAppNotificationSettings = - 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; static const String provisional = 'provisional'; static const String announcement = 'announcement'; } @@ -399,8 +399,7 @@ class TxUNNotificationSettings { static const String alertStyle = 'alertStyle'; static const String showPreviewsSetting = 'showPreviewsSetting'; static const String criticalAlertSetting = 'criticalAlertSetting'; - static const String providesAppNotificationSettings = - 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; static const String announcementSetting = 'announcementSetting'; static const String scheduledDeliverySetting = 'scheduledDeliverySetting'; static const String timeSensitiveSetting = 'timeSensitiveSetting'; diff --git a/lib/src/platform/src/realtime/realtime.dart b/lib/src/platform/src/realtime/realtime.dart index 4977ef19f..695d6a3e0 100644 --- a/lib/src/platform/src/realtime/realtime.dart +++ b/lib/src/platform/src/realtime/realtime.dart @@ -111,7 +111,7 @@ class Realtime extends PlatformObject { /// /// https://docs.ably.com/client-lib-development-guide/features/#RSC16 Future time() async { - final time = await invokeRequest(PlatformMethod.time); + final time = await invokeRequest(PlatformMethod.realtimeTime); return DateTime.fromMillisecondsSinceEpoch(time); } diff --git a/lib/src/platform/src/rest/rest.dart b/lib/src/platform/src/rest/rest.dart index a996f37b7..8c2e8e4a5 100644 --- a/lib/src/platform/src/rest/rest.dart +++ b/lib/src/platform/src/rest/rest.dart @@ -66,7 +66,7 @@ class Rest extends PlatformObject { /// /// https://docs.ably.com/client-lib-development-guide/features/#RSC16 Future time() async { - final time = await invokeRequest(PlatformMethod.time); + final time = await invokeRequest(PlatformMethod.restTime); return DateTime.fromMillisecondsSinceEpoch(time); } From ea9315f67bd1f1c86f614a6a8d056e041b4fa856 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Thu, 16 Dec 2021 11:53:46 +0000 Subject: [PATCH 17/52] Split realtimeTime and restTime in two methods Android id side --- .../flutter/plugin/AblyMethodCallHandler.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java index e6d58901e..0a1e7310b 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java @@ -87,7 +87,8 @@ public AblyMethodCallHandler(final MethodChannel methodChannel, _map.put(PlatformConstants.PlatformMethod.realtimePresenceUpdate, this::updateRealtimePresence); _map.put(PlatformConstants.PlatformMethod.realtimePresenceLeave, this::leaveRealtimePresence); _map.put(PlatformConstants.PlatformMethod.releaseRealtimeChannel, this::releaseRealtimeChannel); - _map.put(PlatformConstants.PlatformMethod.time, this::time); + _map.put(PlatformConstants.PlatformMethod.realtimeTime, this::realtimeTime); + _map.put(PlatformConstants.PlatformMethod.restTime, this::restTime); // Push Notifications _map.put(PlatformConstants.PlatformMethod.pushActivate, this::pushActivate); @@ -601,9 +602,19 @@ private void releaseRealtimeChannel(@NonNull MethodCall call, @NonNull MethodCha }); } - private void time(@NonNull MethodCall methodCall, @NonNull MethodChannel.Result result) { - final AblyFlutterMessage message = (AblyFlutterMessage) methodCall.arguments; - Callback callback = new Callback() { + private void realtimeTime(@NonNull MethodCall methodCall, @NonNull MethodChannel.Result result) { + final AblyFlutterMessage message = (AblyFlutterMessage) methodCall.arguments; + time(methodCall, result, instanceStore.getRealtime((int) message.message)); + } + + private void restTime(@NonNull MethodCall methodCall, @NonNull MethodChannel.Result result) { + final AblyFlutterMessage message = (AblyFlutterMessage) methodCall.arguments; + time(methodCall, result, instanceStore.getRest((int) message.message)); + } + + private void time(@NonNull MethodCall methodCall, @NonNull MethodChannel.Result result, AblyBase client) { + final AblyFlutterMessage message = (AblyFlutterMessage) methodCall.arguments; + Callback callback = new Callback() { @Override public void onSuccess(Long timeResult) { result.success(timeResult); @@ -613,8 +624,8 @@ public void onSuccess(Long timeResult) { public void onError(ErrorInfo reason) { result.error("40000", reason.message, reason); } - }; - instanceStore.getAblyClient((int) message.message).timeAsync(callback); + }; + client.timeAsync(callback); } From c570f089b769b4c9bce86a9ae8d2ccd257e67d07 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Thu, 16 Dec 2021 14:58:00 +0000 Subject: [PATCH 18/52] Split realtimeTime and restTime in two methods iOSside --- ios/Classes/AblyFlutter.m | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/ios/Classes/AblyFlutter.m b/ios/Classes/AblyFlutter.m index c87d75fe0..83e3322d4 100644 --- a/ios/Classes/AblyFlutter.m +++ b/ios/Classes/AblyFlutter.m @@ -549,25 +549,32 @@ -(void)reset; result(nil); }; -static const FlutterHandler _time = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { +static const FlutterHandler _realtimeTime = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { AblyFlutterMessage *const message = call.arguments; AblyInstanceStore *const instanceStore = [ably instanceStore]; - ARTDateTimeCallback callback = ^(NSDate * _Nullable dateTimeResult, NSError * _Nullable error) { + ARTRealtime *const realtime = [instanceStore realtimeFrom:message.message]; + [realtime time:^(NSDate * _Nullable dateTimeResult, NSError * _Nullable error) { if(error){ result(error); }else{ result(@([@(dateTimeResult.timeIntervalSince1970 *1000) longValue])); } - }; - ARTRealtime *const realtime = [instanceStore realtimeFrom:message.message]; - if(realtime){ - [realtime time:callback]; - }else{ - ARTRest *const rest = [instanceStore restFrom:message.message]; - [rest time:callback]; - } - + }]; +}; + +static const FlutterHandler _restTime = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { + AblyFlutterMessage *const message = call.arguments; + AblyInstanceStore *const instanceStore = [ably instanceStore]; + + ARTRest *const rest = [instanceStore restFrom:message.message]; + [rest time:^(NSDate * _Nullable dateTimeResult, NSError * _Nullable error) { + if(error){ + result(error); + }else{ + result(@([@(dateTimeResult.timeIntervalSince1970 *1000) longValue])); + } + }]; }; static const FlutterHandler _getNextPage = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { @@ -686,7 +693,8 @@ -(instancetype)initWithChannel:(FlutterMethodChannel *const)channel AblyPlatformMethod_realtimePresenceUpdate: _updateRealtimePresence, AblyPlatformMethod_realtimePresenceLeave: _leaveRealtimePresence, AblyPlatformMethod_releaseRealtimeChannel: _releaseRealtimeChannel, - AblyPlatformMethod_time:_time, + AblyPlatformMethod_realtimeTime:_realtimeTime, + AblyPlatformMethod_realtimeTime:_restTime, // Push Notifications AblyPlatformMethod_pushActivate: PushHandlers.activate, AblyPlatformMethod_pushRequestPermission: PushHandlers.requestPermission, From dcaf6d0bce17b9b62985509567f5ad7f43457e2f Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Thu, 16 Dec 2021 15:09:27 +0000 Subject: [PATCH 19/52] Flutter format --- lib/src/generated/platform_constants.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/src/generated/platform_constants.dart b/lib/src/generated/platform_constants.dart index 5983aa8da..a744c4f39 100644 --- a/lib/src/generated/platform_constants.dart +++ b/lib/src/generated/platform_constants.dart @@ -383,7 +383,8 @@ class TxPushRequestPermission { static const String alert = 'alert'; static const String carPlay = 'carPlay'; static const String criticalAlert = 'criticalAlert'; - static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = + 'providesAppNotificationSettings'; static const String provisional = 'provisional'; static const String announcement = 'announcement'; } @@ -399,7 +400,8 @@ class TxUNNotificationSettings { static const String alertStyle = 'alertStyle'; static const String showPreviewsSetting = 'showPreviewsSetting'; static const String criticalAlertSetting = 'criticalAlertSetting'; - static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = + 'providesAppNotificationSettings'; static const String announcementSetting = 'announcementSetting'; static const String scheduledDeliverySetting = 'scheduledDeliverySetting'; static const String timeSensitiveSetting = 'timeSensitiveSetting'; From 15a743c59ed8e7f1dd5e6fe02d0531268c0e9fe0 Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Wed, 2 Feb 2022 14:39:38 +0100 Subject: [PATCH 20/52] Regenerated platform constants for time function --- .../io/ably/flutter/plugin/generated/PlatformConstants.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java b/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java index 4ac2433b3..e4c295ca8 100644 --- a/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java +++ b/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java @@ -66,6 +66,8 @@ static final public class PlatformMethod { public static final String publishRealtimeChannelMessage = "publishRealtimeChannelMessage"; public static final String releaseRealtimeChannel = "releaseRealtimeChannel"; public static final String realtimeHistory = "realtimeHistory"; + public static final String realtimeTime = "realtimeTime"; + public static final String restTime = "restTime"; public static final String pushActivate = "pushActivate"; public static final String pushDeactivate = "pushDeactivate"; public static final String pushSubscribeDevice = "pushSubscribeDevice"; From 41f2d41c93bd7a568379777be5e7d42bad87e357 Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Wed, 2 Feb 2022 16:58:26 +0100 Subject: [PATCH 21/52] Fixed time methods code smells, added missing AblyBase import --- .../io/ably/flutter/plugin/AblyMethodCallHandler.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java index 0a1e7310b..f3b04dfea 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java @@ -25,6 +25,7 @@ import io.ably.lib.realtime.Channel; import io.ably.lib.realtime.CompletionListener; import io.ably.lib.realtime.Presence; +import io.ably.lib.rest.AblyBase; import io.ably.lib.rest.AblyRest; import io.ably.lib.rest.Auth; import io.ably.lib.transport.Defaults; @@ -604,16 +605,15 @@ private void releaseRealtimeChannel(@NonNull MethodCall call, @NonNull MethodCha private void realtimeTime(@NonNull MethodCall methodCall, @NonNull MethodChannel.Result result) { final AblyFlutterMessage message = (AblyFlutterMessage) methodCall.arguments; - time(methodCall, result, instanceStore.getRealtime((int) message.message)); + time(result, instanceStore.getRealtime((int) message.message)); } private void restTime(@NonNull MethodCall methodCall, @NonNull MethodChannel.Result result) { final AblyFlutterMessage message = (AblyFlutterMessage) methodCall.arguments; - time(methodCall, result, instanceStore.getRest((int) message.message)); + time(result, instanceStore.getRest((int) message.message)); } - private void time(@NonNull MethodCall methodCall, @NonNull MethodChannel.Result result, AblyBase client) { - final AblyFlutterMessage message = (AblyFlutterMessage) methodCall.arguments; + private void time(@NonNull MethodChannel.Result result, AblyBase client) { Callback callback = new Callback() { @Override public void onSuccess(Long timeResult) { From 38df5e57686cf01b26d4c60d77ab5e862c0db913 Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Tue, 8 Feb 2022 18:19:13 +0100 Subject: [PATCH 22/52] Fixed restTime method message handling on iOS side --- ios/Classes/AblyFlutter.m | 6 +++--- lib/src/platform/src/platform_object.dart | 24 ++++++++++++++++++++++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/ios/Classes/AblyFlutter.m b/ios/Classes/AblyFlutter.m index 83e3322d4..3bf63c990 100644 --- a/ios/Classes/AblyFlutter.m +++ b/ios/Classes/AblyFlutter.m @@ -566,8 +566,8 @@ -(void)reset; static const FlutterHandler _restTime = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { AblyFlutterMessage *const message = call.arguments; AblyInstanceStore *const instanceStore = [ably instanceStore]; - - ARTRest *const rest = [instanceStore restFrom:message.message]; + NSNumber *const handle = message.message; + ARTRest *const rest = [instanceStore restFrom:handle]; [rest time:^(NSDate * _Nullable dateTimeResult, NSError * _Nullable error) { if(error){ result(error); @@ -694,7 +694,7 @@ -(instancetype)initWithChannel:(FlutterMethodChannel *const)channel AblyPlatformMethod_realtimePresenceLeave: _leaveRealtimePresence, AblyPlatformMethod_releaseRealtimeChannel: _releaseRealtimeChannel, AblyPlatformMethod_realtimeTime:_realtimeTime, - AblyPlatformMethod_realtimeTime:_restTime, + AblyPlatformMethod_restTime:_restTime, // Push Notifications AblyPlatformMethod_pushActivate: PushHandlers.activate, AblyPlatformMethod_pushRequestPermission: PushHandlers.requestPermission, diff --git a/lib/src/platform/src/platform_object.dart b/lib/src/platform/src/platform_object.dart index 05310a009..921054b87 100644 --- a/lib/src/platform/src/platform_object.dart +++ b/lib/src/platform/src/platform_object.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'package:ably_flutter/ably_flutter.dart'; -import 'package:flutter/services.dart'; import 'package:meta/meta.dart'; /// A representation of a Platform side instance (Android, iOS). @@ -59,6 +58,29 @@ abstract class PlatformObject { } /// invoke platform method channel with AblyMessage encapsulation + /* FIXME(ikurek): This seems wrong - the structure is either + { + message: { + message: argument, + handle: handle, + type: null + }, + handle: null, + type: null + } + + or + + { + message: handle, + handle: null, + type: null + } + + Which means that the structure is wrong every time, but I can't + understand why and it seems that iOS/Android code reads handle from + message field, so I don't want to touch it now + */ Future invoke(final String method, [final Object? argument]) async { final _handle = await handle; final message = (null != argument) From 4457a5e95b72c2e9160250274b83c1c0d76387eb Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Thu, 16 Dec 2021 11:49:00 +0000 Subject: [PATCH 23/52] Made explicit differences between restTime and realtimeTime --- lib/src/generated/platform_constants.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/src/generated/platform_constants.dart b/lib/src/generated/platform_constants.dart index a744c4f39..5983aa8da 100644 --- a/lib/src/generated/platform_constants.dart +++ b/lib/src/generated/platform_constants.dart @@ -383,8 +383,7 @@ class TxPushRequestPermission { static const String alert = 'alert'; static const String carPlay = 'carPlay'; static const String criticalAlert = 'criticalAlert'; - static const String providesAppNotificationSettings = - 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; static const String provisional = 'provisional'; static const String announcement = 'announcement'; } @@ -400,8 +399,7 @@ class TxUNNotificationSettings { static const String alertStyle = 'alertStyle'; static const String showPreviewsSetting = 'showPreviewsSetting'; static const String criticalAlertSetting = 'criticalAlertSetting'; - static const String providesAppNotificationSettings = - 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; static const String announcementSetting = 'announcementSetting'; static const String scheduledDeliverySetting = 'scheduledDeliverySetting'; static const String timeSensitiveSetting = 'timeSensitiveSetting'; From cdc153c95eb06161371759aeee3dc716ea9aa5f6 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Thu, 16 Dec 2021 15:36:11 +0000 Subject: [PATCH 24/52] Codegen for realtime stats --- bin/codegen_context.dart | 1 + ios/Classes/codec/AblyPlatformConstants.h | 1 + ios/Classes/codec/AblyPlatformConstants.m | 1 + lib/src/generated/platform_constants.dart | 1 + lib/src/platform/src/realtime/realtime.dart | 6 +++--- 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/bin/codegen_context.dart b/bin/codegen_context.dart index e360ac433..6e20344af 100644 --- a/bin/codegen_context.dart +++ b/bin/codegen_context.dart @@ -96,6 +96,7 @@ const List> _platformMethods = [ {'name': 'realtimeHistory', 'value': 'realtimeHistory'}, {'name': 'realtimeTime', 'value': 'realtimeTime'}, {'name': 'restTime', 'value': 'restTime'}, + {'name': 'realtimeStats', 'value': 'realtimeStats'}, // Push Notifications {'name': 'pushActivate', 'value': 'pushActivate'}, diff --git a/ios/Classes/codec/AblyPlatformConstants.h b/ios/Classes/codec/AblyPlatformConstants.h index 3e70044cc..f7ab0f7a7 100644 --- a/ios/Classes/codec/AblyPlatformConstants.h +++ b/ios/Classes/codec/AblyPlatformConstants.h @@ -66,6 +66,7 @@ extern NSString *const AblyPlatformMethod_releaseRealtimeChannel; extern NSString *const AblyPlatformMethod_realtimeHistory; extern NSString *const AblyPlatformMethod_realtimeTime; extern NSString *const AblyPlatformMethod_restTime; +extern NSString *const AblyPlatformMethod_realtimeStats; extern NSString *const AblyPlatformMethod_pushActivate; extern NSString *const AblyPlatformMethod_pushDeactivate; extern NSString *const AblyPlatformMethod_pushSubscribeDevice; diff --git a/ios/Classes/codec/AblyPlatformConstants.m b/ios/Classes/codec/AblyPlatformConstants.m index 7f3f0acf3..ea516e0f8 100644 --- a/ios/Classes/codec/AblyPlatformConstants.m +++ b/ios/Classes/codec/AblyPlatformConstants.m @@ -36,6 +36,7 @@ NSString *const AblyPlatformMethod_realtimeHistory= @"realtimeHistory"; NSString *const AblyPlatformMethod_realtimeTime= @"realtimeTime"; NSString *const AblyPlatformMethod_restTime= @"restTime"; +NSString *const AblyPlatformMethod_realtimeStats= @"realtimeStats"; NSString *const AblyPlatformMethod_pushActivate= @"pushActivate"; NSString *const AblyPlatformMethod_pushDeactivate= @"pushDeactivate"; NSString *const AblyPlatformMethod_pushSubscribeDevice= @"pushSubscribeDevice"; diff --git a/lib/src/generated/platform_constants.dart b/lib/src/generated/platform_constants.dart index 5983aa8da..10c0cfeb2 100644 --- a/lib/src/generated/platform_constants.dart +++ b/lib/src/generated/platform_constants.dart @@ -66,6 +66,7 @@ class PlatformMethod { static const String realtimeHistory = 'realtimeHistory'; static const String realtimeTime = 'realtimeTime'; static const String restTime = 'restTime'; + static const String realtimeStats = 'realtimeStats'; static const String pushActivate = 'pushActivate'; static const String pushDeactivate = 'pushDeactivate'; static const String pushSubscribeDevice = 'pushSubscribeDevice'; diff --git a/lib/src/platform/src/realtime/realtime.dart b/lib/src/platform/src/realtime/realtime.dart index 695d6a3e0..a8e215a2f 100644 --- a/lib/src/platform/src/realtime/realtime.dart +++ b/lib/src/platform/src/realtime/realtime.dart @@ -103,9 +103,9 @@ class Realtime extends PlatformObject { /// gets stats based on params as a [PaginatedResult] /// /// https://docs.ably.com/client-lib-development-guide/features/#RSC6 - // Future> stats([Map? params]) { - // throw UnimplementedError(); - // } + Future> stats([Map? params]) { + throw UnimplementedError(); + } /// returns server time /// From 8249b95c4eef97119b6582dee0c0f618ec787829 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Mon, 20 Dec 2021 14:03:01 +0000 Subject: [PATCH 25/52] Stats encoding from Android side --- .../ably/flutter/plugin/AblyMessageCodec.java | 548 +++++++++++++----- .../flutter/plugin/AblyMethodCallHandler.java | 16 + .../plugin/generated/PlatformConstants.java | 51 ++ bin/codegen_context.dart | 65 +++ example/lib/ui/realtime_sliver.dart | 11 + ios/Classes/codec/AblyPlatformConstants.h | 44 ++ ios/Classes/codec/AblyPlatformConstants.m | 43 ++ lib/src/generated/platform_constants.dart | 51 ++ lib/src/platform/src/realtime/realtime.dart | 10 +- 9 files changed, 680 insertions(+), 159 deletions(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java index 274471339..6c56ef624 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java @@ -1,19 +1,11 @@ package io.ably.flutter.plugin; import androidx.annotation.Nullable; - import com.google.firebase.messaging.RemoteMessage; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; - -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - import io.ably.flutter.plugin.generated.PlatformConstants; import io.ably.flutter.plugin.types.PlatformClientOptions; import io.ably.flutter.plugin.util.CipherParamsStorage; @@ -40,9 +32,15 @@ import io.ably.lib.types.MessageExtras; import io.ably.lib.types.Param; import io.ably.lib.types.PresenceMessage; +import io.ably.lib.types.Stats; import io.ably.lib.util.Crypto; import io.ably.lib.util.Log; import io.flutter.plugin.common.StandardMessageCodec; +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; public class AblyMessageCodec extends StandardMessageCodec { @@ -88,60 +86,171 @@ T decode(Map jsonMap) { public AblyMessageCodec(CipherParamsStorage cipherParamsStorage) { final AblyMessageCodec self = this; this.cipherParamsStorage = cipherParamsStorage; - codecMap = new HashMap() { - { - put(PlatformConstants.CodecTypes.ablyMessage, - new CodecPair<>(self::encodeAblyFlutterMessage, self::decodeAblyFlutterMessage)); - put(PlatformConstants.CodecTypes.ablyEventMessage, - new CodecPair<>(null, self::decodeAblyFlutterEventMessage)); - put(PlatformConstants.CodecTypes.clientOptions, - new CodecPair<>(null, self::decodeClientOptions)); - put(PlatformConstants.CodecTypes.tokenParams, - new CodecPair<>(self::encodeTokenParams, null)); - put(PlatformConstants.CodecTypes.tokenDetails, - new CodecPair<>(null, self::decodeTokenDetails)); - put(PlatformConstants.CodecTypes.tokenRequest, - new CodecPair<>(null, self::decodeTokenRequest)); - put(PlatformConstants.CodecTypes.restChannelOptions, - new CodecPair<>(null, self::decodeRestChannelOptions)); - put(PlatformConstants.CodecTypes.realtimeChannelOptions, - new CodecPair<>(null, self::decodeRealtimeChannelOptions)); - put(PlatformConstants.CodecTypes.paginatedResult, - new CodecPair<>(self::encodePaginatedResult, null)); - put(PlatformConstants.CodecTypes.restHistoryParams, - new CodecPair<>(null, self::decodeRestHistoryParams)); - put(PlatformConstants.CodecTypes.realtimeHistoryParams, - new CodecPair<>(null, self::decodeRealtimeHistoryParams)); - put(PlatformConstants.CodecTypes.restPresenceParams, - new CodecPair<>(null, self::decodeRestPresenceParams)); - put(PlatformConstants.CodecTypes.realtimePresenceParams, - new CodecPair<>(null, self::decodeRealtimePresenceParams)); - put(PlatformConstants.CodecTypes.errorInfo, - new CodecPair<>(self::encodeErrorInfo, null)); - put(PlatformConstants.CodecTypes.messageData, - new CodecPair<>(null, self::decodeChannelMessageData)); - put(PlatformConstants.CodecTypes.messageExtras, - new CodecPair<>(self::encodeChannelMessageExtras, self::decodeChannelMessageExtras)); - put(PlatformConstants.CodecTypes.message, - new CodecPair<>(self::encodeChannelMessage, self::decodeChannelMessage)); - put(PlatformConstants.CodecTypes.presenceMessage, - new CodecPair<>(self::encodePresenceMessage, null)); - put(PlatformConstants.CodecTypes.connectionStateChange, - new CodecPair<>(self::encodeConnectionStateChange, null)); - put(PlatformConstants.CodecTypes.channelStateChange, - new CodecPair<>(self::encodeChannelStateChange, null)); - put(PlatformConstants.CodecTypes.deviceDetails, - new CodecPair<>(self::encodeDeviceDetails, null)); - put(PlatformConstants.CodecTypes.localDevice, - new CodecPair<>(self::encodeLocalDevice, null)); - put(PlatformConstants.CodecTypes.pushChannelSubscription, - new CodecPair<>(self::encodePushChannelSubscription, null)); - put(PlatformConstants.CodecTypes.remoteMessage, - new CodecPair<>(self::encodeRemoteMessage, null)); - put(PlatformConstants.CodecTypes.cipherParams, - new CodecPair<>(self::encodeCipherParams, self::decodeCipherParams)); - } - }; + codecMap = + new HashMap() { + { + put( + PlatformConstants.CodecTypes.ablyMessage, + new CodecPair<>(self::encodeAblyFlutterMessage, self::decodeAblyFlutterMessage)); + put( + PlatformConstants.CodecTypes.ablyEventMessage, + new CodecPair<>(null, self::decodeAblyFlutterEventMessage)); + put( + PlatformConstants.CodecTypes.clientOptions, + new CodecPair<>(null, self::decodeClientOptions)); + put( + PlatformConstants.CodecTypes.tokenParams, + new CodecPair<>(self::encodeTokenParams, null)); + put( + PlatformConstants.CodecTypes.tokenDetails, + new CodecPair<>(null, self::decodeTokenDetails)); + put( + PlatformConstants.CodecTypes.tokenRequest, + new CodecPair<>(null, self::decodeTokenRequest)); + put( + PlatformConstants.CodecTypes.restChannelOptions, + new CodecPair<>(null, self::decodeRestChannelOptions)); + put( + PlatformConstants.CodecTypes.realtimeChannelOptions, + new CodecPair<>(null, self::decodeRealtimeChannelOptions)); + put( + PlatformConstants.CodecTypes.paginatedResult, + new CodecPair<>(self::encodePaginatedResult, null)); + put( + PlatformConstants.CodecTypes.restHistoryParams, + new CodecPair<>(null, self::decodeRestHistoryParams)); + put( + PlatformConstants.CodecTypes.realtimeHistoryParams, + new CodecPair<>(null, self::decodeRealtimeHistoryParams)); + put( + PlatformConstants.CodecTypes.stats, + new CodecPair<>(self::encodeStats,null)); + put( + PlatformConstants.CodecTypes.restPresenceParams, + new CodecPair<>(null, self::decodeRestPresenceParams)); + put( + PlatformConstants.CodecTypes.realtimePresenceParams, + new CodecPair<>(null, self::decodeRealtimePresenceParams)); + put( + PlatformConstants.CodecTypes.errorInfo, + new CodecPair<>(self::encodeErrorInfo, null)); + put( + PlatformConstants.CodecTypes.messageData, + new CodecPair<>(null, self::decodeChannelMessageData)); + put( + PlatformConstants.CodecTypes.messageExtras, + new CodecPair<>( + self::encodeChannelMessageExtras, self::decodeChannelMessageExtras)); + put( + PlatformConstants.CodecTypes.message, + new CodecPair<>(self::encodeChannelMessage, self::decodeChannelMessage)); + put( + PlatformConstants.CodecTypes.presenceMessage, + new CodecPair<>(self::encodePresenceMessage, null)); + put( + PlatformConstants.CodecTypes.connectionStateChange, + new CodecPair<>(self::encodeConnectionStateChange, null)); + put( + PlatformConstants.CodecTypes.channelStateChange, + new CodecPair<>(self::encodeChannelStateChange, null)); + put( + PlatformConstants.CodecTypes.deviceDetails, + new CodecPair<>(self::encodeDeviceDetails, null)); + put( + PlatformConstants.CodecTypes.localDevice, + new CodecPair<>(self::encodeLocalDevice, null)); + put( + PlatformConstants.CodecTypes.pushChannelSubscription, + new CodecPair<>(self::encodePushChannelSubscription, null)); + put( + PlatformConstants.CodecTypes.remoteMessage, + new CodecPair<>(self::encodeRemoteMessage, null)); + put( + PlatformConstants.CodecTypes.cipherParams, + new CodecPair<>(self::encodeCipherParams, self::decodeCipherParams)); + } + }; + } + + private Map encodeStats(Stats stats) { + if (stats == null) return null; + final HashMap jsonMap = new HashMap<>(); + writeValueToJson(jsonMap, PlatformConstants.TxStats.all,encodeStatsMessageTypes(stats.all)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.apiRequests, encodeStatsRequestCount(stats.apiRequests)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.channels, encodeStatsResourceCount(stats.channels)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.connections, encodeStatsConnectionTypes(stats.connections)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.inbound, encodeStatsMessageTraffic(stats.inbound)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.intervalId, stats.intervalId); + writeValueToJson(jsonMap, PlatformConstants.TxStats.outbound, encodeStatsMessageTraffic(stats.outbound)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.persisted, encodeStatsMessageTypes(stats.persisted)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.tokenRequests, encodeStatsRequestCount(stats.tokenRequests)); + return jsonMap; + } + + private Map encodeStatsMessageTraffic(Stats.MessageTraffic messageTraffic) { + if (messageTraffic == null) return null; + final HashMap jsonMap = new HashMap<>(); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTraffic.all,encodeStatsMessageTypes(messageTraffic.all)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTraffic.realtime, + encodeStatsMessageTypes(messageTraffic.realtime)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTraffic.rest, + encodeStatsMessageTypes(messageTraffic.rest)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTraffic.webhook, + encodeStatsMessageTypes(messageTraffic.webhook)); + return jsonMap; + } + + private Map encodeStatsConnectionTypes(Stats.ConnectionTypes connectionTypes) { + if (connectionTypes == null) return null; + final HashMap jsonMap = new HashMap<>(); + writeValueToJson(jsonMap, PlatformConstants.TxStatsConnectionTypes.all, + encodeStatsResourceCount(connectionTypes.all)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsConnectionTypes.plain, + encodeStatsResourceCount(connectionTypes.plain)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsConnectionTypes.tls, + encodeStatsResourceCount(connectionTypes.tls)); + return jsonMap; + } + + private Map encodeStatsResourceCount(Stats.ResourceCount resourceCount) { + if (resourceCount == null) return null; + final HashMap jsonMap = new HashMap<>(); + writeValueToJson(jsonMap,PlatformConstants.TxStatsResourceCount.mean,resourceCount.mean); + writeValueToJson(jsonMap,PlatformConstants.TxStatsResourceCount.min,resourceCount.min); + writeValueToJson(jsonMap,PlatformConstants.TxStatsResourceCount.opened,resourceCount.opened); + writeValueToJson(jsonMap,PlatformConstants.TxStatsResourceCount.peak,resourceCount.peak); + writeValueToJson(jsonMap,PlatformConstants.TxStatsResourceCount.refused,resourceCount.refused); + return jsonMap; + } + + private Map encodeStatsRequestCount(Stats.RequestCount apiRequests) { + if (apiRequests == null) return null; + final HashMap jsonMap = new HashMap<>(); + writeValueToJson(jsonMap,PlatformConstants.TxStatsRequestCount.succeeded,apiRequests.succeeded); + writeValueToJson(jsonMap,PlatformConstants.TxStatsRequestCount.failed,apiRequests.failed); + writeValueToJson(jsonMap,PlatformConstants.TxStatsRequestCount.refused,apiRequests.refused); + return jsonMap; + } + + private Map encodeStatsMessageTypes(Stats.MessageTypes messageTypes){ + if (messageTypes == null) return null; + final HashMap jsonMap = new HashMap<>(); + writeValueToJson(jsonMap,PlatformConstants.TxStatsMessageTypes.all,encodeMessageCategory(messageTypes.all)); + writeValueToJson(jsonMap,PlatformConstants.TxStatsMessageTypes.messages,encodeMessageCategory(messageTypes.messages)); + writeValueToJson(jsonMap,PlatformConstants.TxStatsMessageTypes.presence,encodeMessageCategory(messageTypes.presence)); + return jsonMap; + } + //that's StatsMessageCount in Flutter's side + private Map encodeMessageCategory(Stats.MessageCategory category) { + if (category == null) return null; + if (category.category == null) return null; + final HashMap jsonMap = new HashMap<>(); + //There is a mapping consistencey issue between two, so just assume there is a single message for now + for (String key : category.category.keySet()){ + writeValueToJson(jsonMap,PlatformConstants.TxStatsMessageCount.count, category.category.get(key).count); + writeValueToJson(jsonMap,PlatformConstants.TxStatsMessageCount.data, category.category.get(key).data); + } + return jsonMap; } @Override @@ -154,7 +263,8 @@ protected Object readValueOfType(final byte type, final ByteBuffer buffer) { return super.readValueOfType(type, buffer); } - private void readValueFromJson(Map jsonMap, String key, final Consumer consumer) { + private void readValueFromJson( + Map jsonMap, String key, final Consumer consumer) { final Object object = jsonMap.get(key); if (null != object) { consumer.accept(object); @@ -230,8 +340,8 @@ private void WriteJsonElement(ByteArrayOutputStream stream, JsonElement value) { } /** - * Converts Map to JsonObject, ArrayList to JsonArray and - * returns null if these 2 types are a no-match + * Converts Map to JsonObject, ArrayList to JsonArray and returns null if these 2 types are a + * no-match */ static JsonElement readValueAsJsonElement(final Object object) { if (object instanceof Map) { @@ -243,9 +353,9 @@ static JsonElement readValueAsJsonElement(final Object object) { } /** - * Dart int types get delivered to Java as Integer, unless '32 bits not enough' in which case - * they are delivered as Long. - * See: https://flutter.dev/docs/development/platform-integration/platform-channels#codec + * Dart int types get delivered to Java as Integer, unless '32 bits not enough' in which case they + * are delivered as Long. See: + * https://flutter.dev/docs/development/platform-integration/platform-channels#codec */ private Long readValueAsLong(final Object object) { if (null == object) { @@ -259,7 +369,8 @@ private Long readValueAsLong(final Object object) { private AblyFlutterMessage decodeAblyFlutterMessage(Map jsonMap) { if (jsonMap == null) return null; - final Long handle = readValueAsLong(jsonMap.get(PlatformConstants.TxAblyMessage.registrationHandle)); + final Long handle = + readValueAsLong(jsonMap.get(PlatformConstants.TxAblyMessage.registrationHandle)); final Object messageType = jsonMap.get(PlatformConstants.TxAblyMessage.type); final Integer type = (messageType == null) ? null : Integer.parseInt(messageType.toString()); Object message = jsonMap.get(PlatformConstants.TxAblyMessage.message); @@ -286,47 +397,113 @@ private PlatformClientOptions decodeClientOptions(Map jsonMap) { final ClientOptions o = new ClientOptions(); // AuthOptions (super class of ClientOptions) - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.authUrl, v -> o.authUrl = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.authMethod, v -> o.authMethod = (String) v); + readValueFromJson( + jsonMap, PlatformConstants.TxClientOptions.authUrl, v -> o.authUrl = (String) v); + readValueFromJson( + jsonMap, PlatformConstants.TxClientOptions.authMethod, v -> o.authMethod = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.key, v -> o.key = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.tokenDetails, v -> o.tokenDetails = decodeTokenDetails((Map) v)); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.authHeaders, v -> o.authHeaders = (Param[]) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.authParams, v -> o.authParams = (Param[]) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.queryTime, v -> o.queryTime = (Boolean) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.useTokenAuth, v -> o.useTokenAuth = (Boolean) v); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.tokenDetails, + v -> o.tokenDetails = decodeTokenDetails((Map) v)); + readValueFromJson( + jsonMap, PlatformConstants.TxClientOptions.authHeaders, v -> o.authHeaders = (Param[]) v); + readValueFromJson( + jsonMap, PlatformConstants.TxClientOptions.authParams, v -> o.authParams = (Param[]) v); + readValueFromJson( + jsonMap, PlatformConstants.TxClientOptions.queryTime, v -> o.queryTime = (Boolean) v); + readValueFromJson( + jsonMap, PlatformConstants.TxClientOptions.useTokenAuth, v -> o.useTokenAuth = (Boolean) v); // ClientOptions - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.clientId, v -> o.clientId = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.logLevel, v -> o.logLevel = decodeLogLevel((String) v)); + readValueFromJson( + jsonMap, PlatformConstants.TxClientOptions.clientId, v -> o.clientId = (String) v); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.logLevel, + v -> o.logLevel = decodeLogLevel((String) v)); readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.tls, v -> o.tls = (Boolean) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.restHost, v -> o.restHost = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.realtimeHost, v -> o.realtimeHost = (String) v); + readValueFromJson( + jsonMap, PlatformConstants.TxClientOptions.restHost, v -> o.restHost = (String) v); + readValueFromJson( + jsonMap, PlatformConstants.TxClientOptions.realtimeHost, v -> o.realtimeHost = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.port, v -> o.port = (Integer) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.tlsPort, v -> o.tlsPort = (Integer) v); - o.autoConnect = false; // Always avoid auto-connect, to allow handle to be returned back to Dart side before authCallback is called. - // If the user specifies autoConnect, we call connect once we get the handle back to the dart side - // In other words, Ably Flutter internally manually connects, but to the SDK user this looks like autoConnect. - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.useBinaryProtocol, v -> o.useBinaryProtocol = (Boolean) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.queueMessages, v -> o.queueMessages = (Boolean) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.echoMessages, v -> o.echoMessages = (Boolean) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.recover, v -> o.recover = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.environment, v -> o.environment = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.idempotentRestPublishing, v -> o.idempotentRestPublishing = (Boolean) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.httpOpenTimeout, v -> o.httpOpenTimeout = (Integer) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.httpRequestTimeout, v -> o.httpRequestTimeout = (Integer) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.httpMaxRetryCount, v -> o.httpMaxRetryCount = (Integer) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.realtimeRequestTimeout, v -> o.realtimeRequestTimeout = readValueAsLong(v)); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.fallbackHosts, v -> o.fallbackHosts = (String[]) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.fallbackHostsUseDefault, v -> o.fallbackHostsUseDefault = (Boolean) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.fallbackRetryTimeout, v -> o.fallbackRetryTimeout = readValueAsLong(v)); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.defaultTokenParams, v -> o.defaultTokenParams = decodeTokenParams((Map) v)); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.channelRetryTimeout, v -> o.channelRetryTimeout = (Integer) v); - readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.transportParams, v -> o.transportParams = (Param[]) v); + readValueFromJson( + jsonMap, PlatformConstants.TxClientOptions.tlsPort, v -> o.tlsPort = (Integer) v); + o.autoConnect = + false; // Always avoid auto-connect, to allow handle to be returned back to Dart side before + // authCallback is called. + // If the user specifies autoConnect, we call connect once we get the handle back to the dart + // side + // In other words, Ably Flutter internally manually connects, but to the SDK user this looks + // like autoConnect. + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.useBinaryProtocol, + v -> o.useBinaryProtocol = (Boolean) v); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.queueMessages, + v -> o.queueMessages = (Boolean) v); + readValueFromJson( + jsonMap, PlatformConstants.TxClientOptions.echoMessages, v -> o.echoMessages = (Boolean) v); + readValueFromJson( + jsonMap, PlatformConstants.TxClientOptions.recover, v -> o.recover = (String) v); + readValueFromJson( + jsonMap, PlatformConstants.TxClientOptions.environment, v -> o.environment = (String) v); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.idempotentRestPublishing, + v -> o.idempotentRestPublishing = (Boolean) v); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.httpOpenTimeout, + v -> o.httpOpenTimeout = (Integer) v); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.httpRequestTimeout, + v -> o.httpRequestTimeout = (Integer) v); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.httpMaxRetryCount, + v -> o.httpMaxRetryCount = (Integer) v); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.realtimeRequestTimeout, + v -> o.realtimeRequestTimeout = readValueAsLong(v)); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.fallbackHosts, + v -> o.fallbackHosts = (String[]) v); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.fallbackHostsUseDefault, + v -> o.fallbackHostsUseDefault = (Boolean) v); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.fallbackRetryTimeout, + v -> o.fallbackRetryTimeout = readValueAsLong(v)); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.defaultTokenParams, + v -> o.defaultTokenParams = decodeTokenParams((Map) v)); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.channelRetryTimeout, + v -> o.channelRetryTimeout = (Integer) v); + readValueFromJson( + jsonMap, + PlatformConstants.TxClientOptions.transportParams, + v -> o.transportParams = (Param[]) v); o.agents = new HashMap<>(); o.agents.put("ably-flutter", BuildConfig.FLUTTER_PACKAGE_PLUGIN_VERSION); - return new PlatformClientOptions(o, jsonMap.containsKey(PlatformConstants.TxClientOptions.hasAuthCallback) ? ((boolean) jsonMap.get(PlatformConstants.TxClientOptions.hasAuthCallback)) : false); + return new PlatformClientOptions( + o, + jsonMap.containsKey(PlatformConstants.TxClientOptions.hasAuthCallback) + ? ((boolean) jsonMap.get(PlatformConstants.TxClientOptions.hasAuthCallback)) + : false); } private int decodeLogLevel(String logLevelString) { @@ -353,8 +530,10 @@ private TokenDetails decodeTokenDetails(Map jsonMap) { readValueFromJson(jsonMap, PlatformConstants.TxTokenDetails.token, v -> o.token = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxTokenDetails.expires, v -> o.expires = (int) v); readValueFromJson(jsonMap, PlatformConstants.TxTokenDetails.issued, v -> o.issued = (int) v); - readValueFromJson(jsonMap, PlatformConstants.TxTokenDetails.capability, v -> o.capability = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxTokenDetails.clientId, v -> o.clientId = (String) v); + readValueFromJson( + jsonMap, PlatformConstants.TxTokenDetails.capability, v -> o.capability = (String) v); + readValueFromJson( + jsonMap, PlatformConstants.TxTokenDetails.clientId, v -> o.clientId = (String) v); return o; } @@ -362,10 +541,14 @@ private TokenDetails decodeTokenDetails(Map jsonMap) { private Auth.TokenParams decodeTokenParams(Map jsonMap) { if (jsonMap == null) return null; final Auth.TokenParams o = new Auth.TokenParams(); - readValueFromJson(jsonMap, PlatformConstants.TxTokenParams.capability, v -> o.capability = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxTokenParams.clientId, v -> o.clientId = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxTokenParams.timestamp, v -> o.timestamp = readValueAsLong(v)); - readValueFromJson(jsonMap, PlatformConstants.TxTokenParams.ttl, v -> o.ttl = readValueAsLong(v)); + readValueFromJson( + jsonMap, PlatformConstants.TxTokenParams.capability, v -> o.capability = (String) v); + readValueFromJson( + jsonMap, PlatformConstants.TxTokenParams.clientId, v -> o.clientId = (String) v); + readValueFromJson( + jsonMap, PlatformConstants.TxTokenParams.timestamp, v -> o.timestamp = readValueAsLong(v)); + readValueFromJson( + jsonMap, PlatformConstants.TxTokenParams.ttl, v -> o.ttl = readValueAsLong(v)); // nonce is not supported in ably-java // Track @ https://github.com/ably/ably-flutter/issues/14 return o; @@ -374,20 +557,27 @@ private Auth.TokenParams decodeTokenParams(Map jsonMap) { private Auth.TokenRequest decodeTokenRequest(Map jsonMap) { if (jsonMap == null) return null; final Auth.TokenRequest o = new Auth.TokenRequest(); - readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.keyName, v -> o.keyName = (String) v); + readValueFromJson( + jsonMap, PlatformConstants.TxTokenRequest.keyName, v -> o.keyName = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.nonce, v -> o.nonce = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.mac, v -> o.mac = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.capability, v -> o.capability = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.clientId, v -> o.clientId = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.timestamp, v -> o.timestamp = readValueAsLong(v)); - readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.ttl, v -> o.ttl = readValueAsLong(v)); + readValueFromJson( + jsonMap, PlatformConstants.TxTokenRequest.capability, v -> o.capability = (String) v); + readValueFromJson( + jsonMap, PlatformConstants.TxTokenRequest.clientId, v -> o.clientId = (String) v); + readValueFromJson( + jsonMap, PlatformConstants.TxTokenRequest.timestamp, v -> o.timestamp = readValueAsLong(v)); + readValueFromJson( + jsonMap, PlatformConstants.TxTokenRequest.ttl, v -> o.ttl = readValueAsLong(v)); return o; } private ChannelOptions decodeRestChannelOptions(Map jsonMap) { if (jsonMap == null) return null; ChannelOptions options = new ChannelOptions(); - options.cipherParams = decodeCipherParams((Map) jsonMap.get(PlatformConstants.TxRestChannelOptions.cipherParams)); + options.cipherParams = + decodeCipherParams( + (Map) jsonMap.get(PlatformConstants.TxRestChannelOptions.cipherParams)); if (options.cipherParams != null) { options.encrypted = true; } @@ -397,12 +587,17 @@ private ChannelOptions decodeRestChannelOptions(Map jsonMap) { private ChannelOptions decodeRealtimeChannelOptions(Map jsonMap) { if (jsonMap == null) return null; ChannelOptions options = new ChannelOptions(); - options.cipherParams = decodeCipherParams((Map) jsonMap.get(PlatformConstants.TxRealtimeChannelOptions.cipherParams)); + options.cipherParams = + decodeCipherParams( + (Map) + jsonMap.get(PlatformConstants.TxRealtimeChannelOptions.cipherParams)); if (options.cipherParams != null) { options.encrypted = true; } - options.params = (Map) jsonMap.get(PlatformConstants.TxRealtimeChannelOptions.params); - final ArrayList modes = (ArrayList) jsonMap.get(PlatformConstants.TxRealtimeChannelOptions.modes); + options.params = + (Map) jsonMap.get(PlatformConstants.TxRealtimeChannelOptions.params); + final ArrayList modes = + (ArrayList) jsonMap.get(PlatformConstants.TxRealtimeChannelOptions.modes); if (modes != null && modes.size() > 0) { options.modes = createChannelModesArray(modes); } @@ -421,9 +616,11 @@ private Map encodeCipherParams(Crypto.CipherParams cipherParams) return jsonMap; } - private Crypto.CipherParams decodeCipherParams(@Nullable Map cipherParamsDictionary) { + private Crypto.CipherParams decodeCipherParams( + @Nullable Map cipherParamsDictionary) { if (cipherParamsDictionary == null) return null; - final Integer cipherParamsHandle = (Integer) cipherParamsDictionary.get(PlatformConstants.TxCipherParams.androidHandle); + final Integer cipherParamsHandle = + (Integer) cipherParamsDictionary.get(PlatformConstants.TxCipherParams.androidHandle); return cipherParamsStorage.from(cipherParamsHandle); } @@ -459,7 +656,8 @@ private Param[] decodeRestHistoryParams(Map jsonMap) { final Object limit = jsonMap.get(PlatformConstants.TxRestHistoryParams.limit); final Object direction = jsonMap.get(PlatformConstants.TxRestHistoryParams.direction); if (start != null) { - params[index++] = new Param(PlatformConstants.TxRestHistoryParams.start, readValueAsLong(start)); + params[index++] = + new Param(PlatformConstants.TxRestHistoryParams.start, readValueAsLong(start)); } if (end != null) { params[index++] = new Param(PlatformConstants.TxRestHistoryParams.end, readValueAsLong(end)); @@ -468,7 +666,8 @@ private Param[] decodeRestHistoryParams(Map jsonMap) { params[index++] = new Param(PlatformConstants.TxRestHistoryParams.limit, (Integer) limit); } if (direction != null) { - params[index] = new Param(PlatformConstants.TxRestHistoryParams.direction, (String) direction); + params[index] = + new Param(PlatformConstants.TxRestHistoryParams.direction, (String) direction); } return params; } @@ -483,19 +682,23 @@ private Param[] decodeRealtimeHistoryParams(Map jsonMap) { final Object direction = jsonMap.get(PlatformConstants.TxRealtimeHistoryParams.direction); final Object untilAttach = jsonMap.get(PlatformConstants.TxRealtimeHistoryParams.untilAttach); if (start != null) { - params[index++] = new Param(PlatformConstants.TxRealtimeHistoryParams.start, readValueAsLong(start)); + params[index++] = + new Param(PlatformConstants.TxRealtimeHistoryParams.start, readValueAsLong(start)); } if (end != null) { - params[index++] = new Param(PlatformConstants.TxRealtimeHistoryParams.end, readValueAsLong(end)); + params[index++] = + new Param(PlatformConstants.TxRealtimeHistoryParams.end, readValueAsLong(end)); } if (limit != null) { params[index++] = new Param(PlatformConstants.TxRealtimeHistoryParams.limit, (Integer) limit); } if (direction != null) { - params[index++] = new Param(PlatformConstants.TxRealtimeHistoryParams.direction, (String) direction); + params[index++] = + new Param(PlatformConstants.TxRealtimeHistoryParams.direction, (String) direction); } if (untilAttach != null) { - params[index] = new Param(PlatformConstants.TxRealtimeHistoryParams.untilAttach, (boolean) untilAttach); + params[index] = + new Param(PlatformConstants.TxRealtimeHistoryParams.untilAttach, (boolean) untilAttach); } return params; } @@ -511,10 +714,12 @@ private Param[] decodeRestPresenceParams(Map jsonMap) { params[index++] = new Param(PlatformConstants.TxRestPresenceParams.limit, (Integer) limit); } if (clientId != null) { - params[index++] = new Param(PlatformConstants.TxRestPresenceParams.clientId, (String) clientId); + params[index++] = + new Param(PlatformConstants.TxRestPresenceParams.clientId, (String) clientId); } if (connectionId != null) { - params[index] = new Param(PlatformConstants.TxRestPresenceParams.connectionId, (String) connectionId); + params[index] = + new Param(PlatformConstants.TxRestPresenceParams.connectionId, (String) connectionId); } return params; } @@ -525,15 +730,19 @@ private Param[] decodeRealtimePresenceParams(Map jsonMap) { int index = 0; final Object waitForSync = jsonMap.get(PlatformConstants.TxRealtimePresenceParams.waitForSync); final Object clientId = jsonMap.get(PlatformConstants.TxRealtimePresenceParams.clientId); - final Object connectionId = jsonMap.get(PlatformConstants.TxRealtimePresenceParams.connectionId); + final Object connectionId = + jsonMap.get(PlatformConstants.TxRealtimePresenceParams.connectionId); if (waitForSync != null) { - params[index++] = new Param(PlatformConstants.TxRealtimePresenceParams.waitForSync, (Boolean) waitForSync); + params[index++] = + new Param(PlatformConstants.TxRealtimePresenceParams.waitForSync, (Boolean) waitForSync); } if (clientId != null) { - params[index++] = new Param(PlatformConstants.TxRealtimePresenceParams.clientId, (String) clientId); + params[index++] = + new Param(PlatformConstants.TxRealtimePresenceParams.clientId, (String) clientId); } if (connectionId != null) { - params[index] = new Param(PlatformConstants.TxRealtimePresenceParams.connectionId, (String) connectionId); + params[index] = + new Param(PlatformConstants.TxRealtimePresenceParams.connectionId, (String) connectionId); } return params; } @@ -563,15 +772,17 @@ private Message decodeChannelMessage(Map jsonMap) { readValueFromJson(jsonMap, PlatformConstants.TxMessage.id, v -> o.id = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxMessage.clientId, v -> o.clientId = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxMessage.name, v -> o.name = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxMessage.data, v -> o.data = decodeMessageData(v)); + readValueFromJson( + jsonMap, PlatformConstants.TxMessage.data, v -> o.data = decodeMessageData(v)); readValueFromJson(jsonMap, PlatformConstants.TxMessage.encoding, v -> o.encoding = (String) v); - readValueFromJson(jsonMap, PlatformConstants.TxMessage.extras, v -> o.extras = (MessageExtras) v); + readValueFromJson( + jsonMap, PlatformConstants.TxMessage.extras, v -> o.extras = (MessageExtras) v); return o; } -//=============================================================== -//=====================HANDLING WRITE============================ -//=============================================================== + // =============================================================== + // =====================HANDLING WRITE============================ + // =============================================================== private Map encodeAblyFlutterMessage(AblyFlutterMessage c) { if (c == null) return null; @@ -714,11 +925,7 @@ private Map encodePaginatedResult(AsyncPaginatedResult c for (Object item : items) { list.add((Map) pair.encode(item)); } - writeValueToJson( - jsonMap, - PlatformConstants.TxPaginatedResult.items, - list - ); + writeValueToJson(jsonMap, PlatformConstants.TxPaginatedResult.items, list); writeValueToJson(jsonMap, PlatformConstants.TxPaginatedResult.type, type & 0xff); } } else { @@ -728,25 +935,38 @@ private Map encodePaginatedResult(AsyncPaginatedResult c return jsonMap; } - private Map encodeConnectionStateChange(ConnectionStateListener.ConnectionStateChange c) { + private Map encodeConnectionStateChange( + ConnectionStateListener.ConnectionStateChange c) { if (c == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson(jsonMap, PlatformConstants.TxConnectionStateChange.current, encodeConnectionState(c.current)); - writeValueToJson(jsonMap, PlatformConstants.TxConnectionStateChange.previous, encodeConnectionState(c.previous)); - writeValueToJson(jsonMap, PlatformConstants.TxConnectionStateChange.event, encodeConnectionEvent(c.event)); + writeValueToJson( + jsonMap, + PlatformConstants.TxConnectionStateChange.current, + encodeConnectionState(c.current)); + writeValueToJson( + jsonMap, + PlatformConstants.TxConnectionStateChange.previous, + encodeConnectionState(c.previous)); + writeValueToJson( + jsonMap, PlatformConstants.TxConnectionStateChange.event, encodeConnectionEvent(c.event)); writeValueToJson(jsonMap, PlatformConstants.TxConnectionStateChange.retryIn, c.retryIn); - writeValueToJson(jsonMap, PlatformConstants.TxConnectionStateChange.reason, encodeErrorInfo(c.reason)); + writeValueToJson( + jsonMap, PlatformConstants.TxConnectionStateChange.reason, encodeErrorInfo(c.reason)); return jsonMap; } private Map encodeChannelStateChange(ChannelStateListener.ChannelStateChange c) { if (c == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson(jsonMap, PlatformConstants.TxChannelStateChange.current, encodeChannelState(c.current)); - writeValueToJson(jsonMap, PlatformConstants.TxChannelStateChange.previous, encodeChannelState(c.previous)); - writeValueToJson(jsonMap, PlatformConstants.TxChannelStateChange.event, encodeChannelEvent(c.event)); + writeValueToJson( + jsonMap, PlatformConstants.TxChannelStateChange.current, encodeChannelState(c.current)); + writeValueToJson( + jsonMap, PlatformConstants.TxChannelStateChange.previous, encodeChannelState(c.previous)); + writeValueToJson( + jsonMap, PlatformConstants.TxChannelStateChange.event, encodeChannelEvent(c.event)); writeValueToJson(jsonMap, PlatformConstants.TxChannelStateChange.resumed, c.resumed); - writeValueToJson(jsonMap, PlatformConstants.TxChannelStateChange.reason, encodeErrorInfo(c.reason)); + writeValueToJson( + jsonMap, PlatformConstants.TxChannelStateChange.reason, encodeErrorInfo(c.reason)); return jsonMap; } @@ -759,7 +979,10 @@ private Map encodeDeviceDetails(DeviceDetails c) { writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.platform, c.platform); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.formFactor, c.formFactor); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.metadata, c.metadata); - writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.devicePushDetails, encodeDevicePushDetails(c.push)); + writeValueToJson( + jsonMap, + PlatformConstants.TxDeviceDetails.devicePushDetails, + encodeDevicePushDetails(c.push)); return jsonMap; } @@ -769,8 +992,12 @@ private Map encodeDevicePushDetails(DeviceDetails.Push c) { final HashMap jsonMap = new HashMap<>(); writeValueToJson(jsonMap, PlatformConstants.TxDevicePushDetails.recipient, c.recipient); - writeValueToJson(jsonMap, PlatformConstants.TxDevicePushDetails.state, encodeDevicePushDetailsState(c.state)); - writeValueToJson(jsonMap, PlatformConstants.TxDevicePushDetails.errorReason, encodeErrorInfo(c.errorReason)); + writeValueToJson( + jsonMap, + PlatformConstants.TxDevicePushDetails.state, + encodeDevicePushDetailsState(c.state)); + writeValueToJson( + jsonMap, PlatformConstants.TxDevicePushDetails.errorReason, encodeErrorInfo(c.errorReason)); return jsonMap; } @@ -795,14 +1022,18 @@ private Map encodeLocalDevice(LocalDevice c) { final HashMap jsonMap = new HashMap<>(); writeValueToJson(jsonMap, PlatformConstants.TxLocalDevice.deviceSecret, c.deviceSecret); - writeValueToJson(jsonMap, PlatformConstants.TxLocalDevice.deviceIdentityToken, c.deviceIdentityToken); + writeValueToJson( + jsonMap, PlatformConstants.TxLocalDevice.deviceIdentityToken, c.deviceIdentityToken); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.id, c.id); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.clientId, c.clientId); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.platform, c.platform); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.formFactor, c.formFactor); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.metadata, c.metadata); - writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.devicePushDetails, encodeDevicePushDetails(c.push)); + writeValueToJson( + jsonMap, + PlatformConstants.TxDeviceDetails.devicePushDetails, + encodeDevicePushDetails(c.push)); return jsonMap; } @@ -867,7 +1098,8 @@ private Map encodePresenceMessage(PresenceMessage c) { if (c == null) return null; final HashMap jsonMap = new HashMap<>(); writeValueToJson(jsonMap, PlatformConstants.TxPresenceMessage.id, c.id); - writeValueToJson(jsonMap, PlatformConstants.TxPresenceMessage.action, encodePresenceAction(c.action)); + writeValueToJson( + jsonMap, PlatformConstants.TxPresenceMessage.action, encodePresenceAction(c.action)); writeValueToJson(jsonMap, PlatformConstants.TxPresenceMessage.clientId, c.clientId); writeValueToJson(jsonMap, PlatformConstants.TxPresenceMessage.connectionId, c.connectionId); writeValueToJson(jsonMap, PlatformConstants.TxPresenceMessage.timestamp, c.timestamp); @@ -882,7 +1114,10 @@ private Map encodeRemoteMessage(RemoteMessage message) { if (message == null) return null; final HashMap jsonMap = new HashMap<>(); writeValueToJson(jsonMap, PlatformConstants.TxRemoteMessage.data, message.getData()); - writeValueToJson(jsonMap, PlatformConstants.TxRemoteMessage.notification, encodeNotification(message.getNotification())); + writeValueToJson( + jsonMap, + PlatformConstants.TxRemoteMessage.notification, + encodeNotification(message.getNotification())); return jsonMap; } @@ -893,5 +1128,4 @@ private Map encodeNotification(RemoteMessage.Notification notifi writeValueToJson(jsonMap, PlatformConstants.TxNotification.body, notification.getBody()); return jsonMap; } - } diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java index f3b04dfea..ea8f7db1d 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java @@ -90,6 +90,7 @@ public AblyMethodCallHandler(final MethodChannel methodChannel, _map.put(PlatformConstants.PlatformMethod.releaseRealtimeChannel, this::releaseRealtimeChannel); _map.put(PlatformConstants.PlatformMethod.realtimeTime, this::realtimeTime); _map.put(PlatformConstants.PlatformMethod.restTime, this::restTime); + _map.put(PlatformConstants.PlatformMethod.realtimeStats, this::realtimeStats); // Push Notifications _map.put(PlatformConstants.PlatformMethod.pushActivate, this::pushActivate); @@ -307,6 +308,21 @@ private void getRestHistory(@NonNull MethodCall call, @NonNull MethodChannel.Res }); } + private void realtimeStats(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { + final AblyFlutterMessage message = (AblyFlutterMessage) call.arguments; + final AblyFlutterMessage> paramsMessage = (AblyFlutterMessage>) message.message; + final Map map = paramsMessage.message; + final String channelName = + (String) map.get(PlatformConstants.TxTransportKeys.channelName); + Param[] params = (Param[]) map.get(PlatformConstants.TxTransportKeys.params); + if (params == null) { + params = new Param[0]; + } + instanceStore + .getRealtime(paramsMessage.handle) + .statsAsync(params, this.paginatedResponseHandler(result, null)); + } + private void getRestPresence(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { final AblyFlutterMessage message = (AblyFlutterMessage) call.arguments; this.>>ablyDo(message, (ablyLibrary, messageData) -> { diff --git a/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java b/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java index e4c295ca8..38e4ab9ca 100644 --- a/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java +++ b/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java @@ -36,6 +36,7 @@ static final public class CodecTypes { public static final byte connectionStateChange = (byte) 152; public static final byte channelStateChange = (byte) 153; public static final byte cipherParams = (byte) 154; + public static final byte stats = (byte) 155; } static final public class PlatformMethod { @@ -446,4 +447,54 @@ static final public class TxCryptoGenerateRandomKey { public static final String keyLength = "keyLength"; } + static final public class TxStats { + public static final String all = "all"; + public static final String apiRequests = "apiRequests"; + public static final String channels = "channels"; + public static final String connections = "connections"; + public static final String inbound = "inbound"; + public static final String intervalId = "intervalId"; + public static final String outbound = "outbound"; + public static final String persisted = "persisted"; + public static final String tokenRequests = "tokenRequests"; + } + + static final public class TxStatsMessageTypes { + public static final String all = "all"; + public static final String messages = "messages"; + public static final String presence = "presence"; + } + + static final public class TxStatsMessageCount { + public static final String count = "count"; + public static final String data = "data"; + } + + static final public class TxStatsRequestCount { + public static final String failed = "failed"; + public static final String refused = "refused"; + public static final String succeeded = "succeeded"; + } + + static final public class TxStatsResourceCount { + public static final String mean = "mean"; + public static final String min = "min"; + public static final String opened = "opened"; + public static final String peak = "peak"; + public static final String refused = "refused"; + } + + static final public class TxStatsConnectionTypes { + public static final String all = "all"; + public static final String plain = "plain"; + public static final String tls = "tls"; + } + + static final public class TxStatsMessageTraffic { + public static final String all = "all"; + public static final String realtime = "realtime"; + public static final String rest = "rest"; + public static final String webhook = "webhook"; + } + } diff --git a/bin/codegen_context.dart b/bin/codegen_context.dart index 6e20344af..190d58a2f 100644 --- a/bin/codegen_context.dart +++ b/bin/codegen_context.dart @@ -38,6 +38,7 @@ Iterable> get _types sync* { // Encryption 'cipherParams', + 'stats', ]; // Custom type values must be over 127. At the time of writing @@ -510,6 +511,70 @@ const List> _objects = [ { 'name': 'CryptoGenerateRandomKey', 'properties': ['keyLength'] + }, + { + 'name': 'Stats', + 'properties': [ + 'all', + 'apiRequests', + 'channels', + 'connections', + 'inbound', + 'intervalId', + 'outbound', + 'persisted', + 'tokenRequests' + ] + }, + { + 'name': 'StatsMessageTypes', + 'properties': [ + 'all', + 'messages', + 'presence' + ] + }, + { + 'name': 'StatsMessageCount', + 'properties': [ + 'count', + 'data' + ] + }, + { + 'name': 'StatsRequestCount', + 'properties': [ + 'failed', + 'refused', + 'succeeded' + ] + }, + { + 'name': 'StatsResourceCount', + 'properties': [ + 'mean', + 'min', + 'opened', + 'peak', + 'refused' + ] + }, + { + 'name': 'StatsConnectionTypes', + 'properties': [ + 'all', + 'plain', + 'tls' + ] + }, + { + 'name': 'StatsMessageTraffic', + 'properties': [ + 'all', + 'realtime', + 'rest', + 'webhook' + ] } ]; diff --git a/example/lib/ui/realtime_sliver.dart b/example/lib/ui/realtime_sliver.dart index f9f0085d4..319ca215e 100644 --- a/example/lib/ui/realtime_sliver.dart +++ b/example/lib/ui/realtime_sliver.dart @@ -250,6 +250,17 @@ class RealtimeSliver extends HookWidget { TextRow('Data', message.data.toString()), ], )), + PaginatedResultViewer( + title: 'Stats', + subtitle: TextRow('What is it?', 'Realtime stats'), + query: () => realtime.stats(), + builder: (context, stat, _) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextRow('Statistics ', stat.toString()), + ], + )), + RealtimePresenceSliver(realtime, channel), ], ); } diff --git a/ios/Classes/codec/AblyPlatformConstants.h b/ios/Classes/codec/AblyPlatformConstants.h index f7ab0f7a7..7b30ca072 100644 --- a/ios/Classes/codec/AblyPlatformConstants.h +++ b/ios/Classes/codec/AblyPlatformConstants.h @@ -33,6 +33,7 @@ typedef NS_ENUM(UInt8, CodecType) { CodecTypeConnectionStateChange = 152, CodecTypeChannelStateChange = 153, CodecTypeCipherParams = 154, + CodecTypeStats = 155, }; @@ -401,3 +402,46 @@ extern NSString *const TxCryptoGetParams_key; // key constants for CryptoGenerateRandomKey extern NSString *const TxCryptoGenerateRandomKey_keyLength; + +// key constants for Stats +extern NSString *const TxStats_all; +extern NSString *const TxStats_apiRequests; +extern NSString *const TxStats_channels; +extern NSString *const TxStats_connections; +extern NSString *const TxStats_inbound; +extern NSString *const TxStats_intervalId; +extern NSString *const TxStats_outbound; +extern NSString *const TxStats_persisted; +extern NSString *const TxStats_tokenRequests; + +// key constants for StatsMessageTypes +extern NSString *const TxStatsMessageTypes_all; +extern NSString *const TxStatsMessageTypes_messages; +extern NSString *const TxStatsMessageTypes_presence; + +// key constants for StatsMessageCount +extern NSString *const TxStatsMessageCount_count; +extern NSString *const TxStatsMessageCount_data; + +// key constants for StatsRequestCount +extern NSString *const TxStatsRequestCount_failed; +extern NSString *const TxStatsRequestCount_refused; +extern NSString *const TxStatsRequestCount_succeeded; + +// key constants for StatsResourceCount +extern NSString *const TxStatsResourceCount_mean; +extern NSString *const TxStatsResourceCount_min; +extern NSString *const TxStatsResourceCount_opened; +extern NSString *const TxStatsResourceCount_peak; +extern NSString *const TxStatsResourceCount_refused; + +// key constants for StatsConnectionTypes +extern NSString *const TxStatsConnectionTypes_all; +extern NSString *const TxStatsConnectionTypes_plain; +extern NSString *const TxStatsConnectionTypes_tls; + +// key constants for StatsMessageTraffic +extern NSString *const TxStatsMessageTraffic_all; +extern NSString *const TxStatsMessageTraffic_realtime; +extern NSString *const TxStatsMessageTraffic_rest; +extern NSString *const TxStatsMessageTraffic_webhook; diff --git a/ios/Classes/codec/AblyPlatformConstants.m b/ios/Classes/codec/AblyPlatformConstants.m index ea516e0f8..35574d4ca 100644 --- a/ios/Classes/codec/AblyPlatformConstants.m +++ b/ios/Classes/codec/AblyPlatformConstants.m @@ -371,3 +371,46 @@ // key constants for CryptoGenerateRandomKey NSString *const TxCryptoGenerateRandomKey_keyLength = @"keyLength"; + +// key constants for Stats +NSString *const TxStats_all = @"all"; +NSString *const TxStats_apiRequests = @"apiRequests"; +NSString *const TxStats_channels = @"channels"; +NSString *const TxStats_connections = @"connections"; +NSString *const TxStats_inbound = @"inbound"; +NSString *const TxStats_intervalId = @"intervalId"; +NSString *const TxStats_outbound = @"outbound"; +NSString *const TxStats_persisted = @"persisted"; +NSString *const TxStats_tokenRequests = @"tokenRequests"; + +// key constants for StatsMessageTypes +NSString *const TxStatsMessageTypes_all = @"all"; +NSString *const TxStatsMessageTypes_messages = @"messages"; +NSString *const TxStatsMessageTypes_presence = @"presence"; + +// key constants for StatsMessageCount +NSString *const TxStatsMessageCount_count = @"count"; +NSString *const TxStatsMessageCount_data = @"data"; + +// key constants for StatsRequestCount +NSString *const TxStatsRequestCount_failed = @"failed"; +NSString *const TxStatsRequestCount_refused = @"refused"; +NSString *const TxStatsRequestCount_succeeded = @"succeeded"; + +// key constants for StatsResourceCount +NSString *const TxStatsResourceCount_mean = @"mean"; +NSString *const TxStatsResourceCount_min = @"min"; +NSString *const TxStatsResourceCount_opened = @"opened"; +NSString *const TxStatsResourceCount_peak = @"peak"; +NSString *const TxStatsResourceCount_refused = @"refused"; + +// key constants for StatsConnectionTypes +NSString *const TxStatsConnectionTypes_all = @"all"; +NSString *const TxStatsConnectionTypes_plain = @"plain"; +NSString *const TxStatsConnectionTypes_tls = @"tls"; + +// key constants for StatsMessageTraffic +NSString *const TxStatsMessageTraffic_all = @"all"; +NSString *const TxStatsMessageTraffic_realtime = @"realtime"; +NSString *const TxStatsMessageTraffic_rest = @"rest"; +NSString *const TxStatsMessageTraffic_webhook = @"webhook"; diff --git a/lib/src/generated/platform_constants.dart b/lib/src/generated/platform_constants.dart index 10c0cfeb2..4dad84c76 100644 --- a/lib/src/generated/platform_constants.dart +++ b/lib/src/generated/platform_constants.dart @@ -33,6 +33,7 @@ class CodecTypes { static const int connectionStateChange = 152; static const int channelStateChange = 153; static const int cipherParams = 154; + static const int stats = 155; } class PlatformMethod { @@ -450,3 +451,53 @@ class TxCryptoGetParams { class TxCryptoGenerateRandomKey { static const String keyLength = 'keyLength'; } + +class TxStats { + static const String all = 'all'; + static const String apiRequests = 'apiRequests'; + static const String channels = 'channels'; + static const String connections = 'connections'; + static const String inbound = 'inbound'; + static const String intervalId = 'intervalId'; + static const String outbound = 'outbound'; + static const String persisted = 'persisted'; + static const String tokenRequests = 'tokenRequests'; +} + +class TxStatsMessageTypes { + static const String all = 'all'; + static const String messages = 'messages'; + static const String presence = 'presence'; +} + +class TxStatsMessageCount { + static const String count = 'count'; + static const String data = 'data'; +} + +class TxStatsRequestCount { + static const String failed = 'failed'; + static const String refused = 'refused'; + static const String succeeded = 'succeeded'; +} + +class TxStatsResourceCount { + static const String mean = 'mean'; + static const String min = 'min'; + static const String opened = 'opened'; + static const String peak = 'peak'; + static const String refused = 'refused'; +} + +class TxStatsConnectionTypes { + static const String all = 'all'; + static const String plain = 'plain'; + static const String tls = 'tls'; +} + +class TxStatsMessageTraffic { + static const String all = 'all'; + static const String realtime = 'realtime'; + static const String rest = 'rest'; + static const String webhook = 'webhook'; +} diff --git a/lib/src/platform/src/realtime/realtime.dart b/lib/src/platform/src/realtime/realtime.dart index a8e215a2f..76cf0c07a 100644 --- a/lib/src/platform/src/realtime/realtime.dart +++ b/lib/src/platform/src/realtime/realtime.dart @@ -103,8 +103,14 @@ class Realtime extends PlatformObject { /// gets stats based on params as a [PaginatedResult] /// /// https://docs.ably.com/client-lib-development-guide/features/#RSC6 - Future> stats([Map? params]) { - throw UnimplementedError(); + Future> stats([Map params = const {}]) async{ + final message = + await invokeRequest(PlatformMethod.realtimeStats,{ + TxTransportKeys.params: params + }); + return PaginatedResult.fromAblyMessage( + AblyMessage.castFrom(message), + ); } /// returns server time From fdd302725b639c466f3839b03902ef81a282ff9b Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 21 Dec 2021 09:50:41 +0000 Subject: [PATCH 26/52] Moved stats mapping from realtime to rest --- .../flutter/plugin/AblyMethodCallHandler.java | 20 +++++++++++-------- bin/codegen_context.dart | 2 +- example/lib/ui/rest_sliver.dart | 13 ++++++++++++ ios/Classes/codec/AblyPlatformConstants.h | 2 +- ios/Classes/codec/AblyPlatformConstants.m | 2 +- lib/src/generated/platform_constants.dart | 2 +- lib/src/platform/src/realtime/realtime.dart | 13 ------------ lib/src/platform/src/rest/rest.dart | 12 ++++++++--- 8 files changed, 38 insertions(+), 28 deletions(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java index ea8f7db1d..f4a919b7a 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java @@ -90,7 +90,7 @@ public AblyMethodCallHandler(final MethodChannel methodChannel, _map.put(PlatformConstants.PlatformMethod.releaseRealtimeChannel, this::releaseRealtimeChannel); _map.put(PlatformConstants.PlatformMethod.realtimeTime, this::realtimeTime); _map.put(PlatformConstants.PlatformMethod.restTime, this::restTime); - _map.put(PlatformConstants.PlatformMethod.realtimeStats, this::realtimeStats); + _map.put(PlatformConstants.PlatformMethod.stats, this::stats); // Push Notifications _map.put(PlatformConstants.PlatformMethod.pushActivate, this::pushActivate); @@ -308,18 +308,22 @@ private void getRestHistory(@NonNull MethodCall call, @NonNull MethodChannel.Res }); } - private void realtimeStats(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { + private void stats(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { final AblyFlutterMessage message = (AblyFlutterMessage) call.arguments; final AblyFlutterMessage> paramsMessage = (AblyFlutterMessage>) message.message; final Map map = paramsMessage.message; - final String channelName = - (String) map.get(PlatformConstants.TxTransportKeys.channelName); - Param[] params = (Param[]) map.get(PlatformConstants.TxTransportKeys.params); - if (params == null) { - params = new Param[0]; + final HashMap paramsMap = + (HashMap) map.get(PlatformConstants.TxTransportKeys.params); + Param[] params = new Param[paramsMap != null ? paramsMap.size():0]; + if (paramsMap != null) { + int i = 0; + for (String paramKey: paramsMap.keySet()){ + final Param param = new Param(paramKey,paramsMap.get(paramKey)); + params[i++] = param; + } } instanceStore - .getRealtime(paramsMessage.handle) + .getRest(paramsMessage.handle) .statsAsync(params, this.paginatedResponseHandler(result, null)); } diff --git a/bin/codegen_context.dart b/bin/codegen_context.dart index 190d58a2f..c836f55cd 100644 --- a/bin/codegen_context.dart +++ b/bin/codegen_context.dart @@ -97,7 +97,7 @@ const List> _platformMethods = [ {'name': 'realtimeHistory', 'value': 'realtimeHistory'}, {'name': 'realtimeTime', 'value': 'realtimeTime'}, {'name': 'restTime', 'value': 'restTime'}, - {'name': 'realtimeStats', 'value': 'realtimeStats'}, + {'name': 'stats', 'value': 'stats'}, // Push Notifications {'name': 'pushActivate', 'value': 'pushActivate'}, diff --git a/example/lib/ui/rest_sliver.dart b/example/lib/ui/rest_sliver.dart index 78195594a..740ffc6fb 100644 --- a/example/lib/ui/rest_sliver.dart +++ b/example/lib/ui/rest_sliver.dart @@ -91,7 +91,20 @@ class RestSliver extends HookWidget { channel.presence.history(ably.RestHistoryParams(limit: 10)), builder: (context, message, _) => TextRow('Message name', '${message.id}:${message.clientId}:${message.data}')), + PaginatedResultViewer( + title: 'Stats', + subtitle: TextRow( + 'What is it?', + 'Realtime stats'), + query: () => rest.stats(), + builder: (context, stat, _) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextRow('Statistics ', stat.toString()), + ], + )), ], ); + } } diff --git a/ios/Classes/codec/AblyPlatformConstants.h b/ios/Classes/codec/AblyPlatformConstants.h index 7b30ca072..193c4160b 100644 --- a/ios/Classes/codec/AblyPlatformConstants.h +++ b/ios/Classes/codec/AblyPlatformConstants.h @@ -67,7 +67,7 @@ extern NSString *const AblyPlatformMethod_releaseRealtimeChannel; extern NSString *const AblyPlatformMethod_realtimeHistory; extern NSString *const AblyPlatformMethod_realtimeTime; extern NSString *const AblyPlatformMethod_restTime; -extern NSString *const AblyPlatformMethod_realtimeStats; +extern NSString *const AblyPlatformMethod_stats; extern NSString *const AblyPlatformMethod_pushActivate; extern NSString *const AblyPlatformMethod_pushDeactivate; extern NSString *const AblyPlatformMethod_pushSubscribeDevice; diff --git a/ios/Classes/codec/AblyPlatformConstants.m b/ios/Classes/codec/AblyPlatformConstants.m index 35574d4ca..ead5db17b 100644 --- a/ios/Classes/codec/AblyPlatformConstants.m +++ b/ios/Classes/codec/AblyPlatformConstants.m @@ -36,7 +36,7 @@ NSString *const AblyPlatformMethod_realtimeHistory= @"realtimeHistory"; NSString *const AblyPlatformMethod_realtimeTime= @"realtimeTime"; NSString *const AblyPlatformMethod_restTime= @"restTime"; -NSString *const AblyPlatformMethod_realtimeStats= @"realtimeStats"; +NSString *const AblyPlatformMethod_stats= @"stats"; NSString *const AblyPlatformMethod_pushActivate= @"pushActivate"; NSString *const AblyPlatformMethod_pushDeactivate= @"pushDeactivate"; NSString *const AblyPlatformMethod_pushSubscribeDevice= @"pushSubscribeDevice"; diff --git a/lib/src/generated/platform_constants.dart b/lib/src/generated/platform_constants.dart index 4dad84c76..2d978f22a 100644 --- a/lib/src/generated/platform_constants.dart +++ b/lib/src/generated/platform_constants.dart @@ -67,7 +67,7 @@ class PlatformMethod { static const String realtimeHistory = 'realtimeHistory'; static const String realtimeTime = 'realtimeTime'; static const String restTime = 'restTime'; - static const String realtimeStats = 'realtimeStats'; + static const String stats = 'stats'; static const String pushActivate = 'pushActivate'; static const String pushDeactivate = 'pushDeactivate'; static const String pushSubscribeDevice = 'pushSubscribeDevice'; diff --git a/lib/src/platform/src/realtime/realtime.dart b/lib/src/platform/src/realtime/realtime.dart index 76cf0c07a..9912f6077 100644 --- a/lib/src/platform/src/realtime/realtime.dart +++ b/lib/src/platform/src/realtime/realtime.dart @@ -100,19 +100,6 @@ class Realtime extends PlatformObject { // throw UnimplementedError(); // } - /// gets stats based on params as a [PaginatedResult] - /// - /// https://docs.ably.com/client-lib-development-guide/features/#RSC6 - Future> stats([Map params = const {}]) async{ - final message = - await invokeRequest(PlatformMethod.realtimeStats,{ - TxTransportKeys.params: params - }); - return PaginatedResult.fromAblyMessage( - AblyMessage.castFrom(message), - ); - } - /// returns server time /// /// https://docs.ably.com/client-lib-development-guide/features/#RSC16 diff --git a/lib/src/platform/src/rest/rest.dart b/lib/src/platform/src/rest/rest.dart index 8c2e8e4a5..46367b3f2 100644 --- a/lib/src/platform/src/rest/rest.dart +++ b/lib/src/platform/src/rest/rest.dart @@ -58,9 +58,15 @@ class Rest extends PlatformObject { /// gets stats based on params as a [PaginatedResult] /// /// https://docs.ably.com/client-lib-development-guide/features/#RSC6 - // Future> stats([Map? params]) { - // throw UnimplementedError(); - // } + Future> stats([Map params = const {}]) async{ + final message = + await invokeRequest(PlatformMethod.stats,{ + TxTransportKeys.params: params + }); + return PaginatedResult.fromAblyMessage( + AblyMessage.castFrom(message), + ); + } /// returns server time /// From e58883751452a1d719a980857e00067dd6531cd0 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 21 Dec 2021 15:30:02 +0000 Subject: [PATCH 27/52] File formatting --- .../ably/flutter/plugin/AblyMessageCodec.java | 120 ++++++++++++------ .../flutter/plugin/AblyMethodCallHandler.java | 35 ++--- bin/codegen_context.dart | 38 +----- example/lib/ui/realtime_sliver.dart | 1 - example/lib/ui/rest_sliver.dart | 15 +-- lib/src/generated/platform_constants.dart | 6 +- lib/src/platform/src/rest/rest.dart | 8 +- 7 files changed, 116 insertions(+), 107 deletions(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java index 6c56ef624..be6b09550 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java @@ -122,9 +122,7 @@ public AblyMessageCodec(CipherParamsStorage cipherParamsStorage) { put( PlatformConstants.CodecTypes.realtimeHistoryParams, new CodecPair<>(null, self::decodeRealtimeHistoryParams)); - put( - PlatformConstants.CodecTypes.stats, - new CodecPair<>(self::encodeStats,null)); + put(PlatformConstants.CodecTypes.stats, new CodecPair<>(self::encodeStats, null)); put( PlatformConstants.CodecTypes.restPresenceParams, new CodecPair<>(null, self::decodeRestPresenceParams)); @@ -175,80 +173,120 @@ public AblyMessageCodec(CipherParamsStorage cipherParamsStorage) { private Map encodeStats(Stats stats) { if (stats == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson(jsonMap, PlatformConstants.TxStats.all,encodeStatsMessageTypes(stats.all)); - writeValueToJson(jsonMap, PlatformConstants.TxStats.apiRequests, encodeStatsRequestCount(stats.apiRequests)); - writeValueToJson(jsonMap, PlatformConstants.TxStats.channels, encodeStatsResourceCount(stats.channels)); - writeValueToJson(jsonMap, PlatformConstants.TxStats.connections, encodeStatsConnectionTypes(stats.connections)); - writeValueToJson(jsonMap, PlatformConstants.TxStats.inbound, encodeStatsMessageTraffic(stats.inbound)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.all, encodeStatsMessageTypes(stats.all)); + writeValueToJson( + jsonMap, PlatformConstants.TxStats.apiRequests, encodeStatsRequestCount(stats.apiRequests)); + writeValueToJson( + jsonMap, PlatformConstants.TxStats.channels, encodeStatsResourceCount(stats.channels)); + writeValueToJson( + jsonMap, + PlatformConstants.TxStats.connections, + encodeStatsConnectionTypes(stats.connections)); + writeValueToJson( + jsonMap, PlatformConstants.TxStats.inbound, encodeStatsMessageTraffic(stats.inbound)); writeValueToJson(jsonMap, PlatformConstants.TxStats.intervalId, stats.intervalId); - writeValueToJson(jsonMap, PlatformConstants.TxStats.outbound, encodeStatsMessageTraffic(stats.outbound)); - writeValueToJson(jsonMap, PlatformConstants.TxStats.persisted, encodeStatsMessageTypes(stats.persisted)); - writeValueToJson(jsonMap, PlatformConstants.TxStats.tokenRequests, encodeStatsRequestCount(stats.tokenRequests)); + writeValueToJson( + jsonMap, PlatformConstants.TxStats.outbound, encodeStatsMessageTraffic(stats.outbound)); + writeValueToJson( + jsonMap, PlatformConstants.TxStats.persisted, encodeStatsMessageTypes(stats.persisted)); + writeValueToJson( + jsonMap, + PlatformConstants.TxStats.tokenRequests, + encodeStatsRequestCount(stats.tokenRequests)); return jsonMap; } private Map encodeStatsMessageTraffic(Stats.MessageTraffic messageTraffic) { if (messageTraffic == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTraffic.all,encodeStatsMessageTypes(messageTraffic.all)); - writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTraffic.realtime, - encodeStatsMessageTypes(messageTraffic.realtime)); - writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTraffic.rest, - encodeStatsMessageTypes(messageTraffic.rest)); - writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTraffic.webhook, - encodeStatsMessageTypes(messageTraffic.webhook)); + writeValueToJson( + jsonMap, + PlatformConstants.TxStatsMessageTraffic.all, + encodeStatsMessageTypes(messageTraffic.all)); + writeValueToJson( + jsonMap, + PlatformConstants.TxStatsMessageTraffic.realtime, + encodeStatsMessageTypes(messageTraffic.realtime)); + writeValueToJson( + jsonMap, + PlatformConstants.TxStatsMessageTraffic.rest, + encodeStatsMessageTypes(messageTraffic.rest)); + writeValueToJson( + jsonMap, + PlatformConstants.TxStatsMessageTraffic.webhook, + encodeStatsMessageTypes(messageTraffic.webhook)); return jsonMap; } private Map encodeStatsConnectionTypes(Stats.ConnectionTypes connectionTypes) { if (connectionTypes == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson(jsonMap, PlatformConstants.TxStatsConnectionTypes.all, - encodeStatsResourceCount(connectionTypes.all)); - writeValueToJson(jsonMap, PlatformConstants.TxStatsConnectionTypes.plain, - encodeStatsResourceCount(connectionTypes.plain)); - writeValueToJson(jsonMap, PlatformConstants.TxStatsConnectionTypes.tls, - encodeStatsResourceCount(connectionTypes.tls)); + writeValueToJson( + jsonMap, + PlatformConstants.TxStatsConnectionTypes.all, + encodeStatsResourceCount(connectionTypes.all)); + writeValueToJson( + jsonMap, + PlatformConstants.TxStatsConnectionTypes.plain, + encodeStatsResourceCount(connectionTypes.plain)); + writeValueToJson( + jsonMap, + PlatformConstants.TxStatsConnectionTypes.tls, + encodeStatsResourceCount(connectionTypes.tls)); return jsonMap; } private Map encodeStatsResourceCount(Stats.ResourceCount resourceCount) { if (resourceCount == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson(jsonMap,PlatformConstants.TxStatsResourceCount.mean,resourceCount.mean); - writeValueToJson(jsonMap,PlatformConstants.TxStatsResourceCount.min,resourceCount.min); - writeValueToJson(jsonMap,PlatformConstants.TxStatsResourceCount.opened,resourceCount.opened); - writeValueToJson(jsonMap,PlatformConstants.TxStatsResourceCount.peak,resourceCount.peak); - writeValueToJson(jsonMap,PlatformConstants.TxStatsResourceCount.refused,resourceCount.refused); + writeValueToJson(jsonMap, PlatformConstants.TxStatsResourceCount.mean, resourceCount.mean); + writeValueToJson(jsonMap, PlatformConstants.TxStatsResourceCount.min, resourceCount.min); + writeValueToJson(jsonMap, PlatformConstants.TxStatsResourceCount.opened, resourceCount.opened); + writeValueToJson(jsonMap, PlatformConstants.TxStatsResourceCount.peak, resourceCount.peak); + writeValueToJson( + jsonMap, PlatformConstants.TxStatsResourceCount.refused, resourceCount.refused); return jsonMap; } private Map encodeStatsRequestCount(Stats.RequestCount apiRequests) { if (apiRequests == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson(jsonMap,PlatformConstants.TxStatsRequestCount.succeeded,apiRequests.succeeded); - writeValueToJson(jsonMap,PlatformConstants.TxStatsRequestCount.failed,apiRequests.failed); - writeValueToJson(jsonMap,PlatformConstants.TxStatsRequestCount.refused,apiRequests.refused); + writeValueToJson( + jsonMap, PlatformConstants.TxStatsRequestCount.succeeded, apiRequests.succeeded); + writeValueToJson(jsonMap, PlatformConstants.TxStatsRequestCount.failed, apiRequests.failed); + writeValueToJson(jsonMap, PlatformConstants.TxStatsRequestCount.refused, apiRequests.refused); return jsonMap; } - private Map encodeStatsMessageTypes(Stats.MessageTypes messageTypes){ + private Map encodeStatsMessageTypes(Stats.MessageTypes messageTypes) { if (messageTypes == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson(jsonMap,PlatformConstants.TxStatsMessageTypes.all,encodeMessageCategory(messageTypes.all)); - writeValueToJson(jsonMap,PlatformConstants.TxStatsMessageTypes.messages,encodeMessageCategory(messageTypes.messages)); - writeValueToJson(jsonMap,PlatformConstants.TxStatsMessageTypes.presence,encodeMessageCategory(messageTypes.presence)); + writeValueToJson( + jsonMap, + PlatformConstants.TxStatsMessageTypes.all, + encodeMessageCategory(messageTypes.all)); + writeValueToJson( + jsonMap, + PlatformConstants.TxStatsMessageTypes.messages, + encodeMessageCategory(messageTypes.messages)); + writeValueToJson( + jsonMap, + PlatformConstants.TxStatsMessageTypes.presence, + encodeMessageCategory(messageTypes.presence)); return jsonMap; } - //that's StatsMessageCount in Flutter's side + // that's StatsMessageCount in Flutter's side private Map encodeMessageCategory(Stats.MessageCategory category) { if (category == null) return null; if (category.category == null) return null; final HashMap jsonMap = new HashMap<>(); - //There is a mapping consistencey issue between two, so just assume there is a single message for now - for (String key : category.category.keySet()){ - writeValueToJson(jsonMap,PlatformConstants.TxStatsMessageCount.count, category.category.get(key).count); - writeValueToJson(jsonMap,PlatformConstants.TxStatsMessageCount.data, category.category.get(key).data); + // There is a mapping consistencey issue between two, so just assume there is a single message + // for now + for (String key : category.category.keySet()) { + writeValueToJson( + jsonMap, PlatformConstants.TxStatsMessageCount.count, category.category.get(key).count); + writeValueToJson( + jsonMap, PlatformConstants.TxStatsMessageCount.data, category.category.get(key).data); } return jsonMap; } diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java index f4a919b7a..924ad0d7e 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMethodCallHandler.java @@ -308,24 +308,25 @@ private void getRestHistory(@NonNull MethodCall call, @NonNull MethodChannel.Res }); } - private void stats(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { - final AblyFlutterMessage message = (AblyFlutterMessage) call.arguments; - final AblyFlutterMessage> paramsMessage = (AblyFlutterMessage>) message.message; - final Map map = paramsMessage.message; - final HashMap paramsMap = - (HashMap) map.get(PlatformConstants.TxTransportKeys.params); - Param[] params = new Param[paramsMap != null ? paramsMap.size():0]; - if (paramsMap != null) { - int i = 0; - for (String paramKey: paramsMap.keySet()){ - final Param param = new Param(paramKey,paramsMap.get(paramKey)); - params[i++] = param; - } - } - instanceStore - .getRest(paramsMessage.handle) - .statsAsync(params, this.paginatedResponseHandler(result, null)); + private void stats(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { + final AblyFlutterMessage message = (AblyFlutterMessage) call.arguments; + final AblyFlutterMessage> paramsMessage = + (AblyFlutterMessage>) message.message; + final Map map = paramsMessage.message; + final HashMap paramsMap = + (HashMap) map.get(PlatformConstants.TxTransportKeys.params); + Param[] params = new Param[paramsMap != null ? paramsMap.size() : 0]; + if (paramsMap != null) { + int i = 0; + for (String paramKey : paramsMap.keySet()) { + final Param param = new Param(paramKey, paramsMap.get(paramKey)); + params[i++] = param; + } } + instanceStore + .getRest(paramsMessage.handle) + .statsAsync(params, this.paginatedResponseHandler(result, null)); + } private void getRestPresence(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { final AblyFlutterMessage message = (AblyFlutterMessage) call.arguments; diff --git a/bin/codegen_context.dart b/bin/codegen_context.dart index c836f55cd..cd948bcd8 100644 --- a/bin/codegen_context.dart +++ b/bin/codegen_context.dart @@ -528,53 +528,27 @@ const List> _objects = [ }, { 'name': 'StatsMessageTypes', - 'properties': [ - 'all', - 'messages', - 'presence' - ] + 'properties': ['all', 'messages', 'presence'] }, { 'name': 'StatsMessageCount', - 'properties': [ - 'count', - 'data' - ] + 'properties': ['count', 'data'] }, { 'name': 'StatsRequestCount', - 'properties': [ - 'failed', - 'refused', - 'succeeded' - ] + 'properties': ['failed', 'refused', 'succeeded'] }, { 'name': 'StatsResourceCount', - 'properties': [ - 'mean', - 'min', - 'opened', - 'peak', - 'refused' - ] + 'properties': ['mean', 'min', 'opened', 'peak', 'refused'] }, { 'name': 'StatsConnectionTypes', - 'properties': [ - 'all', - 'plain', - 'tls' - ] + 'properties': ['all', 'plain', 'tls'] }, { 'name': 'StatsMessageTraffic', - 'properties': [ - 'all', - 'realtime', - 'rest', - 'webhook' - ] + 'properties': ['all', 'realtime', 'rest', 'webhook'] } ]; diff --git a/example/lib/ui/realtime_sliver.dart b/example/lib/ui/realtime_sliver.dart index 319ca215e..19a5d300e 100644 --- a/example/lib/ui/realtime_sliver.dart +++ b/example/lib/ui/realtime_sliver.dart @@ -260,7 +260,6 @@ class RealtimeSliver extends HookWidget { TextRow('Statistics ', stat.toString()), ], )), - RealtimePresenceSliver(realtime, channel), ], ); } diff --git a/example/lib/ui/rest_sliver.dart b/example/lib/ui/rest_sliver.dart index 740ffc6fb..7fffcc6e8 100644 --- a/example/lib/ui/rest_sliver.dart +++ b/example/lib/ui/rest_sliver.dart @@ -93,18 +93,15 @@ class RestSliver extends HookWidget { '${message.id}:${message.clientId}:${message.data}')), PaginatedResultViewer( title: 'Stats', - subtitle: TextRow( - 'What is it?', - 'Realtime stats'), + subtitle: TextRow('What is it?', 'Realtime stats'), query: () => rest.stats(), builder: (context, stat, _) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextRow('Statistics ', stat.toString()), - ], - )), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextRow('Statistics ', stat.toString()), + ], + )), ], ); - } } diff --git a/lib/src/generated/platform_constants.dart b/lib/src/generated/platform_constants.dart index 2d978f22a..012075f58 100644 --- a/lib/src/generated/platform_constants.dart +++ b/lib/src/generated/platform_constants.dart @@ -385,7 +385,8 @@ class TxPushRequestPermission { static const String alert = 'alert'; static const String carPlay = 'carPlay'; static const String criticalAlert = 'criticalAlert'; - static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = + 'providesAppNotificationSettings'; static const String provisional = 'provisional'; static const String announcement = 'announcement'; } @@ -401,7 +402,8 @@ class TxUNNotificationSettings { static const String alertStyle = 'alertStyle'; static const String showPreviewsSetting = 'showPreviewsSetting'; static const String criticalAlertSetting = 'criticalAlertSetting'; - static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = + 'providesAppNotificationSettings'; static const String announcementSetting = 'announcementSetting'; static const String scheduledDeliverySetting = 'scheduledDeliverySetting'; static const String timeSensitiveSetting = 'timeSensitiveSetting'; diff --git a/lib/src/platform/src/rest/rest.dart b/lib/src/platform/src/rest/rest.dart index 46367b3f2..33c5690f5 100644 --- a/lib/src/platform/src/rest/rest.dart +++ b/lib/src/platform/src/rest/rest.dart @@ -58,11 +58,9 @@ class Rest extends PlatformObject { /// gets stats based on params as a [PaginatedResult] /// /// https://docs.ably.com/client-lib-development-guide/features/#RSC6 - Future> stats([Map params = const {}]) async{ - final message = - await invokeRequest(PlatformMethod.stats,{ - TxTransportKeys.params: params - }); + Future> stats([Map? params]) async { + final message = await invokeRequest( + PlatformMethod.stats, {TxTransportKeys.params: params}); return PaginatedResult.fromAblyMessage( AblyMessage.castFrom(message), ); From 8a18f2505341d9e72040230fd29afdebbeddf206 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 21 Dec 2021 17:44:46 +0000 Subject: [PATCH 28/52] Created StatsEncoder for iOS --- .../codec/encoders/StatsEncoders.swift | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 ios/Classes/codec/encoders/StatsEncoders.swift diff --git a/ios/Classes/codec/encoders/StatsEncoders.swift b/ios/Classes/codec/encoders/StatsEncoders.swift new file mode 100644 index 000000000..3a94ff400 --- /dev/null +++ b/ios/Classes/codec/encoders/StatsEncoders.swift @@ -0,0 +1,72 @@ +// +// Created by Ikbal Kaya on 21/12/2021. +// + +import Foundation + +public class StatsEncoders: NSObject { + @objc + public static let encodeStats: (ARTStats) -> [String: Any] = { stats in + [ + TxStats_all: encodeStatMessageTypes(stats.all), + TxStats_apiRequests: encodeStatsMessageTypes(stats.apiRequests), + TxStats_channels:encodeStatsResourceCount(stats.channels), + TxStats_connections:encodeStatsConnectionTypes(stats.connections), + TxStats_inbound:encodeStatsMessageTraffic(stats.inbound), + TxStats_intervalId:stats.intervalId, + TxStats_outbound:encodeStatsMessageTraffic(stats.outbound), + TxStats_persisted:encodeStatsMessageTypes(stats.persisted), + TxStats_tokenRequests: encodeStatsRequestCount(stats.tokenRequests) + ] + } + + static let encodeStatsMessageTypes: (ARTStatsMessageTypes) -> [String: Any] = { types in + [ + TxStatsMessageTypes_all: encodeStatsMessageCount(types.all), + TxStatsMessageTypes_messages: encodeStatsMessageCount(types.messages), + TxStatsMessageTypes_presence: encodeStatsMessageCount(types.presence) + ] + } + + static let encodeStatsMessageCount: (ARTStatsMessageCount) -> [String: Any] = { count in + [ + TxStatsMessageCount_count: count.count, + TxStatsMessageCount_data:count.data + ] + } + + static let encodeStatsRequestCount: (ARTStatsRequestCount) -> [String: Any] = { count in + [ + TxStatsRequestCount_failed: count.failed, + TxStatsRequestCount_refused: count.refused, + TxStatsRequestCount_succeeded: count.succeeded + ] + } + + static let encodeStatsResourceCount: (ARTStatsResourceCount) -> [String: Any] = { count in + [ + TxStatsResourceCount_mean:count.mean, + TxStatsResourceCount_min:count.min, + TxStatsResourceCount_opened:count.opened, + TxStatsResourceCount_peak:count.peak, + TxStatsResourceCount_refused:count.refused + ] + } + + static let encodeStatsConnectionTypes: (ARTStatsConnectionTypes) -> [String: Any] = { types in + [ + TxStatsConnectionTypes_all: encodeStatsResourceCount(types.all), + TxStatsConnectionTypes_plain: encodeStatsResourceCount(types.plain), + TxStatsConnectionTypes_tls: encodeStatsResourceCount(types.tls), + ] + } + + static let encodeStatsMessageTraffic: (ARTStatsMessageTraffic) -> [String: Any] = { types in + [ + TxStatsMessageTraffic_all: encodeStatMessageTypes(types.all), + TxStatsMessageTraffic_realtime: encodeStatMessageTypes(types.realtime), + TxStatsMessageTraffic_rest: encodeStatMessageTypes(types.rest), + TxStatsMessageTraffic_webhook: encodeStatMessageTypes(types.webhook) + ] + } +} \ No newline at end of file From 8fc48e26de1ca8715d3d30ff092b3686d116029a Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Tue, 21 Dec 2021 17:46:38 +0000 Subject: [PATCH 29/52] Stats encoding mappings in Obj-C --- ios/Classes/codec/AblyFlutterWriter.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ios/Classes/codec/AblyFlutterWriter.m b/ios/Classes/codec/AblyFlutterWriter.m index dfd2c9596..c542d16a0 100644 --- a/ios/Classes/codec/AblyFlutterWriter.m +++ b/ios/Classes/codec/AblyFlutterWriter.m @@ -51,6 +51,8 @@ + (UInt8) getType:(id)value{ return CodecTypeRestChannelOptions; } else if ([value isKindOfClass:[ARTCipherParams class]]) { return CodecTypeCipherParams; + } else if([value isKindOfClass:[ARTStats class]]){ + return CodecTypeStats; } return 0; } @@ -71,6 +73,7 @@ + (AblyCodecEncoder) getEncoder:(const NSString*)type { [NSString stringWithFormat:@"%d", CodecTypeUnNotificationSettings]: PushNotificationEncoders.encodeUNNotificationSettings, [NSString stringWithFormat:@"%d", CodecTypeRemoteMessage]: PushNotificationEncoders.encodeRemoteMessage, [NSString stringWithFormat:@"%d", CodecTypeCipherParams]: CryptoCodec.encodeCipherParams, + [NSString stringWithFormat:@"%d", CodecTypeStats]: StatsEncoders.encodeStats, }; return [_handlers objectForKey:[NSString stringWithFormat:@"%@", type]]; } @@ -317,4 +320,5 @@ +(NSString *) encodePresenceAction: (ARTPresenceAction) action { return dictionary; }; + @end From d04a956d6019c3aa562e7b97d849973d14b53bf3 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Wed, 22 Dec 2021 15:51:17 +0000 Subject: [PATCH 30/52] Fix function calls in StatsEncoders --- ios/Classes/codec/encoders/StatsEncoders.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Classes/codec/encoders/StatsEncoders.swift b/ios/Classes/codec/encoders/StatsEncoders.swift index 3a94ff400..7ab558452 100644 --- a/ios/Classes/codec/encoders/StatsEncoders.swift +++ b/ios/Classes/codec/encoders/StatsEncoders.swift @@ -8,8 +8,8 @@ public class StatsEncoders: NSObject { @objc public static let encodeStats: (ARTStats) -> [String: Any] = { stats in [ - TxStats_all: encodeStatMessageTypes(stats.all), - TxStats_apiRequests: encodeStatsMessageTypes(stats.apiRequests), + TxStats_all: encodeStatsMessageTypes(stats.all), + TxStats_apiRequests: encodeStatsRequestCount(stats.apiRequests), TxStats_channels:encodeStatsResourceCount(stats.channels), TxStats_connections:encodeStatsConnectionTypes(stats.connections), TxStats_inbound:encodeStatsMessageTraffic(stats.inbound), @@ -63,10 +63,10 @@ public class StatsEncoders: NSObject { static let encodeStatsMessageTraffic: (ARTStatsMessageTraffic) -> [String: Any] = { types in [ - TxStatsMessageTraffic_all: encodeStatMessageTypes(types.all), - TxStatsMessageTraffic_realtime: encodeStatMessageTypes(types.realtime), - TxStatsMessageTraffic_rest: encodeStatMessageTypes(types.rest), - TxStatsMessageTraffic_webhook: encodeStatMessageTypes(types.webhook) + TxStatsMessageTraffic_all: encodeStatsMessageTypes(types.all), + TxStatsMessageTraffic_realtime: encodeStatsMessageTypes(types.realtime), + TxStatsMessageTraffic_rest: encodeStatsMessageTypes(types.rest), + TxStatsMessageTraffic_webhook: encodeStatsMessageTypes(types.webhook) ] } -} \ No newline at end of file +} From da160058dca9577e4c64186d1c75f28bcdd8cf01 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Wed, 22 Dec 2021 15:52:20 +0000 Subject: [PATCH 31/52] Stats function mapping in Objective-C --- ios/Classes/AblyFlutter.m | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ios/Classes/AblyFlutter.m b/ios/Classes/AblyFlutter.m index 3bf63c990..e6ce44dda 100644 --- a/ios/Classes/AblyFlutter.m +++ b/ios/Classes/AblyFlutter.m @@ -577,6 +577,21 @@ -(void)reset; }]; }; +static const FlutterHandler _stats = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { + AblyFlutterMessage *const message = call.arguments; + AblyInstanceStore *const instanceStore = [ably instanceStore]; + + ARTRest *const rest = [instanceStore restFrom:message.message]; + [rest stats:^(ARTPaginatedResult *statsResult, ARTErrorInfo *error) { + if(error){ + result(error); + }else{ + result(statsResult); + } + }]; + +}; + static const FlutterHandler _getNextPage = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { AblyFlutterMessage *const message = call.arguments; AblyInstanceStore *const instanceStore = [ably instanceStore]; @@ -695,6 +710,7 @@ -(instancetype)initWithChannel:(FlutterMethodChannel *const)channel AblyPlatformMethod_releaseRealtimeChannel: _releaseRealtimeChannel, AblyPlatformMethod_realtimeTime:_realtimeTime, AblyPlatformMethod_restTime:_restTime, + AblyPlatformMethod_stats:_stats, // Push Notifications AblyPlatformMethod_pushActivate: PushHandlers.activate, AblyPlatformMethod_pushRequestPermission: PushHandlers.requestPermission, From bb2d95468aef30222d4f1a5b4f9fa2f81cb1095e Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Wed, 22 Dec 2021 16:05:24 +0000 Subject: [PATCH 32/52] File formattings --- .../codec/encoders/StatsEncoders.swift | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/ios/Classes/codec/encoders/StatsEncoders.swift b/ios/Classes/codec/encoders/StatsEncoders.swift index 7ab558452..fd407b8c8 100644 --- a/ios/Classes/codec/encoders/StatsEncoders.swift +++ b/ios/Classes/codec/encoders/StatsEncoders.swift @@ -10,13 +10,13 @@ public class StatsEncoders: NSObject { [ TxStats_all: encodeStatsMessageTypes(stats.all), TxStats_apiRequests: encodeStatsRequestCount(stats.apiRequests), - TxStats_channels:encodeStatsResourceCount(stats.channels), - TxStats_connections:encodeStatsConnectionTypes(stats.connections), - TxStats_inbound:encodeStatsMessageTraffic(stats.inbound), - TxStats_intervalId:stats.intervalId, - TxStats_outbound:encodeStatsMessageTraffic(stats.outbound), - TxStats_persisted:encodeStatsMessageTypes(stats.persisted), - TxStats_tokenRequests: encodeStatsRequestCount(stats.tokenRequests) + TxStats_channels: encodeStatsResourceCount(stats.channels), + TxStats_connections: encodeStatsConnectionTypes(stats.connections), + TxStats_inbound: encodeStatsMessageTraffic(stats.inbound), + TxStats_intervalId: stats.intervalId, + TxStats_outbound: encodeStatsMessageTraffic(stats.outbound), + TxStats_persisted: encodeStatsMessageTypes(stats.persisted), + TxStats_tokenRequests: encodeStatsRequestCount(stats.tokenRequests), ] } @@ -24,14 +24,14 @@ public class StatsEncoders: NSObject { [ TxStatsMessageTypes_all: encodeStatsMessageCount(types.all), TxStatsMessageTypes_messages: encodeStatsMessageCount(types.messages), - TxStatsMessageTypes_presence: encodeStatsMessageCount(types.presence) + TxStatsMessageTypes_presence: encodeStatsMessageCount(types.presence), ] } static let encodeStatsMessageCount: (ARTStatsMessageCount) -> [String: Any] = { count in [ TxStatsMessageCount_count: count.count, - TxStatsMessageCount_data:count.data + TxStatsMessageCount_data: count.data, ] } @@ -39,17 +39,17 @@ public class StatsEncoders: NSObject { [ TxStatsRequestCount_failed: count.failed, TxStatsRequestCount_refused: count.refused, - TxStatsRequestCount_succeeded: count.succeeded + TxStatsRequestCount_succeeded: count.succeeded, ] } static let encodeStatsResourceCount: (ARTStatsResourceCount) -> [String: Any] = { count in [ - TxStatsResourceCount_mean:count.mean, - TxStatsResourceCount_min:count.min, - TxStatsResourceCount_opened:count.opened, - TxStatsResourceCount_peak:count.peak, - TxStatsResourceCount_refused:count.refused + TxStatsResourceCount_mean: count.mean, + TxStatsResourceCount_min: count.min, + TxStatsResourceCount_opened: count.opened, + TxStatsResourceCount_peak: count.peak, + TxStatsResourceCount_refused: count.refused, ] } @@ -66,7 +66,7 @@ public class StatsEncoders: NSObject { TxStatsMessageTraffic_all: encodeStatsMessageTypes(types.all), TxStatsMessageTraffic_realtime: encodeStatsMessageTypes(types.realtime), TxStatsMessageTraffic_rest: encodeStatsMessageTypes(types.rest), - TxStatsMessageTraffic_webhook: encodeStatsMessageTypes(types.webhook) + TxStatsMessageTraffic_webhook: encodeStatsMessageTypes(types.webhook), ] } } From 244cb8fc6238d9f865c060ffa547d5c64e441f2d Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Thu, 23 Dec 2021 11:15:10 +0000 Subject: [PATCH 33/52] Fix messageCategory encoding --- .../ably/flutter/plugin/AblyMessageCodec.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java index be6b09550..67a1b85d7 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java @@ -275,19 +275,18 @@ private Map encodeStatsMessageTypes(Stats.MessageTypes messageTy encodeMessageCategory(messageTypes.presence)); return jsonMap; } - // that's StatsMessageCount in Flutter's side + + // This is different in other platform and will correspond to StatsMessageCount for other libraries private Map encodeMessageCategory(Stats.MessageCategory category) { if (category == null) return null; if (category.category == null) return null; final HashMap jsonMap = new HashMap<>(); - // There is a mapping consistencey issue between two, so just assume there is a single message - // for now - for (String key : category.category.keySet()) { - writeValueToJson( - jsonMap, PlatformConstants.TxStatsMessageCount.count, category.category.get(key).count); - writeValueToJson( - jsonMap, PlatformConstants.TxStatsMessageCount.data, category.category.get(key).data); - } + + writeValueToJson( + jsonMap, PlatformConstants.TxStatsMessageCount.count, category.count); + writeValueToJson( + jsonMap, PlatformConstants.TxStatsMessageCount.data, category.data); + return jsonMap; } From 13f57de0e62db7e4ce7c26f692e38da64164f857 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Thu, 23 Dec 2021 11:33:57 +0000 Subject: [PATCH 34/52] File formatting --- .../java/io/ably/flutter/plugin/AblyMessageCodec.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java index 67a1b85d7..fd72cce0c 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java @@ -276,16 +276,15 @@ private Map encodeStatsMessageTypes(Stats.MessageTypes messageTy return jsonMap; } - // This is different in other platform and will correspond to StatsMessageCount for other libraries + // This is different in other platform and will correspond to StatsMessageCount for other + // libraries private Map encodeMessageCategory(Stats.MessageCategory category) { if (category == null) return null; if (category.category == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson( - jsonMap, PlatformConstants.TxStatsMessageCount.count, category.count); - writeValueToJson( - jsonMap, PlatformConstants.TxStatsMessageCount.data, category.data); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageCount.count, category.count); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageCount.data, category.data); return jsonMap; } From 7be18b9439527d1b986d660a0cf639e89b47231c Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Thu, 23 Dec 2021 12:15:21 +0000 Subject: [PATCH 35/52] Added params to the call in example app and confirmed it's working in Android side --- example/lib/ui/rest_sliver.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/lib/ui/rest_sliver.dart b/example/lib/ui/rest_sliver.dart index 7fffcc6e8..109f35c03 100644 --- a/example/lib/ui/rest_sliver.dart +++ b/example/lib/ui/rest_sliver.dart @@ -94,7 +94,7 @@ class RestSliver extends HookWidget { PaginatedResultViewer( title: 'Stats', subtitle: TextRow('What is it?', 'Realtime stats'), - query: () => rest.stats(), + query: () => rest.stats({ "limit":100, "end":"now" }), builder: (context, stat, _) => Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ From cd12ae18a6c9b73c721de9ea15c793232413578b Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Thu, 23 Dec 2021 15:56:33 +0000 Subject: [PATCH 36/52] Added param query builder for stat params --- ios/Classes/AblyFlutter.m | 18 +++++-- .../codec/ARTStatsQuery+ParamBuilder.h | 12 +++++ .../codec/ARTStatsQuery+ParamBuilder.m | 47 +++++++++++++++++++ 3 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 ios/Classes/codec/ARTStatsQuery+ParamBuilder.h create mode 100644 ios/Classes/codec/ARTStatsQuery+ParamBuilder.m diff --git a/ios/Classes/AblyFlutter.m b/ios/Classes/AblyFlutter.m index e6ce44dda..ad33bac43 100644 --- a/ios/Classes/AblyFlutter.m +++ b/ios/Classes/AblyFlutter.m @@ -2,6 +2,7 @@ #import "AblyFlutter.h" #import +#import #import "codec/AblyFlutterReaderWriter.h" #import "AblyFlutterMessage.h" @@ -9,6 +10,7 @@ #import "AblyFlutterStreamHandler.h" #import "AblyStreamsChannel.h" #import "codec/AblyPlatformConstants.h" +#import "ARTStatsQuery+ParamBuilder.h" #define LOG(fmt, ...) NSLog((@"%@:%d " fmt), [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, ##__VA_ARGS__) @@ -578,17 +580,25 @@ -(void)reset; }; static const FlutterHandler _stats = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { - AblyFlutterMessage *const message = call.arguments; + AblyFlutterMessage *const arguments = call.arguments; AblyInstanceStore *const instanceStore = [ably instanceStore]; + ARTRest *const rest = [instanceStore restFrom:arguments.message]; + AblyFlutterMessage *message = arguments.message; + NSDictionary *paramsDict = message.message; + ARTStatsQuery *query; + if(paramsDict[@"params"]){ + NSDictionary *statsParams = paramsDict[@"params"]; + query = [ARTStatsQuery fromParams:statsParams]; + } - ARTRest *const rest = [instanceStore restFrom:message.message]; - [rest stats:^(ARTPaginatedResult *statsResult, ARTErrorInfo *error) { + NSError *statsError; + [rest stats:query callback:^(ARTPaginatedResult *statsResult, ARTErrorInfo *error) { if(error){ result(error); }else{ result(statsResult); } - }]; + } error:&statsError]; }; diff --git a/ios/Classes/codec/ARTStatsQuery+ParamBuilder.h b/ios/Classes/codec/ARTStatsQuery+ParamBuilder.h new file mode 100644 index 000000000..33e472172 --- /dev/null +++ b/ios/Classes/codec/ARTStatsQuery+ParamBuilder.h @@ -0,0 +1,12 @@ +// +// Created by Ikbal Kaya on 23/12/2021. +// + +#import +#import "ARTStats.h" + +@interface ARTStatsQuery (ParamBuilder) + ++(ARTStatsQuery *)fromParams:(NSDictionary *)params; + +@end \ No newline at end of file diff --git a/ios/Classes/codec/ARTStatsQuery+ParamBuilder.m b/ios/Classes/codec/ARTStatsQuery+ParamBuilder.m new file mode 100644 index 000000000..1e191cdd5 --- /dev/null +++ b/ios/Classes/codec/ARTStatsQuery+ParamBuilder.m @@ -0,0 +1,47 @@ +// +// Created by Ikbal Kaya on 23/12/2021. +// + +#import "ARTStatsQuery+ParamBuilder.h" +#import "ARTNSDate+ARTUtil.h" + + +@implementation ARTStatsQuery (ParamBuilder) ++ (ARTStatsQuery *)fromParams:(NSDictionary *)params { + ARTStatsQuery *query = [[ARTStatsQuery alloc] init]; + id start = params[@"start"]; + if(start && [start isKindOfClass:[NSNumber class]]){ + query.start = [NSDate artDateFromIntegerMs:[start longLongValue]]; + } + id end = params[@"end"]; + if(end && [end isKindOfClass:[NSNumber class]]){ + query.end = [NSDate artDateFromIntegerMs:[end longLongValue]]; + } + id direction = params[@"direction"]; + if(direction && [direction isKindOfClass:[NSString class]]){ + NSString *directionString = [direction stringValue]; + query.direction = [directionString isEqualToString:@"backwards"] ? ARTQueryDirectionBackwards : ARTQueryDirectionForwards; + } + id limit = params[@"limit"]; + if(limit && [limit isKindOfClass:[NSNumber class]]){ + query.limit = (uint16_t) [limit unsignedIntValue]; + } + + id unit = params[@"unit"]; + if(unit && [unit isKindOfClass:[NSString class]]){ + NSString *unitVal = [unit stringValue]; + // minute, hour, day or month, + if ([unitVal isEqualToString:@"minute"]){ + query.unit = ARTStatsGranularityMinute; + }else if ([unitVal isEqualToString:@"hour"]){ + query.unit = ARTStatsGranularityHour; + }else if ([unitVal isEqualToString:@"day"]){ + query.unit = ARTStatsGranularityDay; + }else if ([unitVal isEqualToString:@"month"]){ + query.unit = ARTStatsGranularityMonth; + } + } + return query; +} + +@end \ No newline at end of file From 6f2cfd6ce9aef9528131f8887592cd2be8a01277 Mon Sep 17 00:00:00 2001 From: ikbalkaya Date: Thu, 23 Dec 2021 15:56:59 +0000 Subject: [PATCH 37/52] file formatting --- example/lib/ui/rest_sliver.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/lib/ui/rest_sliver.dart b/example/lib/ui/rest_sliver.dart index 109f35c03..b1b9caa46 100644 --- a/example/lib/ui/rest_sliver.dart +++ b/example/lib/ui/rest_sliver.dart @@ -94,7 +94,7 @@ class RestSliver extends HookWidget { PaginatedResultViewer( title: 'Stats', subtitle: TextRow('What is it?', 'Realtime stats'), - query: () => rest.stats({ "limit":100, "end":"now" }), + query: () => rest.stats({"limit": 100, "end": "now"}), builder: (context, stat, _) => Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ From f48023ee29cfad2990c2c61b36c77155b2fd4a2f Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Wed, 2 Feb 2022 18:07:49 +0100 Subject: [PATCH 38/52] Removed leftover realtime stats widget --- example/lib/ui/realtime_sliver.dart | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/example/lib/ui/realtime_sliver.dart b/example/lib/ui/realtime_sliver.dart index 19a5d300e..f9f0085d4 100644 --- a/example/lib/ui/realtime_sliver.dart +++ b/example/lib/ui/realtime_sliver.dart @@ -250,16 +250,6 @@ class RealtimeSliver extends HookWidget { TextRow('Data', message.data.toString()), ], )), - PaginatedResultViewer( - title: 'Stats', - subtitle: TextRow('What is it?', 'Realtime stats'), - query: () => realtime.stats(), - builder: (context, stat, _) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextRow('Statistics ', stat.toString()), - ], - )), ], ); } From 8bf9837c4c4a6d2254ffe8131323ebb8547b7a54 Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Wed, 2 Feb 2022 18:08:29 +0100 Subject: [PATCH 39/52] Regenerated platform constants --- .../io/ably/flutter/plugin/generated/PlatformConstants.java | 1 + lib/src/generated/platform_constants.dart | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java b/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java index 38e4ab9ca..498c03cb5 100644 --- a/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java +++ b/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java @@ -69,6 +69,7 @@ static final public class PlatformMethod { public static final String realtimeHistory = "realtimeHistory"; public static final String realtimeTime = "realtimeTime"; public static final String restTime = "restTime"; + public static final String stats = "stats"; public static final String pushActivate = "pushActivate"; public static final String pushDeactivate = "pushDeactivate"; public static final String pushSubscribeDevice = "pushSubscribeDevice"; diff --git a/lib/src/generated/platform_constants.dart b/lib/src/generated/platform_constants.dart index 012075f58..2d978f22a 100644 --- a/lib/src/generated/platform_constants.dart +++ b/lib/src/generated/platform_constants.dart @@ -385,8 +385,7 @@ class TxPushRequestPermission { static const String alert = 'alert'; static const String carPlay = 'carPlay'; static const String criticalAlert = 'criticalAlert'; - static const String providesAppNotificationSettings = - 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; static const String provisional = 'provisional'; static const String announcement = 'announcement'; } @@ -402,8 +401,7 @@ class TxUNNotificationSettings { static const String alertStyle = 'alertStyle'; static const String showPreviewsSetting = 'showPreviewsSetting'; static const String criticalAlertSetting = 'criticalAlertSetting'; - static const String providesAppNotificationSettings = - 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; static const String announcementSetting = 'announcementSetting'; static const String scheduledDeliverySetting = 'scheduledDeliverySetting'; static const String timeSensitiveSetting = 'timeSensitiveSetting'; From c902a1ea011cb290159b69179a0c2f027072c0ec Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Thu, 3 Feb 2022 15:36:26 +0100 Subject: [PATCH 40/52] Added Java message codec support for Stats message type --- .../src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java index fd72cce0c..26286295f 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java @@ -345,6 +345,8 @@ private Byte getType(Object value) { } else if (value instanceof ChannelOptions) { // Encoding it into a RealtimeChannelOptions instance, because it extends RestChannelOptions return PlatformConstants.CodecTypes.realtimeChannelOptions; + } else if (value instanceof Stats) { + return PlatformConstants.CodecTypes.stats; } return null; } From c130b31d08388e34574e53d205b5710490a1e6c9 Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Thu, 3 Feb 2022 18:59:33 +0100 Subject: [PATCH 41/52] Implemented basic methods for decoding Stats JSON object --- lib/src/platform/src/codec.dart | 28 ++++++++++++++++++++- lib/src/stats/src/stats.dart | 12 +++++++++ lib/src/stats/src/stats_resource_count.dart | 16 +++++++----- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/lib/src/platform/src/codec.dart b/lib/src/platform/src/codec.dart index 041e80736..f3430b3e0 100644 --- a/lib/src/platform/src/codec.dart +++ b/lib/src/platform/src/codec.dart @@ -84,7 +84,7 @@ class Codec extends StandardMessageCodec { _encodeRealtimePresenceParams, null, ), - + CodecTypes.stats: _CodecPair(null, _decodeStats), // Push Notifications CodecTypes.deviceDetails: _CodecPair(null, _decodeDeviceDetails), @@ -1056,6 +1056,32 @@ class Codec extends StandardMessageCodec { ); } + /// Decodes value [jsonMap] to [Stats] + /// returns null if [jsonMap] is null + /// FIXME: For now only decodes interval and channels + Stats _decodeStats(Map jsonMap) { + final channelsJson = toJsonMap(_readFromJson( + jsonMap, + TxStats.channels, + )); + return Stats( + channels: (channelsJson != null) + ? _decodeStatsResourceCount(channelsJson) + : null, + intervalId: _readFromJson(jsonMap, TxStats.intervalId)); + } + + StatsResourceCount _decodeStatsResourceCount(Map jsonMap) => + StatsResourceCount( + mean: _readFromJson(jsonMap, TxStatsResourceCount.mean), + min: _readFromJson(jsonMap, TxStatsResourceCount.min), + opened: _readFromJson(jsonMap, TxStatsResourceCount.opened), + peak: _readFromJson(jsonMap, TxStatsResourceCount.peak), + refused: _readFromJson( + jsonMap, + TxStatsRequestCount.refused, + )); + /// Decodes [action] to [PresenceAction] enum if not null PresenceAction? _decodePresenceAction(String? action) { switch (action) { diff --git a/lib/src/stats/src/stats.dart b/lib/src/stats/src/stats.dart index 9f0016c1c..ba233877b 100644 --- a/lib/src/stats/src/stats.dart +++ b/lib/src/stats/src/stats.dart @@ -4,6 +4,18 @@ import 'package:ably_flutter/ably_flutter.dart'; /// /// https://docs.ably.com/client-lib-development-guide/features/#TS1 class Stats { + /// Creates a stats instance + Stats( + {this.all, + this.apiRequests, + this.channels, + this.connections, + this.inbound, + this.intervalId, + this.outbound, + this.persisted, + this.tokenRequests}); + /// Aggregates inbound and outbound messages. /// /// https://docs.ably.com/client-lib-development-guide/features/#TS12e diff --git a/lib/src/stats/src/stats_resource_count.dart b/lib/src/stats/src/stats_resource_count.dart index 89781023f..922e30ddd 100644 --- a/lib/src/stats/src/stats_resource_count.dart +++ b/lib/src/stats/src/stats_resource_count.dart @@ -2,19 +2,23 @@ /// in a specific scope /// /// https://docs.ably.com/client-lib-development-guide/features/#TS9 -abstract class StatsResourceCount { +class StatsResourceCount { + /// Creates instance of [StatsResourceCount] + StatsResourceCount( + {this.mean, this.min, this.opened, this.peak, this.refused}); + /// Average resources of this type used for this period. - int? mean; + double? mean; /// Minimum total resources of this type used for this period. - int? min; + double? min; /// Total resources of this type opened. - int? opened; + double? opened; /// Peak resources of this type used for this period. - int? peak; + double? peak; /// Resource requests refused within this period. - int? refused; + double? refused; } From d66e5aa58553ef53ecf88cc0a2aba2672d2de330 Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Thu, 3 Feb 2022 19:01:18 +0100 Subject: [PATCH 42/52] Reduced Stats count fetched in example app --- example/lib/ui/rest_sliver.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/lib/ui/rest_sliver.dart b/example/lib/ui/rest_sliver.dart index b1b9caa46..7a7dc1de5 100644 --- a/example/lib/ui/rest_sliver.dart +++ b/example/lib/ui/rest_sliver.dart @@ -94,7 +94,7 @@ class RestSliver extends HookWidget { PaginatedResultViewer( title: 'Stats', subtitle: TextRow('What is it?', 'Realtime stats'), - query: () => rest.stats({"limit": 100, "end": "now"}), + query: () => rest.stats({"limit": 10, "end": "now"}), builder: (context, stat, _) => Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ From 0e7ad6a33cb27d6fb6ab8e774a75e8839a5b018d Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Thu, 3 Feb 2022 19:50:40 +0100 Subject: [PATCH 43/52] Removed unnecessary formatting changes from AblyMessageCodec to make the PR readable --- .../ably/flutter/plugin/AblyMessageCodec.java | 551 ++++++------------ 1 file changed, 182 insertions(+), 369 deletions(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java index 26286295f..bab601da9 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java @@ -1,11 +1,19 @@ package io.ably.flutter.plugin; import androidx.annotation.Nullable; + import com.google.firebase.messaging.RemoteMessage; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; + +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + import io.ably.flutter.plugin.generated.PlatformConstants; import io.ably.flutter.plugin.types.PlatformClientOptions; import io.ably.flutter.plugin.util.CipherParamsStorage; @@ -36,11 +44,6 @@ import io.ably.lib.util.Crypto; import io.ably.lib.util.Log; import io.flutter.plugin.common.StandardMessageCodec; -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; public class AblyMessageCodec extends StandardMessageCodec { @@ -86,153 +89,95 @@ T decode(Map jsonMap) { public AblyMessageCodec(CipherParamsStorage cipherParamsStorage) { final AblyMessageCodec self = this; this.cipherParamsStorage = cipherParamsStorage; - codecMap = - new HashMap() { - { - put( - PlatformConstants.CodecTypes.ablyMessage, - new CodecPair<>(self::encodeAblyFlutterMessage, self::decodeAblyFlutterMessage)); - put( - PlatformConstants.CodecTypes.ablyEventMessage, - new CodecPair<>(null, self::decodeAblyFlutterEventMessage)); - put( - PlatformConstants.CodecTypes.clientOptions, - new CodecPair<>(null, self::decodeClientOptions)); - put( - PlatformConstants.CodecTypes.tokenParams, - new CodecPair<>(self::encodeTokenParams, null)); - put( - PlatformConstants.CodecTypes.tokenDetails, - new CodecPair<>(null, self::decodeTokenDetails)); - put( - PlatformConstants.CodecTypes.tokenRequest, - new CodecPair<>(null, self::decodeTokenRequest)); - put( - PlatformConstants.CodecTypes.restChannelOptions, - new CodecPair<>(null, self::decodeRestChannelOptions)); - put( - PlatformConstants.CodecTypes.realtimeChannelOptions, - new CodecPair<>(null, self::decodeRealtimeChannelOptions)); - put( - PlatformConstants.CodecTypes.paginatedResult, - new CodecPair<>(self::encodePaginatedResult, null)); - put( - PlatformConstants.CodecTypes.restHistoryParams, - new CodecPair<>(null, self::decodeRestHistoryParams)); - put( - PlatformConstants.CodecTypes.realtimeHistoryParams, - new CodecPair<>(null, self::decodeRealtimeHistoryParams)); - put(PlatformConstants.CodecTypes.stats, new CodecPair<>(self::encodeStats, null)); - put( - PlatformConstants.CodecTypes.restPresenceParams, - new CodecPair<>(null, self::decodeRestPresenceParams)); - put( - PlatformConstants.CodecTypes.realtimePresenceParams, - new CodecPair<>(null, self::decodeRealtimePresenceParams)); - put( - PlatformConstants.CodecTypes.errorInfo, - new CodecPair<>(self::encodeErrorInfo, null)); - put( - PlatformConstants.CodecTypes.messageData, - new CodecPair<>(null, self::decodeChannelMessageData)); - put( - PlatformConstants.CodecTypes.messageExtras, - new CodecPair<>( - self::encodeChannelMessageExtras, self::decodeChannelMessageExtras)); - put( - PlatformConstants.CodecTypes.message, - new CodecPair<>(self::encodeChannelMessage, self::decodeChannelMessage)); - put( - PlatformConstants.CodecTypes.presenceMessage, - new CodecPair<>(self::encodePresenceMessage, null)); - put( - PlatformConstants.CodecTypes.connectionStateChange, - new CodecPair<>(self::encodeConnectionStateChange, null)); - put( - PlatformConstants.CodecTypes.channelStateChange, - new CodecPair<>(self::encodeChannelStateChange, null)); - put( - PlatformConstants.CodecTypes.deviceDetails, - new CodecPair<>(self::encodeDeviceDetails, null)); - put( - PlatformConstants.CodecTypes.localDevice, - new CodecPair<>(self::encodeLocalDevice, null)); - put( - PlatformConstants.CodecTypes.pushChannelSubscription, - new CodecPair<>(self::encodePushChannelSubscription, null)); - put( - PlatformConstants.CodecTypes.remoteMessage, - new CodecPair<>(self::encodeRemoteMessage, null)); - put( - PlatformConstants.CodecTypes.cipherParams, - new CodecPair<>(self::encodeCipherParams, self::decodeCipherParams)); - } - }; + codecMap = new HashMap() { + { + put(PlatformConstants.CodecTypes.ablyMessage, + new CodecPair<>(self::encodeAblyFlutterMessage, self::decodeAblyFlutterMessage)); + put(PlatformConstants.CodecTypes.ablyEventMessage, + new CodecPair<>(null, self::decodeAblyFlutterEventMessage)); + put(PlatformConstants.CodecTypes.clientOptions, + new CodecPair<>(null, self::decodeClientOptions)); + put(PlatformConstants.CodecTypes.tokenParams, + new CodecPair<>(self::encodeTokenParams, null)); + put(PlatformConstants.CodecTypes.tokenDetails, + new CodecPair<>(null, self::decodeTokenDetails)); + put(PlatformConstants.CodecTypes.tokenRequest, + new CodecPair<>(null, self::decodeTokenRequest)); + put(PlatformConstants.CodecTypes.restChannelOptions, + new CodecPair<>(null, self::decodeRestChannelOptions)); + put(PlatformConstants.CodecTypes.realtimeChannelOptions, + new CodecPair<>(null, self::decodeRealtimeChannelOptions)); + put(PlatformConstants.CodecTypes.paginatedResult, + new CodecPair<>(self::encodePaginatedResult, null)); + put(PlatformConstants.CodecTypes.restHistoryParams, + new CodecPair<>(null, self::decodeRestHistoryParams)); + put(PlatformConstants.CodecTypes.realtimeHistoryParams, + new CodecPair<>(null, self::decodeRealtimeHistoryParams)); + put(PlatformConstants.CodecTypes.stats, + new CodecPair<>(self::encodeStats, null)); + put(PlatformConstants.CodecTypes.restPresenceParams, + new CodecPair<>(null, self::decodeRestPresenceParams)); + put(PlatformConstants.CodecTypes.realtimePresenceParams, + new CodecPair<>(null, self::decodeRealtimePresenceParams)); + put(PlatformConstants.CodecTypes.errorInfo, + new CodecPair<>(self::encodeErrorInfo, null)); + put(PlatformConstants.CodecTypes.messageData, + new CodecPair<>(null, self::decodeChannelMessageData)); + put(PlatformConstants.CodecTypes.messageExtras, + new CodecPair<>(self::encodeChannelMessageExtras, self::decodeChannelMessageExtras)); + put(PlatformConstants.CodecTypes.message, + new CodecPair<>(self::encodeChannelMessage, self::decodeChannelMessage)); + put(PlatformConstants.CodecTypes.presenceMessage, + new CodecPair<>(self::encodePresenceMessage, null)); + put(PlatformConstants.CodecTypes.connectionStateChange, + new CodecPair<>(self::encodeConnectionStateChange, null)); + put(PlatformConstants.CodecTypes.channelStateChange, + new CodecPair<>(self::encodeChannelStateChange, null)); + put(PlatformConstants.CodecTypes.deviceDetails, + new CodecPair<>(self::encodeDeviceDetails, null)); + put(PlatformConstants.CodecTypes.localDevice, + new CodecPair<>(self::encodeLocalDevice, null)); + put(PlatformConstants.CodecTypes.pushChannelSubscription, + new CodecPair<>(self::encodePushChannelSubscription, null)); + put(PlatformConstants.CodecTypes.remoteMessage, + new CodecPair<>(self::encodeRemoteMessage, null)); + put(PlatformConstants.CodecTypes.cipherParams, + new CodecPair<>(self::encodeCipherParams, self::decodeCipherParams)); + } + }; } private Map encodeStats(Stats stats) { if (stats == null) return null; final HashMap jsonMap = new HashMap<>(); writeValueToJson(jsonMap, PlatformConstants.TxStats.all, encodeStatsMessageTypes(stats.all)); - writeValueToJson( - jsonMap, PlatformConstants.TxStats.apiRequests, encodeStatsRequestCount(stats.apiRequests)); - writeValueToJson( - jsonMap, PlatformConstants.TxStats.channels, encodeStatsResourceCount(stats.channels)); - writeValueToJson( - jsonMap, - PlatformConstants.TxStats.connections, - encodeStatsConnectionTypes(stats.connections)); - writeValueToJson( - jsonMap, PlatformConstants.TxStats.inbound, encodeStatsMessageTraffic(stats.inbound)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.apiRequests, encodeStatsRequestCount(stats.apiRequests)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.channels, encodeStatsResourceCount(stats.channels)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.connections, encodeStatsConnectionTypes(stats.connections)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.inbound, encodeStatsMessageTraffic(stats.inbound)); writeValueToJson(jsonMap, PlatformConstants.TxStats.intervalId, stats.intervalId); - writeValueToJson( - jsonMap, PlatformConstants.TxStats.outbound, encodeStatsMessageTraffic(stats.outbound)); - writeValueToJson( - jsonMap, PlatformConstants.TxStats.persisted, encodeStatsMessageTypes(stats.persisted)); - writeValueToJson( - jsonMap, - PlatformConstants.TxStats.tokenRequests, - encodeStatsRequestCount(stats.tokenRequests)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.outbound, encodeStatsMessageTraffic(stats.outbound)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.persisted, encodeStatsMessageTypes(stats.persisted)); + writeValueToJson(jsonMap, PlatformConstants.TxStats.tokenRequests, encodeStatsRequestCount(stats.tokenRequests)); return jsonMap; } private Map encodeStatsMessageTraffic(Stats.MessageTraffic messageTraffic) { if (messageTraffic == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson( - jsonMap, - PlatformConstants.TxStatsMessageTraffic.all, - encodeStatsMessageTypes(messageTraffic.all)); - writeValueToJson( - jsonMap, - PlatformConstants.TxStatsMessageTraffic.realtime, - encodeStatsMessageTypes(messageTraffic.realtime)); - writeValueToJson( - jsonMap, - PlatformConstants.TxStatsMessageTraffic.rest, - encodeStatsMessageTypes(messageTraffic.rest)); - writeValueToJson( - jsonMap, - PlatformConstants.TxStatsMessageTraffic.webhook, - encodeStatsMessageTypes(messageTraffic.webhook)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTraffic.all, encodeStatsMessageTypes(messageTraffic.all)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTraffic.realtime, encodeStatsMessageTypes(messageTraffic.realtime)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTraffic.rest, encodeStatsMessageTypes(messageTraffic.rest)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTraffic.webhook, encodeStatsMessageTypes(messageTraffic.webhook)); return jsonMap; } private Map encodeStatsConnectionTypes(Stats.ConnectionTypes connectionTypes) { if (connectionTypes == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson( - jsonMap, - PlatformConstants.TxStatsConnectionTypes.all, - encodeStatsResourceCount(connectionTypes.all)); - writeValueToJson( - jsonMap, - PlatformConstants.TxStatsConnectionTypes.plain, - encodeStatsResourceCount(connectionTypes.plain)); - writeValueToJson( - jsonMap, - PlatformConstants.TxStatsConnectionTypes.tls, - encodeStatsResourceCount(connectionTypes.tls)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsConnectionTypes.all, encodeStatsResourceCount(connectionTypes.all)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsConnectionTypes.plain, encodeStatsResourceCount(connectionTypes.plain)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsConnectionTypes.tls, encodeStatsResourceCount(connectionTypes.tls)); return jsonMap; } @@ -243,16 +188,14 @@ private Map encodeStatsResourceCount(Stats.ResourceCount resourc writeValueToJson(jsonMap, PlatformConstants.TxStatsResourceCount.min, resourceCount.min); writeValueToJson(jsonMap, PlatformConstants.TxStatsResourceCount.opened, resourceCount.opened); writeValueToJson(jsonMap, PlatformConstants.TxStatsResourceCount.peak, resourceCount.peak); - writeValueToJson( - jsonMap, PlatformConstants.TxStatsResourceCount.refused, resourceCount.refused); + writeValueToJson(jsonMap, PlatformConstants.TxStatsResourceCount.refused, resourceCount.refused); return jsonMap; } private Map encodeStatsRequestCount(Stats.RequestCount apiRequests) { if (apiRequests == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson( - jsonMap, PlatformConstants.TxStatsRequestCount.succeeded, apiRequests.succeeded); + writeValueToJson(jsonMap, PlatformConstants.TxStatsRequestCount.succeeded, apiRequests.succeeded); writeValueToJson(jsonMap, PlatformConstants.TxStatsRequestCount.failed, apiRequests.failed); writeValueToJson(jsonMap, PlatformConstants.TxStatsRequestCount.refused, apiRequests.refused); return jsonMap; @@ -261,18 +204,9 @@ private Map encodeStatsRequestCount(Stats.RequestCount apiReques private Map encodeStatsMessageTypes(Stats.MessageTypes messageTypes) { if (messageTypes == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson( - jsonMap, - PlatformConstants.TxStatsMessageTypes.all, - encodeMessageCategory(messageTypes.all)); - writeValueToJson( - jsonMap, - PlatformConstants.TxStatsMessageTypes.messages, - encodeMessageCategory(messageTypes.messages)); - writeValueToJson( - jsonMap, - PlatformConstants.TxStatsMessageTypes.presence, - encodeMessageCategory(messageTypes.presence)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTypes.all, encodeMessageCategory(messageTypes.all)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTypes.messages, encodeMessageCategory(messageTypes.messages)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTypes.presence, encodeMessageCategory(messageTypes.presence)); return jsonMap; } @@ -299,8 +233,7 @@ protected Object readValueOfType(final byte type, final ByteBuffer buffer) { return super.readValueOfType(type, buffer); } - private void readValueFromJson( - Map jsonMap, String key, final Consumer consumer) { + private void readValueFromJson(Map jsonMap, String key, final Consumer consumer) { final Object object = jsonMap.get(key); if (null != object) { consumer.accept(object); @@ -378,8 +311,8 @@ private void WriteJsonElement(ByteArrayOutputStream stream, JsonElement value) { } /** - * Converts Map to JsonObject, ArrayList to JsonArray and returns null if these 2 types are a - * no-match + * Converts Map to JsonObject, ArrayList to JsonArray and + * returns null if these 2 types are a no-match */ static JsonElement readValueAsJsonElement(final Object object) { if (object instanceof Map) { @@ -391,9 +324,9 @@ static JsonElement readValueAsJsonElement(final Object object) { } /** - * Dart int types get delivered to Java as Integer, unless '32 bits not enough' in which case they - * are delivered as Long. See: - * https://flutter.dev/docs/development/platform-integration/platform-channels#codec + * Dart int types get delivered to Java as Integer, unless '32 bits not enough' in which case + * they are delivered as Long. + * See: https://flutter.dev/docs/development/platform-integration/platform-channels#codec */ private Long readValueAsLong(final Object object) { if (null == object) { @@ -407,8 +340,7 @@ private Long readValueAsLong(final Object object) { private AblyFlutterMessage decodeAblyFlutterMessage(Map jsonMap) { if (jsonMap == null) return null; - final Long handle = - readValueAsLong(jsonMap.get(PlatformConstants.TxAblyMessage.registrationHandle)); + final Long handle = readValueAsLong(jsonMap.get(PlatformConstants.TxAblyMessage.registrationHandle)); final Object messageType = jsonMap.get(PlatformConstants.TxAblyMessage.type); final Integer type = (messageType == null) ? null : Integer.parseInt(messageType.toString()); Object message = jsonMap.get(PlatformConstants.TxAblyMessage.message); @@ -435,113 +367,51 @@ private PlatformClientOptions decodeClientOptions(Map jsonMap) { final ClientOptions o = new ClientOptions(); // AuthOptions (super class of ClientOptions) - readValueFromJson( - jsonMap, PlatformConstants.TxClientOptions.authUrl, v -> o.authUrl = (String) v); - readValueFromJson( - jsonMap, PlatformConstants.TxClientOptions.authMethod, v -> o.authMethod = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.authUrl, v -> o.authUrl = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.authMethod, v -> o.authMethod = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.key, v -> o.key = (String) v); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.tokenDetails, - v -> o.tokenDetails = decodeTokenDetails((Map) v)); - readValueFromJson( - jsonMap, PlatformConstants.TxClientOptions.authHeaders, v -> o.authHeaders = (Param[]) v); - readValueFromJson( - jsonMap, PlatformConstants.TxClientOptions.authParams, v -> o.authParams = (Param[]) v); - readValueFromJson( - jsonMap, PlatformConstants.TxClientOptions.queryTime, v -> o.queryTime = (Boolean) v); - readValueFromJson( - jsonMap, PlatformConstants.TxClientOptions.useTokenAuth, v -> o.useTokenAuth = (Boolean) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.tokenDetails, v -> o.tokenDetails = decodeTokenDetails((Map) v)); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.authHeaders, v -> o.authHeaders = (Param[]) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.authParams, v -> o.authParams = (Param[]) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.queryTime, v -> o.queryTime = (Boolean) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.useTokenAuth, v -> o.useTokenAuth = (Boolean) v); // ClientOptions - readValueFromJson( - jsonMap, PlatformConstants.TxClientOptions.clientId, v -> o.clientId = (String) v); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.logLevel, - v -> o.logLevel = decodeLogLevel((String) v)); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.clientId, v -> o.clientId = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.logLevel, v -> o.logLevel = decodeLogLevel((String) v)); readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.tls, v -> o.tls = (Boolean) v); - readValueFromJson( - jsonMap, PlatformConstants.TxClientOptions.restHost, v -> o.restHost = (String) v); - readValueFromJson( - jsonMap, PlatformConstants.TxClientOptions.realtimeHost, v -> o.realtimeHost = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.restHost, v -> o.restHost = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.realtimeHost, v -> o.realtimeHost = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.port, v -> o.port = (Integer) v); - readValueFromJson( - jsonMap, PlatformConstants.TxClientOptions.tlsPort, v -> o.tlsPort = (Integer) v); - o.autoConnect = - false; // Always avoid auto-connect, to allow handle to be returned back to Dart side before - // authCallback is called. - // If the user specifies autoConnect, we call connect once we get the handle back to the dart - // side - // In other words, Ably Flutter internally manually connects, but to the SDK user this looks - // like autoConnect. - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.useBinaryProtocol, - v -> o.useBinaryProtocol = (Boolean) v); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.queueMessages, - v -> o.queueMessages = (Boolean) v); - readValueFromJson( - jsonMap, PlatformConstants.TxClientOptions.echoMessages, v -> o.echoMessages = (Boolean) v); - readValueFromJson( - jsonMap, PlatformConstants.TxClientOptions.recover, v -> o.recover = (String) v); - readValueFromJson( - jsonMap, PlatformConstants.TxClientOptions.environment, v -> o.environment = (String) v); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.idempotentRestPublishing, - v -> o.idempotentRestPublishing = (Boolean) v); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.httpOpenTimeout, - v -> o.httpOpenTimeout = (Integer) v); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.httpRequestTimeout, - v -> o.httpRequestTimeout = (Integer) v); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.httpMaxRetryCount, - v -> o.httpMaxRetryCount = (Integer) v); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.realtimeRequestTimeout, - v -> o.realtimeRequestTimeout = readValueAsLong(v)); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.fallbackHosts, - v -> o.fallbackHosts = (String[]) v); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.fallbackHostsUseDefault, - v -> o.fallbackHostsUseDefault = (Boolean) v); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.fallbackRetryTimeout, - v -> o.fallbackRetryTimeout = readValueAsLong(v)); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.defaultTokenParams, - v -> o.defaultTokenParams = decodeTokenParams((Map) v)); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.channelRetryTimeout, - v -> o.channelRetryTimeout = (Integer) v); - readValueFromJson( - jsonMap, - PlatformConstants.TxClientOptions.transportParams, - v -> o.transportParams = (Param[]) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.tlsPort, v -> o.tlsPort = (Integer) v); + /* Always avoid auto-connect, to allow handle to be returned back to Dart side before + * authCallback is called. + * If the user specifies autoConnect, we call connect once we get the handle back to the dart side + * In other words, Ably Flutter internally manually connects, but to the SDK user this looks + * like autoConnect. + */ + o.autoConnect = false; + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.useBinaryProtocol, v -> o.useBinaryProtocol = (Boolean) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.queueMessages, v -> o.queueMessages = (Boolean) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.echoMessages, v -> o.echoMessages = (Boolean) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.recover, v -> o.recover = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.environment, v -> o.environment = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.idempotentRestPublishing, v -> o.idempotentRestPublishing = (Boolean) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.httpOpenTimeout, v -> o.httpOpenTimeout = (Integer) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.httpRequestTimeout, v -> o.httpRequestTimeout = (Integer) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.httpMaxRetryCount, v -> o.httpMaxRetryCount = (Integer) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.realtimeRequestTimeout, v -> o.realtimeRequestTimeout = readValueAsLong(v)); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.fallbackHosts, v -> o.fallbackHosts = (String[]) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.fallbackHostsUseDefault, v -> o.fallbackHostsUseDefault = (Boolean) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.fallbackRetryTimeout, v -> o.fallbackRetryTimeout = readValueAsLong(v)); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.defaultTokenParams, v -> o.defaultTokenParams = decodeTokenParams((Map) v)); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.channelRetryTimeout, v -> o.channelRetryTimeout = (Integer) v); + readValueFromJson(jsonMap, PlatformConstants.TxClientOptions.transportParams, v -> o.transportParams = (Param[]) v); o.agents = new HashMap<>(); o.agents.put("ably-flutter", BuildConfig.FLUTTER_PACKAGE_PLUGIN_VERSION); - return new PlatformClientOptions( - o, - jsonMap.containsKey(PlatformConstants.TxClientOptions.hasAuthCallback) - ? ((boolean) jsonMap.get(PlatformConstants.TxClientOptions.hasAuthCallback)) - : false); + return new PlatformClientOptions(o, jsonMap.containsKey(PlatformConstants.TxClientOptions.hasAuthCallback) ? ((boolean) jsonMap.get(PlatformConstants.TxClientOptions.hasAuthCallback)) : false); } private int decodeLogLevel(String logLevelString) { @@ -568,10 +438,8 @@ private TokenDetails decodeTokenDetails(Map jsonMap) { readValueFromJson(jsonMap, PlatformConstants.TxTokenDetails.token, v -> o.token = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxTokenDetails.expires, v -> o.expires = (int) v); readValueFromJson(jsonMap, PlatformConstants.TxTokenDetails.issued, v -> o.issued = (int) v); - readValueFromJson( - jsonMap, PlatformConstants.TxTokenDetails.capability, v -> o.capability = (String) v); - readValueFromJson( - jsonMap, PlatformConstants.TxTokenDetails.clientId, v -> o.clientId = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxTokenDetails.capability, v -> o.capability = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxTokenDetails.clientId, v -> o.clientId = (String) v); return o; } @@ -579,14 +447,10 @@ private TokenDetails decodeTokenDetails(Map jsonMap) { private Auth.TokenParams decodeTokenParams(Map jsonMap) { if (jsonMap == null) return null; final Auth.TokenParams o = new Auth.TokenParams(); - readValueFromJson( - jsonMap, PlatformConstants.TxTokenParams.capability, v -> o.capability = (String) v); - readValueFromJson( - jsonMap, PlatformConstants.TxTokenParams.clientId, v -> o.clientId = (String) v); - readValueFromJson( - jsonMap, PlatformConstants.TxTokenParams.timestamp, v -> o.timestamp = readValueAsLong(v)); - readValueFromJson( - jsonMap, PlatformConstants.TxTokenParams.ttl, v -> o.ttl = readValueAsLong(v)); + readValueFromJson(jsonMap, PlatformConstants.TxTokenParams.capability, v -> o.capability = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxTokenParams.clientId, v -> o.clientId = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxTokenParams.timestamp, v -> o.timestamp = readValueAsLong(v)); + readValueFromJson(jsonMap, PlatformConstants.TxTokenParams.ttl, v -> o.ttl = readValueAsLong(v)); // nonce is not supported in ably-java // Track @ https://github.com/ably/ably-flutter/issues/14 return o; @@ -595,27 +459,20 @@ private Auth.TokenParams decodeTokenParams(Map jsonMap) { private Auth.TokenRequest decodeTokenRequest(Map jsonMap) { if (jsonMap == null) return null; final Auth.TokenRequest o = new Auth.TokenRequest(); - readValueFromJson( - jsonMap, PlatformConstants.TxTokenRequest.keyName, v -> o.keyName = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.keyName, v -> o.keyName = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.nonce, v -> o.nonce = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.mac, v -> o.mac = (String) v); - readValueFromJson( - jsonMap, PlatformConstants.TxTokenRequest.capability, v -> o.capability = (String) v); - readValueFromJson( - jsonMap, PlatformConstants.TxTokenRequest.clientId, v -> o.clientId = (String) v); - readValueFromJson( - jsonMap, PlatformConstants.TxTokenRequest.timestamp, v -> o.timestamp = readValueAsLong(v)); - readValueFromJson( - jsonMap, PlatformConstants.TxTokenRequest.ttl, v -> o.ttl = readValueAsLong(v)); + readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.capability, v -> o.capability = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.clientId, v -> o.clientId = (String) v); + readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.timestamp, v -> o.timestamp = readValueAsLong(v)); + readValueFromJson(jsonMap, PlatformConstants.TxTokenRequest.ttl, v -> o.ttl = readValueAsLong(v)); return o; } private ChannelOptions decodeRestChannelOptions(Map jsonMap) { if (jsonMap == null) return null; ChannelOptions options = new ChannelOptions(); - options.cipherParams = - decodeCipherParams( - (Map) jsonMap.get(PlatformConstants.TxRestChannelOptions.cipherParams)); + options.cipherParams = decodeCipherParams((Map) jsonMap.get(PlatformConstants.TxRestChannelOptions.cipherParams)); if (options.cipherParams != null) { options.encrypted = true; } @@ -625,17 +482,12 @@ private ChannelOptions decodeRestChannelOptions(Map jsonMap) { private ChannelOptions decodeRealtimeChannelOptions(Map jsonMap) { if (jsonMap == null) return null; ChannelOptions options = new ChannelOptions(); - options.cipherParams = - decodeCipherParams( - (Map) - jsonMap.get(PlatformConstants.TxRealtimeChannelOptions.cipherParams)); + options.cipherParams = decodeCipherParams((Map) jsonMap.get(PlatformConstants.TxRealtimeChannelOptions.cipherParams)); if (options.cipherParams != null) { options.encrypted = true; } - options.params = - (Map) jsonMap.get(PlatformConstants.TxRealtimeChannelOptions.params); - final ArrayList modes = - (ArrayList) jsonMap.get(PlatformConstants.TxRealtimeChannelOptions.modes); + options.params = (Map) jsonMap.get(PlatformConstants.TxRealtimeChannelOptions.params); + final ArrayList modes = (ArrayList) jsonMap.get(PlatformConstants.TxRealtimeChannelOptions.modes); if (modes != null && modes.size() > 0) { options.modes = createChannelModesArray(modes); } @@ -654,11 +506,9 @@ private Map encodeCipherParams(Crypto.CipherParams cipherParams) return jsonMap; } - private Crypto.CipherParams decodeCipherParams( - @Nullable Map cipherParamsDictionary) { + private Crypto.CipherParams decodeCipherParams(@Nullable Map cipherParamsDictionary) { if (cipherParamsDictionary == null) return null; - final Integer cipherParamsHandle = - (Integer) cipherParamsDictionary.get(PlatformConstants.TxCipherParams.androidHandle); + final Integer cipherParamsHandle = (Integer) cipherParamsDictionary.get(PlatformConstants.TxCipherParams.androidHandle); return cipherParamsStorage.from(cipherParamsHandle); } @@ -694,8 +544,7 @@ private Param[] decodeRestHistoryParams(Map jsonMap) { final Object limit = jsonMap.get(PlatformConstants.TxRestHistoryParams.limit); final Object direction = jsonMap.get(PlatformConstants.TxRestHistoryParams.direction); if (start != null) { - params[index++] = - new Param(PlatformConstants.TxRestHistoryParams.start, readValueAsLong(start)); + params[index++] = new Param(PlatformConstants.TxRestHistoryParams.start, readValueAsLong(start)); } if (end != null) { params[index++] = new Param(PlatformConstants.TxRestHistoryParams.end, readValueAsLong(end)); @@ -704,8 +553,7 @@ private Param[] decodeRestHistoryParams(Map jsonMap) { params[index++] = new Param(PlatformConstants.TxRestHistoryParams.limit, (Integer) limit); } if (direction != null) { - params[index] = - new Param(PlatformConstants.TxRestHistoryParams.direction, (String) direction); + params[index] = new Param(PlatformConstants.TxRestHistoryParams.direction, (String) direction); } return params; } @@ -720,23 +568,19 @@ private Param[] decodeRealtimeHistoryParams(Map jsonMap) { final Object direction = jsonMap.get(PlatformConstants.TxRealtimeHistoryParams.direction); final Object untilAttach = jsonMap.get(PlatformConstants.TxRealtimeHistoryParams.untilAttach); if (start != null) { - params[index++] = - new Param(PlatformConstants.TxRealtimeHistoryParams.start, readValueAsLong(start)); + params[index++] = new Param(PlatformConstants.TxRealtimeHistoryParams.start, readValueAsLong(start)); } if (end != null) { - params[index++] = - new Param(PlatformConstants.TxRealtimeHistoryParams.end, readValueAsLong(end)); + params[index++] = new Param(PlatformConstants.TxRealtimeHistoryParams.end, readValueAsLong(end)); } if (limit != null) { params[index++] = new Param(PlatformConstants.TxRealtimeHistoryParams.limit, (Integer) limit); } if (direction != null) { - params[index++] = - new Param(PlatformConstants.TxRealtimeHistoryParams.direction, (String) direction); + params[index++] = new Param(PlatformConstants.TxRealtimeHistoryParams.direction, (String) direction); } if (untilAttach != null) { - params[index] = - new Param(PlatformConstants.TxRealtimeHistoryParams.untilAttach, (boolean) untilAttach); + params[index] = new Param(PlatformConstants.TxRealtimeHistoryParams.untilAttach, (boolean) untilAttach); } return params; } @@ -752,12 +596,10 @@ private Param[] decodeRestPresenceParams(Map jsonMap) { params[index++] = new Param(PlatformConstants.TxRestPresenceParams.limit, (Integer) limit); } if (clientId != null) { - params[index++] = - new Param(PlatformConstants.TxRestPresenceParams.clientId, (String) clientId); + params[index++] = new Param(PlatformConstants.TxRestPresenceParams.clientId, (String) clientId); } if (connectionId != null) { - params[index] = - new Param(PlatformConstants.TxRestPresenceParams.connectionId, (String) connectionId); + params[index] = new Param(PlatformConstants.TxRestPresenceParams.connectionId, (String) connectionId); } return params; } @@ -768,19 +610,15 @@ private Param[] decodeRealtimePresenceParams(Map jsonMap) { int index = 0; final Object waitForSync = jsonMap.get(PlatformConstants.TxRealtimePresenceParams.waitForSync); final Object clientId = jsonMap.get(PlatformConstants.TxRealtimePresenceParams.clientId); - final Object connectionId = - jsonMap.get(PlatformConstants.TxRealtimePresenceParams.connectionId); + final Object connectionId = jsonMap.get(PlatformConstants.TxRealtimePresenceParams.connectionId); if (waitForSync != null) { - params[index++] = - new Param(PlatformConstants.TxRealtimePresenceParams.waitForSync, (Boolean) waitForSync); + params[index++] = new Param(PlatformConstants.TxRealtimePresenceParams.waitForSync, (Boolean) waitForSync); } if (clientId != null) { - params[index++] = - new Param(PlatformConstants.TxRealtimePresenceParams.clientId, (String) clientId); + params[index++] = new Param(PlatformConstants.TxRealtimePresenceParams.clientId, (String) clientId); } if (connectionId != null) { - params[index] = - new Param(PlatformConstants.TxRealtimePresenceParams.connectionId, (String) connectionId); + params[index] = new Param(PlatformConstants.TxRealtimePresenceParams.connectionId, (String) connectionId); } return params; } @@ -810,17 +648,15 @@ private Message decodeChannelMessage(Map jsonMap) { readValueFromJson(jsonMap, PlatformConstants.TxMessage.id, v -> o.id = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxMessage.clientId, v -> o.clientId = (String) v); readValueFromJson(jsonMap, PlatformConstants.TxMessage.name, v -> o.name = (String) v); - readValueFromJson( - jsonMap, PlatformConstants.TxMessage.data, v -> o.data = decodeMessageData(v)); + readValueFromJson(jsonMap, PlatformConstants.TxMessage.data, v -> o.data = decodeMessageData(v)); readValueFromJson(jsonMap, PlatformConstants.TxMessage.encoding, v -> o.encoding = (String) v); - readValueFromJson( - jsonMap, PlatformConstants.TxMessage.extras, v -> o.extras = (MessageExtras) v); + readValueFromJson(jsonMap, PlatformConstants.TxMessage.extras, v -> o.extras = (MessageExtras) v); return o; } - // =============================================================== - // =====================HANDLING WRITE============================ - // =============================================================== +//=============================================================== +//=====================HANDLING WRITE============================ +//=============================================================== private Map encodeAblyFlutterMessage(AblyFlutterMessage c) { if (c == null) return null; @@ -963,7 +799,11 @@ private Map encodePaginatedResult(AsyncPaginatedResult c for (Object item : items) { list.add((Map) pair.encode(item)); } - writeValueToJson(jsonMap, PlatformConstants.TxPaginatedResult.items, list); + writeValueToJson( + jsonMap, + PlatformConstants.TxPaginatedResult.items, + list + ); writeValueToJson(jsonMap, PlatformConstants.TxPaginatedResult.type, type & 0xff); } } else { @@ -973,38 +813,25 @@ private Map encodePaginatedResult(AsyncPaginatedResult c return jsonMap; } - private Map encodeConnectionStateChange( - ConnectionStateListener.ConnectionStateChange c) { + private Map encodeConnectionStateChange(ConnectionStateListener.ConnectionStateChange c) { if (c == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson( - jsonMap, - PlatformConstants.TxConnectionStateChange.current, - encodeConnectionState(c.current)); - writeValueToJson( - jsonMap, - PlatformConstants.TxConnectionStateChange.previous, - encodeConnectionState(c.previous)); - writeValueToJson( - jsonMap, PlatformConstants.TxConnectionStateChange.event, encodeConnectionEvent(c.event)); + writeValueToJson(jsonMap, PlatformConstants.TxConnectionStateChange.current, encodeConnectionState(c.current)); + writeValueToJson(jsonMap, PlatformConstants.TxConnectionStateChange.previous, encodeConnectionState(c.previous)); + writeValueToJson(jsonMap, PlatformConstants.TxConnectionStateChange.event, encodeConnectionEvent(c.event)); writeValueToJson(jsonMap, PlatformConstants.TxConnectionStateChange.retryIn, c.retryIn); - writeValueToJson( - jsonMap, PlatformConstants.TxConnectionStateChange.reason, encodeErrorInfo(c.reason)); + writeValueToJson(jsonMap, PlatformConstants.TxConnectionStateChange.reason, encodeErrorInfo(c.reason)); return jsonMap; } private Map encodeChannelStateChange(ChannelStateListener.ChannelStateChange c) { if (c == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson( - jsonMap, PlatformConstants.TxChannelStateChange.current, encodeChannelState(c.current)); - writeValueToJson( - jsonMap, PlatformConstants.TxChannelStateChange.previous, encodeChannelState(c.previous)); - writeValueToJson( - jsonMap, PlatformConstants.TxChannelStateChange.event, encodeChannelEvent(c.event)); + writeValueToJson(jsonMap, PlatformConstants.TxChannelStateChange.current, encodeChannelState(c.current)); + writeValueToJson(jsonMap, PlatformConstants.TxChannelStateChange.previous, encodeChannelState(c.previous)); + writeValueToJson(jsonMap, PlatformConstants.TxChannelStateChange.event, encodeChannelEvent(c.event)); writeValueToJson(jsonMap, PlatformConstants.TxChannelStateChange.resumed, c.resumed); - writeValueToJson( - jsonMap, PlatformConstants.TxChannelStateChange.reason, encodeErrorInfo(c.reason)); + writeValueToJson(jsonMap, PlatformConstants.TxChannelStateChange.reason, encodeErrorInfo(c.reason)); return jsonMap; } @@ -1017,10 +844,7 @@ private Map encodeDeviceDetails(DeviceDetails c) { writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.platform, c.platform); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.formFactor, c.formFactor); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.metadata, c.metadata); - writeValueToJson( - jsonMap, - PlatformConstants.TxDeviceDetails.devicePushDetails, - encodeDevicePushDetails(c.push)); + writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.devicePushDetails, encodeDevicePushDetails(c.push)); return jsonMap; } @@ -1030,12 +854,8 @@ private Map encodeDevicePushDetails(DeviceDetails.Push c) { final HashMap jsonMap = new HashMap<>(); writeValueToJson(jsonMap, PlatformConstants.TxDevicePushDetails.recipient, c.recipient); - writeValueToJson( - jsonMap, - PlatformConstants.TxDevicePushDetails.state, - encodeDevicePushDetailsState(c.state)); - writeValueToJson( - jsonMap, PlatformConstants.TxDevicePushDetails.errorReason, encodeErrorInfo(c.errorReason)); + writeValueToJson(jsonMap, PlatformConstants.TxDevicePushDetails.state, encodeDevicePushDetailsState(c.state)); + writeValueToJson(jsonMap, PlatformConstants.TxDevicePushDetails.errorReason, encodeErrorInfo(c.errorReason)); return jsonMap; } @@ -1060,18 +880,14 @@ private Map encodeLocalDevice(LocalDevice c) { final HashMap jsonMap = new HashMap<>(); writeValueToJson(jsonMap, PlatformConstants.TxLocalDevice.deviceSecret, c.deviceSecret); - writeValueToJson( - jsonMap, PlatformConstants.TxLocalDevice.deviceIdentityToken, c.deviceIdentityToken); + writeValueToJson(jsonMap, PlatformConstants.TxLocalDevice.deviceIdentityToken, c.deviceIdentityToken); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.id, c.id); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.clientId, c.clientId); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.platform, c.platform); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.formFactor, c.formFactor); writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.metadata, c.metadata); - writeValueToJson( - jsonMap, - PlatformConstants.TxDeviceDetails.devicePushDetails, - encodeDevicePushDetails(c.push)); + writeValueToJson(jsonMap, PlatformConstants.TxDeviceDetails.devicePushDetails, encodeDevicePushDetails(c.push)); return jsonMap; } @@ -1136,8 +952,7 @@ private Map encodePresenceMessage(PresenceMessage c) { if (c == null) return null; final HashMap jsonMap = new HashMap<>(); writeValueToJson(jsonMap, PlatformConstants.TxPresenceMessage.id, c.id); - writeValueToJson( - jsonMap, PlatformConstants.TxPresenceMessage.action, encodePresenceAction(c.action)); + writeValueToJson(jsonMap, PlatformConstants.TxPresenceMessage.action, encodePresenceAction(c.action)); writeValueToJson(jsonMap, PlatformConstants.TxPresenceMessage.clientId, c.clientId); writeValueToJson(jsonMap, PlatformConstants.TxPresenceMessage.connectionId, c.connectionId); writeValueToJson(jsonMap, PlatformConstants.TxPresenceMessage.timestamp, c.timestamp); @@ -1152,10 +967,7 @@ private Map encodeRemoteMessage(RemoteMessage message) { if (message == null) return null; final HashMap jsonMap = new HashMap<>(); writeValueToJson(jsonMap, PlatformConstants.TxRemoteMessage.data, message.getData()); - writeValueToJson( - jsonMap, - PlatformConstants.TxRemoteMessage.notification, - encodeNotification(message.getNotification())); + writeValueToJson(jsonMap, PlatformConstants.TxRemoteMessage.notification, encodeNotification(message.getNotification())); return jsonMap; } @@ -1166,4 +978,5 @@ private Map encodeNotification(RemoteMessage.Notification notifi writeValueToJson(jsonMap, PlatformConstants.TxNotification.body, notification.getBody()); return jsonMap; } + } From 2031824e2f3c2ca838676e9fecfedd3aeb1bacc6 Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Thu, 3 Feb 2022 20:14:16 +0100 Subject: [PATCH 44/52] Moved stats to proper category in codegen_context --- bin/codegen_context.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/codegen_context.dart b/bin/codegen_context.dart index cd948bcd8..57c06cf7a 100644 --- a/bin/codegen_context.dart +++ b/bin/codegen_context.dart @@ -21,6 +21,7 @@ Iterable> get _types sync* { 'restPresenceParams', 'presenceMessage', 'realtimePresenceParams', + 'stats', // Push Notifications 'deviceDetails', @@ -38,7 +39,6 @@ Iterable> get _types sync* { // Encryption 'cipherParams', - 'stats', ]; // Custom type values must be over 127. At the time of writing From b211abdc62b578ac29235c31d5b313bd6a5c06c5 Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Fri, 4 Feb 2022 18:56:37 +0100 Subject: [PATCH 45/52] Added serialization method for StatsRequestCount --- lib/src/platform/src/codec.dart | 33 +++++++++++++++++++--- lib/src/stats/src/stats_request_count.dart | 11 +++++--- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/lib/src/platform/src/codec.dart b/lib/src/platform/src/codec.dart index f3430b3e0..e3bce0e98 100644 --- a/lib/src/platform/src/codec.dart +++ b/lib/src/platform/src/codec.dart @@ -1060,15 +1060,30 @@ class Codec extends StandardMessageCodec { /// returns null if [jsonMap] is null /// FIXME: For now only decodes interval and channels Stats _decodeStats(Map jsonMap) { + final apiRequestsJson = toJsonMap(_readFromJson( + jsonMap, + TxStats.apiRequests, + )); final channelsJson = toJsonMap(_readFromJson( jsonMap, TxStats.channels, )); + final tokenRequestsJson = toJsonMap(_readFromJson( + jsonMap, + TxStats.tokenRequests, + )); return Stats( - channels: (channelsJson != null) - ? _decodeStatsResourceCount(channelsJson) - : null, - intervalId: _readFromJson(jsonMap, TxStats.intervalId)); + apiRequests: (apiRequestsJson != null) + ? _decodeStatsRequestCount(apiRequestsJson) + : null, + channels: (channelsJson != null) + ? _decodeStatsResourceCount(channelsJson) + : null, + intervalId: _readFromJson(jsonMap, TxStats.intervalId), + tokenRequests: (tokenRequestsJson != null) + ? _decodeStatsRequestCount(jsonMap) + : null, + ); } StatsResourceCount _decodeStatsResourceCount(Map jsonMap) => @@ -1078,6 +1093,16 @@ class Codec extends StandardMessageCodec { opened: _readFromJson(jsonMap, TxStatsResourceCount.opened), peak: _readFromJson(jsonMap, TxStatsResourceCount.peak), refused: _readFromJson( + jsonMap, + TxStatsResourceCount.refused, + )); + + StatsRequestCount _decodeStatsRequestCount(Map jsonMap) => + StatsRequestCount( + failed: _readFromJson(jsonMap, TxStatsRequestCount.failed), + succeeded: + _readFromJson(jsonMap, TxStatsRequestCount.succeeded), + refused: _readFromJson( jsonMap, TxStatsRequestCount.refused, )); diff --git a/lib/src/stats/src/stats_request_count.dart b/lib/src/stats/src/stats_request_count.dart index 5bd0d8a1e..509bad5d3 100644 --- a/lib/src/stats/src/stats_request_count.dart +++ b/lib/src/stats/src/stats_request_count.dart @@ -1,14 +1,17 @@ /// RequestCount contains aggregate counts for requests made /// /// https://docs.ably.com/client-lib-development-guide/features/#TS8 -abstract class StatsRequestCount { +class StatsRequestCount { + /// Creates instance of [StatsRequestCount] + StatsRequestCount({this.failed, this.refused, this.succeeded}); + /// Requests failed. - int? failed; + double? failed; /// Requests refused typically as a result of permissions /// or a limit being exceeded. - int? refused; + double? refused; /// Requests succeeded. - int? succeeded; + double? succeeded; } From 749c2cfcc23f6f887ce4de837eb52c38174f4971 Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Mon, 7 Feb 2022 14:40:48 +0100 Subject: [PATCH 46/52] Added serialization method for StatsMessageTypes, fixed Android issue with serializing Stats.MessageCategory --- .../ably/flutter/plugin/AblyMessageCodec.java | 9 ++--- lib/src/platform/src/codec.dart | 37 ++++++++++++++++++- lib/src/stats/src/stats_message_count.dart | 9 +++-- lib/src/stats/src/stats_message_types.dart | 5 ++- 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java index bab601da9..612b7e1b4 100644 --- a/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java +++ b/android/src/main/java/io/ably/flutter/plugin/AblyMessageCodec.java @@ -204,17 +204,16 @@ private Map encodeStatsRequestCount(Stats.RequestCount apiReques private Map encodeStatsMessageTypes(Stats.MessageTypes messageTypes) { if (messageTypes == null) return null; final HashMap jsonMap = new HashMap<>(); - writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTypes.all, encodeMessageCategory(messageTypes.all)); - writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTypes.messages, encodeMessageCategory(messageTypes.messages)); - writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTypes.presence, encodeMessageCategory(messageTypes.presence)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTypes.all, encodeStatsMessageCategory(messageTypes.all)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTypes.messages, encodeStatsMessageCategory(messageTypes.messages)); + writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageTypes.presence, encodeStatsMessageCategory(messageTypes.presence)); return jsonMap; } // This is different in other platform and will correspond to StatsMessageCount for other // libraries - private Map encodeMessageCategory(Stats.MessageCategory category) { + private Map encodeStatsMessageCategory(Stats.MessageCategory category) { if (category == null) return null; - if (category.category == null) return null; final HashMap jsonMap = new HashMap<>(); writeValueToJson(jsonMap, PlatformConstants.TxStatsMessageCount.count, category.count); diff --git a/lib/src/platform/src/codec.dart b/lib/src/platform/src/codec.dart index e3bce0e98..79af16305 100644 --- a/lib/src/platform/src/codec.dart +++ b/lib/src/platform/src/codec.dart @@ -1058,8 +1058,12 @@ class Codec extends StandardMessageCodec { /// Decodes value [jsonMap] to [Stats] /// returns null if [jsonMap] is null - /// FIXME: For now only decodes interval and channels + /// FIXME: Does not decode everything Stats _decodeStats(Map jsonMap) { + final allJson = toJsonMap(_readFromJson( + jsonMap, + TxStats.all, + )); final apiRequestsJson = toJsonMap(_readFromJson( jsonMap, TxStats.apiRequests, @@ -1073,6 +1077,7 @@ class Codec extends StandardMessageCodec { TxStats.tokenRequests, )); return Stats( + all: (allJson != null) ? _decodeStatsMessageTypes(allJson) : null, apiRequests: (apiRequestsJson != null) ? _decodeStatsRequestCount(apiRequestsJson) : null, @@ -1086,6 +1091,36 @@ class Codec extends StandardMessageCodec { ); } + StatsMessageTypes _decodeStatsMessageTypes(Map jsonMap) { + final allJson = toJsonMap(_readFromJson( + jsonMap, + TxStatsMessageTypes.all, + )); + final messagesJson = toJsonMap(_readFromJson( + jsonMap, + TxStatsMessageTypes.messages, + )); + final presenceJson = toJsonMap(_readFromJson( + jsonMap, + TxStatsMessageTypes.presence, + )); + + return StatsMessageTypes( + all: (allJson != null) ? _decodeStatsMessageCount(allJson) : null, + messages: (messagesJson != null) + ? _decodeStatsMessageCount(messagesJson) + : null, + presence: (presenceJson != null) + ? _decodeStatsMessageCount(presenceJson) + : null, + ); + } + + StatsMessageCount _decodeStatsMessageCount(Map jsonMap) => + StatsMessageCount( + count: _readFromJson(jsonMap, TxStatsMessageCount.count), + data: _readFromJson(jsonMap, TxStatsMessageCount.data)); + StatsResourceCount _decodeStatsResourceCount(Map jsonMap) => StatsResourceCount( mean: _readFromJson(jsonMap, TxStatsResourceCount.mean), diff --git a/lib/src/stats/src/stats_message_count.dart b/lib/src/stats/src/stats_message_count.dart index cdbe89d3d..019c2262b 100644 --- a/lib/src/stats/src/stats_message_count.dart +++ b/lib/src/stats/src/stats_message_count.dart @@ -1,10 +1,13 @@ /// MessageCount contains aggregate counts for messages and data transferred /// /// https://docs.ably.com/client-lib-development-guide/features/#TS5 -abstract class StatsMessageCount { +class StatsMessageCount { + ///Creates instance of [StatsMessageCount] + StatsMessageCount({this.count, this.data}); + /// Count of all messages. - int? count; + double? count; /// Total data transferred for all messages in bytes. - int? data; + double? data; } diff --git a/lib/src/stats/src/stats_message_types.dart b/lib/src/stats/src/stats_message_types.dart index caaa362e8..9f1f4ce3e 100644 --- a/lib/src/stats/src/stats_message_types.dart +++ b/lib/src/stats/src/stats_message_types.dart @@ -4,7 +4,10 @@ import 'package:ably_flutter/ably_flutter.dart'; /// for different (message vs presence) message types /// /// https://docs.ably.com/client-lib-development-guide/features/#TS6 -abstract class StatsMessageTypes { +class StatsMessageTypes { + /// Creates instance of [StatsMessageTypes] + StatsMessageTypes({this.all, this.messages, this.presence}); + /// All messages count (includes both presence & messages). StatsMessageCount? all; From 38a2918dd67fd21f099d144296df366c74332023 Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Mon, 7 Feb 2022 15:27:56 +0100 Subject: [PATCH 47/52] Added serialization method for StatsConnectionTypes --- lib/src/platform/src/codec.dart | 29 +++++++++++++++++++ lib/src/stats/src/stats_connection_types.dart | 5 +++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/src/platform/src/codec.dart b/lib/src/platform/src/codec.dart index 79af16305..7171d4bae 100644 --- a/lib/src/platform/src/codec.dart +++ b/lib/src/platform/src/codec.dart @@ -1072,6 +1072,10 @@ class Codec extends StandardMessageCodec { jsonMap, TxStats.channels, )); + final connectionsJson = toJsonMap(_readFromJson( + jsonMap, + TxStats.connections, + )); final tokenRequestsJson = toJsonMap(_readFromJson( jsonMap, TxStats.tokenRequests, @@ -1084,6 +1088,9 @@ class Codec extends StandardMessageCodec { channels: (channelsJson != null) ? _decodeStatsResourceCount(channelsJson) : null, + connections: (connectionsJson != null) + ? _decodeStatsConnectionTypes(connectionsJson) + : null, intervalId: _readFromJson(jsonMap, TxStats.intervalId), tokenRequests: (tokenRequestsJson != null) ? _decodeStatsRequestCount(jsonMap) @@ -1132,6 +1139,28 @@ class Codec extends StandardMessageCodec { TxStatsResourceCount.refused, )); + StatsConnectionTypes _decodeStatsConnectionTypes( + Map jsonMap) { + final allJson = toJsonMap(_readFromJson( + jsonMap, + TxStatsConnectionTypes.all, + )); + final plainJson = toJsonMap(_readFromJson( + jsonMap, + TxStatsConnectionTypes.plain, + )); + final tlsJson = toJsonMap(_readFromJson( + jsonMap, + TxStatsConnectionTypes.tls, + )); + + return StatsConnectionTypes( + all: (allJson != null) ? _decodeStatsResourceCount(allJson) : null, + plain: (plainJson != null) ? _decodeStatsResourceCount(plainJson) : null, + tls: (tlsJson != null) ? _decodeStatsResourceCount(tlsJson) : null, + ); + } + StatsRequestCount _decodeStatsRequestCount(Map jsonMap) => StatsRequestCount( failed: _readFromJson(jsonMap, TxStatsRequestCount.failed), diff --git a/lib/src/stats/src/stats_connection_types.dart b/lib/src/stats/src/stats_connection_types.dart index 509a3ffba..fe40786a4 100644 --- a/lib/src/stats/src/stats_connection_types.dart +++ b/lib/src/stats/src/stats_connection_types.dart @@ -4,7 +4,10 @@ import 'package:ably_flutter/ably_flutter.dart'; /// for different (TLS vs non-TLS) connection types /// /// https://docs.ably.com/client-lib-development-guide/features/#TS4 -abstract class StatsConnectionTypes { +class StatsConnectionTypes { + /// Creates instance of [StatsConnectionTypes] + StatsConnectionTypes({this.all, this.plain, this.tls}); + /// All connection count (includes both TLS & non-TLS connections). StatsResourceCount? all; From f54f6f5ad755e630961138797f8e1826257cad4f Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Mon, 7 Feb 2022 15:49:35 +0100 Subject: [PATCH 48/52] Added serialization method for StatsMessageTraffic --- lib/src/platform/src/codec.dart | 43 ++++++++++++++++++++ lib/src/stats/src/stats_message_traffic.dart | 5 ++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/src/platform/src/codec.dart b/lib/src/platform/src/codec.dart index 7171d4bae..ce8891699 100644 --- a/lib/src/platform/src/codec.dart +++ b/lib/src/platform/src/codec.dart @@ -1076,6 +1076,14 @@ class Codec extends StandardMessageCodec { jsonMap, TxStats.connections, )); + final inboundJson = toJsonMap(_readFromJson( + jsonMap, + TxStats.inbound, + )); + final outboundJson = toJsonMap(_readFromJson( + jsonMap, + TxStats.outbound, + )); final tokenRequestsJson = toJsonMap(_readFromJson( jsonMap, TxStats.tokenRequests, @@ -1091,7 +1099,13 @@ class Codec extends StandardMessageCodec { connections: (connectionsJson != null) ? _decodeStatsConnectionTypes(connectionsJson) : null, + inbound: (inboundJson != null) + ? _decodeStatsMessageTraffic(inboundJson) + : null, intervalId: _readFromJson(jsonMap, TxStats.intervalId), + outbound: (outboundJson != null) + ? _decodeStatsMessageTraffic(outboundJson) + : null, tokenRequests: (tokenRequestsJson != null) ? _decodeStatsRequestCount(jsonMap) : null, @@ -1161,6 +1175,35 @@ class Codec extends StandardMessageCodec { ); } + StatsMessageTraffic _decodeStatsMessageTraffic(Map jsonMap) { + final allJson = toJsonMap(_readFromJson( + jsonMap, + TxStatsMessageTraffic.all, + )); + final realtimeJson = toJsonMap(_readFromJson( + jsonMap, + TxStatsMessageTraffic.realtime, + )); + final restJson = toJsonMap(_readFromJson( + jsonMap, + TxStatsMessageTraffic.rest, + )); + final webhookJson = toJsonMap(_readFromJson( + jsonMap, + TxStatsMessageTraffic.webhook, + )); + + return StatsMessageTraffic( + all: (allJson != null) ? _decodeStatsMessageTypes(allJson) : null, + realtime: (realtimeJson != null) + ? _decodeStatsMessageTypes(realtimeJson) + : null, + rest: (restJson != null) ? _decodeStatsMessageTypes(restJson) : null, + webhook: (webhookJson != null) + ? _decodeStatsMessageTypes(webhookJson) + : null); + } + StatsRequestCount _decodeStatsRequestCount(Map jsonMap) => StatsRequestCount( failed: _readFromJson(jsonMap, TxStatsRequestCount.failed), diff --git a/lib/src/stats/src/stats_message_traffic.dart b/lib/src/stats/src/stats_message_traffic.dart index 8feef9ca6..e50eb9287 100644 --- a/lib/src/stats/src/stats_message_traffic.dart +++ b/lib/src/stats/src/stats_message_traffic.dart @@ -4,7 +4,10 @@ import 'package:ably_flutter/ably_flutter.dart'; /// for traffic over various transport types /// /// https://docs.ably.com/client-lib-development-guide/features/#TS7 -abstract class StatsMessageTraffic { +class StatsMessageTraffic { + /// Creates instance of [StatsMessageTraffic] + StatsMessageTraffic({this.all, this.realtime, this.rest, this.webhook}); + /// All messages count (includes realtime, rest and webhook messages). StatsMessageTypes? all; From ca14d9ce59894680f924862d3497526b60040353 Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Mon, 7 Feb 2022 15:50:42 +0100 Subject: [PATCH 49/52] Fixed tokenrequest serialization on dart side --- lib/src/platform/src/codec.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/platform/src/codec.dart b/lib/src/platform/src/codec.dart index ce8891699..e6c18d092 100644 --- a/lib/src/platform/src/codec.dart +++ b/lib/src/platform/src/codec.dart @@ -1107,7 +1107,7 @@ class Codec extends StandardMessageCodec { ? _decodeStatsMessageTraffic(outboundJson) : null, tokenRequests: (tokenRequestsJson != null) - ? _decodeStatsRequestCount(jsonMap) + ? _decodeStatsRequestCount(tokenRequestsJson) : null, ); } From 289d45124ccb1d544068edd6fdcb9908df8ad3dc Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Mon, 7 Feb 2022 16:06:25 +0100 Subject: [PATCH 50/52] Added decoding StatsMessageTypes for persisted field --- lib/src/platform/src/codec.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/src/platform/src/codec.dart b/lib/src/platform/src/codec.dart index e6c18d092..7a7539eba 100644 --- a/lib/src/platform/src/codec.dart +++ b/lib/src/platform/src/codec.dart @@ -1084,6 +1084,10 @@ class Codec extends StandardMessageCodec { jsonMap, TxStats.outbound, )); + final persistedJson = toJsonMap(_readFromJson( + jsonMap, + TxStats.persisted, + )); final tokenRequestsJson = toJsonMap(_readFromJson( jsonMap, TxStats.tokenRequests, @@ -1106,6 +1110,9 @@ class Codec extends StandardMessageCodec { outbound: (outboundJson != null) ? _decodeStatsMessageTraffic(outboundJson) : null, + persisted: (persistedJson != null) + ? _decodeStatsMessageTypes(persistedJson) + : null, tokenRequests: (tokenRequestsJson != null) ? _decodeStatsRequestCount(tokenRequestsJson) : null, From 9ad87dcd2e6e8953fd9484bca259f2a5d55091a3 Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Tue, 8 Feb 2022 15:54:37 +0100 Subject: [PATCH 51/52] Fixed stats method message handling on iOS side --- ios/Classes/AblyFlutter.m | 2 +- lib/src/platform/src/codec.dart | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ios/Classes/AblyFlutter.m b/ios/Classes/AblyFlutter.m index ad33bac43..f5b296658 100644 --- a/ios/Classes/AblyFlutter.m +++ b/ios/Classes/AblyFlutter.m @@ -582,8 +582,8 @@ -(void)reset; static const FlutterHandler _stats = ^void(AblyFlutter *const ably, FlutterMethodCall *const call, const FlutterResult result) { AblyFlutterMessage *const arguments = call.arguments; AblyInstanceStore *const instanceStore = [ably instanceStore]; - ARTRest *const rest = [instanceStore restFrom:arguments.message]; AblyFlutterMessage *message = arguments.message; + ARTRest *const rest = [instanceStore restFrom:message.handle]; NSDictionary *paramsDict = message.message; ARTStatsQuery *query; if(paramsDict[@"params"]){ diff --git a/lib/src/platform/src/codec.dart b/lib/src/platform/src/codec.dart index 7a7539eba..ffeb0a554 100644 --- a/lib/src/platform/src/codec.dart +++ b/lib/src/platform/src/codec.dart @@ -1058,7 +1058,8 @@ class Codec extends StandardMessageCodec { /// Decodes value [jsonMap] to [Stats] /// returns null if [jsonMap] is null - /// FIXME: Does not decode everything + /// FIXME: Decoding crashes on iOS because of different implementations of SDK + /// See: https://github.com/ably/ably-cocoa/issues/1284 Stats _decodeStats(Map jsonMap) { final allJson = toJsonMap(_readFromJson( jsonMap, From 541e38f3888333fb55c18106564b6aacb129695f Mon Sep 17 00:00:00 2001 From: Igor Kurek Date: Tue, 8 Feb 2022 18:46:19 +0100 Subject: [PATCH 52/52] Regenerated platform constants with codegen --- .../plugin/generated/PlatformConstants.java | 22 +++++++-------- ios/Classes/codec/AblyPlatformConstants.h | 22 +++++++-------- lib/src/generated/platform_constants.dart | 28 ++++++++++--------- 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java b/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java index 498c03cb5..3339fb6d1 100644 --- a/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java +++ b/android/src/main/java/io/ably/flutter/plugin/generated/PlatformConstants.java @@ -26,17 +26,17 @@ static final public class CodecTypes { public static final byte restPresenceParams = (byte) 142; public static final byte presenceMessage = (byte) 143; public static final byte realtimePresenceParams = (byte) 144; - public static final byte deviceDetails = (byte) 145; - public static final byte localDevice = (byte) 146; - public static final byte pushChannelSubscription = (byte) 147; - public static final byte unNotificationSettings = (byte) 148; - public static final byte remoteMessage = (byte) 149; - public static final byte errorInfo = (byte) 150; - public static final byte logLevel = (byte) 151; - public static final byte connectionStateChange = (byte) 152; - public static final byte channelStateChange = (byte) 153; - public static final byte cipherParams = (byte) 154; - public static final byte stats = (byte) 155; + public static final byte stats = (byte) 145; + public static final byte deviceDetails = (byte) 146; + public static final byte localDevice = (byte) 147; + public static final byte pushChannelSubscription = (byte) 148; + public static final byte unNotificationSettings = (byte) 149; + public static final byte remoteMessage = (byte) 150; + public static final byte errorInfo = (byte) 151; + public static final byte logLevel = (byte) 152; + public static final byte connectionStateChange = (byte) 153; + public static final byte channelStateChange = (byte) 154; + public static final byte cipherParams = (byte) 155; } static final public class PlatformMethod { diff --git a/ios/Classes/codec/AblyPlatformConstants.h b/ios/Classes/codec/AblyPlatformConstants.h index 193c4160b..24dac1ba8 100644 --- a/ios/Classes/codec/AblyPlatformConstants.h +++ b/ios/Classes/codec/AblyPlatformConstants.h @@ -23,17 +23,17 @@ typedef NS_ENUM(UInt8, CodecType) { CodecTypeRestPresenceParams = 142, CodecTypePresenceMessage = 143, CodecTypeRealtimePresenceParams = 144, - CodecTypeDeviceDetails = 145, - CodecTypeLocalDevice = 146, - CodecTypePushChannelSubscription = 147, - CodecTypeUnNotificationSettings = 148, - CodecTypeRemoteMessage = 149, - CodecTypeErrorInfo = 150, - CodecTypeLogLevel = 151, - CodecTypeConnectionStateChange = 152, - CodecTypeChannelStateChange = 153, - CodecTypeCipherParams = 154, - CodecTypeStats = 155, + CodecTypeStats = 145, + CodecTypeDeviceDetails = 146, + CodecTypeLocalDevice = 147, + CodecTypePushChannelSubscription = 148, + CodecTypeUnNotificationSettings = 149, + CodecTypeRemoteMessage = 150, + CodecTypeErrorInfo = 151, + CodecTypeLogLevel = 152, + CodecTypeConnectionStateChange = 153, + CodecTypeChannelStateChange = 154, + CodecTypeCipherParams = 155, }; diff --git a/lib/src/generated/platform_constants.dart b/lib/src/generated/platform_constants.dart index 2d978f22a..92a534e89 100644 --- a/lib/src/generated/platform_constants.dart +++ b/lib/src/generated/platform_constants.dart @@ -23,17 +23,17 @@ class CodecTypes { static const int restPresenceParams = 142; static const int presenceMessage = 143; static const int realtimePresenceParams = 144; - static const int deviceDetails = 145; - static const int localDevice = 146; - static const int pushChannelSubscription = 147; - static const int unNotificationSettings = 148; - static const int remoteMessage = 149; - static const int errorInfo = 150; - static const int logLevel = 151; - static const int connectionStateChange = 152; - static const int channelStateChange = 153; - static const int cipherParams = 154; - static const int stats = 155; + static const int stats = 145; + static const int deviceDetails = 146; + static const int localDevice = 147; + static const int pushChannelSubscription = 148; + static const int unNotificationSettings = 149; + static const int remoteMessage = 150; + static const int errorInfo = 151; + static const int logLevel = 152; + static const int connectionStateChange = 153; + static const int channelStateChange = 154; + static const int cipherParams = 155; } class PlatformMethod { @@ -385,7 +385,8 @@ class TxPushRequestPermission { static const String alert = 'alert'; static const String carPlay = 'carPlay'; static const String criticalAlert = 'criticalAlert'; - static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = + 'providesAppNotificationSettings'; static const String provisional = 'provisional'; static const String announcement = 'announcement'; } @@ -401,7 +402,8 @@ class TxUNNotificationSettings { static const String alertStyle = 'alertStyle'; static const String showPreviewsSetting = 'showPreviewsSetting'; static const String criticalAlertSetting = 'criticalAlertSetting'; - static const String providesAppNotificationSettings = 'providesAppNotificationSettings'; + static const String providesAppNotificationSettings = + 'providesAppNotificationSettings'; static const String announcementSetting = 'announcementSetting'; static const String scheduledDeliverySetting = 'scheduledDeliverySetting'; static const String timeSensitiveSetting = 'timeSensitiveSetting';