Browse Source

Fix crash on attempting to share multiple large files

Vishnu Mohandas 4 years ago
parent
commit
0c70cd96fd
4 changed files with 48 additions and 13 deletions
  1. 8 0
      lib/utils/file_util.dart
  2. 32 13
      lib/utils/share_util.dart
  3. 7 0
      pubspec.lock
  4. 1 0
      pubspec.yaml

+ 8 - 0
lib/utils/file_util.dart

@@ -60,6 +60,14 @@ void preloadLocalFileThumbnail(File file) {
   });
   });
 }
 }
 
 
+Future<io.File> getNativeFile(File file) async {
+  if (file.localID == null) {
+    return getFileFromServer(file);
+  } else {
+    return file.getAsset().then((asset) => asset.file);
+  }
+}
+
 Future<Uint8List> getBytes(File file, {int quality = 100}) async {
 Future<Uint8List> getBytes(File file, {int quality = 100}) async {
   if (file.localID == null) {
   if (file.localID == null) {
     return getFileFromServer(file).then((file) => file.readAsBytesSync());
     return getFileFromServer(file).then((file) => file.readAsBytesSync());

+ 32 - 13
lib/utils/share_util.dart

@@ -1,14 +1,44 @@
-import 'dart:typed_data';
-
 import 'package:esys_flutter_share/esys_flutter_share.dart';
 import 'package:esys_flutter_share/esys_flutter_share.dart';
 import 'package:flutter/widgets.dart';
 import 'package:flutter/widgets.dart';
 import 'package:photos/models/file.dart';
 import 'package:photos/models/file.dart';
 import 'package:path/path.dart';
 import 'package:path/path.dart';
+import 'package:photos/models/file_type.dart';
 import 'package:photos/utils/dialog_util.dart';
 import 'package:photos/utils/dialog_util.dart';
 import 'package:photos/utils/file_util.dart';
 import 'package:photos/utils/file_util.dart';
+import 'package:progress_dialog/progress_dialog.dart';
+import 'package:share_extend/share_extend.dart';
 
 
 Future<void> share(BuildContext context, File file) async {
 Future<void> share(BuildContext context, File file) async {
   final dialog = createProgressDialog(context, "Preparing...");
   final dialog = createProgressDialog(context, "Preparing...");
+  if (file.fileType == FileType.image) {
+    return _shareImage(dialog, file);
+  } else {
+    return _shareVideo(dialog, file);
+  }
+}
+
+Future<void> shareMultiple(BuildContext context, List<File> files) async {
+  if (files.length == 1) {
+    return share(context, files[0]);
+  }
+  final dialog = createProgressDialog(context, "Preparing...");
+  await dialog.show();
+  final pathList = List<String>();
+  for (File file in files) {
+    pathList.add((await getNativeFile(file)).path);
+  }
+  await dialog.hide();
+  return ShareExtend.shareMultiple(pathList, "image");
+}
+
+Future<void> _shareVideo(ProgressDialog dialog, File file) async {
+  await dialog.show();
+  final path = (await getNativeFile(file)).path;
+  await dialog.hide();
+  return ShareExtend.share(path, "image");
+}
+
+Future<void> _shareImage(ProgressDialog dialog, File file) async {
   await dialog.show();
   await dialog.show();
   final bytes = await getBytes(file);
   final bytes = await getBytes(file);
   final filename = _getFilename(file.title);
   final filename = _getFilename(file.title);
@@ -20,17 +50,6 @@ Future<void> share(BuildContext context, File file) async {
   return Share.file(filename, filename, bytes, "image/" + shareExt);
   return Share.file(filename, filename, bytes, "image/" + shareExt);
 }
 }
 
 
-Future<void> shareMultiple(BuildContext context, List<File> files) async {
-  final dialog = createProgressDialog(context, "Preparing...");
-  await dialog.show();
-  final shareContent = Map<String, Uint8List>();
-  for (File file in files) {
-    shareContent[_getFilename(file.title)] = await getBytes(file);
-  }
-  await dialog.hide();
-  return Share.files("images", shareContent, "*/*");
-}
-
 String _getFilename(String name) {
 String _getFilename(String name) {
   if (name.endsWith(".HEIC")) {
   if (name.endsWith(".HEIC")) {
     return name.substring(0, name.lastIndexOf(".HEIC")) + ".JPG";
     return name.substring(0, name.lastIndexOf(".HEIC")) + ".JPG";

+ 7 - 0
pubspec.lock

@@ -541,6 +541,13 @@ packages:
       url: "https://pub.dartlang.org"
       url: "https://pub.dartlang.org"
     source: hosted
     source: hosted
     version: "0.1.0"
     version: "0.1.0"
+  share_extend:
+    dependency: "direct main"
+    description:
+      name: share_extend
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.9"
   shared_preferences:
   shared_preferences:
     dependency: "direct main"
     dependency: "direct main"
     description:
     description:

+ 1 - 0
pubspec.yaml

@@ -35,6 +35,7 @@ dependencies:
   crypto: ^2.1.3
   crypto: ^2.1.3
   image: ^2.1.4
   image: ^2.1.4
   esys_flutter_share: ^1.0.2
   esys_flutter_share: ^1.0.2
+  share_extend: ^1.1.9
   draggable_scrollbar: ^0.0.4
   draggable_scrollbar: ^0.0.4
   photo_view: ^0.9.2
   photo_view: ^0.9.2
   visibility_detector: ^0.1.5
   visibility_detector: ^0.1.5