44
55package io .flutter .plugins .firebasedynamiclinks ;
66
7+ import android .app .Activity ;
78import android .content .Intent ;
89import android .net .Uri ;
9- import androidx .annotation .NonNull ;
1010import com .google .android .gms .tasks .OnCompleteListener ;
1111import com .google .android .gms .tasks .OnFailureListener ;
1212import com .google .android .gms .tasks .OnSuccessListener ;
1515import com .google .firebase .dynamiclinks .FirebaseDynamicLinks ;
1616import com .google .firebase .dynamiclinks .PendingDynamicLinkData ;
1717import com .google .firebase .dynamiclinks .ShortDynamicLink ;
18+ import io .flutter .embedding .engine .plugins .FlutterPlugin ;
19+ import io .flutter .embedding .engine .plugins .activity .ActivityAware ;
20+ import io .flutter .embedding .engine .plugins .activity .ActivityPluginBinding ;
21+ import io .flutter .plugin .common .BinaryMessenger ;
1822import io .flutter .plugin .common .MethodCall ;
1923import io .flutter .plugin .common .MethodChannel ;
2024import io .flutter .plugin .common .MethodChannel .MethodCallHandler ;
2630import java .util .List ;
2731import java .util .Map ;
2832
29- /** FirebaseDynamicLinksPlugin */
30- public class FirebaseDynamicLinksPlugin implements MethodCallHandler , NewIntentListener {
31- private final Registrar registrar ;
32- private final MethodChannel channel ;
33-
34- private FirebaseDynamicLinksPlugin (Registrar registrar , MethodChannel channel ) {
35- this .registrar = registrar ;
33+ /**
34+ * Flutter plugin accessing for Firebase Dynamic Links API.
35+ *
36+ * <p>Instantiate this in an add to app scenario to gracefully handle activity and context changes.
37+ */
38+ public class FirebaseDynamicLinksPlugin
39+ implements FlutterPlugin , ActivityAware , MethodCallHandler , NewIntentListener {
40+ private Activity activity ;
41+ private MethodChannel channel ;
42+
43+ private FirebaseDynamicLinksPlugin (Activity activity , MethodChannel channel ) {
44+ this .activity = activity ;
3645 this .channel = channel ;
3746 }
3847
48+ /**
49+ * Default Constructor.
50+ *
51+ * <p>Use this when adding the plugin to your FlutterEngine
52+ */
53+ public FirebaseDynamicLinksPlugin () {}
54+
55+ /**
56+ * Registers a plugin with the v1 embedding api {@code io.flutter.plugin.common}.
57+ *
58+ * <p>Calling this will register the plugin with the passed registrar. However, plugins
59+ * initialized this way won't react to changes in activity or context.
60+ *
61+ * @param registrar attaches this plugin's {@link
62+ * io.flutter.plugin.common.MethodChannel.MethodCallHandler} to the registrar's {@link
63+ * io.flutter.plugin.common.BinaryMessenger}.
64+ */
65+ public static void registerWith (Registrar registrar ) {
66+ final MethodChannel channel = createChannel (registrar .messenger ());
67+ final FirebaseDynamicLinksPlugin plugin =
68+ new FirebaseDynamicLinksPlugin (registrar .activity (), channel );
69+ registrar .addNewIntentListener (plugin );
70+ channel .setMethodCallHandler (plugin );
71+ }
72+
73+ private static MethodChannel createChannel (final BinaryMessenger messenger ) {
74+ return new MethodChannel (messenger , "plugins.flutter.io/firebase_dynamic_links" );
75+ }
76+
3977 @ Override
4078 public boolean onNewIntent (Intent intent ) {
4179 FirebaseDynamicLinks .getInstance ()
@@ -54,7 +92,7 @@ public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
5492 .addOnFailureListener (
5593 new OnFailureListener () {
5694 @ Override
57- public void onFailure (@ NonNull Exception e ) {
95+ public void onFailure (Exception e ) {
5896 Map <String , Object > exception = new HashMap <>();
5997 exception .put ("code" , e .getClass ().getSimpleName ());
6098 exception .put ("message" , e .getMessage ());
@@ -66,12 +104,37 @@ public void onFailure(@NonNull Exception e) {
66104 return false ;
67105 }
68106
69- public static void registerWith (Registrar registrar ) {
70- final MethodChannel channel =
71- new MethodChannel (registrar .messenger (), "plugins.flutter.io/firebase_dynamic_links" );
72- final FirebaseDynamicLinksPlugin plugin = new FirebaseDynamicLinksPlugin (registrar , channel );
73- registrar .addNewIntentListener (plugin );
74- channel .setMethodCallHandler (plugin );
107+ @ Override
108+ public void onAttachedToEngine (FlutterPluginBinding binding ) {
109+ channel = createChannel (binding .getFlutterEngine ().getDartExecutor ());
110+ channel .setMethodCallHandler (this );
111+ }
112+
113+ @ Override
114+ public void onDetachedFromEngine (FlutterPluginBinding binding ) {
115+ channel .setMethodCallHandler (null );
116+ }
117+
118+ @ Override
119+ public void onAttachedToActivity (ActivityPluginBinding binding ) {
120+ activity = binding .getActivity ();
121+ binding .addOnNewIntentListener (this );
122+ }
123+
124+ @ Override
125+ public void onDetachedFromActivityForConfigChanges () {
126+ activity = null ;
127+ }
128+
129+ @ Override
130+ public void onReattachedToActivityForConfigChanges (ActivityPluginBinding binding ) {
131+ activity = binding .getActivity ();
132+ binding .addOnNewIntentListener (this );
133+ }
134+
135+ @ Override
136+ public void onDetachedFromActivity () {
137+ activity = null ;
75138 }
76139
77140 @ Override
@@ -134,7 +197,7 @@ public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
134197 .addOnFailureListener (
135198 new OnFailureListener () {
136199 @ Override
137- public void onFailure (@ NonNull Exception e ) {
200+ public void onFailure (Exception e ) {
138201 result .error (e .getClass ().getSimpleName (), e .getMessage (), null );
139202 }
140203 });
@@ -146,20 +209,19 @@ private void handleGetDynamicLink(final Result result, Uri uri) {
146209
147210 private void handleGetInitialDynamicLink (final Result result ) {
148211 // If there's no activity, then there's no initial dynamic link.
149- if (registrar . activity () == null ) {
212+ if (activity == null ) {
150213 result .success (null );
151214 return ;
152215 }
153216
154217 addDynamicLinkListener (
155- FirebaseDynamicLinks .getInstance ().getDynamicLink (registrar .activity ().getIntent ()),
156- result );
218+ FirebaseDynamicLinks .getInstance ().getDynamicLink (activity .getIntent ()), result );
157219 }
158220
159221 private OnCompleteListener <ShortDynamicLink > createShortLinkListener (final Result result ) {
160222 return new OnCompleteListener <ShortDynamicLink >() {
161223 @ Override
162- public void onComplete (@ NonNull Task <ShortDynamicLink > task ) {
224+ public void onComplete (Task <ShortDynamicLink > task ) {
163225 if (task .isSuccessful ()) {
164226 Map <String , Object > url = new HashMap <>();
165227 url .put ("url" , task .getResult ().getShortLink ().toString ());
0 commit comments