55import androidx .annotation .NonNull ;
66import com .google .android .gms .tasks .OnCompleteListener ;
77import com .google .android .gms .tasks .OnFailureListener ;
8+ import com .google .android .gms .tasks .OnSuccessListener ;
89import com .google .android .gms .tasks .Task ;
910import com .google .firebase .dynamiclinks .DynamicLink ;
1011import com .google .firebase .dynamiclinks .FirebaseDynamicLinks ;
1415import io .flutter .plugin .common .MethodChannel ;
1516import io .flutter .plugin .common .MethodChannel .MethodCallHandler ;
1617import io .flutter .plugin .common .MethodChannel .Result ;
17- import io .flutter .plugin .common .PluginRegistry ;
18+ import io .flutter .plugin .common .PluginRegistry . NewIntentListener ;
1819import io .flutter .plugin .common .PluginRegistry .Registrar ;
1920import java .util .ArrayList ;
2021import java .util .HashMap ;
2122import java .util .List ;
2223import java .util .Map ;
2324
2425/** FirebaseDynamicLinksPlugin */
25- public class FirebaseDynamicLinksPlugin implements MethodCallHandler {
26- private Registrar registrar ;
27- private Intent latestIntent ;
26+ public class FirebaseDynamicLinksPlugin implements MethodCallHandler , NewIntentListener {
27+ private final Registrar registrar ;
28+ private final MethodChannel channel ;
2829
29- private FirebaseDynamicLinksPlugin (Registrar registrar ) {
30+ private FirebaseDynamicLinksPlugin (Registrar registrar , MethodChannel channel ) {
3031 this .registrar = registrar ;
31- latestIntent = registrar .activity ().getIntent ();
32-
33- registrar .addNewIntentListener (
34- new PluginRegistry .NewIntentListener () {
35- @ Override
36- public boolean onNewIntent (Intent intent ) {
37- latestIntent = intent ;
38- return false ;
39- }
40- });
32+ this .channel = channel ;
33+ }
34+
35+ @ Override
36+ public boolean onNewIntent (Intent intent ) {
37+ FirebaseDynamicLinks .getInstance ()
38+ .getDynamicLink (intent )
39+ .addOnSuccessListener (
40+ registrar .activity (),
41+ new OnSuccessListener <PendingDynamicLinkData >() {
42+ @ Override
43+ public void onSuccess (PendingDynamicLinkData pendingDynamicLinkData ) {
44+ if (pendingDynamicLinkData != null ) {
45+ Map <String , Object > dynamicLink =
46+ getMapFromPendingDynamicLinkData (pendingDynamicLinkData );
47+ channel .invokeMethod ("onLinkSuccess" , dynamicLink );
48+ }
49+ }
50+ })
51+ .addOnFailureListener (
52+ registrar .activity (),
53+ new OnFailureListener () {
54+ @ Override
55+ public void onFailure (@ NonNull Exception e ) {
56+ Map <String , Object > exception = new HashMap <>();
57+ exception .put ("code" , e .getClass ().getSimpleName ());
58+ exception .put ("message" , e .getMessage ());
59+ exception .put ("details" , null );
60+ channel .invokeMethod ("onLinkError" , exception );
61+ }
62+ });
63+
64+ return false ;
4165 }
4266
4367 public static void registerWith (Registrar registrar ) {
4468 final MethodChannel channel =
4569 new MethodChannel (registrar .messenger (), "plugins.flutter.io/firebase_dynamic_links" );
46- channel .setMethodCallHandler (new FirebaseDynamicLinksPlugin (registrar ));
70+ channel .setMethodCallHandler (new FirebaseDynamicLinksPlugin (registrar , channel ));
4771 }
4872
4973 @ Override
@@ -64,49 +88,47 @@ public void onMethodCall(MethodCall call, Result result) {
6488 builder .setLongLink (url );
6589 buildShortDynamicLink (builder , call , createShortLinkListener (result ));
6690 break ;
67- case "FirebaseDynamicLinks#retrieveDynamicLink " :
68- handleRetrieveDynamicLink (result );
91+ case "FirebaseDynamicLinks#getLaunchLink " :
92+ handleGetLaunchDynamicLink (result );
6993 break ;
7094 default :
7195 result .notImplemented ();
7296 break ;
7397 }
7498 }
7599
76- private void handleRetrieveDynamicLink (final Result result ) {
77- if (latestIntent == null ) {
78- result .success (null );
79- return ;
80- }
100+ private Map <String , Object > getMapFromPendingDynamicLinkData (
101+ PendingDynamicLinkData pendingDynamicLinkData ) {
102+ Map <String , Object > dynamicLink = new HashMap <>();
103+ dynamicLink .put ("link" , pendingDynamicLinkData .getLink ().toString ());
104+
105+ Map <String , Object > androidData = new HashMap <>();
106+ androidData .put ("clickTimestamp" , pendingDynamicLinkData .getClickTimestamp ());
107+ androidData .put ("minimumVersion" , pendingDynamicLinkData .getMinimumAppVersion ());
81108
109+ dynamicLink .put ("android" , androidData );
110+ return dynamicLink ;
111+ }
112+
113+ private void handleGetLaunchDynamicLink (final Result result ) {
82114 FirebaseDynamicLinks .getInstance ()
83- .getDynamicLink (latestIntent )
84- .addOnCompleteListener (
115+ .getDynamicLink (registrar . activity (). getIntent () )
116+ .addOnSuccessListener (
85117 registrar .activity (),
86- new OnCompleteListener <PendingDynamicLinkData >() {
118+ new OnSuccessListener <PendingDynamicLinkData >() {
87119 @ Override
88- public void onComplete (@ NonNull Task <PendingDynamicLinkData > task ) {
89- if (task .isSuccessful ()) {
90- PendingDynamicLinkData data = task .getResult ();
91- if (data != null ) {
92- Map <String , Object > dynamicLink = new HashMap <>();
93- dynamicLink .put ("link" , data .getLink ().toString ());
94-
95- Map <String , Object > androidData = new HashMap <>();
96- androidData .put ("clickTimestamp" , data .getClickTimestamp ());
97- androidData .put ("minimumVersion" , data .getMinimumAppVersion ());
98-
99- dynamicLink .put ("android" , androidData );
100-
101- latestIntent = null ;
102- result .success (dynamicLink );
103- return ;
104- }
120+ public void onSuccess (PendingDynamicLinkData pendingDynamicLinkData ) {
121+ if (pendingDynamicLinkData != null ) {
122+ Map <String , Object > dynamicLink =
123+ getMapFromPendingDynamicLinkData (pendingDynamicLinkData );
124+ result .success (dynamicLink );
125+ return ;
105126 }
106127 result .success (null );
107128 }
108129 })
109130 .addOnFailureListener (
131+ registrar .activity (),
110132 new OnFailureListener () {
111133 @ Override
112134 public void onFailure (@ NonNull Exception e ) {
0 commit comments