From 92f7f1f3a6f7854fd2bf005c1eb024e35becd814 Mon Sep 17 00:00:00 2001 From: Roei Erez Date: Mon, 6 May 2019 16:06:30 +0300 Subject: [PATCH 1/4] firebase_dynamic_links bug fix: support clicking on link while app is running. This commit checks for dynamic links on any new intent and remove the limitation for the fluter activity intent only. This way users can retrieve the dynamic link that was clicked while the app was running. In addition the old links is cleaned up every time the link was sent successfully to the user to get a better and more expected behavior. This behavior now matches the behavior on ios. --- .../FirebaseDynamicLinksPlugin.java | 63 +++++++++++++------ 1 file changed, 45 insertions(+), 18 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 91fe3a06ed27..b5edcbe464e8 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 @@ -1,5 +1,6 @@ package io.flutter.plugins.firebasedynamiclinks; +import android.content.Intent; import android.net.Uri; import androidx.annotation.NonNull; import com.google.android.gms.tasks.OnCompleteListener; @@ -13,6 +14,7 @@ import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.plugin.common.PluginRegistry; import io.flutter.plugin.common.PluginRegistry.Registrar; import java.util.ArrayList; import java.util.HashMap; @@ -22,9 +24,22 @@ /** FirebaseDynamicLinksPlugin */ public class FirebaseDynamicLinksPlugin implements MethodCallHandler { private Registrar registrar; + private Map dynamicLinkData; + private Task extractIntentLinkTask; private FirebaseDynamicLinksPlugin(Registrar registrar) { this.registrar = registrar; + + registrar.addNewIntentListener( + new PluginRegistry.NewIntentListener() { + @Override + public boolean onNewIntent(Intent intent) { + checkLinkOnIntent(intent); + return false; + } + }); + + checkLinkOnIntent(registrar.activity().getIntent()); } public static void registerWith(Registrar registrar) { @@ -61,29 +76,14 @@ public void onMethodCall(MethodCall call, Result result) { } private void handleRetrieveDynamicLink(final Result result) { - FirebaseDynamicLinks.getInstance() - .getDynamicLink(registrar.activity().getIntent()) + extractIntentLinkTask .addOnCompleteListener( registrar.activity(), new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { - PendingDynamicLinkData data = task.getResult(); - if (data != null) { - Map dynamicLink = new HashMap<>(); - dynamicLink.put("link", data.getLink().toString()); - - Map androidData = new HashMap<>(); - androidData.put("clickTimestamp", data.getClickTimestamp()); - androidData.put("minimumVersion", data.getMinimumAppVersion()); - - dynamicLink.put("android", androidData); - result.success(dynamicLink); - return; - } - } - result.success(null); + result.success(dynamicLinkData); + dynamicLinkData = null; } }) .addOnFailureListener( @@ -274,4 +274,31 @@ private static T valueFor(String key, Map map) { T result = (T) map.get(key); return result; } + + private void checkLinkOnIntent(Intent intent) { + extractIntentLinkTask = + FirebaseDynamicLinks.getInstance() + .getDynamicLink(intent) + .addOnCompleteListener( + registrar.activity(), + new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (task.isSuccessful()) { + PendingDynamicLinkData data = task.getResult(); + if (data != null) { + Map linkData = new HashMap<>(); + linkData.put("link", data.getLink().toString()); + + Map androidData = new HashMap<>(); + androidData.put("clickTimestamp", data.getClickTimestamp()); + androidData.put("minimumVersion", data.getMinimumAppVersion()); + + linkData.put("android", androidData); + dynamicLinkData = linkData; + } + } + } + }); + } } From 945af5e5a307999732a2f47efcdad5e3924dd393 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Tue, 28 May 2019 16:32:54 -0700 Subject: [PATCH 2/4] cache intent rather than task --- .../FirebaseDynamicLinksPlugin.java | 63 +++++++++---------- 1 file changed, 28 insertions(+), 35 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 b5edcbe464e8..463ceff35a15 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 @@ -24,22 +24,20 @@ /** FirebaseDynamicLinksPlugin */ public class FirebaseDynamicLinksPlugin implements MethodCallHandler { private Registrar registrar; - private Map dynamicLinkData; - private Task extractIntentLinkTask; + private Intent latestIntent; private FirebaseDynamicLinksPlugin(Registrar registrar) { this.registrar = registrar; + latestIntent = registrar.activity().getIntent(); registrar.addNewIntentListener( new PluginRegistry.NewIntentListener() { @Override public boolean onNewIntent(Intent intent) { - checkLinkOnIntent(intent); + latestIntent = intent; return false; } }); - - checkLinkOnIntent(registrar.activity().getIntent()); } public static void registerWith(Registrar registrar) { @@ -76,14 +74,36 @@ public void onMethodCall(MethodCall call, Result result) { } private void handleRetrieveDynamicLink(final Result result) { - extractIntentLinkTask + if (latestIntent == null) { + result.success(null); + return; + } + + FirebaseDynamicLinks.getInstance() + .getDynamicLink(latestIntent) .addOnCompleteListener( registrar.activity(), new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { - result.success(dynamicLinkData); - dynamicLinkData = null; + if (task.isSuccessful()) { + PendingDynamicLinkData data = task.getResult(); + if (data != null) { + Map dynamicLink = new HashMap<>(); + dynamicLink.put("link", data.getLink().toString()); + + Map androidData = new HashMap<>(); + androidData.put("clickTimestamp", data.getClickTimestamp()); + androidData.put("minimumVersion", data.getMinimumAppVersion()); + + dynamicLink.put("android", androidData); + + latestIntent = null; + result.success(dynamicLink); + return; + } + } + result.success(null); } }) .addOnFailureListener( @@ -274,31 +294,4 @@ private static T valueFor(String key, Map map) { T result = (T) map.get(key); return result; } - - private void checkLinkOnIntent(Intent intent) { - extractIntentLinkTask = - FirebaseDynamicLinks.getInstance() - .getDynamicLink(intent) - .addOnCompleteListener( - registrar.activity(), - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { - PendingDynamicLinkData data = task.getResult(); - if (data != null) { - Map linkData = new HashMap<>(); - linkData.put("link", data.getLink().toString()); - - Map androidData = new HashMap<>(); - androidData.put("clickTimestamp", data.getClickTimestamp()); - androidData.put("minimumVersion", data.getMinimumAppVersion()); - - linkData.put("android", androidData); - dynamicLinkData = linkData; - } - } - } - }); - } } From b3be7b60d41be3a0c06b523bf783723dfbf6bd1b Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Tue, 28 May 2019 16:43:56 -0700 Subject: [PATCH 3/4] Open app by link in example --- packages/firebase_dynamic_links/example/lib/main.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/firebase_dynamic_links/example/lib/main.dart b/packages/firebase_dynamic_links/example/lib/main.dart index 43d16e9537e2..443b79d986db 100644 --- a/packages/firebase_dynamic_links/example/lib/main.dart +++ b/packages/firebase_dynamic_links/example/lib/main.dart @@ -36,6 +36,7 @@ class _MainScreenState extends State<_MainScreen> with WidgetsBindingObserver { @override void initState() { super.initState(); + _retrieveDynamicLink(); WidgetsBinding.instance.addObserver(this); } From 1db97b648a3d7704faa66af782217eb54f40c8f5 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Tue, 28 May 2019 16:47:53 -0700 Subject: [PATCH 4/4] Version bump --- packages/firebase_dynamic_links/CHANGELOG.md | 5 +++++ packages/firebase_dynamic_links/pubspec.yaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/firebase_dynamic_links/CHANGELOG.md b/packages/firebase_dynamic_links/CHANGELOG.md index a6be81ecc1d3..1d026828a148 100644 --- a/packages/firebase_dynamic_links/CHANGELOG.md +++ b/packages/firebase_dynamic_links/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.4.0+1 + +* Fixed bug where link persists after starting an app with a Dynamic Link. +* Fixed bug where retrieving a link would fail when app was already running. + ## 0.4.0 * Update dependency on firebase_core to 0.4.0. diff --git a/packages/firebase_dynamic_links/pubspec.yaml b/packages/firebase_dynamic_links/pubspec.yaml index f87e00d1f549..739e30b40157 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.4.0 +version: 0.4.0+1 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_dynamic_links