magic_util.dart 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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/common/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,
  18. List<File> files,
  19. int newVisibility,
  20. ) async {
  21. final dialog = createProgressDialog(
  22. context,
  23. newVisibility == kVisibilityArchive ? "Hiding..." : "Unhiding...",
  24. );
  25. await dialog.show();
  26. try {
  27. await FileMagicService.instance.changeVisibility(files, newVisibility);
  28. showShortToast(
  29. context,
  30. newVisibility == kVisibilityArchive
  31. ? "Successfully hidden"
  32. : "Successfully unhidden",
  33. );
  34. await dialog.hide();
  35. } catch (e, s) {
  36. _logger.severe("failed to update file visibility", e, s);
  37. await dialog.hide();
  38. rethrow;
  39. }
  40. }
  41. Future<void> changeCollectionVisibility(
  42. BuildContext context,
  43. Collection collection,
  44. int newVisibility,
  45. ) async {
  46. final dialog = createProgressDialog(
  47. context,
  48. newVisibility == kVisibilityArchive ? "Hiding..." : "Unhiding...",
  49. );
  50. await dialog.show();
  51. try {
  52. Map<String, dynamic> update = {kMagicKeyVisibility: newVisibility};
  53. await CollectionsService.instance.updateMagicMetadata(collection, update);
  54. // Force reload home gallery to pull in the now unarchived files
  55. Bus.instance.fire(ForceReloadHomeGalleryEvent());
  56. showShortToast(
  57. context,
  58. newVisibility == kVisibilityArchive
  59. ? "Successfully hidden"
  60. : "Successfully unhidden",
  61. );
  62. await dialog.hide();
  63. } catch (e, s) {
  64. _logger.severe("failed to update collection visibility", e, s);
  65. await dialog.hide();
  66. rethrow;
  67. }
  68. }
  69. Future<bool> editTime(
  70. BuildContext context,
  71. List<File> files,
  72. int editedTime,
  73. ) async {
  74. try {
  75. await _updatePublicMetadata(
  76. context,
  77. files,
  78. kPubMagicKeyEditedTime,
  79. editedTime,
  80. );
  81. return true;
  82. } catch (e, s) {
  83. showToast(context, 'something went wrong');
  84. return false;
  85. }
  86. }
  87. Future<bool> editFilename(
  88. BuildContext context,
  89. File file,
  90. ) async {
  91. try {
  92. final fileName = file.getDisplayName();
  93. final nameWithoutExt = basenameWithoutExtension(fileName);
  94. final extName = extension(fileName);
  95. var result = await showDialog<String>(
  96. context: context,
  97. builder: (BuildContext context) {
  98. return RenameDialog(nameWithoutExt, 'file', maxLength: 50);
  99. },
  100. barrierColor: Colors.black.withOpacity(0.85),
  101. );
  102. if (result == null || result.trim() == nameWithoutExt.trim()) {
  103. return true;
  104. }
  105. result = result + extName;
  106. await _updatePublicMetadata(
  107. context,
  108. List.of([file]),
  109. kPubMagicKeyEditedName,
  110. result,
  111. );
  112. return true;
  113. } catch (e, s) {
  114. showToast(context, 'something went wrong');
  115. return false;
  116. }
  117. }
  118. Future<void> _updatePublicMetadata(
  119. BuildContext context,
  120. List<File> files,
  121. String key,
  122. dynamic value,
  123. ) async {
  124. if (files.isEmpty) {
  125. return;
  126. }
  127. final dialog = createProgressDialog(context, 'please wait...');
  128. await dialog.show();
  129. try {
  130. Map<String, dynamic> update = {key: value};
  131. await FileMagicService.instance.updatePublicMagicMetadata(files, update);
  132. showShortToast(context, 'done');
  133. await dialog.hide();
  134. if (_shouldReloadGallery(key)) {
  135. Bus.instance.fire(ForceReloadHomeGalleryEvent());
  136. }
  137. } catch (e, s) {
  138. _logger.severe("failed to update $key = $value", e, s);
  139. await dialog.hide();
  140. rethrow;
  141. }
  142. }
  143. bool _shouldReloadGallery(String key) {
  144. return key == kPubMagicKeyEditedTime;
  145. }