move/copy: fixed storage permission check for destination folder

This commit is contained in:
Thibault Deckers 2020-06-12 15:24:00 +09:00
parent ce69587d2c
commit 7db80f93be
2 changed files with 9 additions and 5 deletions

View file

@ -1,14 +1,17 @@
import 'package:aves/model/image_entry.dart'; import 'package:aves/model/image_entry.dart';
import 'package:aves/services/android_file_service.dart'; import 'package:aves/services/android_file_service.dart';
import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/android_file_utils.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
mixin PermissionAwareMixin { mixin PermissionAwareMixin {
Future<bool> checkStoragePermission(BuildContext context, Iterable<ImageEntry> entries) async { Future<bool> checkStoragePermission(BuildContext context, Iterable<ImageEntry> entries) {
final byVolume = groupBy(entries.where((e) => e.path != null), (e) => androidFileUtils.getStorageVolume(e.path)); return checkStoragePermissionForPaths(context, entries.where((e) => e.path != null).map((e) => e.path));
final removableVolumes = byVolume.keys.where((v) => v.isRemovable); }
Future<bool> checkStoragePermissionForPaths(BuildContext context, Iterable<String> paths) async {
final volumes = paths.map((path) => androidFileUtils.getStorageVolume(path)).toSet();
final removableVolumes = volumes.where((v) => v.isRemovable);
final volumePermissions = await Future.wait<Tuple2<StorageVolume, bool>>( final volumePermissions = await Future.wait<Tuple2<StorageVolume, bool>>(
removableVolumes.map( removableVolumes.map(
(volume) => AndroidFileService.hasGrantedPermissionToVolumeRoot(volume.path).then( (volume) => AndroidFileService.hasGrantedPermissionToVolumeRoot(volume.path).then(

View file

@ -1,10 +1,10 @@
import 'dart:async'; import 'dart:async';
import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/model/favourite_repo.dart'; import 'package:aves/model/favourite_repo.dart';
import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/album.dart';
import 'package:aves/model/image_entry.dart'; import 'package:aves/model/image_entry.dart';
import 'package:aves/model/metadata_db.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/android_app_service.dart';
import 'package:aves/services/image_file_service.dart'; import 'package:aves/services/image_file_service.dart';
import 'package:aves/utils/durations.dart'; import 'package:aves/utils/durations.dart';
@ -97,6 +97,7 @@ class SelectionActionDelegate with FeedbackMixin, PermissionAwareMixin {
), ),
); );
if (destinationAlbum == null || destinationAlbum.isEmpty) return; if (destinationAlbum == null || destinationAlbum.isEmpty) return;
if (!await checkStoragePermissionForPaths(context, [destinationAlbum])) return;
final selection = collection.selection.toList(); final selection = collection.selection.toList();
if (!await checkStoragePermission(context, selection)) return; if (!await checkStoragePermission(context, selection)) return;