From 22ae5a44535eaf4eac0c26c9cebf015ff6a8132f Mon Sep 17 00:00:00 2001 From: Yiyao Zhang Date: Thu, 7 Nov 2019 15:38:56 +0800 Subject: [PATCH 1/8] getDynamicLink iOS --- .../ios/Classes/FirebaseDynamicLinksPlugin.m | 14 ++++++++++++++ .../lib/src/firebase_dynamic_links.dart | 10 ++++++++++ 2 files changed, 24 insertions(+) diff --git a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m index 9893a4ad6c02..3731f270e3cf 100644 --- a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m +++ b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m @@ -99,6 +99,20 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result } else { result(dict); } + } else if ([@"FirebaseDynamicLinks#getDynamicLink" isEqualToString:call.method]) { + NSURL *shortLink = [NSURL URLWithString:call.arguments[@"url"]]; + FIRDynamicLinkUniversalLinkHandler completion = + ^(FIRDynamicLink *_Nullable dynamicLink, NSError *_Nullable error) { + if (error) { + result(getFlutterError(error)); + } else if (dynamicLink && dynamicLink.url) { + result([dynamicLink.url absoluteString]); + } else { + result(null); + } + }; + [[FIRDynamicLinks dynamicLinks] handleUniversalLink:shortLink + completion:completion]; } else { result(FlutterMethodNotImplemented); } diff --git a/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart b/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart index 82d64840e4ee..273e49c4702b 100644 --- a/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart +++ b/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart @@ -37,6 +37,16 @@ class FirebaseDynamicLinks { return getPendingDynamicLinkDataFromMap(linkData); } + Future getDynamicLink(Uri url) async { + final String reply = await FirebaseDynamicLinks.channel.invokeMethod( + 'FirebaseDynamicLinks#getDynamicLink', + {'url': url.toString()}); + if (reply == null) { + return null; + } + return Uri.tryParse(reply['url']); + } + PendingDynamicLinkData getPendingDynamicLinkDataFromMap( Map linkData) { if (linkData == null) return null; From 94c35617377ef267c7a8037a936f41b067dc320f Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Thu, 7 Nov 2019 17:33:40 +0800 Subject: [PATCH 2/8] getDynamicLink Android --- .../FirebaseDynamicLinksPlugin.java | 27 +++++++++++++++++++ .../lib/src/firebase_dynamic_links.dart | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java index 9969fc31f2dd..143941f57892 100644 --- a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java +++ b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java @@ -92,6 +92,9 @@ public void onMethodCall(MethodCall call, Result result) { builder.setLongLink(url); buildShortDynamicLink(builder, call, createShortLinkListener(result)); break; + case "FirebaseDynamicLinks#getDynamicLink": + handleGetDynamicLink(result, Uri.parse(call.argument("url"))); + break; case "FirebaseDynamicLinks#getInitialLink": handleGetInitialDynamicLink(result); break; @@ -114,6 +117,30 @@ private Map getMapFromPendingDynamicLinkData( return dynamicLink; } + private void handleGetDynamicLink(final Result result, Uri uri) { + FirebaseDynamicLinks.getInstance() + .getDynamicLink(uri) + .addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) { + if (pendingDynamicLinkData != null) { + Uri link = pendingDynamicLinkData.getLink(); + if (link != null) { + result.success(link.toString()); + return; + } + } + result.success(null); + } + }) + .addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception e) { + result.error(e.getClass().getSimpleName(), e.getMessage(), null); + } + }); + } + private void handleGetInitialDynamicLink(final Result result) { // If there's no activity, then there's no initial dynamic link. if (registrar.activity() == null) { diff --git a/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart b/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart index 273e49c4702b..2951e8dad6a7 100644 --- a/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart +++ b/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart @@ -44,7 +44,7 @@ class FirebaseDynamicLinks { if (reply == null) { return null; } - return Uri.tryParse(reply['url']); + return Uri.tryParse(reply); } PendingDynamicLinkData getPendingDynamicLinkDataFromMap( From 91643156557092fc895cf35773db5be58e460ea4 Mon Sep 17 00:00:00 2001 From: Yiyao Zhang Date: Thu, 7 Nov 2019 19:03:58 +0800 Subject: [PATCH 3/8] Fix formatting --- .../FirebaseDynamicLinksPlugin.java | 38 ++++++++++--------- .../ios/Classes/FirebaseDynamicLinksPlugin.m | 5 +-- .../lib/src/firebase_dynamic_links.dart | 6 +-- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java index 143941f57892..59da62249dc7 100644 --- a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java +++ b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java @@ -120,25 +120,27 @@ private Map getMapFromPendingDynamicLinkData( private void handleGetDynamicLink(final Result result, Uri uri) { FirebaseDynamicLinks.getInstance() .getDynamicLink(uri) - .addOnSuccessListener(new OnSuccessListener() { - @Override - public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) { - if (pendingDynamicLinkData != null) { - Uri link = pendingDynamicLinkData.getLink(); - if (link != null) { - result.success(link.toString()); - return; + .addOnSuccessListener( + new OnSuccessListener() { + @Override + public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) { + if (pendingDynamicLinkData != null) { + Uri link = pendingDynamicLinkData.getLink(); + if (link != null) { + result.success(link.toString()); + return; + } + } + result.success(null); } - } - result.success(null); - } - }) - .addOnFailureListener(new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error(e.getClass().getSimpleName(), e.getMessage(), null); - } - }); + }) + .addOnFailureListener( + new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception e) { + result.error(e.getClass().getSimpleName(), e.getMessage(), null); + } + }); } private void handleGetInitialDynamicLink(final Result result) { diff --git a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m index 3731f270e3cf..9552861d022a 100644 --- a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m +++ b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m @@ -101,7 +101,7 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result } } else if ([@"FirebaseDynamicLinks#getDynamicLink" isEqualToString:call.method]) { NSURL *shortLink = [NSURL URLWithString:call.arguments[@"url"]]; - FIRDynamicLinkUniversalLinkHandler completion = + FIRDynamicLinkUniversalLinkHandler completion = ^(FIRDynamicLink *_Nullable dynamicLink, NSError *_Nullable error) { if (error) { result(getFlutterError(error)); @@ -111,8 +111,7 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result result(null); } }; - [[FIRDynamicLinks dynamicLinks] handleUniversalLink:shortLink - completion:completion]; + [[FIRDynamicLinks dynamicLinks] handleUniversalLink:shortLink completion:completion]; } else { result(FlutterMethodNotImplemented); } diff --git a/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart b/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart index 2951e8dad6a7..34f8e587326f 100644 --- a/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart +++ b/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart @@ -38,9 +38,9 @@ class FirebaseDynamicLinks { } Future getDynamicLink(Uri url) async { - final String reply = await FirebaseDynamicLinks.channel.invokeMethod( - 'FirebaseDynamicLinks#getDynamicLink', - {'url': url.toString()}); + final String reply = await FirebaseDynamicLinks.channel + .invokeMethod('FirebaseDynamicLinks#getDynamicLink', + {'url': url.toString()}); if (reply == null) { return null; } From c61e9ba8da139dd3270e583b2e263345adb0ef98 Mon Sep 17 00:00:00 2001 From: Yiyao Zhang Date: Thu, 7 Nov 2019 19:42:28 +0800 Subject: [PATCH 4/8] getDynamicLink test --- .../test/firebase_dynamic_links_test.dart | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/firebase_dynamic_links/test/firebase_dynamic_links_test.dart b/packages/firebase_dynamic_links/test/firebase_dynamic_links_test.dart index ad558df4b635..643614c9527a 100644 --- a/packages/firebase_dynamic_links/test/firebase_dynamic_links_test.dart +++ b/packages/firebase_dynamic_links/test/firebase_dynamic_links_test.dart @@ -39,6 +39,8 @@ void main() { 'minimumVersion': 'Version 12', }, }; + case 'FirebaseDynamicLinks#getDynamicLink': + return 'https://google.com'; default: return null; } @@ -65,6 +67,21 @@ void main() { ]); }); + test('getDynamicLink', () async { + final Uri argument = Uri.parse('short-link'); + final Uri url = + await FirebaseDynamicLinks.instance.getDynamicLink(argument); + + expect(url.host, 'google.com'); + + expect(log, [ + isMethodCall('FirebaseDynamicLinks#getDynamicLink', + arguments: { + 'url': argument.toString(), + }) + ]); + }); + group('$DynamicLinkParameters', () { test('shortenUrl', () async { final Uri url = Uri.parse('google.com'); From 6646515471a57caa01b628bded5726a8854e8b57 Mon Sep 17 00:00:00 2001 From: Yiyao Zhang Date: Thu, 7 Nov 2019 20:04:13 +0800 Subject: [PATCH 5/8] Fix build --- .../firebasedynamiclinks/FirebaseDynamicLinksPlugin.java | 2 +- .../ios/Classes/FirebaseDynamicLinksPlugin.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java index 59da62249dc7..0640ffdd828e 100644 --- a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java +++ b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java @@ -93,7 +93,7 @@ public void onMethodCall(MethodCall call, Result result) { buildShortDynamicLink(builder, call, createShortLinkListener(result)); break; case "FirebaseDynamicLinks#getDynamicLink": - handleGetDynamicLink(result, Uri.parse(call.argument("url"))); + handleGetDynamicLink(result, Uri.parse((String) call.argument("url"))); break; case "FirebaseDynamicLinks#getInitialLink": handleGetInitialDynamicLink(result); diff --git a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m index 9552861d022a..1abc83a22fed 100644 --- a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m +++ b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m @@ -108,7 +108,7 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result } else if (dynamicLink && dynamicLink.url) { result([dynamicLink.url absoluteString]); } else { - result(null); + result(nil); } }; [[FIRDynamicLinks dynamicLinks] handleUniversalLink:shortLink completion:completion]; From fa5242be65caaa5784cd254c991b7c1e700ccf96 Mon Sep 17 00:00:00 2001 From: ckcz Date: Fri, 8 Nov 2019 09:47:23 +0800 Subject: [PATCH 6/8] Returns PendingDynamicLinkData while getting dynamicLink --- .../FirebaseDynamicLinksPlugin.java | 46 ++++++------------- 1 file changed, 13 insertions(+), 33 deletions(-) diff --git a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java index 0640ffdd828e..4d0dafbc1771 100644 --- a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java +++ b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java @@ -117,19 +117,16 @@ private Map getMapFromPendingDynamicLinkData( return dynamicLink; } - private void handleGetDynamicLink(final Result result, Uri uri) { - FirebaseDynamicLinks.getInstance() - .getDynamicLink(uri) - .addOnSuccessListener( + private void addDynamicLinkListener(Task task, Result result) { + task.addOnSuccessListener( new OnSuccessListener() { @Override public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) { if (pendingDynamicLinkData != null) { - Uri link = pendingDynamicLinkData.getLink(); - if (link != null) { - result.success(link.toString()); - return; - } + Map dynamicLink = + getMapFromPendingDynamicLinkData(pendingDynamicLinkData); + result.success(dynamicLink); + return; } result.success(null); } @@ -143,6 +140,10 @@ public void onFailure(@NonNull Exception e) { }); } + private void handleGetDynamicLink(final Result result, Uri uri) { + addDynamicLinkListener(FirebaseDynamicLinks.getInstance().getDynamicLink(uri), result); + } + private void handleGetInitialDynamicLink(final Result result) { // If there's no activity, then there's no initial dynamic link. if (registrar.activity() == null) { @@ -150,30 +151,9 @@ private void handleGetInitialDynamicLink(final Result result) { return; } - FirebaseDynamicLinks.getInstance() - .getDynamicLink(registrar.activity().getIntent()) - .addOnSuccessListener( - registrar.activity(), - new OnSuccessListener() { - @Override - public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) { - if (pendingDynamicLinkData != null) { - Map dynamicLink = - getMapFromPendingDynamicLinkData(pendingDynamicLinkData); - result.success(dynamicLink); - return; - } - result.success(null); - } - }) - .addOnFailureListener( - registrar.activity(), - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error(e.getClass().getSimpleName(), e.getMessage(), null); - } - }); + addDynamicLinkListener( + FirebaseDynamicLinks.getInstance().getDynamicLink(registrar.activity().getIntent()), + result); } private OnCompleteListener createShortLinkListener(final Result result) { From 0f3fa7745bf30e8823311accc14dc9e9212bda38 Mon Sep 17 00:00:00 2001 From: Yiyao Zhang Date: Fri, 8 Nov 2019 09:47:29 +0800 Subject: [PATCH 7/8] Update dart & iOS for returning PendingDynamicLinkData --- .../ios/Classes/FirebaseDynamicLinksPlugin.m | 4 +--- .../lib/src/firebase_dynamic_links.dart | 9 +++------ 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m index 1abc83a22fed..00e8b5797e58 100644 --- a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m +++ b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m @@ -105,10 +105,8 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result ^(FIRDynamicLink *_Nullable dynamicLink, NSError *_Nullable error) { if (error) { result(getFlutterError(error)); - } else if (dynamicLink && dynamicLink.url) { - result([dynamicLink.url absoluteString]); } else { - result(nil); + result(getDictionaryFromDynamicLink(dynamicLink)); } }; [[FIRDynamicLinks dynamicLinks] handleUniversalLink:shortLink completion:completion]; diff --git a/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart b/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart index 34f8e587326f..cc8b3b0d2d39 100644 --- a/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart +++ b/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart @@ -37,14 +37,11 @@ class FirebaseDynamicLinks { return getPendingDynamicLinkDataFromMap(linkData); } - Future getDynamicLink(Uri url) async { - final String reply = await FirebaseDynamicLinks.channel + Future getDynamicLink(Uri url) async { + final Map linkData = await FirebaseDynamicLinks.channel .invokeMethod('FirebaseDynamicLinks#getDynamicLink', {'url': url.toString()}); - if (reply == null) { - return null; - } - return Uri.tryParse(reply); + return getPendingDynamicLinkDataFromMap(linkData); } PendingDynamicLinkData getPendingDynamicLinkDataFromMap( From 8cd182046432b67ba0950537aa1f04cdb2a4ba85 Mon Sep 17 00:00:00 2001 From: Yiyao Zhang Date: Thu, 14 Nov 2019 11:38:38 +0800 Subject: [PATCH 8/8] Update CHANGELOG.md and pubspec.yaml --- packages/firebase_dynamic_links/CHANGELOG.md | 4 ++++ packages/firebase_dynamic_links/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/firebase_dynamic_links/CHANGELOG.md b/packages/firebase_dynamic_links/CHANGELOG.md index d68336cfe70f..d70d789ffdbc 100644 --- a/packages/firebase_dynamic_links/CHANGELOG.md +++ b/packages/firebase_dynamic_links/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.0+7 + +* Add `getDynamicLink` to support expanding from short links. + ## 0.5.0+6 * Updated README instructions for contributing for consistency with other Flutterfire plugins. diff --git a/packages/firebase_dynamic_links/pubspec.yaml b/packages/firebase_dynamic_links/pubspec.yaml index 6e65ada6f417..032659e93a4d 100644 --- a/packages/firebase_dynamic_links/pubspec.yaml +++ b/packages/firebase_dynamic_links/pubspec.yaml @@ -1,7 +1,7 @@ name: firebase_dynamic_links description: Flutter plugin for Google Dynamic Links for Firebase, an app solution for creating and handling links across multiple platforms. -version: 0.5.0+6 +version: 0.5.0+7 author: Flutter Team homepage: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_dynamic_links