magic_util.dart 4.0 KB

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