2022-12-14 17:35:08 +00:00
|
|
|
import 'package:flutter/cupertino.dart';
|
|
|
|
import 'package:flutter/material.dart';
|
2022-12-15 10:02:46 +00:00
|
|
|
import 'package:page_transition/page_transition.dart';
|
2022-12-15 04:06:51 +00:00
|
|
|
import 'package:photos/core/configuration.dart';
|
2022-12-14 17:35:08 +00:00
|
|
|
import 'package:photos/models/collection.dart';
|
|
|
|
import 'package:photos/models/device_collection.dart';
|
|
|
|
import 'package:photos/models/gallery_type.dart';
|
2022-12-15 11:24:51 +00:00
|
|
|
import 'package:photos/models/magic_metadata.dart';
|
2022-12-15 04:06:51 +00:00
|
|
|
import 'package:photos/models/selected_file_breakup.dart';
|
|
|
|
import 'package:photos/models/selected_files.dart';
|
2022-12-15 10:02:46 +00:00
|
|
|
import 'package:photos/services/collections_service.dart';
|
2022-12-15 11:24:51 +00:00
|
|
|
import 'package:photos/services/hidden_service.dart';
|
2022-12-14 17:35:08 +00:00
|
|
|
import 'package:photos/theme/ente_theme.dart';
|
2022-12-15 10:02:46 +00:00
|
|
|
import 'package:photos/ui/actions/collection/collection_file_actions.dart';
|
|
|
|
import 'package:photos/ui/actions/collection/collection_sharing_actions.dart';
|
2022-12-14 17:35:08 +00:00
|
|
|
import 'package:photos/ui/components/blur_menu_item_widget.dart';
|
|
|
|
import 'package:photos/ui/components/bottom_action_bar/expanded_menu_widget.dart';
|
2022-12-15 10:02:46 +00:00
|
|
|
import 'package:photos/ui/create_collection_page.dart';
|
2022-12-15 11:24:51 +00:00
|
|
|
import 'package:photos/utils/delete_file_util.dart';
|
|
|
|
import 'package:photos/utils/magic_util.dart';
|
2022-12-14 17:35:08 +00:00
|
|
|
|
|
|
|
class FileSelectionActionWidget extends StatefulWidget {
|
|
|
|
final GalleryType type;
|
|
|
|
final Collection? collection;
|
|
|
|
final DeviceCollection? deviceCollection;
|
2022-12-15 04:06:51 +00:00
|
|
|
final SelectedFiles selectedFiles;
|
2022-12-14 17:35:08 +00:00
|
|
|
|
|
|
|
const FileSelectionActionWidget(
|
2022-12-15 04:06:51 +00:00
|
|
|
this.type,
|
|
|
|
this.selectedFiles, {
|
2022-12-14 17:35:08 +00:00
|
|
|
Key? key,
|
|
|
|
this.collection,
|
|
|
|
this.deviceCollection,
|
|
|
|
}) : super(key: key);
|
|
|
|
|
|
|
|
@override
|
|
|
|
State<FileSelectionActionWidget> createState() =>
|
|
|
|
_FileSelectionActionWidgetState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _FileSelectionActionWidgetState extends State<FileSelectionActionWidget> {
|
2022-12-15 04:06:51 +00:00
|
|
|
late int currentUserID;
|
|
|
|
late SelectedFileSplit split;
|
2022-12-15 10:02:46 +00:00
|
|
|
late CollectionActions collectionActions;
|
2022-12-15 04:06:51 +00:00
|
|
|
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
currentUserID = Configuration.instance.getUserID()!;
|
|
|
|
split = widget.selectedFiles.split(currentUserID);
|
|
|
|
widget.selectedFiles.addListener(_selectFileChangeListener);
|
2022-12-15 10:02:46 +00:00
|
|
|
collectionActions = CollectionActions(CollectionsService.instance);
|
2022-12-15 04:06:51 +00:00
|
|
|
super.initState();
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void dispose() {
|
|
|
|
widget.selectedFiles.removeListener(_selectFileChangeListener);
|
|
|
|
super.dispose();
|
|
|
|
}
|
|
|
|
|
|
|
|
void _selectFileChangeListener() {
|
|
|
|
split = widget.selectedFiles.split(currentUserID);
|
|
|
|
if (mounted) {
|
|
|
|
setState(() => {});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-14 17:35:08 +00:00
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2022-12-15 04:06:51 +00:00
|
|
|
final bool showPrefix =
|
|
|
|
split.pendingUploads.isNotEmpty || split.ownedByOtherUsers.isNotEmpty;
|
|
|
|
final String suffix = showPrefix
|
|
|
|
? " (${split.ownedByCurrentUser.length})"
|
|
|
|
""
|
|
|
|
: "";
|
2022-12-14 17:35:08 +00:00
|
|
|
debugPrint('$runtimeType building $mounted');
|
|
|
|
final colorScheme = getEnteColorScheme(context);
|
|
|
|
final List<List<BlurMenuItemWidget>> items = [];
|
|
|
|
final List<BlurMenuItemWidget> firstList = [];
|
|
|
|
if (widget.type.showAddToAlbum()) {
|
|
|
|
firstList.add(
|
|
|
|
BlurMenuItemWidget(
|
|
|
|
leadingIcon: Icons.add_outlined,
|
2022-12-15 04:06:51 +00:00
|
|
|
labelText: "Add to album$suffix",
|
2022-12-14 17:35:08 +00:00
|
|
|
menuItemColor: colorScheme.fillFaint,
|
2022-12-15 10:02:46 +00:00
|
|
|
onTap: _addToAlbum,
|
2022-12-14 17:35:08 +00:00
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (widget.type.showMoveToAlbum()) {
|
|
|
|
firstList.add(
|
|
|
|
BlurMenuItemWidget(
|
|
|
|
leadingIcon: Icons.arrow_forward_outlined,
|
2022-12-15 04:06:51 +00:00
|
|
|
labelText: "Move to album$suffix",
|
2022-12-14 17:35:08 +00:00
|
|
|
menuItemColor: colorScheme.fillFaint,
|
2022-12-15 10:02:46 +00:00
|
|
|
onTap: _moveFiles,
|
2022-12-14 17:35:08 +00:00
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (widget.type.showRemoveFromAlbum()) {
|
|
|
|
firstList.add(
|
|
|
|
BlurMenuItemWidget(
|
|
|
|
leadingIcon: Icons.remove_outlined,
|
2022-12-15 04:06:51 +00:00
|
|
|
labelText: "Remove from album$suffix",
|
2022-12-14 17:35:08 +00:00
|
|
|
menuItemColor: colorScheme.fillFaint,
|
2022-12-15 16:25:29 +00:00
|
|
|
onTap: split.ownedByCurrentUser.isNotEmpty
|
|
|
|
? _removeFilesFromAlbum
|
|
|
|
: null,
|
2022-12-14 17:35:08 +00:00
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (widget.type.showDeleteOption()) {
|
|
|
|
firstList.add(
|
|
|
|
BlurMenuItemWidget(
|
|
|
|
leadingIcon: Icons.delete_outline,
|
2022-12-15 04:06:51 +00:00
|
|
|
labelText: "Delete$suffix",
|
2022-12-14 17:35:08 +00:00
|
|
|
menuItemColor: colorScheme.fillFaint,
|
2022-12-15 11:24:51 +00:00
|
|
|
onTap: _onDeleteClick,
|
2022-12-14 17:35:08 +00:00
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (widget.type.showHideOption()) {
|
|
|
|
firstList.add(
|
|
|
|
BlurMenuItemWidget(
|
|
|
|
leadingIcon: Icons.visibility_off_outlined,
|
2022-12-15 04:06:51 +00:00
|
|
|
labelText: "Hide$suffix",
|
2022-12-14 17:35:08 +00:00
|
|
|
menuItemColor: colorScheme.fillFaint,
|
2022-12-15 11:24:51 +00:00
|
|
|
onTap: _onHideClick,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
} else if (widget.type.showUnHideOption()) {
|
|
|
|
firstList.add(
|
|
|
|
BlurMenuItemWidget(
|
|
|
|
leadingIcon: Icons.visibility_off_outlined,
|
|
|
|
labelText: "Unhide$suffix",
|
|
|
|
menuItemColor: colorScheme.fillFaint,
|
|
|
|
onTap: _onUnhideClick,
|
2022-12-14 17:35:08 +00:00
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (widget.type.showArchiveOption()) {
|
|
|
|
firstList.add(
|
|
|
|
BlurMenuItemWidget(
|
|
|
|
leadingIcon: Icons.archive_outlined,
|
2022-12-15 04:06:51 +00:00
|
|
|
labelText: "Archive$suffix",
|
2022-12-14 17:35:08 +00:00
|
|
|
menuItemColor: colorScheme.fillFaint,
|
2022-12-15 11:24:51 +00:00
|
|
|
onTap: _onArchiveClick,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
} else if (widget.type.showUnArchiveOption()) {
|
|
|
|
firstList.add(
|
|
|
|
BlurMenuItemWidget(
|
|
|
|
leadingIcon: Icons.unarchive_outlined,
|
|
|
|
labelText: "Unarchive$suffix",
|
|
|
|
menuItemColor: colorScheme.fillFaint,
|
|
|
|
onTap: _onUnArchiveClick,
|
2022-12-14 17:35:08 +00:00
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (widget.type.showFavoriteOption()) {
|
|
|
|
firstList.add(
|
|
|
|
BlurMenuItemWidget(
|
|
|
|
leadingIcon: Icons.favorite_border_rounded,
|
2022-12-15 04:06:51 +00:00
|
|
|
labelText: "Favorite$suffix",
|
2022-12-14 17:35:08 +00:00
|
|
|
menuItemColor: colorScheme.fillFaint,
|
2022-12-15 10:02:46 +00:00
|
|
|
onTap: _onFavoriteClick,
|
2022-12-14 17:35:08 +00:00
|
|
|
),
|
|
|
|
);
|
2022-12-15 11:24:51 +00:00
|
|
|
} else if (widget.type.showUnFavoriteOption()) {
|
|
|
|
firstList.add(
|
|
|
|
BlurMenuItemWidget(
|
|
|
|
leadingIcon: Icons.favorite,
|
|
|
|
labelText: "Remove from favorite$suffix",
|
|
|
|
menuItemColor: colorScheme.fillFaint,
|
|
|
|
onTap: _onUnFavoriteClick,
|
|
|
|
),
|
|
|
|
);
|
2022-12-14 17:35:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (firstList.isNotEmpty) {
|
|
|
|
items.add(firstList);
|
|
|
|
}
|
|
|
|
return ExpandedMenuWidget(
|
|
|
|
items: items,
|
|
|
|
);
|
|
|
|
}
|
2022-12-15 10:02:46 +00:00
|
|
|
|
|
|
|
Future<void> _moveFiles() async {
|
|
|
|
if (split.pendingUploads.isNotEmpty || split.ownedByOtherUsers.isNotEmpty) {
|
|
|
|
widget.selectedFiles
|
|
|
|
.unSelectAll(split.pendingUploads.toSet(), skipNotify: true);
|
|
|
|
widget.selectedFiles
|
|
|
|
.unSelectAll(split.ownedByOtherUsers.toSet(), skipNotify: true);
|
|
|
|
}
|
|
|
|
await _selectionCollectionForAction(CollectionActionType.moveFiles);
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> _addToAlbum() async {
|
|
|
|
if (split.ownedByOtherUsers.isNotEmpty) {
|
|
|
|
widget.selectedFiles
|
|
|
|
.unSelectAll(split.ownedByOtherUsers.toSet(), skipNotify: true);
|
|
|
|
}
|
|
|
|
await _selectionCollectionForAction(CollectionActionType.addFiles);
|
|
|
|
}
|
|
|
|
|
2022-12-15 11:24:51 +00:00
|
|
|
Future<void> _onDeleteClick() async {
|
|
|
|
showDeleteSheet(context, widget.selectedFiles);
|
|
|
|
}
|
|
|
|
|
2022-12-15 10:02:46 +00:00
|
|
|
Future<void> _removeFilesFromAlbum() async {
|
2022-12-15 16:25:29 +00:00
|
|
|
if (split.pendingUploads.isNotEmpty || split.ownedByOtherUsers.isNotEmpty) {
|
|
|
|
widget.selectedFiles
|
|
|
|
.unSelectAll(split.pendingUploads.toSet(), skipNotify: true);
|
|
|
|
widget.selectedFiles
|
|
|
|
.unSelectAll(split.ownedByOtherUsers.toSet(), skipNotify: true);
|
|
|
|
}
|
2022-12-15 10:02:46 +00:00
|
|
|
await collectionActions.showRemoveFromCollectionSheet(
|
|
|
|
context,
|
|
|
|
widget.collection!,
|
|
|
|
widget.selectedFiles,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> _onFavoriteClick() async {
|
|
|
|
final result = await collectionActions.updateFavorites(
|
|
|
|
context,
|
|
|
|
split.ownedByCurrentUser,
|
|
|
|
true,
|
|
|
|
);
|
|
|
|
if (result) {
|
|
|
|
widget.selectedFiles.clearAll();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-15 11:24:51 +00:00
|
|
|
Future<void> _onUnFavoriteClick() async {
|
|
|
|
final result = await collectionActions.updateFavorites(
|
|
|
|
context,
|
|
|
|
split.ownedByCurrentUser,
|
|
|
|
false,
|
|
|
|
);
|
|
|
|
if (result) {
|
|
|
|
widget.selectedFiles.clearAll();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> _onArchiveClick() async {
|
|
|
|
await changeVisibility(
|
|
|
|
context,
|
|
|
|
split.ownedByCurrentUser,
|
|
|
|
visibilityArchive,
|
|
|
|
);
|
|
|
|
widget.selectedFiles.clearAll();
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> _onUnArchiveClick() async {
|
|
|
|
await changeVisibility(
|
|
|
|
context,
|
|
|
|
split.ownedByCurrentUser,
|
|
|
|
visibilityVisible,
|
|
|
|
);
|
|
|
|
widget.selectedFiles.clearAll();
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> _onHideClick() async {
|
|
|
|
await CollectionsService.instance.hideFiles(
|
|
|
|
context,
|
|
|
|
split.ownedByCurrentUser,
|
|
|
|
);
|
|
|
|
widget.selectedFiles.clearAll();
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> _onUnhideClick() async {
|
|
|
|
if (split.pendingUploads.isNotEmpty || split.ownedByOtherUsers.isNotEmpty) {
|
|
|
|
widget.selectedFiles
|
|
|
|
.unSelectAll(split.pendingUploads.toSet(), skipNotify: true);
|
|
|
|
widget.selectedFiles
|
|
|
|
.unSelectAll(split.ownedByOtherUsers.toSet(), skipNotify: true);
|
|
|
|
}
|
|
|
|
await _selectionCollectionForAction(CollectionActionType.unHide);
|
|
|
|
}
|
|
|
|
|
2022-12-15 10:02:46 +00:00
|
|
|
Future<Object?> _selectionCollectionForAction(
|
|
|
|
CollectionActionType type,
|
|
|
|
) async {
|
|
|
|
return Navigator.push(
|
|
|
|
context,
|
|
|
|
PageTransition(
|
|
|
|
type: PageTransitionType.bottomToTop,
|
|
|
|
child: CreateCollectionPage(
|
|
|
|
widget.selectedFiles,
|
|
|
|
null,
|
|
|
|
actionType: type,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
2022-12-14 17:35:08 +00:00
|
|
|
}
|