From 732a533f61dce945cd2ec5d5ead7548c3c27199f Mon Sep 17 00:00:00 2001 From: Andre Paraense Date: Mon, 10 Feb 2020 15:42:46 +0000 Subject: [PATCH] Support for all flags --- CHANGELOG.md | 6 +++- android/build.gradle | 2 +- .../LaunchdarklyFlutterPlugin.java | 4 ++- example/lib/main.dart | 28 +++++++++++++++++++ .../SwiftLaunchdarklyFlutterPlugin.swift | 10 +++++-- ios/launchdarkly_flutter.podspec | 2 +- lib/launchdarkly_flutter.dart | 7 +++++ pubspec.yaml | 2 +- test/launchdarkly_flutter_test.dart | 13 +++++++++ 9 files changed, 67 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 647bd9d..ac43b8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ +## 0.3.0 + +* Adding all flags support. + ## 0.2.0 -* Adding real-time updates support. +* Adding real-time updates support for feature flags. ## 0.1.7 diff --git a/android/build.gradle b/android/build.gradle index 91fdf67..f9a2be5 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,5 +1,5 @@ group 'com.oakam.launchdarkly_flutter' -version '0.2.0' +version '0.3.0' buildscript { repositories { diff --git a/android/src/main/java/com/oakam/launchdarkly_flutter/LaunchdarklyFlutterPlugin.java b/android/src/main/java/com/oakam/launchdarkly_flutter/LaunchdarklyFlutterPlugin.java index 2be26f1..e985ec1 100644 --- a/android/src/main/java/com/oakam/launchdarkly_flutter/LaunchdarklyFlutterPlugin.java +++ b/android/src/main/java/com/oakam/launchdarkly_flutter/LaunchdarklyFlutterPlugin.java @@ -125,7 +125,9 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { String flagKey = call.argument("flagKey"); String fallback = call.argument("fallback"); result.success(ldClient.stringVariation(flagKey,fallback)); - } else if (call.method.equals("registerFeatureFlagListener")) { + } else if (call.method.equals("allFlags")) { + result.success(ldClient.allFlags()); + }else if (call.method.equals("registerFeatureFlagListener")) { String flagKey = call.argument("flagKey"); diff --git a/example/lib/main.dart b/example/lib/main.dart index e2a3d40..68b45f0 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -13,6 +13,7 @@ class MyApp extends StatefulWidget { class _MyAppState extends State { bool _shouldShow = false; bool _listenerRegistered = false; + Map _allFlags = {}; LaunchdarklyFlutter launchdarklyFlutter; String mobileKey = 'YOUR_MOBILE_KEY'; @@ -86,6 +87,14 @@ class _MyAppState extends State { ? 'Unregister listener' : 'Register listener'), ), + SizedBox(height: 30.0,), + RaisedButton( + onPressed: () async { + _verifyAllFlags(); + }, + child: Text('Verify all flags'), + ), + Text('All flags: $_allFlags\n'), ], ), ), @@ -111,4 +120,23 @@ class _MyAppState extends State { _shouldShow = shouldShow; }); } + + void _verifyAllFlags() async { + Map allFlags; + // Platform messages may fail, so we use a try/catch PlatformException. + try { + allFlags = await launchdarklyFlutter.allFlags(); + } on PlatformException { + allFlags = {}; + } + + // If the widget was removed from the tree while the asynchronous platform + // message was in flight, we want to discard the reply rather than calling + // setState to update our non-existent appearance. + if (!mounted) return; + + setState(() { + _allFlags = allFlags; + }); + } } diff --git a/ios/Classes/SwiftLaunchdarklyFlutterPlugin.swift b/ios/Classes/SwiftLaunchdarklyFlutterPlugin.swift index e00360d..38314bc 100644 --- a/ios/Classes/SwiftLaunchdarklyFlutterPlugin.swift +++ b/ios/Classes/SwiftLaunchdarklyFlutterPlugin.swift @@ -22,7 +22,7 @@ import LaunchDarkly } public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - let arguments = call.arguments as! [String:Any] + let arguments = call.arguments as? [String:Any] ?? [:] if (call.method == "init") { @@ -76,7 +76,13 @@ import LaunchDarkly result(LDClient.shared.variation(forKey: flagKey, fallback: fallback) as String) - } else if(call.method == "registerFeatureFlagListener") { + } else if(call.method == "allFlags") { + + let allFlags = LDClient.shared.allFlagValues ?? [:] + + result(allFlags) + + }else if(call.method == "registerFeatureFlagListener") { let flagKey = arguments["flagKey"] as? String ?? "" diff --git a/ios/launchdarkly_flutter.podspec b/ios/launchdarkly_flutter.podspec index 39393ed..99fcc12 100644 --- a/ios/launchdarkly_flutter.podspec +++ b/ios/launchdarkly_flutter.podspec @@ -4,7 +4,7 @@ # Pod::Spec.new do |s| s.name = 'launchdarkly_flutter' - s.version = '0.2.0' + s.version = '0.3.0' s.summary = 'A Flutter LaunchDarkly SDK.' s.description = <<-DESC This is an unofficial LaunchDarkly SDK for Flutter, for anyone willing to use LaunchDarkly in a Flutter app. diff --git a/lib/launchdarkly_flutter.dart b/lib/launchdarkly_flutter.dart index 5a6499a..0694e82 100644 --- a/lib/launchdarkly_flutter.dart +++ b/lib/launchdarkly_flutter.dart @@ -122,4 +122,11 @@ class LaunchdarklyFlutter { return await _channel.invokeMethod( 'unregisterFeatureFlagListener', {'flagKey': flagKey}); } + + /// Returns a map of all feature flags for the current user. No events are sent to LaunchDarkly. + Future> allFlags() async { + Map allFlags = + Map.from(await _channel.invokeMethod('allFlags')); + return allFlags; + } } diff --git a/pubspec.yaml b/pubspec.yaml index d083d36..d832c26 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: launchdarkly_flutter description: This is an unofficial LaunchDarkly SDK for Flutter, for anyone willing to use LaunchDarkly in a Flutter app. -version: 0.2.0 +version: 0.3.0 homepage: https://github.com/andre-paraense/launchdarkly_flutter issue_tracker: https://github.com/andre-paraense/launchdarkly_flutter/issues diff --git a/test/launchdarkly_flutter_test.dart b/test/launchdarkly_flutter_test.dart index 6215e87..b77eac8 100644 --- a/test/launchdarkly_flutter_test.dart +++ b/test/launchdarkly_flutter_test.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:launchdarkly_flutter/launchdarkly_flutter.dart'; @@ -47,6 +49,11 @@ void main() { return true; } + if (methodCall.method == 'allFlags') { + Map response = jsonDecode('{"flagKey":true}'); + return response; + } + return launchdarklyFlutter.handlerMethodCalls(methodCall); }); }); @@ -197,4 +204,10 @@ void main() { 'callbackRegisterFeatureFlagListener', arguments), true); }); + + test('allFlags', () async { + Map response = await launchdarklyFlutter.allFlags(); + + expect(response['flagKey'], true); + }); }