66 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Dart
		
	
	
		
		
			
		
	
	
			66 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Dart
		
	
	
| 
								 | 
							
								import 'package:firebase_dynamic_links/firebase_dynamic_links.dart';
							 | 
						||
| 
								 | 
							
								import 'package:flutter/services.dart';
							 | 
						||
| 
								 | 
							
								import 'package:guru_app/guru_app.dart';
							 | 
						||
| 
								 | 
							
								import 'package:guru_navigator/guru_navigator.dart';
							 | 
						||
| 
								 | 
							
								import 'package:guru_utils/log/log.dart';
							 | 
						||
| 
								 | 
							
								import 'package:guru_utils/router/router.dart';
							 | 
						||
| 
								 | 
							
								import 'package:guru_utils/uri/uri_utils.dart';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Created by Haoyi on 5/20/21
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class DxLinkManager {
							 | 
						||
| 
								 | 
							
								  static final DxLinkManager instance = DxLinkManager._();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  DxLinkManager._();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void initDynamicLinks() async {
							 | 
						||
| 
								 | 
							
								    FirebaseDynamicLinks.instance.onLink.listen((PendingDynamicLinkData? dynamicLink) async {
							 | 
						||
| 
								 | 
							
								      final Uri? deepLink = dynamicLink?.link;
							 | 
						||
| 
								 | 
							
								      Log.d("### onDynamicLink $deepLink");
							 | 
						||
| 
								 | 
							
								      if (deepLink != null) {
							 | 
						||
| 
								 | 
							
								        _openLink(deepLink);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }, onError: (e) async {
							 | 
						||
| 
								 | 
							
								      Log.w('onLinkError ${e.message} ${e.stacktrace}', error: e);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    final PendingDynamicLinkData? data =
							 | 
						||
| 
								 | 
							
								        await FirebaseDynamicLinks.instance.getInitialLink().catchError((error, stacktrace) {
							 | 
						||
| 
								 | 
							
								      Log.d("getInitialLink error:$error $stacktrace");
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    final Uri? deepLink = data?.link;
							 | 
						||
| 
								 | 
							
								    Log.d("initDynamicLinks: $deepLink");
							 | 
						||
| 
								 | 
							
								    if (deepLink != null) {
							 | 
						||
| 
								 | 
							
								      Future.delayed(const Duration(seconds: 2), () => _openLink(deepLink));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Future<dynamic> _handleDeeplink(MethodCall call) async {
							 | 
						||
| 
								 | 
							
								    Log.d("call.method: ${call.method} arguments:${call.arguments}");
							 | 
						||
| 
								 | 
							
								    switch (call.method) {
							 | 
						||
| 
								 | 
							
								      case "navigate":
							 | 
						||
| 
								 | 
							
								        final uri = Uri.parse(call.arguments["uri"]);
							 | 
						||
| 
								 | 
							
								        if ((uri.authority.isNotEmpty != true) ||
							 | 
						||
| 
								 | 
							
								            uri.toString().contains(GuruApp.instance.appSpec.details.authority)) {
							 | 
						||
| 
								 | 
							
								          _openLink(uri);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								          UriUtils.launchURL(uri);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return true;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void initDeeplink() async {
							 | 
						||
| 
								 | 
							
								    GuruNavigator.init(_handleDeeplink);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void init() async {
							 | 
						||
| 
								 | 
							
								    initDeeplink();
							 | 
						||
| 
								 | 
							
								    initDynamicLinks();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void _openLink(Uri uri) {
							 | 
						||
| 
								 | 
							
								    RouteCenter.instance.dispatchUri(uri);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |