magic_util.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter/widgets.dart';
  3. import 'package:logging/logging.dart';
  4. import 'package:path/path.dart';
  5. import 'package:photos/core/event_bus.dart';
  6. import 'package:photos/events/force_reload_home_gallery_event.dart';
  7. import 'package:photos/models/collection.dart';
  8. import 'package:photos/models/file.dart';
  9. import 'package:photos/models/magic_metadata.dart';
  10. import 'package:photos/services/collections_service.dart';
  11. import 'package:photos/services/file_magic_service.dart';
  12. import 'package:photos/ui/rename_dialog.dart';
  13. import 'package:photos/utils/dialog_util.dart';
  14. import 'package:photos/utils/toast_util.dart';
  15. final _logger = Logger('MagicUtil');
  16. Future<void> changeVisibility(
  17. BuildContext context, List<File> files, int newVisibility) async {
  18. final dialog = createProgressDialog(context,
  19. newVisibility == kVisibilityArchive ? "archiving..." : "unarchiving...");
  20. await dialog.show();
  21. try {
  22. await FileMagicService.instance.changeVisibility(files, newVisibility);
  23. showShortToast(newVisibility == kVisibilityArchive
  24. ? "successfully archived"
  25. : "successfully unarchived");
  26. await dialog.hide();
  27. } catch (e, s) {
  28. _logger.severe("failed to update file visibility", e, s);
  29. await dialog.hide();
  30. rethrow;
  31. }
  32. }
  33. Future<void> changeCollectionVisibility(
  34. BuildContext context, Collection collection, int newVisibility) async {
  35. final dialog = createProgressDialog(context,
  36. newVisibility == kVisibilityArchive ? "archiving..." : "unarchiving...");
  37. await dialog.show();
  38. try {
  39. Map<String, dynamic> update = {kMagicKeyVisibility: newVisibility};
  40. await CollectionsService.instance.updateMagicMetadata(collection, update);
  41. // Force reload home gallery to pull in the now unarchived files
  42. Bus.instance.fire(ForceReloadHomeGalleryEvent());
  43. showShortToast(newVisibility == kVisibilityArchive
  44. ? "successfully archived"
  45. : "successfully unarchived");
  46. await dialog.hide();
  47. } catch (e, s) {
  48. _logger.severe("failed to update collection visibility", e, s);
  49. await dialog.hide();
  50. rethrow;
  51. }
  52. }
  53. Future<bool> editTime(
  54. BuildContext context, List<File> files, int editedTime) async {
  55. try {
  56. await _updatePublicMetadata(
  57. context, files, kPubMagicKeyEditedTime, editedTime);
  58. return true;
  59. } catch (e, s) {
  60. showToast('something went wrong');
  61. return false;
  62. }
  63. }
  64. Future<bool> editFilename(
  65. BuildContext context,
  66. File file,
  67. ) async {
  68. try {
  69. final fileName = file.getDisplayName();
  70. final nameWithoutExt = basenameWithoutExtension(fileName);
  71. final extName = extension(fileName);
  72. var result = await showDialog<String>(
  73. context: context,
  74. builder: (BuildContext context) {
  75. return RenameDialog(nameWithoutExt, 'file', maxLength: 50);
  76. },
  77. barrierColor: Colors.black.withOpacity(0.85),
  78. );
  79. if (result == null || result.trim() == nameWithoutExt.trim()) {
  80. return true;
  81. }
  82. result = result + extName;
  83. await _updatePublicMetadata(
  84. context, List.of([file]), kPubMagicKeyEditedName, result);
  85. return true;
  86. } catch (e, s) {
  87. showToast('something went wrong');
  88. return false;
  89. }
  90. }
  91. Future<void> _updatePublicMetadata(
  92. BuildContext context, List<File> files, String key, dynamic value) async {
  93. if (files.isEmpty) {
  94. return;
  95. }
  96. final dialog = createProgressDialog(context, 'please wait...');
  97. await dialog.show();
  98. try {
  99. Map<String, dynamic> update = {key: value};
  100. await FileMagicService.instance.updatePublicMagicMetadata(files, update);
  101. showShortToast('done');
  102. await dialog.hide();
  103. if (_shouldReloadGallery(key)) {
  104. Bus.instance.fire(ForceReloadHomeGalleryEvent());
  105. }
  106. } catch (e, s) {
  107. _logger.severe("failed to update $key = $value", e, s);
  108. await dialog.hide();
  109. rethrow;
  110. }
  111. }
  112. bool _shouldReloadGallery(String key) {
  113. return key == kPubMagicKeyEditedTime;
  114. }