diff --git a/core/lib/data/network/download/download_manager.dart b/core/lib/data/network/download/download_manager.dart index b4b015514..efe7a791e 100644 --- a/core/lib/data/network/download/download_manager.dart +++ b/core/lib/data/network/download/download_manager.dart @@ -2,18 +2,23 @@ import 'dart:async'; import 'dart:io'; import 'dart:typed_data'; +import 'package:core/data/constants/constant.dart'; import 'package:core/data/network/download/download_client.dart'; import 'package:core/data/network/download/downloaded_response.dart'; import 'package:core/domain/exceptions/download_file_exception.dart'; import 'package:core/utils/app_logger.dart'; +import 'package:core/utils/html/html_utils.dart'; +import 'package:device_info_plus/device_info_plus.dart'; import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; import 'package:http_parser/http_parser.dart'; import 'package:universal_html/html.dart' as html; class DownloadManager { final DownloadClient _downloadClient; + final DeviceInfoPlugin _deviceInfoPlugin; - DownloadManager(this._downloadClient); + DownloadManager(this._downloadClient, this._deviceInfoPlugin); Future downloadFile( String downloadUrl, @@ -104,14 +109,18 @@ class DownloadManager { } } - void openDownloadedFileWeb(Uint8List bytes, String? mimeType) { + Future openDownloadedFileWeb(Uint8List bytes, String? mimeType) async { try { - final blob = html.Blob([bytes], mimeType); - final url = html.Url.createObjectUrlFromBlob(blob); - - html.window.open(url, '_blank'); - - html.Url.revokeObjectUrl(url); + final deviceInfo = await _deviceInfoPlugin.deviceInfo; + if ('${deviceInfo.data['browserName']}' != 'BrowserName.chrome' + || mimeType != Constant.pdfMimeType) { + final blob = html.Blob([bytes], mimeType); + final url = html.Url.createObjectUrlFromBlob(blob); + html.window.open(url, '_blank'); + html.Url.revokeObjectUrl(url); + } else { + HtmlUtils.openNewTabHtmlDocument(HtmlUtils.pdfViewer(bytes)); + } } catch (exception) { logError('DownloadManager::openDownloadedFileWeb(): ERROR: $exception'); rethrow; diff --git a/core/lib/utils/html/html_utils.dart b/core/lib/utils/html/html_utils.dart index c9ab00f37..ca20c0ab8 100644 --- a/core/lib/utils/html/html_utils.dart +++ b/core/lib/utils/html/html_utils.dart @@ -1,3 +1,5 @@ +import 'js_interop_stub.dart' if (dart.library.html) 'dart:js_interop'; +import 'dart:typed_data'; import 'package:core/data/constants/constant.dart'; import 'package:core/presentation/extensions/html_extension.dart'; @@ -148,4 +150,45 @@ class HtmlUtils { html.Url.revokeObjectUrl(url); } + + static get iframeFullScreenCssStyle => ''' + position: fixed; + border: 0; + width: 100%; + height: 100%;'''; + + static String pdfViewer(Uint8List bytes) { + return ''' + + + + + + + + + '''; + } } diff --git a/core/lib/utils/html/js_interop_stub.dart b/core/lib/utils/html/js_interop_stub.dart new file mode 100644 index 000000000..6439b915a --- /dev/null +++ b/core/lib/utils/html/js_interop_stub.dart @@ -0,0 +1,5 @@ +import 'dart:typed_data'; + +extension Uint8ListExtension on Uint8List { + dynamic get toJS => throw UnimplementedError(); +} \ No newline at end of file diff --git a/lib/main/bindings/network/network_bindings.dart b/lib/main/bindings/network/network_bindings.dart index 2e27a65eb..2a015626b 100644 --- a/lib/main/bindings/network/network_bindings.dart +++ b/lib/main/bindings/network/network_bindings.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:contact/data/network/contact_api.dart'; import 'package:core/core.dart'; +import 'package:device_info_plus/device_info_plus.dart'; import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_appauth/flutter_appauth.dart'; @@ -101,7 +102,7 @@ class NetworkBindings extends Bindings { void _bindingApi() { Get.put(HttpClient(Get.find())); Get.put(DownloadClient(Get.find(), Get.find())); - Get.put(DownloadManager(Get.find())); + Get.put(DownloadManager(Get.find(), Get.find())); Get.put(MailboxAPI(Get.find(), Get.find())); Get.put(SessionAPI(Get.find())); Get.put(ThreadAPI(Get.find())); diff --git a/lib/main/bindings/network/network_isolate_binding.dart b/lib/main/bindings/network/network_isolate_binding.dart index b99d9f51a..91f8862b5 100644 --- a/lib/main/bindings/network/network_isolate_binding.dart +++ b/lib/main/bindings/network/network_isolate_binding.dart @@ -1,4 +1,5 @@ import 'package:core/core.dart'; +import 'package:device_info_plus/device_info_plus.dart'; import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_appauth/flutter_appauth.dart'; @@ -56,7 +57,7 @@ class NetworkIsolateBindings extends Bindings { void _bindingApi() { final httpClient = Get.put(HttpClient(Get.find(tag: BindingTag.isolateTag)), tag: BindingTag.isolateTag); Get.put(DownloadClient(Get.find(tag: BindingTag.isolateTag), Get.find()), tag: BindingTag.isolateTag); - Get.put(DownloadManager(Get.find(tag: BindingTag.isolateTag)), tag: BindingTag.isolateTag); + Get.put(DownloadManager(Get.find(tag: BindingTag.isolateTag), Get.find()), tag: BindingTag.isolateTag); Get.put(ThreadAPI(httpClient), tag: BindingTag.isolateTag); Get.put(EmailAPI( httpClient,