fixed deleting binned item from the Download album

This commit is contained in:
Thibault Deckers 2022-09-19 18:29:04 +02:00
parent 341ff57dff
commit a0231de559
5 changed files with 15 additions and 8 deletions

View file

@ -22,6 +22,7 @@ All notable changes to this project will be documented in this file.
- photo frame widget rendering in some cases - photo frame widget rendering in some cases
- exporting large images to BMP - exporting large images to BMP
- replacing entries during move/copy - replacing entries during move/copy
- deleting binned item from the Download album
## <a id="v1.6.13"></a>[v1.6.13] - 2022-08-29 ## <a id="v1.6.13"></a>[v1.6.13] - 2022-08-29

View file

@ -171,6 +171,7 @@ object PermissionManager {
// returns paths accessible to the app (granted by the user or by default) // returns paths accessible to the app (granted by the user or by default)
private fun getAccessibleDirs(context: Context): Set<String> { private fun getAccessibleDirs(context: Context): Set<String> {
val accessibleDirs = HashSet(getGrantedDirs(context)) val accessibleDirs = HashSet(getGrantedDirs(context))
accessibleDirs.addAll(context.getExternalFilesDirs(null).filterNotNull().map { it.path })
// until API 18 / Android 4.3 / Jelly Bean MR2, removable storage is accessible by default like primary storage // until API 18 / Android 4.3 / Jelly Bean MR2, removable storage is accessible by default like primary storage
// from API 19 / Android 4.4 / KitKat, removable storage requires access permission, at the file level // from API 19 / Android 4.4 / KitKat, removable storage requires access permission, at the file level

View file

@ -213,9 +213,13 @@ class AvesEntry {
return _extension; return _extension;
} }
String? get storagePath => trashed ? trashDetails?.path : path;
String? get storageDirectory => trashed ? pContext.dirname(trashDetails!.path) : directory;
bool get isMissingAtPath { bool get isMissingAtPath {
final effectivePath = trashed ? trashDetails?.path : path; final _storagePath = storagePath;
return effectivePath != null && !File(effectivePath).existsSync(); return _storagePath != null && !File(_storagePath).existsSync();
} }
// the MIME type reported by the Media Store is unreliable // the MIME type reported by the Media Store is unreliable

View file

@ -275,7 +275,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware
final l10n = context.l10n; final l10n = context.l10n;
final source = context.read<CollectionSource>(); final source = context.read<CollectionSource>();
final selectionDirs = entries.map((e) => e.directory).whereNotNull().toSet(); final storageDirs = entries.map((e) => e.storageDirectory).whereNotNull().toSet();
final todoCount = entries.length; final todoCount = entries.length;
if (!await showConfirmationDialog( if (!await showConfirmationDialog(
@ -285,7 +285,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware
confirmationButtonLabel: l10n.deleteButtonLabel, confirmationButtonLabel: l10n.deleteButtonLabel,
)) return; )) return;
if (!pureTrash && !await checkStoragePermissionForAlbums(context, selectionDirs, entries: entries)) return; if (!await checkStoragePermissionForAlbums(context, storageDirs, entries: entries)) return;
source.pauseMonitoring(); source.pauseMonitoring();
final opId = mediaEditService.newOpId; final opId = mediaEditService.newOpId;
@ -308,7 +308,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware
} }
// cleanup // cleanup
await storageService.deleteEmptyDirectories(selectionDirs); await storageService.deleteEmptyDirectories(storageDirs);
}, },
); );

View file

@ -8,13 +8,14 @@ import 'package:flutter/material.dart';
mixin PermissionAwareMixin { mixin PermissionAwareMixin {
Future<bool> checkStoragePermission(BuildContext context, Set<AvesEntry> entries) { Future<bool> checkStoragePermission(BuildContext context, Set<AvesEntry> entries) {
return checkStoragePermissionForAlbums(context, entries.map((e) => e.directory).whereNotNull().toSet(), entries: entries); final storageDirs = entries.map((e) => e.storageDirectory).whereNotNull().toSet();
return checkStoragePermissionForAlbums(context, storageDirs, entries: entries);
} }
Future<bool> checkStoragePermissionForAlbums(BuildContext context, Set<String> albumPaths, {Set<AvesEntry>? entries}) async { Future<bool> checkStoragePermissionForAlbums(BuildContext context, Set<String> storageDirs, {Set<AvesEntry>? entries}) async {
final restrictedDirs = await storageService.getRestrictedDirectories(); final restrictedDirs = await storageService.getRestrictedDirectories();
while (true) { while (true) {
final dirs = await storageService.getInaccessibleDirectories(albumPaths); final dirs = await storageService.getInaccessibleDirectories(storageDirs);
final restrictedInaccessibleDirs = dirs.where(restrictedDirs.contains).toSet(); final restrictedInaccessibleDirs = dirs.where(restrictedDirs.contains).toSet();
if (restrictedInaccessibleDirs.isNotEmpty) { if (restrictedInaccessibleDirs.isNotEmpty) {