diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart index d75bc1662..b487e19eb 100644 --- a/lib/generated/intl/messages_en.dart +++ b/lib/generated/intl/messages_en.dart @@ -358,6 +358,8 @@ class MessageLookup extends MessageLookupByLibrary { "cancelSubscription": MessageLookupByLibrary.simpleMessage("Cancel subscription"), "cannotAddMorePhotosAfterBecomingViewer": m6, + "cannotDeleteSharedFiles": + MessageLookupByLibrary.simpleMessage("Cannot delete shared files"), "centerPoint": MessageLookupByLibrary.simpleMessage("Center point"), "changeEmail": MessageLookupByLibrary.simpleMessage("Change email"), "changePassword": diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart index b73c10905..ab67a1824 100644 --- a/lib/generated/l10n.dart +++ b/lib/generated/l10n.dart @@ -3282,6 +3282,16 @@ class S { ); } + /// `Cannot delete shared files` + String get cannotDeleteSharedFiles { + return Intl.message( + 'Cannot delete shared files', + name: 'cannotDeleteSharedFiles', + desc: '', + args: [], + ); + } + /// `The download could not be completed` String get theDownloadCouldNotBeCompleted { return Intl.message( diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 39ac5b9a5..ec4692608 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -463,6 +463,7 @@ "updateAvailable": "Update available", "ignoreUpdate": "Ignore", "downloading": "Downloading...", + "cannotDeleteSharedFiles": "Cannot delete shared files", "theDownloadCouldNotBeCompleted": "The download could not be completed", "retry": "Retry", "backedUpFolders": "Backed up folders", diff --git a/lib/models/files_split.dart b/lib/models/files_split.dart index d4bbe8adf..90e03397e 100644 --- a/lib/models/files_split.dart +++ b/lib/models/files_split.dart @@ -14,6 +14,8 @@ class FilesSplit { int get totalFileOwnedCount => pendingUploads.length + ownedByCurrentUser.length; + int get count => totalFileOwnedCount + ownedByOtherUsers.length; + static FilesSplit split(Iterable files, int currentUserID) { final List ownedByCurrentUser = [], ownedByOtherUsers = [], diff --git a/lib/ui/viewer/actions/file_selection_actions_widget.dart b/lib/ui/viewer/actions/file_selection_actions_widget.dart index 68dae23aa..6f26d8e7d 100644 --- a/lib/ui/viewer/actions/file_selection_actions_widget.dart +++ b/lib/ui/viewer/actions/file_selection_actions_widget.dart @@ -383,7 +383,7 @@ class _FileSelectionActionsWidgetState } Future _onDeleteClick() async { - return showDeleteSheet(context, widget.selectedFiles); + return showDeleteSheet(context, widget.selectedFiles, split); } Future _removeFilesFromAlbum() async { diff --git a/lib/ui/viewer/file_details/file_properties_item_widget.dart b/lib/ui/viewer/file_details/file_properties_item_widget.dart index d0f2916d2..5fd923f8d 100644 --- a/lib/ui/viewer/file_details/file_properties_item_widget.dart +++ b/lib/ui/viewer/file_details/file_properties_item_widget.dart @@ -4,6 +4,7 @@ import 'package:photos/models/file/file.dart'; import 'package:photos/models/file/file_type.dart'; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/components/info_item_widget.dart"; +import "package:photos/utils/data_util.dart"; import "package:photos/utils/date_time_util.dart"; import "package:photos/utils/file_util.dart"; import "package:photos/utils/magic_util.dart"; @@ -78,7 +79,7 @@ class _FilePropertiesItemWidgetState extends State { } subSectionWidgets.add( Text( - (fileSize / (1024 * 1024)).toStringAsFixed(2) + " MB", + formatBytes(fileSize), style: getEnteTextTheme(context).miniMuted, ), ); diff --git a/lib/utils/delete_file_util.dart b/lib/utils/delete_file_util.dart index 5809c3850..070403b8b 100644 --- a/lib/utils/delete_file_util.dart +++ b/lib/utils/delete_file_util.dart @@ -4,6 +4,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; +import "package:path/path.dart"; import 'package:photo_manager/photo_manager.dart'; import 'package:photos/core/constants.dart'; import 'package:photos/core/event_bus.dart'; @@ -14,6 +15,7 @@ import "package:photos/events/force_reload_trash_page_event.dart"; import 'package:photos/events/local_photos_updated_event.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/models/file/file.dart'; +import "package:photos/models/files_split.dart"; import 'package:photos/models/selected_files.dart'; import 'package:photos/models/trash_item_request.dart'; import 'package:photos/services/remote_sync_service.dart'; @@ -500,18 +502,21 @@ Future shouldProceedWithDeletion(BuildContext context) async { Future showDeleteSheet( BuildContext context, SelectedFiles selectedFiles, + FilesSplit filesSplit, ) async { - bool containsUploadedFile = false, containsLocalFile = false; - for (final file in selectedFiles.files) { - if (file.uploadedFileID != null) { - debugPrint("${file.toString()} is uploaded"); - containsUploadedFile = true; - } - if (file.localID != null) { - debugPrint("${file.toString()} has local"); - containsLocalFile = true; - } + if (selectedFiles.files.length != filesSplit.count) { + throw AssertionError("Unexpected state, #{selectedFiles.files.length} != " + "${filesSplit.count}"); } + final List deletableFiles = + filesSplit.ownedByCurrentUser + filesSplit.pendingUploads; + if (deletableFiles.isEmpty && filesSplit.ownedByOtherUsers.isNotEmpty) { + showShortToast(context, S.of(context).cannotDeleteSharedFiles); + return; + } + final containsUploadedFile = deletableFiles.any((f) => f.isUploaded); + final containsLocalFile = deletableFiles.any((f) => f.localID != null); + final List buttons = []; final bool isBothLocalAndRemote = containsUploadedFile && containsLocalFile; final bool isLocalOnly = !containsUploadedFile; @@ -545,7 +550,7 @@ Future showDeleteSheet( onTap: () async { await deleteFilesFromRemoteOnly( context, - selectedFiles.files.toList(), + deletableFiles, ).then( (value) { showShortToast(context, S.of(context).movedToTrash); @@ -572,7 +577,7 @@ Future showDeleteSheet( shouldSurfaceExecutionStates: false, isInAlert: true, onTap: () async { - await deleteFilesOnDeviceOnly(context, selectedFiles.files.toList()); + await deleteFilesOnDeviceOnly(context, deletableFiles); }, ), ); @@ -591,7 +596,7 @@ Future showDeleteSheet( onTap: () async { await deleteFilesFromEverywhere( context, - selectedFiles.files.toList(), + deletableFiles, ); }, ),