From a06f54b36bf09d64075bee7a260a1a59317d1776 Mon Sep 17 00:00:00 2001 From: yaso Date: Tue, 10 Dec 2024 14:10:44 +0200 Subject: [PATCH 1/3] add file downloader package nd config --- Frontend/android/app/src/main/AndroidManifest.xml | 7 ++++++- Frontend/ios/Runner/Info.plist | 4 ++++ Frontend/pubspec.lock | 8 ++++++++ Frontend/pubspec.yaml | 3 ++- Frontend/windows/flutter/generated_plugin_registrant.cc | 3 +++ Frontend/windows/flutter/generated_plugins.cmake | 1 + 6 files changed, 24 insertions(+), 2 deletions(-) diff --git a/Frontend/android/app/src/main/AndroidManifest.xml b/Frontend/android/app/src/main/AndroidManifest.xml index 044c329c..0fc1cb6c 100644 --- a/Frontend/android/app/src/main/AndroidManifest.xml +++ b/Frontend/android/app/src/main/AndroidManifest.xml @@ -1,9 +1,14 @@ - + + + diff --git a/Frontend/ios/Runner/Info.plist b/Frontend/ios/Runner/Info.plist index 11e8e2c6..beac0123 100644 --- a/Frontend/ios/Runner/Info.plist +++ b/Frontend/ios/Runner/Info.plist @@ -2,6 +2,10 @@ + LSSupportsOpeningDocumentsInPlace + + UIFileSharingEnabled + LSApplicationQueriesSchemes sms diff --git a/Frontend/pubspec.lock b/Frontend/pubspec.lock index 7f2b4e35..0412f3c2 100644 --- a/Frontend/pubspec.lock +++ b/Frontend/pubspec.lock @@ -382,6 +382,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + fl_downloader: + dependency: "direct main" + description: + name: fl_downloader + sha256: e3f0696f7b22933baeae3c99d806c3a6f11507ab6c2bf74b4c580abf8e036f80 + url: "https://pub.dev" + source: hosted + version: "2.0.2" flutter: dependency: "direct main" description: flutter diff --git a/Frontend/pubspec.yaml b/Frontend/pubspec.yaml index 965101f3..91951898 100644 --- a/Frontend/pubspec.yaml +++ b/Frontend/pubspec.yaml @@ -40,7 +40,7 @@ dependencies: syncfusion_flutter_core: ^26.2.10 syncfusion_flutter_pdfviewer: ^26.1.39 universal_html: ^2.2.4 - file_picker: ^8.0.5 + file_picker: ^8.1.4 supertokens_flutter: ^0.6.0 http: ^1.2.1 google_nav_bar: ^5.0.6 @@ -66,6 +66,7 @@ dependencies: # flutter_barcode_scanner: ^2.0.0 barcode_widget: ^2.0.4 url_launcher: ^6.3.1 + fl_downloader: ^2.0.2 dev_dependencies: flutter_test: diff --git a/Frontend/windows/flutter/generated_plugin_registrant.cc b/Frontend/windows/flutter/generated_plugin_registrant.cc index 72aa3764..ef659127 100644 --- a/Frontend/windows/flutter/generated_plugin_registrant.cc +++ b/Frontend/windows/flutter/generated_plugin_registrant.cc @@ -7,6 +7,7 @@ #include "generated_plugin_registrant.h" #include +#include #include #include #include @@ -17,6 +18,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { FirebaseCorePluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + FlDownloaderPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlDownloaderPluginCApi")); GeolocatorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("GeolocatorWindows")); PermissionHandlerWindowsPluginRegisterWithRegistrar( diff --git a/Frontend/windows/flutter/generated_plugins.cmake b/Frontend/windows/flutter/generated_plugins.cmake index f358287e..0335c59d 100644 --- a/Frontend/windows/flutter/generated_plugins.cmake +++ b/Frontend/windows/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST firebase_core + fl_downloader geolocator_windows permission_handler_windows printing From ceed580fbdb7b68c6eab8955322f47c35c6eab3d Mon Sep 17 00:00:00 2001 From: yaso Date: Tue, 10 Dec 2024 14:11:19 +0200 Subject: [PATCH 2/3] add native downloader to file viewers --- .../builder/build_file_view.dart | 93 +++++++++++++++++-- .../patient_profile/full_screen_file.dart | 54 ++++++++++- 2 files changed, 136 insertions(+), 11 deletions(-) diff --git a/Frontend/lib/mih_packages/patient_profile/builder/build_file_view.dart b/Frontend/lib/mih_packages/patient_profile/builder/build_file_view.dart index 9e7ae0a4..3500e9bf 100644 --- a/Frontend/lib/mih_packages/patient_profile/builder/build_file_view.dart +++ b/Frontend/lib/mih_packages/patient_profile/builder/build_file_view.dart @@ -1,15 +1,20 @@ +import 'dart:async'; + +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_core/theme.dart'; import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart'; import "package:universal_html/html.dart" as html; import 'package:http/http.dart' as http; +import 'package:fl_downloader/fl_downloader.dart'; -import '../../../main.dart'; import '../../../mih_objects/arguments.dart'; class BuildFileView extends StatefulWidget { final String link; final String path; + const BuildFileView({ super.key, required this.link, @@ -25,6 +30,18 @@ class _BuildFileViewState extends State { //late TextEditingController currentPageController = TextEditingController(); double startZoomLevel = 1; + int progress = 0; + late StreamSubscription progressStream; + + void mihLoadingPopUp() { + showDialog( + context: context, + builder: (context) { + return const Mihloadingcircle(); + }, + ); + } + String getExtType(String path) { //print(pdfLink.split(".")[1]); return path.split(".").last; @@ -50,18 +67,55 @@ class _BuildFileViewState extends State { ); } + void nativeFileDownload(String fileLink) async { + var permission = await FlDownloader.requestPermission(); + if (permission == StoragePermissionStatus.granted) { + try { + mihLoadingPopUp(); + await FlDownloader.download(fileLink); + Navigator.of(context).pop(); + } on Exception catch (error) { + Navigator.of(context).pop(); + print(error); + } + } else { + print("denied"); + } + } + @override void dispose() { pdfViewerController.dispose(); + progressStream.cancel(); super.dispose(); } + @override + void initState() { + super.initState(); + FlDownloader.initialize(); + progressStream = FlDownloader.progressStream.listen((event) { + if (event.status == DownloadStatus.successful) { + setState(() { + progress = event.progress; + }); + //Navigator.of(context).pop(); + print("Progress $progress%: Success Downloading"); + FlDownloader.openFile(filePath: event.filePath); + } else if (event.status == DownloadStatus.failed) { + print("Progress $progress%: Error Downloading"); + } else if (event.status == DownloadStatus.running) { + print("Progress $progress%: Download Running"); + } + }); + } + @override Widget build(BuildContext context) { // double width = MediaQuery.sizeOf(context).width; //double height = MediaQuery.sizeOf(context).height; + debugPrint(widget.link); if (getExtType(widget.path).toLowerCase() == "pdf") { - //print(widget.pdfLink); return Expanded( child: Stack( fit: StackFit.expand, @@ -102,14 +156,25 @@ class _BuildFileViewState extends State { child: IconButton.filled( iconSize: 35, padding: const EdgeInsets.all(0), - onPressed: () { + onPressed: () async { + // debugPrint( + // "I'm here ${MzanziInnovationHub.of(context)!.theme.getPlatform()}"); if (MzanziInnovationHub.of(context)!.theme.getPlatform() == "Web") { html.window.open( widget.link, // '${AppEnviroment.baseFileUrl}/mih/$filePath', 'download'); - } else {} + } else { + // print("Here"); + // var permission = await FlDownloader.requestPermission(); + // if (permission == StoragePermissionStatus.granted) { + // await FlDownloader.download(widget.link); + // } else { + // print("denied"); + // } + nativeFileDownload(widget.link); + } }, icon: Icon( Icons.download, @@ -166,18 +231,26 @@ class _BuildFileViewState extends State { child: IconButton.filled( iconSize: 35, padding: const EdgeInsets.all(0), - onPressed: () { + onPressed: () async { + // debugPrint("I'm here "); + // debugPrint( + // "I'm here ${MzanziInnovationHub.of(context)!.theme.getPlatform()}"); if (MzanziInnovationHub.of(context)!.theme.getPlatform() == "Web") { html.window.open( widget.link, // '${AppEnviroment.baseFileUrl}/mih/$filePath', 'download'); - } else {} - // html.window.open( - // widget.link, - // // '${AppEnviroment.baseFileUrl}/mih/$filePath', - // 'download'); + } else { + //print("Here"); + // var permission = await FlDownloader.requestPermission(); + // if (permission == StoragePermissionStatus.granted) { + // await FlDownloader.download(widget.link); + // } else { + // print("denied"); + // } + nativeFileDownload(widget.link); + } }, icon: Icon( Icons.download, diff --git a/Frontend/lib/mih_packages/patient_profile/full_screen_file.dart b/Frontend/lib/mih_packages/patient_profile/full_screen_file.dart index c6961a64..983a1853 100644 --- a/Frontend/lib/mih_packages/patient_profile/full_screen_file.dart +++ b/Frontend/lib/mih_packages/patient_profile/full_screen_file.dart @@ -1,3 +1,6 @@ +import 'dart:async'; + +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:flutter/material.dart'; import '../../main.dart'; import 'package:syncfusion_flutter_core/theme.dart'; @@ -6,6 +9,7 @@ import "package:universal_html/html.dart" as html; import 'package:http/http.dart' as http; import 'package:printing/printing.dart'; +import 'package:fl_downloader/fl_downloader.dart'; import '../../mih_components/mih_layout/mih_action.dart'; import '../../mih_components/mih_layout/mih_body.dart'; @@ -31,6 +35,9 @@ class _FullScreenFileViewerState extends State { double startZoomLevel = 1.0; double zoomOut = 0; + int progress = 0; + late StreamSubscription progressStream; + String getExtType(String path) { //print(pdfLink.split(".")[1]); return path.split(".").last; @@ -215,7 +222,11 @@ class _FullScreenFileViewerState extends State { widget.arguments.link, // '${AppEnviroment.baseFileUrl}/mih/$filePath', 'download'); - } else {} + } else { + nativeFileDownload( + widget.arguments.link, + ); + } }, icon: Icon( Icons.download, @@ -272,9 +283,35 @@ class _FullScreenFileViewerState extends State { ); } + void mihLoadingPopUp() { + showDialog( + context: context, + builder: (context) { + return const Mihloadingcircle(); + }, + ); + } + + void nativeFileDownload(String fileLink) async { + var permission = await FlDownloader.requestPermission(); + if (permission == StoragePermissionStatus.granted) { + try { + mihLoadingPopUp(); + await FlDownloader.download(fileLink); + Navigator.of(context).pop(); + } on Exception catch (error) { + Navigator.of(context).pop(); + print(error); + } + } else { + print("denied"); + } + } + @override void dispose() { pdfViewerController.dispose(); + progressStream.cancel(); super.dispose(); } @@ -282,6 +319,21 @@ class _FullScreenFileViewerState extends State { void initState() { //pdfViewerController = widget.arguments.pdfViewerController!; pdfViewerController.addListener(onPageSelect); + FlDownloader.initialize(); + progressStream = FlDownloader.progressStream.listen((event) { + if (event.status == DownloadStatus.successful) { + setState(() { + progress = event.progress; + }); + //Navigator.of(context).pop(); + print("Progress $progress%: Success Downloading"); + FlDownloader.openFile(filePath: event.filePath); + } else if (event.status == DownloadStatus.failed) { + print("Progress $progress%: Error Downloading"); + } else if (event.status == DownloadStatus.running) { + print("Progress $progress%: Download Running"); + } + }); super.initState(); } From 75fd829a1453dece720eee2815b4945a15ffb374 Mon Sep 17 00:00:00 2001 From: yaso Date: Tue, 10 Dec 2024 14:11:38 +0200 Subject: [PATCH 3/3] fix getting patform type --- Frontend/lib/mih_theme/mih_theme.dart | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Frontend/lib/mih_theme/mih_theme.dart b/Frontend/lib/mih_theme/mih_theme.dart index efbe821d..52115d0f 100644 --- a/Frontend/lib/mih_theme/mih_theme.dart +++ b/Frontend/lib/mih_theme/mih_theme.dart @@ -76,13 +76,14 @@ class MyTheme { } String getPlatform() { - if (isPwa()) { - if (platform == TargetPlatform.android) { - return "Android"; - } else if (platform == TargetPlatform.iOS) { - return "iOS"; - } - } else if (kIsWeb) { + // if (isPwa()) { + // if (platform == TargetPlatform.android) { + // return "Android"; + // } else if (platform == TargetPlatform.iOS) { + // return "iOS"; + // } + // } else + if (kIsWeb) { return "Web"; } else if (!kIsWeb) { if (platform == TargetPlatform.android) {