From f5917e5b65c05aba4e8abc7ba94cc4ef5edca7a4 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sat, 16 Dec 2023 17:07:11 +0600 Subject: [PATCH] feat(android): add intent share support --- android/app/src/main/AndroidManifest.xml | 16 +++++++ lib/hooks/configurators/use_deep_linking.dart | 46 ++++++++++++++++++- pubspec.lock | 8 ++++ pubspec.yaml | 1 + 4 files changed, 70 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d1c58f19..5ab7a0b5 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -48,6 +48,22 @@ + + + + + + + + + + + + + diff --git a/lib/hooks/configurators/use_deep_linking.dart b/lib/hooks/configurators/use_deep_linking.dart index 83b6bfe5..546ab2e8 100644 --- a/lib/hooks/configurators/use_deep_linking.dart +++ b/lib/hooks/configurators/use_deep_linking.dart @@ -5,6 +5,8 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/collections/routes.dart'; import 'package:spotube/provider/spotify_provider.dart'; +import 'package:flutter_sharing_intent/flutter_sharing_intent.dart'; +import 'package:flutter_sharing_intent/model/sharing_file.dart'; void useDeepLinking(WidgetRef ref) { // single instance no worries @@ -13,6 +15,45 @@ void useDeepLinking(WidgetRef ref) { final queryClient = useQueryClient(); useEffect(() { + void uriListener(List files) async { + for (final file in files) { + if (file.type != SharedMediaType.URL) continue; + final url = Uri.parse(file.value!); + if (url.pathSegments.length != 2) continue; + + switch (url.pathSegments.first) { + case "album": + router.push( + "/album/${url.pathSegments.last}", + extra: await queryClient.fetchQuery( + "album/${url.pathSegments.last}", + () => spotify.albums.get(url.pathSegments.last), + ), + ); + break; + case "artist": + router.push("/artist/${url.pathSegments.last}"); + break; + case "playlist": + router.push( + "/playlist/${url.pathSegments.last}", + extra: await queryClient.fetchQuery( + "playlist/${url.pathSegments.last}", + () => spotify.playlists.get(url.pathSegments.last), + ), + ); + break; + default: + break; + } + } + } + + FlutterSharingIntent.instance.getInitialSharing().then(uriListener); + + final mediaStream = + FlutterSharingIntent.instance.getMediaStream().listen(uriListener); + final subscription = appLinks.allStringLinkStream.listen((uri) async { final startSegment = uri.split(":").take(2).join(":"); final endSegment = uri.split(":").last; @@ -44,6 +85,9 @@ void useDeepLinking(WidgetRef ref) { } }); - return subscription.cancel; + return () { + mediaStream.cancel(); + subscription.cancel(); + }; }, [spotify, queryClient]); } diff --git a/pubspec.lock b/pubspec.lock index 5860a339..526898d5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -915,6 +915,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + flutter_sharing_intent: + dependency: "direct main" + description: + name: flutter_sharing_intent + sha256: "6eb896e6523b735e8230eeb206fd3b9f220f11ce879c2400a90b443147036ff9" + url: "https://pub.dev" + source: hosted + version: "1.1.0" flutter_svg: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 60da5c0d..267ab17f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -121,6 +121,7 @@ dependencies: skeletonizer: ^0.8.0 app_links: ^3.5.0 win32_registry: ^1.1.2 + flutter_sharing_intent: ^1.1.0 dev_dependencies: build_runner: ^2.3.2