diff --git a/lib/widgets/common/action_delegates/permission_aware.dart b/lib/widgets/common/action_delegates/permission_aware.dart index 394c83e92..0557fd1bb 100644 --- a/lib/widgets/common/action_delegates/permission_aware.dart +++ b/lib/widgets/common/action_delegates/permission_aware.dart @@ -1,14 +1,17 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/services/android_file_service.dart'; import 'package:aves/utils/android_file_utils.dart'; -import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:tuple/tuple.dart'; mixin PermissionAwareMixin { - Future checkStoragePermission(BuildContext context, Iterable entries) async { - final byVolume = groupBy(entries.where((e) => e.path != null), (e) => androidFileUtils.getStorageVolume(e.path)); - final removableVolumes = byVolume.keys.where((v) => v.isRemovable); + Future checkStoragePermission(BuildContext context, Iterable entries) { + return checkStoragePermissionForPaths(context, entries.where((e) => e.path != null).map((e) => e.path)); + } + + Future checkStoragePermissionForPaths(BuildContext context, Iterable paths) async { + final volumes = paths.map((path) => androidFileUtils.getStorageVolume(path)).toSet(); + final removableVolumes = volumes.where((v) => v.isRemovable); final volumePermissions = await Future.wait>( removableVolumes.map( (volume) => AndroidFileService.hasGrantedPermissionToVolumeRoot(volume.path).then( diff --git a/lib/widgets/common/action_delegates/selection_action_delegate.dart b/lib/widgets/common/action_delegates/selection_action_delegate.dart index 0f301f0a9..404667891 100644 --- a/lib/widgets/common/action_delegates/selection_action_delegate.dart +++ b/lib/widgets/common/action_delegates/selection_action_delegate.dart @@ -1,10 +1,10 @@ import 'dart:async'; -import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/favourite_repo.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/metadata_db.dart'; +import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/services/android_app_service.dart'; import 'package:aves/services/image_file_service.dart'; import 'package:aves/utils/durations.dart'; @@ -97,6 +97,7 @@ class SelectionActionDelegate with FeedbackMixin, PermissionAwareMixin { ), ); if (destinationAlbum == null || destinationAlbum.isEmpty) return; + if (!await checkStoragePermissionForPaths(context, [destinationAlbum])) return; final selection = collection.selection.toList(); if (!await checkStoragePermission(context, selection)) return;