diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 799408295..8068ac306 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -3,8 +3,21 @@ package="deckers.thibault.aves" android:installLocation="auto"> + + - + + diff --git a/android/app/src/main/java/deckers/thibault/aves/model/provider/MediaStoreImageProvider.java b/android/app/src/main/java/deckers/thibault/aves/model/provider/MediaStoreImageProvider.java index 5230ed873..082e9c9ba 100644 --- a/android/app/src/main/java/deckers/thibault/aves/model/provider/MediaStoreImageProvider.java +++ b/android/app/src/main/java/deckers/thibault/aves/model/provider/MediaStoreImageProvider.java @@ -33,6 +33,7 @@ public class MediaStoreImageProvider extends ImageProvider { MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.MIME_TYPE, MediaStore.MediaColumns.SIZE, + // TODO TLAD use `DISPLAY_NAME` instead/along `TITLE`? MediaStore.MediaColumns.TITLE, MediaStore.MediaColumns.WIDTH, MediaStore.MediaColumns.HEIGHT, @@ -192,12 +193,15 @@ public class MediaStoreImageProvider extends ImageProvider { return; } - if (activity.getContentResolver().delete(uri, null, null) > 0) { - Log.d(LOG_TAG, "deleted from content resolver uri=" + uri); - callback.onSuccess(null); - return; + try { + if (activity.getContentResolver().delete(uri, null, null) > 0) { + Log.d(LOG_TAG, "deleted from content resolver uri=" + uri); + callback.onSuccess(null); + return; + } + } catch (Exception e) { + Log.e(LOG_TAG, "failed to delete entry", e); } - callback.onFailure(); } diff --git a/lib/main.dart b/lib/main.dart index 0b473fc78..0f7c9d046 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -101,11 +101,13 @@ class _HomePageState extends State { if (snapshot.hasError) return const Icon(OMIcons.error); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); debugPrint('$runtimeType app setup future complete'); - return _sharedEntry != null - ? SingleFullscreenPage( - entry: _sharedEntry, - ) - : CollectionPage(_mediaStore.collection); + if (_sharedEntry != null) { + return SingleFullscreenPage(entry: _sharedEntry); + } + if (_mediaStore != null) { + return CollectionPage(_mediaStore.collection); + } + return const SizedBox.shrink(); }); } } diff --git a/lib/utils/android_file_utils.dart b/lib/utils/android_file_utils.dart index c14187243..8c94ea034 100644 --- a/lib/utils/android_file_utils.dart +++ b/lib/utils/android_file_utils.dart @@ -84,7 +84,7 @@ class StorageVolume { isPrimary: map['isPrimary'] ?? false, isRemovable: map['isRemovable'] ?? false, path: map['path'] ?? '', - state: map['string'] ?? '', + state: map['state'] ?? '', ); } } diff --git a/lib/widgets/common/action_delegates/selection_action_delegate.dart b/lib/widgets/common/action_delegates/selection_action_delegate.dart index d70c34bf2..d2936c189 100644 --- a/lib/widgets/common/action_delegates/selection_action_delegate.dart +++ b/lib/widgets/common/action_delegates/selection_action_delegate.dart @@ -68,7 +68,8 @@ class SelectionActionDelegate with PermissionAwareMixin { final deletedCount = deletedUris.length; final selectionCount = selection.length; if (deletedCount < selectionCount) { - _showFeedback(context, 'Failed to delete ${selectionCount - deletedCount} items'); + final count = selectionCount - deletedCount; + _showFeedback(context, 'Failed to delete ${Intl.plural(count, one: '${count} item', other: '${count} items')}'); } if (deletedCount > 0) { collection.source.removeEntries(selection.where((e) => deletedUris.contains(e.uri)));