diff --git a/.pubnub.yml b/.pubnub.yml index 59a84afa..45cfc832 100644 --- a/.pubnub.yml +++ b/.pubnub.yml @@ -1,5 +1,10 @@ --- changelog: + - date: 2024-03-28 + version: v4.3.3 + changes: + - type: feature + text: "Added support for pagination params for listChannels API of push notification devices." - date: 2024-01-22 version: v4.3.2 changes: @@ -442,7 +447,7 @@ supported-platforms: platforms: - "Dart SDK >=2.6.0 <3.0.0" version: "PubNub Dart SDK" -version: "4.3.2" +version: "4.3.3" sdks: - full-name: PubNub Dart SDK diff --git a/pubnub/CHANGELOG.md b/pubnub/CHANGELOG.md index 0568a024..cfd6621e 100644 --- a/pubnub/CHANGELOG.md +++ b/pubnub/CHANGELOG.md @@ -1,3 +1,9 @@ +## v4.3.3 +March 28 2024 + +#### Added +- Added support for pagination params for listChannels api of push notification devices. + ## v4.3.2 January 22 2024 diff --git a/pubnub/README.md b/pubnub/README.md index 47d3a3e4..a05902d1 100644 --- a/pubnub/README.md +++ b/pubnub/README.md @@ -14,7 +14,7 @@ To add the package to your Dart or Flutter project, add `pubnub` as a dependency ```yaml dependencies: - pubnub: ^4.3.2 + pubnub: ^4.3.3 ``` After adding the dependency to `pubspec.yaml`, run the `dart pub get` command in the root directory of your project (the same that the `pubspec.yaml` is in). diff --git a/pubnub/lib/src/core/core.dart b/pubnub/lib/src/core/core.dart index e2459e02..4e61b252 100644 --- a/pubnub/lib/src/core/core.dart +++ b/pubnub/lib/src/core/core.dart @@ -21,7 +21,7 @@ class Core { /// Internal module responsible for supervising. SupervisorModule supervisor = SupervisorModule(); - static String version = '4.3.2'; + static String version = '4.3.3'; Core( {Keyset? defaultKeyset, diff --git a/pubnub/lib/src/core/crypto/cipher_key.dart b/pubnub/lib/src/core/crypto/cipher_key.dart index 7588c95b..9c50ad8b 100644 --- a/pubnub/lib/src/core/crypto/cipher_key.dart +++ b/pubnub/lib/src/core/crypto/cipher_key.dart @@ -23,12 +23,9 @@ class CipherKey { } @override - bool operator ==(dynamic other) { - if (other == null) { - return false; - } + bool operator ==(Object other) { if (runtimeType == other.runtimeType) { - return utf8.decode(data) == utf8.decode(other!.data); + return utf8.decode(data) == utf8.decode((other as CipherKey).data); } return false; } diff --git a/pubnub/lib/src/core/timetoken.dart b/pubnub/lib/src/core/timetoken.dart index 83745da6..ec68a73c 100644 --- a/pubnub/lib/src/core/timetoken.dart +++ b/pubnub/lib/src/core/timetoken.dart @@ -15,7 +15,7 @@ class Timetoken implements Result { /// Timetokens are compared based on their [value]. @override - bool operator ==(dynamic other) { + bool operator ==(Object other) { if (other is Timetoken) { return value == other.value; } else { diff --git a/pubnub/lib/src/core/user_id.dart b/pubnub/lib/src/core/user_id.dart index 547f8950..2201d9b9 100644 --- a/pubnub/lib/src/core/user_id.dart +++ b/pubnub/lib/src/core/user_id.dart @@ -11,7 +11,7 @@ class UserId { String toString() => '$value'; @override - bool operator ==(dynamic other) { + bool operator ==(Object other) { if (other is UserId) { return value == other.value; } diff --git a/pubnub/lib/src/core/uuid.dart b/pubnub/lib/src/core/uuid.dart index 2c51e15c..798bcfbe 100644 --- a/pubnub/lib/src/core/uuid.dart +++ b/pubnub/lib/src/core/uuid.dart @@ -11,7 +11,7 @@ class UUID { String toString() => '$value'; @override - bool operator ==(dynamic other) { + bool operator ==(Object other) { if (other is UUID) { return value == other.value; } diff --git a/pubnub/lib/src/dx/_endpoints/push.dart b/pubnub/lib/src/dx/_endpoints/push.dart index 07f8fc93..417d9710 100644 --- a/pubnub/lib/src/dx/_endpoints/push.dart +++ b/pubnub/lib/src/dx/_endpoints/push.dart @@ -56,9 +56,18 @@ class ListPushChannelsParams extends Parameters { PushGateway pushGateway; Environment? environment; String? topic; - - ListPushChannelsParams(this.keyset, this.deviceId, this.pushGateway, - {this.topic, this.environment}); + String? start; + int? count; + + ListPushChannelsParams( + this.keyset, + this.deviceId, + this.pushGateway, { + this.topic, + this.environment, + this.start, + this.count, + }); @override Request toRequest() { @@ -74,7 +83,9 @@ class ListPushChannelsParams extends Parameters { var queryParameters = { if (keyset.authKey != null) 'auth': '${keyset.authKey}', 'uuid': '${keyset.uuid}', - 'type': pushGateway.value() + 'type': pushGateway.value(), + if (start != null && start!.isNotEmpty) 'start': start!, + if (count != null) 'count': '$count' }; if (pushGateway == PushGateway.apns2) { queryParameters['environment'] = diff --git a/pubnub/lib/src/dx/push/push.dart b/pubnub/lib/src/dx/push/push.dart index 938c9d1b..d381f04f 100644 --- a/pubnub/lib/src/dx/push/push.dart +++ b/pubnub/lib/src/dx/push/push.dart @@ -19,12 +19,16 @@ mixin PushNotificationDx on Core { /// If [gateway] is [PushGateway.apns2] then [topic] is mandatory to provide. /// [topic] is bundle id of the mobile application. /// [environment] denoting the environment of the mobile application for [PushGateway.apns2], it can be either: + /// [start] Starting channel for pagination. Use the last channel from the previous page request. + /// [count] Number of channels to return for pagination. Max of 1000 tokens at a time. Defaults to 500. /// * [Environment.development] (which is the default value). /// * [Environment.production]. Future listPushChannels( String deviceId, PushGateway gateway, {String? topic, Environment? environment, + String? start, + int? count, Keyset? keyset, String? using}) async { keyset ??= keysets[using]; @@ -32,8 +36,15 @@ mixin PushNotificationDx on Core { Ensure(deviceId).isNotEmpty('deviceId'); if (gateway == PushGateway.apns2) Ensure(topic).isNotNull('topic'); - var params = ListPushChannelsParams(keyset, deviceId, gateway, - topic: topic, environment: environment); + var params = ListPushChannelsParams( + keyset, + deviceId, + gateway, + topic: topic, + environment: environment, + start: start, + count: count, + ); return defaultFlow( keyset: keyset, core: this, diff --git a/pubnub/pubspec.yaml b/pubnub/pubspec.yaml index bb48377b..7f7b44a7 100644 --- a/pubnub/pubspec.yaml +++ b/pubnub/pubspec.yaml @@ -1,6 +1,6 @@ name: pubnub description: PubNub SDK v5 for Dart lang (with Flutter support) that allows you to create real-time applications -version: 4.3.2 +version: 4.3.3 homepage: https://www.pubnub.com/docs/sdks/dart environment: diff --git a/pubnub/test/unit/dx/push_test.dart b/pubnub/test/unit/dx/push_test.dart index c090ac18..124b6a5d 100644 --- a/pubnub/test/unit/dx/push_test.dart +++ b/pubnub/test/unit/dx/push_test.dart @@ -189,6 +189,37 @@ void main() { #environment: null })); }); + + test('listPushChannels delegate supported arguments', () async { + fakePubnub.returnWhen( + #listPushChannels, + Future.value(ListPushChannelsResult.fromJson(['ch1', 'ch2', 'ch3'])), + ); + + await fakePubnub.listPushChannels( + 'A332C23D', + PushGateway.mpns, + start: 'ch2', + count: 10, + ); + + var invocation = fakePubnub.invocations[0]; + + expect(invocation.isMethod, equals(true)); + expect(invocation.memberName, equals(#listPushChannels)); + expect(invocation.positionalArguments, + equals(['A332C23D', PushGateway.mpns])); + expect( + invocation.namedArguments, + equals({ + #keyset: null, + #using: null, + #topic: null, + #environment: null, + #start: 'ch2', + #count: 10, + })); + }); }); }); } diff --git a/pubnub/test/unit/dx/utils_test.dart b/pubnub/test/unit/dx/utils_test.dart index abd44265..f56c2af0 100644 --- a/pubnub/test/unit/dx/utils_test.dart +++ b/pubnub/test/unit/dx/utils_test.dart @@ -44,7 +44,9 @@ void main() { computeV2Signature(keyset, requestType, path, queryParams, body); expect(response, equals(expectedSign)); }); - test('computeV2Signature should return valid signature when special characters included', () { + test( + 'computeV2Signature should return valid signature when special characters included', + () { PubNub.version = '1.0.0'; Core.version = '1.0.0'; Time.mock(DateTime.fromMillisecondsSinceEpoch(1234567890000));