diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7ed9d63..0c93ae0 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,15 @@ - - + + + + + + + + + + + + + + diff --git a/lib/features/documents/view/widgets/documents_empty_state.dart b/lib/features/documents/view/widgets/documents_empty_state.dart index f5c0026..e2d15bb 100644 --- a/lib/features/documents/view/widgets/documents_empty_state.dart +++ b/lib/features/documents/view/widgets/documents_empty_state.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:paperless_mobile/core/logic/error_code_localization_mapper.dart'; -import 'package:paperless_mobile/core/model/error_message.dart'; import 'package:paperless_mobile/core/widgets/empty_state.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart'; diff --git a/lib/features/home/view/home_page.dart b/lib/features/home/view/home_page.dart index 05b8b03..735d65c 100644 --- a/lib/features/home/view/home_page.dart +++ b/lib/features/home/view/home_page.dart @@ -7,7 +7,6 @@ import 'package:paperless_mobile/core/widgets/offline_banner.dart'; import 'package:paperless_mobile/di_initializer.dart'; import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart'; import 'package:paperless_mobile/features/documents/bloc/saved_view_cubit.dart'; -import 'package:paperless_mobile/features/documents/model/saved_view.model.dart'; import 'package:paperless_mobile/features/documents/view/pages/documents_page.dart'; import 'package:paperless_mobile/features/home/view/widget/bottom_navigation_bar.dart'; import 'package:paperless_mobile/features/home/view/widget/info_drawer.dart'; diff --git a/lib/features/labels/document_type/bloc/document_type_cubit.dart b/lib/features/labels/document_type/bloc/document_type_cubit.dart index 6a5493f..3a552b4 100644 --- a/lib/features/labels/document_type/bloc/document_type_cubit.dart +++ b/lib/features/labels/document_type/bloc/document_type_cubit.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:paperless_mobile/core/bloc/label_cubit.dart'; import 'package:paperless_mobile/features/labels/document_type/model/document_type.model.dart'; import 'package:injectable/injectable.dart'; @@ -8,7 +9,7 @@ class DocumentTypeCubit extends LabelCubit { @override Future initialize() async { - return labelRepository.getDocumentTypes().then(loadFrom); + labelRepository.getDocumentTypes().then(loadFrom); } @override diff --git a/lib/features/scan/view/document_upload_page.dart b/lib/features/scan/view/document_upload_page.dart index 908335b..f8dac98 100644 --- a/lib/features/scan/view/document_upload_page.dart +++ b/lib/features/scan/view/document_upload_page.dart @@ -30,10 +30,11 @@ import 'package:intl/intl.dart'; class DocumentUploadPage extends StatefulWidget { final Uint8List fileBytes; - + final void Function()? afterUpload; const DocumentUploadPage({ Key? key, required this.fileBytes, + this.afterUpload, }) : super(key: key); @override @@ -221,6 +222,7 @@ class _DocumentUploadPageState extends State { .ids, createdAt: (_formKey.currentState?.value[DocumentModel.createdKey] as DateTime?), + propagateEventOnError: false, ); setState(() { _isUploadLoading = false; @@ -228,6 +230,7 @@ class _DocumentUploadPageState extends State { getIt().reset(); Navigator.pop(context); showSnackBar(context, S.of(context).documentUploadSuccessText); + widget.afterUpload?.call(); } on ErrorMessage catch (error) { showError(context, error); } on PaperlessValidationErrors catch (errorMessages) { diff --git a/lib/main.dart b/lib/main.dart index 6b96f47..785fb5c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,8 @@ +import 'dart:developer'; import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; @@ -11,9 +13,11 @@ import 'package:paperless_mobile/core/global/asset_images.dart'; import 'package:paperless_mobile/core/global/http_self_signed_certificate_override.dart'; import 'package:paperless_mobile/di_initializer.dart'; import 'package:paperless_mobile/features/app_intro/application_intro_slideshow.dart'; +import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart'; import 'package:paperless_mobile/features/home/view/home_page.dart'; import 'package:paperless_mobile/features/login/bloc/authentication_cubit.dart'; import 'package:paperless_mobile/features/login/view/login_page.dart'; +import 'package:paperless_mobile/features/scan/view/document_upload_page.dart'; import 'package:paperless_mobile/features/settings/bloc/application_settings_cubit.dart'; import 'package:paperless_mobile/features/settings/model/application_settings_state.dart'; import 'package:paperless_mobile/generated/l10n.dart'; @@ -23,6 +27,7 @@ import 'package:intl/intl.dart'; import 'package:intl/intl_standalone.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:receive_sharing_intent/receive_sharing_intent.dart'; void main() async { final widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); @@ -125,6 +130,53 @@ class AuthenticationWrapper extends StatefulWidget { } class _AuthenticationWrapperState extends State { + @override + void initState() { + super.initState(); + // For sharing files coming from outside the app while the app is still opened + ReceiveSharingIntent.getMediaStream().listen((List value) { + final bytes = File(value.first.path).readAsBytesSync(); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => BlocProvider.value( + value: getIt(), + child: LabelBlocProvider( + child: DocumentUploadPage( + fileBytes: bytes, + afterUpload: () => SystemNavigator.pop(), + ), + ), + ), + ), + ); + }, onError: (err) { + log(err); + }); + + // For sharing files coming from outside the app while the app is closed + ReceiveSharingIntent.getInitialMedia().then((List value) { + if (value.isEmpty) { + return; + } + final bytes = File(value.first.path).readAsBytesSync(); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => BlocProvider.value( + value: getIt(), + child: LabelBlocProvider( + child: DocumentUploadPage( + fileBytes: bytes, + afterUpload: () => SystemNavigator.pop(), + ), + ), + ), + ), + ); + }); + } + @override void didChangeDependencies() { FlutterNativeSplash.remove(); diff --git a/pubspec.lock b/pubspec.lock index 351e782..02f0b2e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1123,6 +1123,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.1" + receive_sharing_intent: + dependency: "direct main" + description: + name: receive_sharing_intent + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.5" rxdart: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 645e9d2..986e333 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -74,6 +74,7 @@ dependencies: share_plus: ^6.2.0 introduction_screen: ^3.0.2 mime: ^1.0.2 + receive_sharing_intent: ^1.4.5 dev_dependencies: integration_test: