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/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..ef7a0263b39e 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((String) call.argument("url"))); + break; case "FirebaseDynamicLinks#getInitialLink": handleGetInitialDynamicLink(result); break; @@ -114,17 +117,8 @@ private Map getMapFromPendingDynamicLinkData( return dynamicLink; } - private void handleGetInitialDynamicLink(final Result result) { - // If there's no activity, then there's no initial dynamic link. - if (registrar.activity() == null) { - result.success(null); - return; - } - - FirebaseDynamicLinks.getInstance() - .getDynamicLink(registrar.activity().getIntent()) - .addOnSuccessListener( - registrar.activity(), + private void addDynamicLinkListener(Task task, final Result result) { + task.addOnSuccessListener( new OnSuccessListener() { @Override public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) { @@ -138,7 +132,6 @@ public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) { } }) .addOnFailureListener( - registrar.activity(), new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { @@ -147,6 +140,22 @@ 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) { + result.success(null); + return; + } + + addDynamicLinkListener( + FirebaseDynamicLinks.getInstance().getDynamicLink(registrar.activity().getIntent()), + result); + } + private OnCompleteListener createShortLinkListener(final Result result) { return new OnCompleteListener() { @Override diff --git a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m index 9893a4ad6c02..00e8b5797e58 100644 --- a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m +++ b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m @@ -99,6 +99,17 @@ - (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 { + result(getDictionaryFromDynamicLink(dynamicLink)); + } + }; + [[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..d9f701d79245 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,13 @@ class FirebaseDynamicLinks { return getPendingDynamicLinkDataFromMap(linkData); } + Future getDynamicLink(Uri url) async { + final Map linkData = await FirebaseDynamicLinks.channel + .invokeMapMethod('FirebaseDynamicLinks#getDynamicLink', + {'url': url.toString()}); + return getPendingDynamicLinkDataFromMap(linkData); + } + PendingDynamicLinkData getPendingDynamicLinkDataFromMap( Map linkData) { if (linkData == null) return null; 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 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..6cccf0393b5c 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,10 @@ void main() { 'minimumVersion': 'Version 12', }, }; + case 'FirebaseDynamicLinks#getDynamicLink': + return { + 'link': 'https://google.com', + }; default: return null; } @@ -65,6 +69,21 @@ void main() { ]); }); + test('getDynamicLink', () async { + final Uri argument = Uri.parse('short-link'); + final PendingDynamicLinkData data = + await FirebaseDynamicLinks.instance.getDynamicLink(argument); + + expect(data.link.host, 'google.com'); + + expect(log, [ + isMethodCall('FirebaseDynamicLinks#getDynamicLink', + arguments: { + 'url': argument.toString(), + }) + ]); + }); + group('$DynamicLinkParameters', () { test('shortenUrl', () async { final Uri url = Uri.parse('google.com');