diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/StorageUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/StorageUtils.kt index c801c30ec..21b61b732 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/utils/StorageUtils.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/StorageUtils.kt @@ -272,7 +272,9 @@ object StorageUtils { // content://com.android.externalstorage.documents/tree/primary%3A -> /storage/emulated/0/ // content://com.android.externalstorage.documents/tree/10F9-3F13%3APictures -> /storage/10F9-3F13/Pictures/ fun convertTreeUriToDirPath(context: Context, treeUri: Uri): String? { - val encoded = treeUri.toString().substring(TREE_URI_ROOT.length) + val treeUriString = treeUri.toString() + if (treeUriString.length <= TREE_URI_ROOT.length) return null + val encoded = treeUriString.substring(TREE_URI_ROOT.length) val matcher = TREE_URI_PATH_PATTERN.matcher(Uri.decode(encoded)) with(matcher) { if (find()) { diff --git a/lib/model/filters/filters.dart b/lib/model/filters/filters.dart index f2389dce7..af637d41b 100644 --- a/lib/model/filters/filters.dart +++ b/lib/model/filters/filters.dart @@ -21,12 +21,12 @@ import 'package:flutter/widgets.dart'; abstract class CollectionFilter extends Equatable implements Comparable { static const List categoryOrder = [ QueryFilter.type, - FavouriteFilter.type, MimeFilter.type, - TypeFilter.type, AlbumFilter.type, + TypeFilter.type, LocationFilter.type, CoordinateFilter.type, + FavouriteFilter.type, RatingFilter.type, TagFilter.type, PathFilter.type, diff --git a/lib/model/metadata/date_modifier.dart b/lib/model/metadata/date_modifier.dart index 86c312f62..6018b9bfc 100644 --- a/lib/model/metadata/date_modifier.dart +++ b/lib/model/metadata/date_modifier.dart @@ -1,9 +1,10 @@ import 'package:aves/model/metadata/enums.dart'; +import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; @immutable -class DateModifier { +class DateModifier extends Equatable { static const writableDateFields = [ MetadataField.exifDate, MetadataField.exifDateOriginal, @@ -18,6 +19,9 @@ class DateModifier { final DateFieldSource? copyFieldSource; final int? shiftMinutes; + @override + List get props => [action, fields, setDateTime, copyFieldSource, shiftMinutes]; + const DateModifier._private( this.action, this.fields, { diff --git a/lib/widgets/about/bug_report.dart b/lib/widgets/about/bug_report.dart index db9195c68..cee2b94aa 100644 --- a/lib/widgets/about/bug_report.dart +++ b/lib/widgets/about/bug_report.dart @@ -162,6 +162,6 @@ class _BugReportState extends State with FeedbackMixin { } Future _goToGithub() async { - await launch('${Constants.avesGithub}/issues/new'); + await launch('${Constants.avesGithub}/issues/new?labels=type%3Abug&template=bug_report.md'); } } diff --git a/lib/widgets/dialogs/entry_editors/edit_entry_date_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_entry_date_dialog.dart index 306b2f572..f3ce87745 100644 --- a/lib/widgets/dialogs/entry_editors/edit_entry_date_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_entry_date_dialog.dart @@ -95,7 +95,7 @@ class _EditEntryDateDialogState extends State { if (_action == DateEditAction.setCustom) _buildSetCustomContent(context), if (_action == DateEditAction.copyField) _buildCopyFieldContent(context), if (_action == DateEditAction.shift) _buildShiftContent(context), - (_action == DateEditAction.shift || _action == DateEditAction.remove)? _buildDestinationFields(context): const SizedBox(height: 8), + (_action == DateEditAction.shift || _action == DateEditAction.remove) ? _buildDestinationFields(context) : const SizedBox(height: 8), ], ), ), diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart b/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart index 2d7f47fe0..509ea70ec 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart @@ -11,6 +11,7 @@ class XmpCrsNamespace extends XmpNamespace { static final pbcPattern = RegExp(ns + r':PaintBasedCorrections\[(\d+)\]/(.*)'); static final retouchAreasPattern = RegExp(ns + r':RetouchAreas\[(\d+)\]/(.*)'); static final lookPattern = RegExp(ns + r':Look/(.*)'); + static final rmmiPattern = RegExp(ns + r':RangeMaskMapInfo/' + ns + r':RangeMaskMapInfo/(.*)'); final cgbc = >{}; final gbc = >{}; @@ -18,12 +19,14 @@ class XmpCrsNamespace extends XmpNamespace { final pbc = >{}; final retouchAreas = >{}; final look = {}; + final rmmi = {}; XmpCrsNamespace(Map rawProps) : super(ns, rawProps); @override bool extractData(XmpProp prop) { - final hasStructs = extractStruct(prop, lookPattern, look); + var hasStructs = extractStruct(prop, lookPattern, look); + hasStructs |= extractStruct(prop, rmmiPattern, rmmi); var hasIndexedStructs = extractIndexedStruct(prop, cgbcPattern, cgbc); hasIndexedStructs |= extractIndexedStruct(prop, gbcPattern, gbc); hasIndexedStructs |= extractIndexedStruct(prop, mgbcPattern, mgbc); @@ -59,6 +62,11 @@ class XmpCrsNamespace extends XmpNamespace { title: 'Paint Based Corrections', structByIndex: pbc, ), + if (rmmi.isNotEmpty) + XmpStructCard( + title: 'Range Mask Map Info', + struct: rmmi, + ), if (retouchAreas.isNotEmpty) XmpStructArrayCard( title: 'Retouch Areas',