share_util.dart 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import 'dart:async';
  2. import 'dart:io';
  3. import 'package:logging/logging.dart';
  4. import 'package:intl/intl.dart';
  5. import 'package:path/path.dart';
  6. import 'dart:io' as dartio;
  7. import 'package:exif/exif.dart';
  8. import 'package:photos/core/constants.dart';
  9. import 'package:photos/models/file_type.dart';
  10. import 'package:receive_sharing_intent/receive_sharing_intent.dart';
  11. import 'package:share/share.dart';
  12. import 'package:photos/core/configuration.dart';
  13. import 'package:flutter/widgets.dart';
  14. import 'package:photos/models/file.dart';
  15. import 'package:photos/utils/dialog_util.dart';
  16. import 'package:photos/utils/file_util.dart';
  17. DateFormat _exifDateFormat = DateFormat('yyyy:MM:dd HH:mm:ss');
  18. final _logger = Logger("ShareUtil");
  19. // share is used to share media/files from ente to other apps
  20. Future<void> share(BuildContext context, List<File> files) async {
  21. final dialog = createProgressDialog(context, "preparing...");
  22. await dialog.show();
  23. final List<Future<String>> pathFutures = [];
  24. for (File file in files) {
  25. pathFutures.add(getFile(file).then((file) => file.path));
  26. }
  27. final paths = await Future.wait(pathFutures);
  28. await dialog.hide();
  29. return Share.shareFiles(paths);
  30. }
  31. Future<void> shareText(String text) async {
  32. return Share.share(text);
  33. }
  34. Future<List<File>> convertIncomingSharedMediaToFile(
  35. List<SharedMediaFile> sharedMedia, int collectionID) async {
  36. List<File> localFiles = [];
  37. for (var media in sharedMedia) {
  38. var enteFile = File();
  39. // fileName: img_x.jpg
  40. enteFile.title = basename(media.path);
  41. var ioFile = dartio.File(media.path);
  42. ioFile = ioFile.renameSync(Configuration.instance.getSharedMediaCacheDirectory() +
  43. "/" +
  44. enteFile.title);
  45. enteFile.localID = kSharedMediaIdentifier + enteFile.title;
  46. enteFile.collectionID = collectionID;
  47. enteFile.fileType = FileType.image;
  48. var exifMap = await readExifFromFile(ioFile);
  49. if (exifMap != null &&
  50. exifMap["Image DateTime"] != null &&
  51. '0000:00:00 00:00:00' != exifMap["Image DateTime"].toString()) {
  52. try {
  53. final exifTime =
  54. _exifDateFormat.parse(exifMap["Image DateTime"].toString());
  55. enteFile.creationTime = exifTime.microsecondsSinceEpoch;
  56. } catch (e) {
  57. //ignore
  58. }
  59. }
  60. if (enteFile.creationTime == null || enteFile.creationTime == 0) {
  61. final parsedDateTime =
  62. parseDateFromFileName(basenameWithoutExtension(media.path));
  63. if (parsedDateTime != null) {
  64. enteFile.creationTime = parsedDateTime.microsecondsSinceEpoch;
  65. } else {
  66. enteFile.creationTime = DateTime.now().microsecondsSinceEpoch;
  67. }
  68. }
  69. enteFile.modificationTime = enteFile.creationTime;
  70. localFiles.add(enteFile);
  71. }
  72. return localFiles;
  73. }
  74. DateTime parseDateFromFileName(String fileName) {
  75. if (fileName.startsWith('IMG-') || fileName.startsWith('VID-')) {
  76. // Whatsapp media files
  77. return DateTime.tryParse(fileName.split('-')[1]);
  78. } else if (fileName.startsWith("Screenshot_")) {
  79. // Screenshots on droid
  80. return DateTime.tryParse(
  81. (fileName).replaceAll('Screenshot_', '').replaceAll('-', 'T'));
  82. } else {
  83. return DateTime.tryParse((fileName)
  84. .replaceAll("IMG_", "")
  85. .replaceAll("DCIM_", "")
  86. .replaceAll("_", " "));
  87. }
  88. }