Provide option to download multiple items

This commit is contained in:
vishnukvmd 2024-04-30 16:06:03 +05:30
parent cdddbc4602
commit fe5e6c18e8

View file

@ -3,6 +3,7 @@ import "dart:async";
import 'package:fast_base58/fast_base58.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import "package:logging/logging.dart";
import "package:modal_bottom_sheet/modal_bottom_sheet.dart";
import 'package:photos/core/configuration.dart';
import "package:photos/generated/l10n.dart";
@ -30,6 +31,8 @@ import 'package:photos/ui/sharing/manage_links_widget.dart';
import "package:photos/ui/tools/collage/collage_creator_page.dart";
import "package:photos/ui/viewer/location/update_location_data_widget.dart";
import 'package:photos/utils/delete_file_util.dart';
import "package:photos/utils/dialog_util.dart";
import "package:photos/utils/file_download_util.dart";
import 'package:photos/utils/magic_util.dart';
import 'package:photos/utils/navigation_util.dart';
import "package:photos/utils/share_util.dart";
@ -56,6 +59,7 @@ class FileSelectionActionsWidget extends StatefulWidget {
class _FileSelectionActionsWidgetState
extends State<FileSelectionActionsWidget> {
static final _logger = Logger("FileSelectionActionsWidget");
late int currentUserID;
late FilesSplit split;
late CollectionActions collectionActions;
@ -115,6 +119,8 @@ class _FileSelectionActionsWidgetState
!widget.selectedFiles.files.any(
(element) => element.fileType == FileType.video,
);
final showDownloadOption =
widget.selectedFiles.files.any((element) => element.localID == null);
//To animate adding and removing of [SelectedActionButton], add all items
//and set [shouldShow] to false for items that should not be shown and true
@ -367,6 +373,16 @@ class _FileSelectionActionsWidgetState
);
}
if (showDownloadOption) {
items.add(
SelectionActionButton(
labelText: S.of(context).download,
icon: Icons.cloud_download_outlined,
onTap: () => _download(widget.selectedFiles.files.toList()),
),
);
}
items.add(
SelectionActionButton(
labelText: S.of(context).share,
@ -642,4 +658,29 @@ class _FileSelectionActionsWidgetState
widget.selectedFiles.clearAll();
}
}
Future<void> _download(List<EnteFile> files) async {
final dialog = createProgressDialog(
context,
S.of(context).downloading,
isDismissible: true,
);
await dialog.show();
try {
final futures = <Future>[];
for (final file in files) {
if (file.localID == null) {
futures.add(downloadToGallery(file));
}
}
await Future.wait(futures);
await dialog.hide();
widget.selectedFiles.clearAll();
showToast(context, S.of(context).filesSavedToGallery);
} catch (e) {
_logger.warning("Failed to save files", e);
await dialog.hide();
await showGenericErrorDialog(context: context, error: e);
}
}
}