From f62678f58f3e58df722288652edbd3fdae579b9b Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Thu, 18 Jan 2024 21:01:38 +0000 Subject: [PATCH] feat(mobile): long-press delete button to permanently delete asset (#6240) * feat(mobile): delete assets from device only * mobile: add backed up only toggle for delete device only * remove toggle inside alert and show different content * mobile: change content color for local only * mobile: delete local only button to dialog * style: display bottom action in two lines * feat: separate delete buttons * fix: incorrect error message for ownedRemoteSelection * feat(mobile): long-press delete to permanently delete asset * chore: add todo to handle long press to delete in gallery_viewer * chore: rebase on deletion branch * feat(mobile): long-press delete to permanently delete asset * fix(mobile): update minChildSize of control bottom app bar --------- Co-authored-by: shalong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex Tran --- .../asset_viewer/views/gallery_viewer.dart | 1 + .../home/ui/control_bottom_app_bar.dart | 40 +++++++++++++------ .../ui/asset_grid/multiselect_grid.dart | 4 +- mobile/lib/shared/ui/drag_sheet.dart | 3 ++ 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/mobile/lib/modules/asset_viewer/views/gallery_viewer.dart b/mobile/lib/modules/asset_viewer/views/gallery_viewer.dart index 760af3e06f..4109412b4a 100644 --- a/mobile/lib/modules/asset_viewer/views/gallery_viewer.dart +++ b/mobile/lib/modules/asset_viewer/views/gallery_viewer.dart @@ -633,6 +633,7 @@ class GalleryViewerPage extends HookConsumerWidget { ); } + // TODO: Migrate to a custom bottom bar and handle long press to delete Widget buildBottomBar() { // !!!! itemsList and actionlist should always be in sync final itemsList = [ diff --git a/mobile/lib/modules/home/ui/control_bottom_app_bar.dart b/mobile/lib/modules/home/ui/control_bottom_app_bar.dart index b24aad5a3d..119a94d9e7 100644 --- a/mobile/lib/modules/home/ui/control_bottom_app_bar.dart +++ b/mobile/lib/modules/home/ui/control_bottom_app_bar.dart @@ -63,6 +63,22 @@ class ControlBottomAppBar extends ConsumerWidget { ref.watch(serverInfoProvider.select((v) => v.serverFeatures.trash)); final albums = ref.watch(albumProvider).where((a) => a.isRemote).toList(); final sharedAlbums = ref.watch(sharedAlbumProvider); + const bottomPadding = 0.20; + + void showForceDeleteDialog( + Function(bool) deleteCb, { + String? alertMsg, + }) { + showDialog( + context: context, + builder: (BuildContext context) { + return DeleteDialog( + alert: alertMsg, + onDelete: () => deleteCb(true), + ); + }, + ); + } void handleRemoteDelete( bool force, @@ -73,15 +89,7 @@ class ControlBottomAppBar extends ConsumerWidget { deleteCb(force); return; } - showDialog( - context: context, - builder: (BuildContext context) { - return DeleteDialog( - alert: alertMsg, - onDelete: () => deleteCb(force), - ); - }, - ); + return showForceDeleteDialog(deleteCb, alertMsg: alertMsg); } List renderActionButtons() { @@ -132,6 +140,12 @@ class ControlBottomAppBar extends ConsumerWidget { alertMsg: "delete_dialog_alert_remote", ) : null, + onLongPressed: enabled + ? () => showForceDeleteDialog( + onDeleteServer!, + alertMsg: "delete_dialog_alert_remote", + ) + : null, ), ), if (hasLocal && onDeleteLocal != null) @@ -167,6 +181,8 @@ class ControlBottomAppBar extends ConsumerWidget { onPressed: enabled ? () => handleRemoteDelete(!trashEnabled, onDelete!) : null, + onLongPressed: + enabled ? () => showForceDeleteDialog(onDelete!) : null, ), ), if (hasRemote && onEditTime != null) @@ -214,9 +230,9 @@ class ControlBottomAppBar extends ConsumerWidget { } return DraggableScrollableSheet( - initialChildSize: hasRemote ? 0.30 : 0.18, - minChildSize: 0.18, - maxChildSize: hasRemote ? 0.60 : 0.18, + initialChildSize: hasRemote ? 0.30 : bottomPadding, + minChildSize: bottomPadding, + maxChildSize: hasRemote ? 0.60 : bottomPadding, snap: true, builder: ( BuildContext context, diff --git a/mobile/lib/shared/ui/asset_grid/multiselect_grid.dart b/mobile/lib/shared/ui/asset_grid/multiselect_grid.dart index 0dafc435bd..342bc397d3 100644 --- a/mobile/lib/shared/ui/asset_grid/multiselect_grid.dart +++ b/mobile/lib/shared/ui/asset_grid/multiselect_grid.dart @@ -201,9 +201,9 @@ class MultiselectGrid extends HookConsumerWidget { msg: '${selection.value.length} $assetOrAssets $trashOrRemoved', gravity: ToastGravity.BOTTOM, ); + selectionEnabledHook.value = false; } } finally { - selectionEnabledHook.value = false; processing.value = false; } } @@ -224,9 +224,9 @@ class MultiselectGrid extends HookConsumerWidget { '${localIds.length} $assetOrAssets removed permanently from your device', gravity: ToastGravity.BOTTOM, ); + selectionEnabledHook.value = false; } } finally { - selectionEnabledHook.value = false; processing.value = false; } } diff --git a/mobile/lib/shared/ui/drag_sheet.dart b/mobile/lib/shared/ui/drag_sheet.dart index fd4a3c2cf9..9c717202d9 100644 --- a/mobile/lib/shared/ui/drag_sheet.dart +++ b/mobile/lib/shared/ui/drag_sheet.dart @@ -23,11 +23,13 @@ class ControlBoxButton extends StatelessWidget { required this.label, required this.iconData, this.onPressed, + this.onLongPressed, }) : super(key: key); final String label; final IconData iconData; final void Function()? onPressed; + final void Function()? onLongPressed; @override Widget build(BuildContext context) { @@ -35,6 +37,7 @@ class ControlBoxButton extends StatelessWidget { padding: const EdgeInsets.all(10), shape: const CircleBorder(), onPressed: onPressed, + onLongPress: onLongPressed, minWidth: 75.0, child: Column( mainAxisAlignment: MainAxisAlignment.start,