From ad779514b53a9b914a38d917ceee67f99a28a728 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Tue, 7 May 2024 16:02:06 +0200 Subject: [PATCH] implemented reading of pdf files --- app/android/app/src/main/AndroidManifest.xml | 5 ++ .../domain/services/sharing_intent.dart | 53 ++++++++++++++----- app/pubspec.lock | 18 ++++++- app/pubspec.yaml | 3 ++ 4 files changed, 64 insertions(+), 15 deletions(-) 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: