diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml
index f5032612..a9f3ab82 100644
--- a/app/android/app/src/main/AndroidManifest.xml
+++ b/app/android/app/src/main/AndroidManifest.xml
@@ -39,6 +39,11 @@
+
+
+
+
+
diff --git a/app/lib/features/share_intent/domain/services/sharing_intent.dart b/app/lib/features/share_intent/domain/services/sharing_intent.dart
index 2a8bfe2f..63f3bd8d 100644
--- a/app/lib/features/share_intent/domain/services/sharing_intent.dart
+++ b/app/lib/features/share_intent/domain/services/sharing_intent.dart
@@ -1,14 +1,52 @@
import 'dart:async';
+import 'package:bang_navigator/core/logger.dart';
import 'package:bang_navigator/domain/entities/received_parameter.dart';
+import 'package:bang_navigator/features/search_browser/domain/entities/modes.dart';
import 'package:collection/collection.dart';
+import 'package:flutter_pdf_text/flutter_pdf_text.dart';
import 'package:flutter_sharing_intent/flutter_sharing_intent.dart';
import 'package:flutter_sharing_intent/model/sharing_file.dart';
+import 'package:mime/mime.dart' as mime;
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:rxdart/rxdart.dart';
+import 'package:uri_to_file/uri_to_file.dart' as uri_to_file;
part 'sharing_intent.g.dart';
+final _sharingIntentTransformer =
+ StreamTransformer, ReceivedParameter>.fromHandlers(
+ handleData: (files, sink) async {
+ //For now only one file is supported to share with the app
+ final data = files.firstOrNull;
+
+ if (data != null && data.value != null) {
+ switch (data.type) {
+ case SharedMediaType.TEXT:
+ case SharedMediaType.URL:
+ if (uri_to_file.isUriSupported(data.value!)) {
+ final file = await uri_to_file.toFile(data.value!);
+ final mimeType = mime.lookupMimeType(file.path);
+ switch (mimeType) {
+ case 'application/pdf':
+ final content =
+ await PDFDoc.fromFile(file).then((doc) => doc.text);
+ sink.add(
+ ReceivedParameter(content, KagiTool.summarizer.name),
+ );
+ default:
+ logger.w('Unhandled mime type: $mimeType');
+ }
+ } else {
+ sink.add(ReceivedParameter(data.value, null));
+ }
+ default:
+ logger.w('Unhandled media type: $data');
+ }
+ }
+ },
+);
+
@riverpod
Raw> sharingIntentStream(SharingIntentStreamRef ref) {
final initialStream = FlutterSharingIntent.instance
@@ -22,18 +60,5 @@ Raw> sharingIntentStream(SharingIntentStreamRef ref) {
return ConcatStream(
[initialStream, FlutterSharingIntent.instance.getMediaStream()],
- )
- .map(
- (event) => event
- .where(
- (shared) =>
- shared.type == SharedMediaType.TEXT ||
- shared.type == SharedMediaType.URL,
- )
- .map((shared) => shared.value)
- .whereNotNull()
- .firstOrNull,
- )
- .whereNotNull()
- .map((content) => ReceivedParameter(content, null));
+ ).transform(_sharingIntentTransformer);
}
diff --git a/app/pubspec.lock b/app/pubspec.lock
index ad7d80ba..0cda05e1 100644
--- a/app/pubspec.lock
+++ b/app/pubspec.lock
@@ -406,6 +406,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.7447"
+ flutter_pdf_text:
+ dependency: "direct main"
+ description:
+ name: flutter_pdf_text
+ sha256: "97a49ecba6cf711a607642785758bf74fe0aaa3a2223524fa0c142e3966c56a0"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.6.0"
flutter_riverpod:
dependency: transitive
description:
@@ -660,7 +668,7 @@ packages:
source: hosted
version: "1.12.0"
mime:
- dependency: transitive
+ dependency: "direct main"
description:
name: mime
sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2"
@@ -1064,6 +1072,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.2.2"
+ uri_to_file:
+ dependency: "direct main"
+ description:
+ name: uri_to_file
+ sha256: cbbb38f975d22311efacc9a53cdcb806708606666d8092314b81c5cb7983b700
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.0"
url_launcher:
dependency: "direct main"
description:
diff --git a/app/pubspec.yaml b/app/pubspec.yaml
index cc761bc1..e16416fc 100644
--- a/app/pubspec.yaml
+++ b/app/pubspec.yaml
@@ -18,6 +18,7 @@ dependencies:
flutter_hooks: ^0.20.5
flutter_inappwebview: ^6.0.0
flutter_material_design_icons: ^1.1.7447
+ flutter_pdf_text: ^0.6.0
flutter_secure_storage: ^9.0.0
flutter_sharing_intent: ^1.1.1
go_router: ^13.2.2
@@ -26,6 +27,7 @@ dependencies:
html: ^0.15.4
http: ^1.2.1
logger: ^2.2.0
+ mime: ^1.0.5
riverpod: ^2.5.1
riverpod_annotation: ^2.3.5
rxdart: ^0.27.7
@@ -35,6 +37,7 @@ dependencies:
speech_to_text_google_dialog: ^0.0.6
text_scroll: ^0.2.0
universal_io: ^2.2.2
+ uri_to_file: ^1.0.0
url_launcher: ^6.2.5
dev_dependencies: