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