diff --git a/lib/convert/convert.dart b/lib/convert/convert.dart new file mode 100644 index 000000000..43780fce2 --- /dev/null +++ b/lib/convert/convert.dart @@ -0,0 +1,3 @@ +export 'metadata/date_field_source.dart'; +export 'metadata/fields.dart'; +export 'metadata/metadata_type.dart'; diff --git a/lib/convert/metadata/date_field_source.dart b/lib/convert/metadata/date_field_source.dart new file mode 100644 index 000000000..1bc1ee1bd --- /dev/null +++ b/lib/convert/metadata/date_field_source.dart @@ -0,0 +1,18 @@ +import 'package:aves_model/aves_model.dart'; + +extension ExtraDateFieldSourceConvert on DateFieldSource { + MetadataField? toMetadataField() { + switch (this) { + case DateFieldSource.fileModifiedDate: + return null; + case DateFieldSource.exifDate: + return MetadataField.exifDate; + case DateFieldSource.exifDateOriginal: + return MetadataField.exifDateOriginal; + case DateFieldSource.exifDateDigitized: + return MetadataField.exifDateDigitized; + case DateFieldSource.exifGpsDate: + return MetadataField.exifGpsDatestamp; + } + } +} diff --git a/lib/model/metadata/fields.dart b/lib/convert/metadata/fields.dart similarity index 66% rename from lib/model/metadata/fields.dart rename to lib/convert/metadata/fields.dart index 797c2e5ef..fd677c105 100644 --- a/lib/model/metadata/fields.dart +++ b/lib/convert/metadata/fields.dart @@ -1,87 +1,6 @@ import 'package:aves_model/aves_model.dart'; -enum MetadataField { - exifDate, - exifDateOriginal, - exifDateDigitized, - exifGpsAltitude, - exifGpsAltitudeRef, - exifGpsAreaInformation, - exifGpsDatestamp, - exifGpsDestBearing, - exifGpsDestBearingRef, - exifGpsDestDistance, - exifGpsDestDistanceRef, - exifGpsDestLatitude, - exifGpsDestLatitudeRef, - exifGpsDestLongitude, - exifGpsDestLongitudeRef, - exifGpsDifferential, - exifGpsDOP, - exifGpsHPositioningError, - exifGpsImgDirection, - exifGpsImgDirectionRef, - exifGpsLatitude, - exifGpsLatitudeRef, - exifGpsLongitude, - exifGpsLongitudeRef, - exifGpsMapDatum, - exifGpsMeasureMode, - exifGpsProcessingMethod, - exifGpsSatellites, - exifGpsSpeed, - exifGpsSpeedRef, - exifGpsStatus, - exifGpsTimestamp, - exifGpsTrack, - exifGpsTrackRef, - exifGpsVersionId, - exifImageDescription, - exifUserComment, - mp4GpsCoordinates, - mp4RotationDegrees, - mp4Xmp, - xmpXmpCreateDate, -} - -class MetadataFields { - static const Set exifGpsFields = { - MetadataField.exifGpsAltitude, - MetadataField.exifGpsAltitudeRef, - MetadataField.exifGpsAreaInformation, - MetadataField.exifGpsDatestamp, - MetadataField.exifGpsDestBearing, - MetadataField.exifGpsDestBearingRef, - MetadataField.exifGpsDestDistance, - MetadataField.exifGpsDestDistanceRef, - MetadataField.exifGpsDestLatitude, - MetadataField.exifGpsDestLatitudeRef, - MetadataField.exifGpsDestLongitude, - MetadataField.exifGpsDestLongitudeRef, - MetadataField.exifGpsDifferential, - MetadataField.exifGpsDOP, - MetadataField.exifGpsHPositioningError, - MetadataField.exifGpsImgDirection, - MetadataField.exifGpsImgDirectionRef, - MetadataField.exifGpsLatitude, - MetadataField.exifGpsLatitudeRef, - MetadataField.exifGpsLongitude, - MetadataField.exifGpsLongitudeRef, - MetadataField.exifGpsMapDatum, - MetadataField.exifGpsMeasureMode, - MetadataField.exifGpsProcessingMethod, - MetadataField.exifGpsSatellites, - MetadataField.exifGpsSpeed, - MetadataField.exifGpsSpeedRef, - MetadataField.exifGpsStatus, - MetadataField.exifGpsTimestamp, - MetadataField.exifGpsTrack, - MetadataField.exifGpsTrackRef, - MetadataField.exifGpsVersionId, - }; -} - -extension ExtraMetadataField on MetadataField { +extension ExtraMetadataFieldConvert on MetadataField { MetadataType get type { switch (this) { case MetadataField.exifDate: @@ -228,21 +147,4 @@ extension ExtraMetadataField on MetadataField { return null; } } - - String get title { - switch (this) { - case MetadataField.exifDate: - return 'Exif date'; - case MetadataField.exifDateOriginal: - return 'Exif original date'; - case MetadataField.exifDateDigitized: - return 'Exif digitized date'; - case MetadataField.exifGpsDatestamp: - return 'Exif GPS date'; - case MetadataField.xmpXmpCreateDate: - return 'XMP xmp:CreateDate'; - default: - return name; - } - } } diff --git a/lib/convert/metadata/metadata_type.dart b/lib/convert/metadata/metadata_type.dart new file mode 100644 index 000000000..63259e7ba --- /dev/null +++ b/lib/convert/metadata/metadata_type.dart @@ -0,0 +1,28 @@ +import 'package:aves_model/aves_model.dart'; + +extension ExtraMetadataTypeConvert on MetadataType { + String get toPlatform { + switch (this) { + case MetadataType.comment: + return 'comment'; + case MetadataType.exif: + return 'exif'; + case MetadataType.iccProfile: + return 'icc_profile'; + case MetadataType.iptc: + return 'iptc'; + case MetadataType.jfif: + return 'jfif'; + case MetadataType.jpegAdobe: + return 'jpeg_adobe'; + case MetadataType.jpegDucky: + return 'jpeg_ducky'; + case MetadataType.mp4: + return 'mp4'; + case MetadataType.photoshopIrb: + return 'photoshop_irb'; + case MetadataType.xmp: + return 'xmp'; + } + } +} diff --git a/lib/model/covers.dart b/lib/model/covers.dart index 962310fa8..b36dee1a9 100644 --- a/lib/model/covers.dart +++ b/lib/model/covers.dart @@ -5,10 +5,10 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart'; diff --git a/lib/model/entry/dirs.dart b/lib/model/entry/dirs.dart index a59861c0d..6db7918a4 100644 --- a/lib/model/entry/dirs.dart +++ b/lib/model/entry/dirs.dart @@ -1,8 +1,8 @@ import 'dart:async'; import 'dart:io'; -import 'package:aves/model/storage/relative_dir.dart'; import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; import 'package:collection/collection.dart'; final entryDirRepo = EntryDirRepo._private(); @@ -52,7 +52,7 @@ class EntryDir { } String? _resolve() { - final vrl = VolumeRelativeDirectory.fromPath(asIs!); + final vrl = androidFileUtils.relativeDirectoryFromPath(asIs!); if (vrl == null || vrl.relativeDir.isEmpty) return asIs; var resolved = vrl.volumePath; diff --git a/lib/model/entry/extensions/images.dart b/lib/model/entry/extensions/images.dart index 46e18a337..ee9dbafd1 100644 --- a/lib/model/entry/extensions/images.dart +++ b/lib/model/entry/extensions/images.dart @@ -7,7 +7,7 @@ import 'package:aves/model/entry/cache.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/utils/math_utils.dart'; import 'package:collection/collection.dart'; -import 'package:flutter/widgets.dart'; +import 'package:flutter/painting.dart'; extension ExtraAvesEntryImages on AvesEntry { bool isThumbnailReady({double extent = 0}) => _isReady(_getThumbnailProviderKey(extent)); diff --git a/lib/model/entry/extensions/metadata_edition.dart b/lib/model/entry/extensions/metadata_edition.dart index cf977f815..ea4973ee1 100644 --- a/lib/model/entry/extensions/metadata_edition.dart +++ b/lib/model/entry/extensions/metadata_edition.dart @@ -1,15 +1,15 @@ import 'dart:convert'; import 'dart:io'; +import 'package:aves/convert/convert.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/catalog.dart'; import 'package:aves/model/entry/extensions/props.dart'; import 'package:aves/model/metadata/date_modifier.dart'; -import 'package:aves/model/metadata/enums/date_field_source.dart'; -import 'package:aves/model/metadata/fields.dart'; -import 'package:aves/ref/exif.dart'; -import 'package:aves/ref/iptc.dart'; +import 'package:aves/ref/metadata/exif.dart'; +import 'package:aves/ref/metadata/iptc.dart'; import 'package:aves/ref/mime_types.dart'; +import 'package:aves/ref/metadata/xmp.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/services/metadata/xmp.dart'; import 'package:aves/utils/time_utils.dart'; @@ -54,7 +54,7 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { editCreateDateXmp(descriptions, appliedModifier.setDateTime); break; case DateEditAction.shift: - final xmpDate = XMP.getString(descriptions, XMP.xmpCreateDate, namespace: Namespaces.xmp); + final xmpDate = XMP.getString(descriptions, XmpAttributes.xmpCreateDate, namespace: XmpNamespaces.xmp); if (xmpDate != null) { final date = DateTime.tryParse(xmpDate); if (date != null) { @@ -262,18 +262,18 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { if (editTitle) { modified |= XMP.setAttribute( descriptions, - XMP.dcTitle, + XmpElements.dcTitle, title, - namespace: Namespaces.dc, + namespace: XmpNamespaces.dc, strat: XmpEditStrategy.always, ); } if (editDescription) { modified |= XMP.setAttribute( descriptions, - XMP.dcDescription, + XmpElements.dcDescription, description, - namespace: Namespaces.dc, + namespace: XmpNamespaces.dc, strat: XmpEditStrategy.always, ); } @@ -417,9 +417,9 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { static bool editCreateDateXmp(List descriptions, DateTime? date) { return XMP.setAttribute( descriptions, - XMP.xmpCreateDate, + XmpAttributes.xmpCreateDate, date != null ? XMP.toXmpDate(date) : null, - namespace: Namespaces.xmp, + namespace: XmpNamespaces.xmp, strat: XmpEditStrategy.always, ); } @@ -428,9 +428,9 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { static bool editTagsXmp(List descriptions, Set tags) { return XMP.setStringBag( descriptions, - XMP.dcSubject, + XmpElements.dcSubject, tags, - namespace: Namespaces.dc, + namespace: XmpNamespaces.dc, strat: XmpEditStrategy.always, ); } @@ -441,17 +441,17 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { modified |= XMP.setAttribute( descriptions, - XMP.xmpRating, + XmpElements.xmpRating, (rating ?? 0) == 0 ? null : '$rating', - namespace: Namespaces.xmp, + namespace: XmpNamespaces.xmp, strat: XmpEditStrategy.always, ); modified |= XMP.setAttribute( descriptions, - XMP.msPhotoRating, + XmpElements.msPhotoRating, XMP.toMsPhotoRating(rating), - namespace: Namespaces.microsoftPhoto, + namespace: XmpNamespaces.microsoftPhoto, strat: XmpEditStrategy.updateIfPresent, ); @@ -464,23 +464,23 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { modified |= XMP.removeElements( descriptions, - XMP.containerDirectory, - Namespaces.gContainer, + XmpElements.containerDirectory, + XmpNamespaces.gContainer, ); modified |= [ - XMP.gCameraMicroVideo, - XMP.gCameraMicroVideoVersion, - XMP.gCameraMicroVideoOffset, - XMP.gCameraMicroVideoPresentationTimestampUs, - XMP.gCameraMotionPhoto, - XMP.gCameraMotionPhotoVersion, - XMP.gCameraMotionPhotoPresentationTimestampUs, + XmpAttributes.gCameraMicroVideo, + XmpAttributes.gCameraMicroVideoVersion, + XmpAttributes.gCameraMicroVideoOffset, + XmpAttributes.gCameraMicroVideoPresentationTimestampUs, + XmpAttributes.gCameraMotionPhoto, + XmpAttributes.gCameraMotionPhotoVersion, + XmpAttributes.gCameraMotionPhotoPresentationTimestampUs, ].fold(modified, (prev, name) { return prev |= XMP.removeElements( descriptions, name, - Namespaces.gCamera, + XmpNamespaces.gCamera, ); }); diff --git a/lib/model/favourites.dart b/lib/model/favourites.dart index f2e77476d..5c56b8ad3 100644 --- a/lib/model/favourites.dart +++ b/lib/model/favourites.dart @@ -1,11 +1,11 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/storage/volume.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:equatable/equatable.dart'; -import 'package:flutter/widgets.dart'; +import 'package:flutter/foundation.dart'; final Favourites favourites = Favourites._private(); diff --git a/lib/model/filters/album.dart b/lib/model/filters/album.dart index 96a8612ad..7f5f8aa77 100644 --- a/lib/model/filters/album.dart +++ b/lib/model/filters/album.dart @@ -1,10 +1,10 @@ import 'package:aves/model/covers.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/identity/aves_icons.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; diff --git a/lib/model/geotiff.dart b/lib/model/geotiff.dart index 1f6923ecf..efa6afb46 100644 --- a/lib/model/geotiff.dart +++ b/lib/model/geotiff.dart @@ -4,7 +4,7 @@ import 'dart:ui' as ui; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/images.dart'; -import 'package:aves/ref/geotiff.dart'; +import 'package:aves/ref/metadata/geotiff.dart'; import 'package:aves/utils/math_utils.dart'; import 'package:aves_map/aves_map.dart'; import 'package:equatable/equatable.dart'; diff --git a/lib/model/highlight.dart b/lib/model/highlight.dart index 642abe8ac..7a9c94de0 100644 --- a/lib/model/highlight.dart +++ b/lib/model/highlight.dart @@ -1,6 +1,6 @@ import 'package:event_bus/event_bus.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; +import 'package:flutter/painting.dart'; class HighlightInfo extends ChangeNotifier { final EventBus eventBus = EventBus(); diff --git a/lib/model/metadata/address.dart b/lib/model/metadata/address.dart index 1ad7a65a9..2680799ec 100644 --- a/lib/model/metadata/address.dart +++ b/lib/model/metadata/address.dart @@ -1,7 +1,6 @@ import 'package:aves/geo/states.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; @immutable class AddressDetails extends Equatable { diff --git a/lib/model/metadata/date_modifier.dart b/lib/model/metadata/date_modifier.dart index 19a0e5151..4fd675122 100644 --- a/lib/model/metadata/date_modifier.dart +++ b/lib/model/metadata/date_modifier.dart @@ -1,8 +1,6 @@ -import 'package:aves/model/metadata/fields.dart'; import 'package:aves_model/aves_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; @immutable class DateModifier extends Equatable { diff --git a/lib/model/metadata/enums/metadata_type.dart b/lib/model/metadata/enums/metadata_type.dart deleted file mode 100644 index 7348d4eed..000000000 --- a/lib/model/metadata/enums/metadata_type.dart +++ /dev/null @@ -1,76 +0,0 @@ -import 'package:aves_model/aves_model.dart'; - -class MetadataTypes { - static const main = { - MetadataType.exif, - MetadataType.xmp, - }; - - static const common = { - MetadataType.exif, - MetadataType.xmp, - MetadataType.comment, - MetadataType.iccProfile, - MetadataType.iptc, - MetadataType.photoshopIrb, - }; - - static const jpeg = { - MetadataType.jfif, - MetadataType.jpegAdobe, - MetadataType.jpegDucky, - }; -} - -extension ExtraMetadataType on MetadataType { - // match `metadata-extractor` directory names - String getText() { - switch (this) { - case MetadataType.comment: - return 'Comment'; - case MetadataType.exif: - return 'Exif'; - case MetadataType.iccProfile: - return 'ICC Profile'; - case MetadataType.iptc: - return 'IPTC'; - case MetadataType.jfif: - return 'JFIF'; - case MetadataType.jpegAdobe: - return 'Adobe JPEG'; - case MetadataType.jpegDucky: - return 'Ducky'; - case MetadataType.mp4: - return 'MP4'; - case MetadataType.photoshopIrb: - return 'Photoshop'; - case MetadataType.xmp: - return 'XMP'; - } - } - - String get toPlatform { - switch (this) { - case MetadataType.comment: - return 'comment'; - case MetadataType.exif: - return 'exif'; - case MetadataType.iccProfile: - return 'icc_profile'; - case MetadataType.iptc: - return 'iptc'; - case MetadataType.jfif: - return 'jfif'; - case MetadataType.jpegAdobe: - return 'jpeg_adobe'; - case MetadataType.jpegDucky: - return 'jpeg_ducky'; - case MetadataType.mp4: - return 'mp4'; - case MetadataType.photoshopIrb: - return 'photoshop_irb'; - case MetadataType.xmp: - return 'xmp'; - } - } -} diff --git a/lib/model/settings/defaults.dart b/lib/model/settings/defaults.dart index 82a535444..eeb911869 100644 --- a/lib/model/settings/defaults.dart +++ b/lib/model/settings/defaults.dart @@ -2,7 +2,6 @@ import 'dart:ui'; import 'package:aves/model/filters/recent.dart'; import 'package:aves/model/naming_pattern.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/ref/mime_types.dart'; import 'package:aves/utils/colors.dart'; import 'package:aves/widgets/filter_grids/albums_page.dart'; diff --git a/lib/model/settings/enums/subtitle_position.dart b/lib/model/settings/enums/subtitle_position.dart index 6a75f2899..a37ad7254 100644 --- a/lib/model/settings/enums/subtitle_position.dart +++ b/lib/model/settings/enums/subtitle_position.dart @@ -1,5 +1,5 @@ import 'package:aves_model/aves_model.dart'; -import 'package:flutter/widgets.dart'; +import 'package:flutter/painting.dart'; extension ExtraSubtitlePosition on SubtitlePosition { TextAlignVertical toTextAlignVertical() { diff --git a/lib/model/settings/enums/thumbnail_overlay_location_icon.dart b/lib/model/settings/enums/thumbnail_overlay_location_icon.dart deleted file mode 100644 index b475797b6..000000000 --- a/lib/model/settings/enums/thumbnail_overlay_location_icon.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:aves/theme/icons.dart'; -import 'package:aves_model/aves_model.dart'; -import 'package:flutter/widgets.dart'; - -extension ExtraThumbnailOverlayLocationIcon on ThumbnailOverlayLocationIcon { - IconData getIcon(BuildContext context) { - switch (this) { - case ThumbnailOverlayLocationIcon.unlocated: - return AIcons.locationUnlocated; - case ThumbnailOverlayLocationIcon.located: - case ThumbnailOverlayLocationIcon.none: - return AIcons.location; - } - } -} diff --git a/lib/model/settings/enums/thumbnail_overlay_tag_icon.dart b/lib/model/settings/enums/thumbnail_overlay_tag_icon.dart deleted file mode 100644 index 1b9ceeae7..000000000 --- a/lib/model/settings/enums/thumbnail_overlay_tag_icon.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:aves/theme/icons.dart'; -import 'package:aves_model/aves_model.dart'; -import 'package:flutter/widgets.dart'; - -extension ExtraThumbnailOverlayTagIcon on ThumbnailOverlayTagIcon { - IconData getIcon(BuildContext context) { - switch (this) { - case ThumbnailOverlayTagIcon.tagged: - return AIcons.tag; - case ThumbnailOverlayTagIcon.untagged: - return AIcons.tagUntagged; - case ThumbnailOverlayTagIcon.none: - return AIcons.tag; - } - } -} diff --git a/lib/model/settings/enums/widget_shape.dart b/lib/model/settings/enums/widget_shape.dart index 47ba95a35..adb2d6730 100644 --- a/lib/model/settings/enums/widget_shape.dart +++ b/lib/model/settings/enums/widget_shape.dart @@ -1,6 +1,6 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves_model/aves_model.dart'; -import 'package:flutter/widgets.dart'; +import 'package:flutter/painting.dart'; extension ExtraWidgetShape on WidgetShape { Path path(Size widgetSize, double devicePixelRatio) { diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 8bc0e89f8..755ca9dbc 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -9,7 +9,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/settings/defaults.dart'; import 'package:aves/model/settings/enums/map_style.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/ref/bursts.dart'; import 'package:aves/services/accessibility_service.dart'; import 'package:aves/services/common/services.dart'; diff --git a/lib/model/source/album.dart b/lib/model/source/album.dart index a5827a48f..e4524418e 100644 --- a/lib/model/source/album.dart +++ b/lib/model/source/album.dart @@ -2,13 +2,12 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; -import 'package:aves/model/storage/relative_dir.dart'; import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/collection_utils.dart'; -import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/widgets.dart'; @@ -175,27 +174,13 @@ mixin AlbumMixin on SourceBase { final type = androidFileUtils.getAlbumType(dirPath); if (context != null) { - switch (type) { - case AlbumType.camera: - return context.l10n.albumCamera; - case AlbumType.download: - return context.l10n.albumDownload; - case AlbumType.screenshots: - return context.l10n.albumScreenshots; - case AlbumType.screenRecordings: - return context.l10n.albumScreenRecordings; - case AlbumType.videoCaptures: - return context.l10n.albumVideoCaptures; - case AlbumType.regular: - case AlbumType.vault: - case AlbumType.app: - break; - } + final name = type.getName(context); + if (name != null) return name; } if (type == AlbumType.vault) return pContext.basename(dirPath); - final dir = VolumeRelativeDirectory.fromPath(dirPath); + final dir = androidFileUtils.relativeDirectoryFromPath(dirPath); if (dir == null) return dirPath; final relativeDir = dir.relativeDir; diff --git a/lib/model/source/collection_lens.dart b/lib/model/source/collection_lens.dart index d7a1b093c..44b37f548 100644 --- a/lib/model/source/collection_lens.dart +++ b/lib/model/source/collection_lens.dart @@ -14,7 +14,6 @@ import 'package:aves/model/filters/rating.dart'; import 'package:aves/model/filters/trash.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/events.dart'; import 'package:aves/model/source/location/location.dart'; import 'package:aves/model/source/section_keys.dart'; diff --git a/lib/model/source/collection_source.dart b/lib/model/source/collection_source.dart index 863be5279..ec7d49304 100644 --- a/lib/model/source/collection_source.dart +++ b/lib/model/source/collection_source.dart @@ -15,7 +15,6 @@ import 'package:aves/model/metadata/trash.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/album.dart'; import 'package:aves/model/source/analysis_controller.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/events.dart'; import 'package:aves/model/source/location/country.dart'; import 'package:aves/model/source/location/location.dart'; diff --git a/lib/model/source/location/location.dart b/lib/model/source/location/location.dart index 54e65fc93..d0dadab88 100644 --- a/lib/model/source/location/location.dart +++ b/lib/model/source/location/location.dart @@ -7,11 +7,11 @@ import 'package:aves/model/filters/location.dart'; import 'package:aves/model/metadata/address.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/analysis_controller.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/location/country.dart'; import 'package:aves/model/source/location/place.dart'; import 'package:aves/model/source/location/state.dart'; import 'package:aves/services/common/services.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:tuple/tuple.dart'; diff --git a/lib/model/source/media_store_source.dart b/lib/model/source/media_store_source.dart index 0f8e6b352..5ca9a2466 100644 --- a/lib/model/source/media_store_source.dart +++ b/lib/model/source/media_store_source.dart @@ -8,10 +8,10 @@ import 'package:aves/model/favourites.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/analysis_controller.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; diff --git a/lib/model/source/tag.dart b/lib/model/source/tag.dart index 6b8dcd682..bd8248b07 100644 --- a/lib/model/source/tag.dart +++ b/lib/model/source/tag.dart @@ -4,9 +4,9 @@ import 'package:aves/model/filters/tag.dart'; import 'package:aves/model/metadata/catalog.dart'; import 'package:aves/model/source/analysis_controller.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/utils/collection_utils.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; diff --git a/lib/model/storage/relative_dir.dart b/lib/model/storage/relative_dir.dart deleted file mode 100644 index d7e552480..000000000 --- a/lib/model/storage/relative_dir.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:aves/utils/android_file_utils.dart'; -import 'package:collection/collection.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/widgets.dart'; - -@immutable -class VolumeRelativeDirectory extends Equatable { - final String volumePath, relativeDir; - - @override - List get props => [volumePath, relativeDir]; - - String get dirPath => '$volumePath$relativeDir'; - - const VolumeRelativeDirectory({ - required this.volumePath, - required this.relativeDir, - }); - - static VolumeRelativeDirectory fromMap(Map map) { - return VolumeRelativeDirectory( - volumePath: map['volumePath'] ?? '', - relativeDir: map['relativeDir'] ?? '', - ); - } - - Map toMap() => { - 'volumePath': volumePath, - 'relativeDir': relativeDir, - }; - - // prefer static method over a null returning factory constructor - static VolumeRelativeDirectory? fromPath(String dirPath) { - final volume = androidFileUtils.getStorageVolume(dirPath); - if (volume == null) return null; - - final root = volume.path; - final rootLength = root.length; - return VolumeRelativeDirectory( - volumePath: root, - relativeDir: dirPath.length < rootLength ? '' : dirPath.substring(rootLength), - ); - } - - String getVolumeDescription(BuildContext context) { - final volume = androidFileUtils.storageVolumes.firstWhereOrNull((volume) => volume.path == volumePath); - return volume?.getDescription(context) ?? volumePath; - } -} diff --git a/lib/model/storage/volume.dart b/lib/model/storage/volume.dart deleted file mode 100644 index 284529bcf..000000000 --- a/lib/model/storage/volume.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:aves/widgets/common/extensions/build_context.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/widgets.dart'; - -@immutable -class StorageVolume extends Equatable { - final String? _description; - final String path, state; - final bool isPrimary, isRemovable; - - @override - List get props => [_description, path, state, isPrimary, isRemovable]; - - const StorageVolume({ - required String? description, - required this.isPrimary, - required this.isRemovable, - required this.path, - required this.state, - }) : _description = description; - - String getDescription(BuildContext? context) { - if (_description != null) return _description!; - // ideally, the context should always be provided, but in some cases (e.g. album comparison), - // this would require numerous additional methods to have the context as argument - // for such a minor benefit: fallback volume description on Android < N - if (isPrimary) return context?.l10n.storageVolumeDescriptionFallbackPrimary ?? 'Internal Storage'; - return context?.l10n.storageVolumeDescriptionFallbackNonPrimary ?? 'SD card'; - } - - factory StorageVolume.fromMap(Map map) { - final isPrimary = map['isPrimary'] ?? false; - return StorageVolume( - description: map['description'], - isPrimary: isPrimary, - isRemovable: map['isRemovable'] ?? false, - path: map['path'] ?? '', - state: map['state'] ?? '', - ); - } -} diff --git a/lib/model/vaults/details.dart b/lib/model/vaults/details.dart index d4898148d..4d1a165b8 100644 --- a/lib/model/vaults/details.dart +++ b/lib/model/vaults/details.dart @@ -1,6 +1,6 @@ -import 'package:aves/model/vaults/enums.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/collection_utils.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart'; diff --git a/lib/model/vaults/vaults.dart b/lib/model/vaults/vaults.dart index 902a9aa0d..5eaa6f435 100644 --- a/lib/model/vaults/vaults.dart +++ b/lib/model/vaults/vaults.dart @@ -2,18 +2,9 @@ import 'dart:async'; import 'dart:io'; import 'package:aves/model/vaults/details.dart'; -import 'package:aves/model/vaults/enums.dart'; import 'package:aves/services/common/services.dart'; -import 'package:aves/widgets/common/extensions/build_context.dart'; -import 'package:aves/widgets/dialogs/aves_dialog.dart'; -import 'package:aves/widgets/dialogs/filter_editors/password_dialog.dart'; -import 'package:aves/widgets/dialogs/filter_editors/pattern_dialog.dart'; -import 'package:aves/widgets/dialogs/filter_editors/pin_dialog.dart'; import 'package:collection/collection.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:local_auth/error_codes.dart' as auth_error; -import 'package:local_auth/local_auth.dart'; +import 'package:flutter/foundation.dart'; import 'package:screen_state/screen_state.dart'; final Vaults vaults = Vaults._private(); @@ -44,7 +35,7 @@ class Vaults extends ChangeNotifier { Set get all => Set.unmodifiable(_rows); - VaultDetails? _detailsForPath(String dirPath) => _rows.firstWhereOrNull((v) => v.path == dirPath); + VaultDetails? detailsForPath(String dirPath) => _rows.firstWhereOrNull((v) => v.path == dirPath); Future create(VaultDetails details) async { await metadataDb.addVaults({details}); @@ -56,7 +47,7 @@ class Vaults extends ChangeNotifier { } Future remove(Set dirPaths) async { - final details = dirPaths.map(_detailsForPath).whereNotNull().toSet(); + final details = dirPaths.map(detailsForPath).whereNotNull().toSet(); if (details.isEmpty) return; await metadataDb.removeVaults(details); @@ -70,7 +61,7 @@ class Vaults extends ChangeNotifier { } Future rename(String oldDirPath, String newDirPath) async { - final oldDetails = _detailsForPath(oldDirPath); + final oldDetails = detailsForPath(oldDirPath); if (oldDetails == null) return; final newName = VaultDetails.nameFromPath(newDirPath); @@ -96,7 +87,7 @@ class Vaults extends ChangeNotifier { // update details, except name Future update(VaultDetails newDetails) async { - final oldDetails = _detailsForPath(newDetails.path); + final oldDetails = detailsForPath(newDetails.path); if (oldDetails == null) return; await metadataDb.updateVault(newDetails.name, newDetails); @@ -141,119 +132,11 @@ class Vaults extends ChangeNotifier { _onLockStateChanged(); } - Future tryUnlock(String dirPath, BuildContext context) async { - if (!isVault(dirPath) || !isLocked(dirPath)) return true; - - final details = _detailsForPath(dirPath); - if (details == null) return false; - - bool? confirmed; - switch (details.lockType) { - case VaultLockType.system: - try { - confirmed = await LocalAuthentication().authenticate( - localizedReason: context.l10n.authenticateToUnlockVault, - ); - } on PlatformException catch (e, stack) { - if (e.code != 'auth_in_progress') { - // `auth_in_progress`: `Authentication in progress` - await reportService.recordError(e, stack); - } - } - break; - case VaultLockType.pattern: - final pattern = await showDialog( - context: context, - builder: (context) => const PatternDialog(needConfirmation: false), - routeSettings: const RouteSettings(name: PatternDialog.routeName), - ); - if (pattern != null) { - confirmed = pattern == await securityService.readValue(details.passKey); - } - break; - case VaultLockType.pin: - final pin = await showDialog( - context: context, - builder: (context) => const PinDialog(needConfirmation: false), - routeSettings: const RouteSettings(name: PinDialog.routeName), - ); - if (pin != null) { - confirmed = pin == await securityService.readValue(details.passKey); - } - break; - case VaultLockType.password: - final password = await showDialog( - context: context, - builder: (context) => const PasswordDialog(needConfirmation: false), - routeSettings: const RouteSettings(name: PasswordDialog.routeName), - ); - if (password != null) { - confirmed = password == await securityService.readValue(details.passKey); - } - break; - } - - if (confirmed == null || !confirmed) return false; + void unlock(String dirPath) { + if (!vaults.isVault(dirPath) || !vaults.isLocked(dirPath)) return; _unlockedDirPaths.add(dirPath); _onLockStateChanged(); - return true; - } - - Future setPass(BuildContext context, VaultDetails details) async { - switch (details.lockType) { - case VaultLockType.system: - final l10n = context.l10n; - try { - return await LocalAuthentication().authenticate( - localizedReason: l10n.authenticateToConfigureVault, - ); - } on PlatformException catch (e, stack) { - await showDialog( - context: context, - builder: (context) => AvesDialog( - content: Text(e.message ?? l10n.genericFailureFeedback), - actions: const [OkButton()], - ), - routeSettings: const RouteSettings(name: AvesDialog.warningRouteName), - ); - if (e.code != auth_error.notAvailable) { - await reportService.recordError(e, stack); - } - } - break; - case VaultLockType.pattern: - final pattern = await showDialog( - context: context, - builder: (context) => const PatternDialog(needConfirmation: true), - routeSettings: const RouteSettings(name: PatternDialog.routeName), - ); - if (pattern != null) { - return await securityService.writeValue(details.passKey, pattern); - } - break; - case VaultLockType.pin: - final pin = await showDialog( - context: context, - builder: (context) => const PinDialog(needConfirmation: true), - routeSettings: const RouteSettings(name: PinDialog.routeName), - ); - if (pin != null) { - return await securityService.writeValue(details.passKey, pin); - } - break; - case VaultLockType.password: - final password = await showDialog( - context: context, - builder: (context) => const PasswordDialog(needConfirmation: true), - routeSettings: const RouteSettings(name: PasswordDialog.routeName), - ); - if (password != null) { - return await securityService.writeValue(details.passKey, password); - } - break; - } - return false; } void _onScreenOff() => lock(all.where((v) => v.autoLockScreenOff).map((v) => v.path).toSet()); diff --git a/lib/ref/exif.dart b/lib/ref/metadata/exif.dart similarity index 100% rename from lib/ref/exif.dart rename to lib/ref/metadata/exif.dart diff --git a/lib/ref/geotiff.dart b/lib/ref/metadata/geotiff.dart similarity index 100% rename from lib/ref/geotiff.dart rename to lib/ref/metadata/geotiff.dart diff --git a/lib/ref/iptc.dart b/lib/ref/metadata/iptc.dart similarity index 100% rename from lib/ref/iptc.dart rename to lib/ref/metadata/iptc.dart diff --git a/lib/ref/metadata/xmp.dart b/lib/ref/metadata/xmp.dart new file mode 100644 index 000000000..7548cdc13 --- /dev/null +++ b/lib/ref/metadata/xmp.dart @@ -0,0 +1,107 @@ +class XmpNamespaces { + static const acdsee = 'http://ns.acdsee.com/iptc/1.0/'; + static const adsmlat = 'http://adsml.org/xmlns/'; + static const avm = 'http://www.communicatingastronomy.org/avm/1.0/'; + static const camera = 'http://pix4d.com/camera/1.0/'; + static const cc = 'http://creativecommons.org/ns#'; + static const creatorAtom = 'http://ns.adobe.com/creatorAtom/1.0/'; + static const crd = 'http://ns.adobe.com/camera-raw-defaults/1.0/'; + static const crlcp = 'http://ns.adobe.com/camera-raw-embedded-lens-profile/1.0/'; + static const crs = 'http://ns.adobe.com/camera-raw-settings/1.0/'; + static const crss = 'http://ns.adobe.com/camera-raw-saved-settings/1.0/'; + static const darktable = 'http://darktable.sf.net/'; + static const dc = 'http://purl.org/dc/elements/1.1/'; + static const dcterms = 'http://purl.org/dc/terms/'; + static const dicom = 'http://ns.adobe.com/DICOM/'; + static const digiKam = 'http://www.digikam.org/ns/1.0/'; + static const droneDji = 'http://www.dji.com/drone-dji/1.0/'; + static const dwc = 'http://rs.tdwg.org/dwc/index.htm'; + static const dwciri = 'http://rs.tdwg.org/dwc/iri/'; + static const exif = 'http://ns.adobe.com/exif/1.0/'; + static const exifAux = 'http://ns.adobe.com/exif/1.0/aux/'; + static const exifEx = 'http://cipa.jp/exif/1.0/'; + static const fstop = 'http://www.fstopapp.com/xmp/'; + static const gAudio = 'http://ns.google.com/photos/1.0/audio/'; + static const gCamera = 'http://ns.google.com/photos/1.0/camera/'; + static const gContainer = 'http://ns.google.com/photos/1.0/container/'; + static const gCreations = 'http://ns.google.com/photos/1.0/creations/'; + static const gDepth = 'http://ns.google.com/photos/1.0/depthmap/'; + static const gDevice = 'http://ns.google.com/photos/dd/1.0/device/'; + static const gDeviceCamera = 'http://ns.google.com/photos/dd/1.0/camera/'; + static const gDeviceContainer = 'http://ns.google.com/photos/dd/1.0/container/'; + static const gDeviceItem = 'http://ns.google.com/photos/dd/1.0/item/'; + static const gFocus = 'http://ns.google.com/photos/1.0/focus/'; + static const gImage = 'http://ns.google.com/photos/1.0/image/'; + static const gPano = 'http://ns.google.com/photos/1.0/panorama/'; + static const gSpherical = 'http://ns.google.com/videos/1.0/spherical/'; + static const gettyImagesGift = 'http://xmp.gettyimages.com/gift/1.0/'; + static const gimp210 = 'http://www.gimp.org/ns/2.10/'; + static const gimpXmp = 'http://www.gimp.org/xmp/'; + static const illustrator = 'http://ns.adobe.com/illustrator/1.0/'; + static const iptc4xmpCore = 'http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/'; + static const iptc4xmpExt = 'http://iptc.org/std/Iptc4xmpExt/2008-02-29/'; + static const lr = 'http://ns.adobe.com/lightroom/1.0/'; + static const mediapro = 'http://ns.iview-multimedia.com/mediapro/1.0/'; + static const miCamera = 'http://ns.xiaomi.com/photos/1.0/camera/'; + + // also seen in the wild for prefix `MicrosoftPhoto`: 'http://ns.microsoft.com/photo/1.0' + static const microsoftPhoto = 'http://ns.microsoft.com/photo/1.0/'; + static const mp1 = 'http://ns.microsoft.com/photo/1.1'; + static const mp = 'http://ns.microsoft.com/photo/1.2/'; + static const mpri = 'http://ns.microsoft.com/photo/1.2/t/RegionInfo#'; + static const mpreg = 'http://ns.microsoft.com/photo/1.2/t/Region#'; + static const mwgrs = 'http://www.metadataworkinggroup.com/schemas/regions/'; + static const nga = 'https://standards.nga.gov/metadata/media/image/artobject/1.0'; + static const opMedia = 'http://ns.oneplus.com/media/1.0/'; + static const panorama = 'http://ns.adobe.com/photoshop/1.0/panorama-profile'; + static const panoStudio = 'http://www.tshsoft.com/xmlns'; + static const pdf = 'http://ns.adobe.com/pdf/1.3/'; + static const pdfX = 'http://ns.adobe.com/pdfx/1.3/'; + static const photoMechanic = 'http://ns.camerabits.com/photomechanic/1.0/'; + static const photoshop = 'http://ns.adobe.com/photoshop/1.0/'; + static const plus = 'http://ns.useplus.org/ldf/xmp/1.0/'; + static const pmtm = 'http://www.hdrsoft.com/photomatix_settings01'; + static const rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; + static const stCamera = 'http://ns.adobe.com/photoshop/1.0/camera-profile'; + static const stEvt = 'http://ns.adobe.com/xap/1.0/sType/ResourceEvent#'; + static const stRef = 'http://ns.adobe.com/xap/1.0/sType/ResourceRef#'; + static const tiff = 'http://ns.adobe.com/tiff/1.0/'; + static const x = 'adobe:ns:meta/'; + static const xmp = 'http://ns.adobe.com/xap/1.0/'; + static const xmpBJ = 'http://ns.adobe.com/xap/1.0/bj/'; + static const xmpDM = 'http://ns.adobe.com/xmp/1.0/DynamicMedia/'; + static const xmpGImg = 'http://ns.adobe.com/xap/1.0/g/img/'; + static const xmpMM = 'http://ns.adobe.com/xap/1.0/mm/'; + static const xmpNote = 'http://ns.adobe.com/xmp/note/'; + static const xmpRights = 'http://ns.adobe.com/xap/1.0/rights/'; + static const xmpTPg = 'http://ns.adobe.com/xap/1.0/t/pg/'; + static const xperiaCamera = 'http://xmlns.sony.net/xperia/camera/1.0/'; +} + +class XmpElements { + static const xXmpmeta = 'xmpmeta'; + static const rdfRoot = 'RDF'; + static const rdfDescription = 'Description'; + static const containerDirectory = 'Directory'; + static const dcDescription = 'description'; + static const dcSubject = 'subject'; + static const dcTitle = 'title'; + static const msPhotoRating = 'Rating'; + static const xmpRating = 'Rating'; +} + +class XmpAttributes { + static const xXmptk = 'xmptk'; + static const rdfAbout = 'about'; + static const gCameraMicroVideo = 'MicroVideo'; + static const gCameraMicroVideoVersion = 'MicroVideoVersion'; + static const gCameraMicroVideoOffset = 'MicroVideoOffset'; + static const gCameraMicroVideoPresentationTimestampUs = 'MicroVideoPresentationTimestampUs'; + static const gCameraMotionPhoto = 'MotionPhoto'; + static const gCameraMotionPhotoVersion = 'MotionPhotoVersion'; + static const gCameraMotionPhotoPresentationTimestampUs = 'MotionPhotoPresentationTimestampUs'; + static const xmpCreateDate = 'CreateDate'; + static const xmpMetadataDate = 'MetadataDate'; + static const xmpModifyDate = 'ModifyDate'; + static const xmpNoteHasExtendedXMP = 'HasExtendedXMP'; +} diff --git a/lib/services/analysis_service.dart b/lib/services/analysis_service.dart index 31a0c26e2..dde0d5675 100644 --- a/lib/services/analysis_service.dart +++ b/lib/services/analysis_service.dart @@ -5,11 +5,11 @@ import 'package:aves/l10n/l10n.dart'; import 'package:aves/model/device.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/analysis_controller.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/media_store_source.dart'; -import 'package:aves/model/source/source_state.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:fijkplayer/fijkplayer.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; diff --git a/lib/services/metadata/metadata_edit_service.dart b/lib/services/metadata/metadata_edit_service.dart index 12d48c2d4..d5839a0fe 100644 --- a/lib/services/metadata/metadata_edit_service.dart +++ b/lib/services/metadata/metadata_edit_service.dart @@ -1,10 +1,9 @@ import 'dart:async'; +import 'package:aves/convert/convert.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/props.dart'; import 'package:aves/model/metadata/date_modifier.dart'; -import 'package:aves/model/metadata/enums/metadata_type.dart'; -import 'package:aves/model/metadata/fields.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; diff --git a/lib/services/metadata/metadata_fetch_service.dart b/lib/services/metadata/metadata_fetch_service.dart index 4998a1b6c..d6e618a7b 100644 --- a/lib/services/metadata/metadata_fetch_service.dart +++ b/lib/services/metadata/metadata_fetch_service.dart @@ -1,9 +1,9 @@ +import 'package:aves/convert/convert.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/multipage.dart'; import 'package:aves/model/entry/extensions/props.dart'; import 'package:aves/model/geotiff.dart'; import 'package:aves/model/metadata/catalog.dart'; -import 'package:aves/model/metadata/fields.dart'; import 'package:aves/model/metadata/overlay.dart'; import 'package:aves/model/multipage.dart'; import 'package:aves/model/panorama.dart'; @@ -12,6 +12,7 @@ import 'package:aves/services/common/service_policy.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/services/metadata/xmp.dart'; import 'package:aves/utils/time_utils.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; diff --git a/lib/services/storage_service.dart b/lib/services/storage_service.dart index 861b1dee0..6780bd3de 100644 --- a/lib/services/storage_service.dart +++ b/lib/services/storage_service.dart @@ -1,9 +1,8 @@ import 'dart:async'; -import 'package:aves/model/storage/relative_dir.dart'; -import 'package:aves/model/storage/volume.dart'; import 'package:aves/services/common/output_buffer.dart'; import 'package:aves/services/common/services.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/services.dart'; import 'package:streams_channel/streams_channel.dart'; diff --git a/lib/services/wallpaper_service.dart b/lib/services/wallpaper_service.dart index bff7e2152..3a2a4bd80 100644 --- a/lib/services/wallpaper_service.dart +++ b/lib/services/wallpaper_service.dart @@ -1,5 +1,5 @@ -import 'package:aves/model/wallpaper_target.dart'; import 'package:aves/services/common/services.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/services.dart'; class WallpaperService { diff --git a/lib/utils/android_file_utils.dart b/lib/utils/android_file_utils.dart index dcb589758..2368fd0dc 100644 --- a/lib/utils/android_file_utils.dart +++ b/lib/utils/android_file_utils.dart @@ -1,8 +1,7 @@ import 'package:aves/model/apps.dart'; -import 'package:aves/model/source/enums/enums.dart'; -import 'package:aves/model/storage/volume.dart'; import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/services/common/services.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; @@ -82,6 +81,19 @@ class AndroidFileUtils { return volume != null || path.endsWith(separator) ? volume : getStorageVolume('$path$separator'); } + // prefer static method over a null returning factory constructor + VolumeRelativeDirectory? relativeDirectoryFromPath(String dirPath) { + final volume = getStorageVolume(dirPath); + if (volume == null) return null; + + final root = volume.path; + final rootLength = root.length; + return VolumeRelativeDirectory( + volumePath: root, + relativeDir: dirPath.length < rootLength ? '' : dirPath.substring(rootLength), + ); + } + bool isOnRemovableStorage(String path) => getStorageVolume(path)?.isRemovable ?? false; AlbumType getAlbumType(String dirPath) { diff --git a/lib/utils/xmp_utils.dart b/lib/utils/xmp_utils.dart index bc7c767a0..c46274fa7 100644 --- a/lib/utils/xmp_utils.dart +++ b/lib/utils/xmp_utils.dart @@ -1,194 +1,29 @@ +import 'package:aves/ref/metadata/xmp.dart'; import 'package:intl/intl.dart'; import 'package:xml/xml.dart'; -class Namespaces { - static const acdsee = 'http://ns.acdsee.com/iptc/1.0/'; - static const adsmlat = 'http://adsml.org/xmlns/'; - static const avm = 'http://www.communicatingastronomy.org/avm/1.0/'; - static const camera = 'http://pix4d.com/camera/1.0/'; - static const cc = 'http://creativecommons.org/ns#'; - static const creatorAtom = 'http://ns.adobe.com/creatorAtom/1.0/'; - static const crd = 'http://ns.adobe.com/camera-raw-defaults/1.0/'; - static const crlcp = 'http://ns.adobe.com/camera-raw-embedded-lens-profile/1.0/'; - static const crs = 'http://ns.adobe.com/camera-raw-settings/1.0/'; - static const crss = 'http://ns.adobe.com/camera-raw-saved-settings/1.0/'; - static const darktable = 'http://darktable.sf.net/'; - static const dc = 'http://purl.org/dc/elements/1.1/'; - static const dcterms = 'http://purl.org/dc/terms/'; - static const dicom = 'http://ns.adobe.com/DICOM/'; - static const digiKam = 'http://www.digikam.org/ns/1.0/'; - static const droneDji = 'http://www.dji.com/drone-dji/1.0/'; - static const dwc = 'http://rs.tdwg.org/dwc/index.htm'; - static const dwciri = 'http://rs.tdwg.org/dwc/iri/'; - static const exif = 'http://ns.adobe.com/exif/1.0/'; - static const exifAux = 'http://ns.adobe.com/exif/1.0/aux/'; - static const exifEx = 'http://cipa.jp/exif/1.0/'; - static const fstop = 'http://www.fstopapp.com/xmp/'; - static const gAudio = 'http://ns.google.com/photos/1.0/audio/'; - static const gCamera = 'http://ns.google.com/photos/1.0/camera/'; - static const gContainer = 'http://ns.google.com/photos/1.0/container/'; - static const gCreations = 'http://ns.google.com/photos/1.0/creations/'; - static const gDepth = 'http://ns.google.com/photos/1.0/depthmap/'; - static const gDevice = 'http://ns.google.com/photos/dd/1.0/device/'; - static const gDeviceCamera = 'http://ns.google.com/photos/dd/1.0/camera/'; - static const gDeviceContainer = 'http://ns.google.com/photos/dd/1.0/container/'; - static const gDeviceItem = 'http://ns.google.com/photos/dd/1.0/item/'; - static const gFocus = 'http://ns.google.com/photos/1.0/focus/'; - static const gImage = 'http://ns.google.com/photos/1.0/image/'; - static const gPano = 'http://ns.google.com/photos/1.0/panorama/'; - static const gSpherical = 'http://ns.google.com/videos/1.0/spherical/'; - static const gettyImagesGift = 'http://xmp.gettyimages.com/gift/1.0/'; - static const gimp210 = 'http://www.gimp.org/ns/2.10/'; - static const gimpXmp = 'http://www.gimp.org/xmp/'; - static const illustrator = 'http://ns.adobe.com/illustrator/1.0/'; - static const iptc4xmpCore = 'http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/'; - static const iptc4xmpExt = 'http://iptc.org/std/Iptc4xmpExt/2008-02-29/'; - static const lr = 'http://ns.adobe.com/lightroom/1.0/'; - static const mediapro = 'http://ns.iview-multimedia.com/mediapro/1.0/'; - static const miCamera = 'http://ns.xiaomi.com/photos/1.0/camera/'; - - // also seen in the wild for prefix `MicrosoftPhoto`: 'http://ns.microsoft.com/photo/1.0' - static const microsoftPhoto = 'http://ns.microsoft.com/photo/1.0/'; - static const mp1 = 'http://ns.microsoft.com/photo/1.1'; - static const mp = 'http://ns.microsoft.com/photo/1.2/'; - static const mpri = 'http://ns.microsoft.com/photo/1.2/t/RegionInfo#'; - static const mpreg = 'http://ns.microsoft.com/photo/1.2/t/Region#'; - static const mwgrs = 'http://www.metadataworkinggroup.com/schemas/regions/'; - static const nga = 'https://standards.nga.gov/metadata/media/image/artobject/1.0'; - static const opMedia = 'http://ns.oneplus.com/media/1.0/'; - static const panorama = 'http://ns.adobe.com/photoshop/1.0/panorama-profile'; - static const panoStudio = 'http://www.tshsoft.com/xmlns'; - static const pdf = 'http://ns.adobe.com/pdf/1.3/'; - static const pdfX = 'http://ns.adobe.com/pdfx/1.3/'; - static const photoMechanic = 'http://ns.camerabits.com/photomechanic/1.0/'; - static const photoshop = 'http://ns.adobe.com/photoshop/1.0/'; - static const plus = 'http://ns.useplus.org/ldf/xmp/1.0/'; - static const pmtm = 'http://www.hdrsoft.com/photomatix_settings01'; - static const rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; - static const stCamera = 'http://ns.adobe.com/photoshop/1.0/camera-profile'; - static const stEvt = 'http://ns.adobe.com/xap/1.0/sType/ResourceEvent#'; - static const stRef = 'http://ns.adobe.com/xap/1.0/sType/ResourceRef#'; - static const tiff = 'http://ns.adobe.com/tiff/1.0/'; - static const x = 'adobe:ns:meta/'; - static const xmp = 'http://ns.adobe.com/xap/1.0/'; - static const xmpBJ = 'http://ns.adobe.com/xap/1.0/bj/'; - static const xmpDM = 'http://ns.adobe.com/xmp/1.0/DynamicMedia/'; - static const xmpGImg = 'http://ns.adobe.com/xap/1.0/g/img/'; - static const xmpMM = 'http://ns.adobe.com/xap/1.0/mm/'; - static const xmpNote = 'http://ns.adobe.com/xmp/note/'; - static const xmpRights = 'http://ns.adobe.com/xap/1.0/rights/'; - static const xmpTPg = 'http://ns.adobe.com/xap/1.0/t/pg/'; - static const xperiaCamera = 'http://xmlns.sony.net/xperia/camera/1.0/'; - - // cf https://exiftool.org/TagNames/XMP.html - static const Map nsTitles = { - acdsee: 'ACDSee', - adsmlat: 'AdsML', - exifAux: 'Exif Aux', - avm: 'Astronomy Visualization', - camera: 'Pix4D Camera', - cc: 'Creative Commons', - crd: 'Camera Raw Defaults', - creatorAtom: 'After Effects', - crs: 'Camera Raw Settings', - crss: 'Camera Raw Saved Settings', - darktable: 'darktable', - dc: 'Dublin Core', - digiKam: 'digiKam', - droneDji: 'DJI Drone', - dwc: 'Darwin Core', - exif: 'Exif', - exifEx: 'Exif Ex', - fstop: 'F-Stop', - gAudio: 'Google Audio', - gCamera: 'Google Camera', - gContainer: 'Google Container', - gCreations: 'Google Creations', - gDepth: 'Google Depth', - gDevice: 'Google Device', - gFocus: 'Google Focus', - gImage: 'Google Image', - gPano: 'Google Panorama', - gSpherical: 'Google Spherical', - gettyImagesGift: 'Getty Images', - gimp210: 'GIMP 2.10', - gimpXmp: 'GIMP', - illustrator: 'Illustrator', - iptc4xmpCore: 'IPTC Core', - iptc4xmpExt: 'IPTC Extension', - lr: 'Lightroom', - mediapro: 'MediaPro', - miCamera: 'Mi Camera', - microsoftPhoto: 'Microsoft Photo 1.0', - mp1: 'Microsoft Photo 1.1', - mp: 'Microsoft Photo 1.2', - mwgrs: 'Regions', - nga: 'National Gallery of Art', - opMedia: 'OnePlus Media', - panorama: 'Panorama', - panoStudio: 'PanoramaStudio', - pdf: 'PDF', - pdfX: 'PDF/X', - photoMechanic: 'Photo Mechanic', - photoshop: 'Photoshop', - plus: 'PLUS', - pmtm: 'Photomatix', - tiff: 'TIFF', - xmp: 'Basic', - xmpBJ: 'Basic Job Ticket', - xmpDM: 'Dynamic Media', - xmpMM: 'Media Management', - xmpNote: 'Note', - xmpRights: 'Rights Management', - xmpTPg: 'Paged-Text', - xperiaCamera: 'Xperia Camera', - }; - - static final defaultPrefixes = { - gContainer: 'Container', - dc: 'dc', - gCamera: 'GCamera', - microsoftPhoto: 'MicrosoftPhoto', - rdf: 'rdf', - x: 'x', - xmp: 'xmp', - xmpGImg: 'xmpGImg', - xmpNote: 'xmpNote', - }; -} - class XMP { static const xmlnsPrefix = 'xmlns'; static const propNamespaceSeparator = ':'; static const structFieldSeparator = '/'; - static String prefixOf(String ns) => Namespaces.defaultPrefixes[ns] ?? ''; + static final _defaultPrefixes = { + XmpNamespaces.gContainer: 'Container', + XmpNamespaces.dc: 'dc', + XmpNamespaces.gCamera: 'GCamera', + XmpNamespaces.microsoftPhoto: 'MicrosoftPhoto', + XmpNamespaces.rdf: 'rdf', + XmpNamespaces.x: 'x', + XmpNamespaces.xmp: 'xmp', + XmpNamespaces.xmpGImg: 'xmpGImg', + XmpNamespaces.xmpNote: 'xmpNote', + }; - // elements - static const xXmpmeta = 'xmpmeta'; - static const rdfRoot = 'RDF'; - static const rdfDescription = 'Description'; - static const containerDirectory = 'Directory'; - static const dcDescription = 'description'; - static const dcSubject = 'subject'; - static const dcTitle = 'title'; - static const msPhotoRating = 'Rating'; - static const xmpRating = 'Rating'; + static String prefixOf(String ns) => _defaultPrefixes[ns] ?? ''; - // attributes - static const xXmptk = 'xmptk'; - static const rdfAbout = 'about'; - static const gCameraMicroVideo = 'MicroVideo'; - static const gCameraMicroVideoVersion = 'MicroVideoVersion'; - static const gCameraMicroVideoOffset = 'MicroVideoOffset'; - static const gCameraMicroVideoPresentationTimestampUs = 'MicroVideoPresentationTimestampUs'; - static const gCameraMotionPhoto = 'MotionPhoto'; - static const gCameraMotionPhotoVersion = 'MotionPhotoVersion'; - static const gCameraMotionPhotoPresentationTimestampUs = 'MotionPhotoPresentationTimestampUs'; - static const xmpCreateDate = 'CreateDate'; - static const xmpMetadataDate = 'MetadataDate'; - static const xmpModifyDate = 'ModifyDate'; - static const xmpNoteHasExtendedXMP = 'HasExtendedXMP'; + static const nsRdf = XmpNamespaces.rdf; + static const nsX = XmpNamespaces.x; + static const nsXmp = XmpNamespaces.xmp; // for `rdf:Description` node only static bool _hasMeaningfulChildren(XmlNode node) => node.children.any((v) => v.nodeType != XmlNodeType.TEXT || v.text.trim().isNotEmpty); @@ -197,9 +32,9 @@ class XMP { static bool _hasMeaningfulAttributes(XmlNode description) { final hasMeaningfulAttributes = description.attributes.any((v) { switch (v.name.local) { - case rdfAbout: - case xmpMetadataDate: - case xmpModifyDate: + case XmpAttributes.rdfAbout: + case XmpAttributes.xmpMetadataDate: + case XmpAttributes.xmpModifyDate: return false; default: switch (v.name.prefix) { @@ -338,10 +173,10 @@ class XMP { node.children.add(rootBuilder.buildFragment()); final bagBuilder = XmlBuilder(); - bagBuilder.namespace(Namespaces.rdf, prefixOf(Namespaces.rdf)); - bagBuilder.element('Bag', namespace: Namespaces.rdf, nest: () { + bagBuilder.namespace(nsRdf, prefixOf(nsRdf)); + bagBuilder.element('Bag', namespace: nsRdf, nest: () { values.forEach((v) { - bagBuilder.element('li', namespace: Namespaces.rdf, nest: v); + bagBuilder.element('li', namespace: nsRdf, nest: v); }); }); node.children.last.children.add(bagBuilder.buildFragment()); @@ -363,42 +198,42 @@ class XMP { } if (xmpDoc == null) { final builder = XmlBuilder(); - builder.namespace(Namespaces.x, prefixOf(Namespaces.x)); - builder.element(xXmpmeta, namespace: Namespaces.x, namespaces: { - Namespaces.x: prefixOf(Namespaces.x), + builder.namespace(nsX, prefixOf(nsX)); + builder.element(XmpElements.xXmpmeta, namespace: nsX, namespaces: { + nsX: prefixOf(nsX), }, attributes: { - '${prefixOf(Namespaces.x)}$propNamespaceSeparator$xXmptk': await toolkit(), + '${prefixOf(nsX)}$propNamespaceSeparator${XmpAttributes.xXmptk}': await toolkit(), }); xmpDoc = builder.buildDocument(); } final root = xmpDoc.rootElement; - XmlNode? rdf = root.getElement(rdfRoot, namespace: Namespaces.rdf); + XmlNode? rdf = root.getElement(XmpElements.rdfRoot, namespace: nsRdf); if (rdf == null) { final builder = XmlBuilder(); - builder.namespace(Namespaces.rdf, prefixOf(Namespaces.rdf)); - builder.element(rdfRoot, namespace: Namespaces.rdf, namespaces: { - Namespaces.rdf: prefixOf(Namespaces.rdf), + builder.namespace(nsRdf, prefixOf(nsRdf)); + builder.element(XmpElements.rdfRoot, namespace: nsRdf, namespaces: { + nsRdf: prefixOf(nsRdf), }); // get element because doc fragment cannot be used to edit root.children.add(builder.buildFragment()); - rdf = root.getElement(rdfRoot, namespace: Namespaces.rdf)!; + rdf = root.getElement(XmpElements.rdfRoot, namespace: nsRdf)!; } // content can be split in multiple `rdf:Description` elements List descriptions = rdf.children.where((node) { - return node is XmlElement && node.name.local == rdfDescription && node.name.namespaceUri == Namespaces.rdf; + return node is XmlElement && node.name.local == XmpElements.rdfDescription && node.name.namespaceUri == nsRdf; }).toList(); if (descriptions.isEmpty) { final builder = XmlBuilder(); - builder.namespace(Namespaces.rdf, prefixOf(Namespaces.rdf)); - builder.element(rdfDescription, namespace: Namespaces.rdf, attributes: { - '${prefixOf(Namespaces.rdf)}$propNamespaceSeparator$rdfAbout': '', + builder.namespace(nsRdf, prefixOf(nsRdf)); + builder.element(XmpElements.rdfDescription, namespace: nsRdf, attributes: { + '${prefixOf(nsRdf)}$propNamespaceSeparator${XmpAttributes.rdfAbout}': '', }); rdf.children.add(builder.buildFragment()); // get element because doc fragment cannot be used to edit - descriptions.add(rdf.getElement(rdfDescription, namespace: Namespaces.rdf)!); + descriptions.add(rdf.getElement(XmpElements.rdfDescription, namespace: nsRdf)!); } final modified = apply(descriptions); @@ -410,10 +245,10 @@ class XMP { if (rdf.children.isNotEmpty) { if (modified) { - _addNamespaces(descriptions.first, {Namespaces.xmp: prefixOf(Namespaces.xmp)}); + _addNamespaces(descriptions.first, {nsXmp: prefixOf(nsXmp)}); final xmpDate = toXmpDate(modifyDate ?? DateTime.now()); - setAttribute(descriptions, xmpMetadataDate, xmpDate, namespace: Namespaces.xmp, strat: XmpEditStrategy.always); - setAttribute(descriptions, xmpModifyDate, xmpDate, namespace: Namespaces.xmp, strat: XmpEditStrategy.always); + setAttribute(descriptions, XmpAttributes.xmpMetadataDate, xmpDate, namespace: nsXmp, strat: XmpEditStrategy.always); + setAttribute(descriptions, XmpAttributes.xmpModifyDate, xmpDate, namespace: nsXmp, strat: XmpEditStrategy.always); } } else { // clear XMP if there are no attributes or elements worth preserving diff --git a/lib/model/actions/chip.dart b/lib/view/src/actions/chip.dart similarity index 96% rename from lib/model/actions/chip.dart rename to lib/view/src/actions/chip.dart index 3a464f30c..cf4b7f0a1 100644 --- a/lib/model/actions/chip.dart +++ b/lib/view/src/actions/chip.dart @@ -3,7 +3,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -extension ExtraChipAction on ChipAction { +extension ExtraChipActionView on ChipAction { String getText(BuildContext context) { switch (this) { case ChipAction.goToAlbumPage: diff --git a/lib/model/actions/chip_set.dart b/lib/view/src/actions/chip_set.dart similarity index 98% rename from lib/model/actions/chip_set.dart rename to lib/view/src/actions/chip_set.dart index 4f7162c60..f178505ab 100644 --- a/lib/model/actions/chip_set.dart +++ b/lib/view/src/actions/chip_set.dart @@ -3,7 +3,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; -extension ExtraChipSetAction on ChipSetAction { +extension ExtraChipSetActionView on ChipSetAction { String getText(BuildContext context) { switch (this) { // general diff --git a/lib/model/actions/entry.dart b/lib/view/src/actions/entry.dart similarity index 99% rename from lib/model/actions/entry.dart rename to lib/view/src/actions/entry.dart index c6a3b5390..960673705 100644 --- a/lib/model/actions/entry.dart +++ b/lib/view/src/actions/entry.dart @@ -4,7 +4,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -extension ExtraEntryAction on EntryAction { +extension ExtraEntryActionView on EntryAction { String getText(BuildContext context) { switch (this) { case EntryAction.info: diff --git a/lib/model/actions/entry_set.dart b/lib/view/src/actions/entry_set.dart similarity index 98% rename from lib/model/actions/entry_set.dart rename to lib/view/src/actions/entry_set.dart index f311b8020..880250bc6 100644 --- a/lib/model/actions/entry_set.dart +++ b/lib/view/src/actions/entry_set.dart @@ -3,7 +3,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; -extension ExtraEntrySetAction on EntrySetAction { +extension ExtraEntrySetActionView on EntrySetAction { String getText(BuildContext context) { switch (this) { // general diff --git a/lib/model/actions/map.dart b/lib/view/src/actions/map.dart similarity index 94% rename from lib/model/actions/map.dart rename to lib/view/src/actions/map.dart index c10311851..05a2ceb71 100644 --- a/lib/model/actions/map.dart +++ b/lib/view/src/actions/map.dart @@ -3,7 +3,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -extension ExtraMapAction on MapAction { +extension ExtraMapActionView on MapAction { String getText(BuildContext context) { switch (this) { case MapAction.selectStyle: diff --git a/lib/model/actions/map_cluster.dart b/lib/view/src/actions/map_cluster.dart similarity index 92% rename from lib/model/actions/map_cluster.dart rename to lib/view/src/actions/map_cluster.dart index ed3b67e1e..cc605675f 100644 --- a/lib/model/actions/map_cluster.dart +++ b/lib/view/src/actions/map_cluster.dart @@ -3,7 +3,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -extension ExtraMapClusterAction on MapClusterAction { +extension ExtraMapClusterActionView on MapClusterAction { String getText(BuildContext context) { switch (this) { case MapClusterAction.editLocation: diff --git a/lib/model/actions/share.dart b/lib/view/src/actions/share.dart similarity index 93% rename from lib/model/actions/share.dart rename to lib/view/src/actions/share.dart index cbe2f7aa1..d9a224a00 100644 --- a/lib/model/actions/share.dart +++ b/lib/view/src/actions/share.dart @@ -3,7 +3,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -extension ExtraShareAction on ShareAction { +extension ExtraShareActionView on ShareAction { String getText(BuildContext context) { switch (this) { case ShareAction.imageOnly: diff --git a/lib/model/actions/slideshow.dart b/lib/view/src/actions/slideshow.dart similarity index 93% rename from lib/model/actions/slideshow.dart rename to lib/view/src/actions/slideshow.dart index 40bbc0025..84c729bad 100644 --- a/lib/model/actions/slideshow.dart +++ b/lib/view/src/actions/slideshow.dart @@ -3,7 +3,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -extension ExtraSlideshowAction on SlideshowAction { +extension ExtraSlideshowActionView on SlideshowAction { String getText(BuildContext context) { switch (this) { case SlideshowAction.resume: diff --git a/lib/model/metadata/enums/date_edit_action.dart b/lib/view/src/metadata/date_edit_action.dart similarity index 93% rename from lib/model/metadata/enums/date_edit_action.dart rename to lib/view/src/metadata/date_edit_action.dart index d6deffdff..de735ff63 100644 --- a/lib/model/metadata/enums/date_edit_action.dart +++ b/lib/view/src/metadata/date_edit_action.dart @@ -2,7 +2,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -extension ExtraDateEditAction on DateEditAction { +extension ExtraDateEditActionView on DateEditAction { String getText(BuildContext context) { switch (this) { case DateEditAction.setCustom: diff --git a/lib/model/metadata/enums/date_field_source.dart b/lib/view/src/metadata/date_field_source.dart similarity index 52% rename from lib/model/metadata/enums/date_field_source.dart rename to lib/view/src/metadata/date_field_source.dart index 327cf333e..88355826b 100644 --- a/lib/model/metadata/enums/date_field_source.dart +++ b/lib/view/src/metadata/date_field_source.dart @@ -1,9 +1,8 @@ -import 'package:aves/model/metadata/fields.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -extension ExtraDateFieldSource on DateFieldSource { +extension ExtraDateFieldSourceView on DateFieldSource { String getText(BuildContext context) { switch (this) { case DateFieldSource.fileModifiedDate: @@ -18,19 +17,4 @@ extension ExtraDateFieldSource on DateFieldSource { return 'Exif GPS date'; } } - - MetadataField? toMetadataField() { - switch (this) { - case DateFieldSource.fileModifiedDate: - return null; - case DateFieldSource.exifDate: - return MetadataField.exifDate; - case DateFieldSource.exifDateOriginal: - return MetadataField.exifDateOriginal; - case DateFieldSource.exifDateDigitized: - return MetadataField.exifDateDigitized; - case DateFieldSource.exifGpsDate: - return MetadataField.exifGpsDatestamp; - } - } } diff --git a/lib/view/src/metadata/fields.dart b/lib/view/src/metadata/fields.dart new file mode 100644 index 000000000..906146443 --- /dev/null +++ b/lib/view/src/metadata/fields.dart @@ -0,0 +1,20 @@ +import 'package:aves_model/aves_model.dart'; + +extension ExtraMetadataFieldView on MetadataField { + String get title { + switch (this) { + case MetadataField.exifDate: + return 'Exif date'; + case MetadataField.exifDateOriginal: + return 'Exif original date'; + case MetadataField.exifDateDigitized: + return 'Exif digitized date'; + case MetadataField.exifGpsDatestamp: + return 'Exif GPS date'; + case MetadataField.xmpXmpCreateDate: + return 'XMP xmp:CreateDate'; + default: + return name; + } + } +} diff --git a/lib/model/metadata/enums/length_unit.dart b/lib/view/src/metadata/length_unit.dart similarity index 89% rename from lib/model/metadata/enums/length_unit.dart rename to lib/view/src/metadata/length_unit.dart index 0687bd913..d4766d902 100644 --- a/lib/model/metadata/enums/length_unit.dart +++ b/lib/view/src/metadata/length_unit.dart @@ -2,7 +2,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -extension ExtraLengthUnit on LengthUnit { +extension ExtraLengthUnitView on LengthUnit { String getText(BuildContext context) { switch (this) { case LengthUnit.px: diff --git a/lib/model/metadata/enums/location_edit_action.dart b/lib/view/src/metadata/location_edit_action.dart similarity index 90% rename from lib/model/metadata/enums/location_edit_action.dart rename to lib/view/src/metadata/location_edit_action.dart index 0964d8f5b..469a15c3d 100644 --- a/lib/model/metadata/enums/location_edit_action.dart +++ b/lib/view/src/metadata/location_edit_action.dart @@ -2,7 +2,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -extension ExtraLocationEditAction on LocationEditAction { +extension ExtraLocationEditActionView on LocationEditAction { String getText(BuildContext context) { switch (this) { case LocationEditAction.chooseOnMap: diff --git a/lib/view/src/metadata/metadata_type.dart b/lib/view/src/metadata/metadata_type.dart new file mode 100644 index 000000000..5eee2bf45 --- /dev/null +++ b/lib/view/src/metadata/metadata_type.dart @@ -0,0 +1,29 @@ +import 'package:aves_model/aves_model.dart'; + +extension ExtraMetadataTypeView on MetadataType { + // match `metadata-extractor` directory names + String getText() { + switch (this) { + case MetadataType.comment: + return 'Comment'; + case MetadataType.exif: + return 'Exif'; + case MetadataType.iccProfile: + return 'ICC Profile'; + case MetadataType.iptc: + return 'IPTC'; + case MetadataType.jfif: + return 'JFIF'; + case MetadataType.jpegAdobe: + return 'Adobe JPEG'; + case MetadataType.jpegDucky: + return 'Ducky'; + case MetadataType.mp4: + return 'MP4'; + case MetadataType.photoshopIrb: + return 'Photoshop'; + case MetadataType.xmp: + return 'XMP'; + } + } +} diff --git a/lib/model/settings/enums/l10n.dart b/lib/view/src/settings/enums.dart similarity index 78% rename from lib/model/settings/enums/l10n.dart rename to lib/view/src/settings/enums.dart index 3d0dcaaeb..15b1f5031 100644 --- a/lib/model/settings/enums/l10n.dart +++ b/lib/view/src/settings/enums.dart @@ -3,7 +3,7 @@ import 'package:aves_map/aves_map.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -extension ExtraAccessibilityAnimationsName on AccessibilityAnimations { +extension ExtraAccessibilityAnimationsView on AccessibilityAnimations { String getName(BuildContext context) { switch (this) { case AccessibilityAnimations.system: @@ -16,7 +16,7 @@ extension ExtraAccessibilityAnimationsName on AccessibilityAnimations { } } -extension ExtraAccessibilityTimeoutName on AccessibilityTimeout { +extension ExtraAccessibilityTimeoutView on AccessibilityTimeout { String getName(BuildContext context) { switch (this) { case AccessibilityTimeout.system: @@ -35,7 +35,7 @@ extension ExtraAccessibilityTimeoutName on AccessibilityTimeout { } } -extension ExtraAvesThemeBrightnessName on AvesThemeBrightness { +extension ExtraAvesThemeBrightnessView on AvesThemeBrightness { String getName(BuildContext context) { switch (this) { case AvesThemeBrightness.system: @@ -50,7 +50,7 @@ extension ExtraAvesThemeBrightnessName on AvesThemeBrightness { } } -extension ExtraCoordinateFormatName on CoordinateFormat { +extension ExtraCoordinateFormatView on CoordinateFormat { String getName(BuildContext context) { switch (this) { case CoordinateFormat.dms: @@ -61,7 +61,7 @@ extension ExtraCoordinateFormatName on CoordinateFormat { } } -extension ExtraDisplayRefreshRateModeName on DisplayRefreshRateMode { +extension ExtraDisplayRefreshRateModeView on DisplayRefreshRateMode { String getName(BuildContext context) { switch (this) { case DisplayRefreshRateMode.auto: @@ -74,7 +74,7 @@ extension ExtraDisplayRefreshRateModeName on DisplayRefreshRateMode { } } -extension ExtraEntryMapStyleName on EntryMapStyle { +extension ExtraEntryMapStyleView on EntryMapStyle { String getName(BuildContext context) { switch (this) { case EntryMapStyle.googleNormal: @@ -97,7 +97,7 @@ extension ExtraEntryMapStyleName on EntryMapStyle { } } -extension ExtraHomePageSettingName on HomePageSetting { +extension ExtraHomePageSettingView on HomePageSetting { String getName(BuildContext context) { switch (this) { case HomePageSetting.collection: @@ -108,7 +108,7 @@ extension ExtraHomePageSettingName on HomePageSetting { } } -extension ExtraKeepScreenOnName on KeepScreenOn { +extension ExtraKeepScreenOnView on KeepScreenOn { String getName(BuildContext context) { switch (this) { case KeepScreenOn.never: @@ -123,7 +123,7 @@ extension ExtraKeepScreenOnName on KeepScreenOn { } } -extension ExtraSlideshowVideoPlaybackName on SlideshowVideoPlayback { +extension ExtraSlideshowVideoPlaybackView on SlideshowVideoPlayback { String getName(BuildContext context) { switch (this) { case SlideshowVideoPlayback.skip: @@ -136,7 +136,7 @@ extension ExtraSlideshowVideoPlaybackName on SlideshowVideoPlayback { } } -extension ExtraSubtitlePositionName on SubtitlePosition { +extension ExtraSubtitlePositionView on SubtitlePosition { String getName(BuildContext context) { switch (this) { case SubtitlePosition.top: @@ -147,33 +147,7 @@ extension ExtraSubtitlePositionName on SubtitlePosition { } } -extension ExtraThumbnailOverlayLocationIconName on ThumbnailOverlayLocationIcon { - String getName(BuildContext context) { - switch (this) { - case ThumbnailOverlayLocationIcon.located: - return context.l10n.filterLocatedLabel; - case ThumbnailOverlayLocationIcon.unlocated: - return context.l10n.filterNoLocationLabel; - case ThumbnailOverlayLocationIcon.none: - return context.l10n.settingsDisabled; - } - } -} - -extension ExtraThumbnailOverlayTagIconName on ThumbnailOverlayTagIcon { - String getName(BuildContext context) { - switch (this) { - case ThumbnailOverlayTagIcon.tagged: - return context.l10n.filterTaggedLabel; - case ThumbnailOverlayTagIcon.untagged: - return context.l10n.filterNoTagLabel; - case ThumbnailOverlayTagIcon.none: - return context.l10n.settingsDisabled; - } - } -} - -extension ExtraUnitSystemName on UnitSystem { +extension ExtraUnitSystemView on UnitSystem { String getName(BuildContext context) { switch (this) { case UnitSystem.metric: @@ -184,7 +158,7 @@ extension ExtraUnitSystemName on UnitSystem { } } -extension ExtraVideoAutoPlayModeName on VideoAutoPlayMode { +extension ExtraVideoAutoPlayModeView on VideoAutoPlayMode { String getName(BuildContext context) { switch (this) { case VideoAutoPlayMode.disabled: @@ -197,7 +171,7 @@ extension ExtraVideoAutoPlayModeName on VideoAutoPlayMode { } } -extension ExtraVideoBackgroundModeName on VideoBackgroundMode { +extension ExtraVideoBackgroundModeView on VideoBackgroundMode { String getName(BuildContext context) { switch (this) { case VideoBackgroundMode.disabled: @@ -208,7 +182,7 @@ extension ExtraVideoBackgroundModeName on VideoBackgroundMode { } } -extension ExtraVideoControlsName on VideoControls { +extension ExtraVideoControlsView on VideoControls { String getName(BuildContext context) { switch (this) { case VideoControls.play: @@ -223,7 +197,7 @@ extension ExtraVideoControlsName on VideoControls { } } -extension ExtraVideoLoopModeName on VideoLoopMode { +extension ExtraVideoLoopModeView on VideoLoopMode { String getName(BuildContext context) { switch (this) { case VideoLoopMode.never: @@ -236,7 +210,7 @@ extension ExtraVideoLoopModeName on VideoLoopMode { } } -extension ExtraViewerTransitionName on ViewerTransition { +extension ExtraViewerTransitionView on ViewerTransition { String getName(BuildContext context) { switch (this) { case ViewerTransition.slide: @@ -253,7 +227,7 @@ extension ExtraViewerTransitionName on ViewerTransition { } } -extension ExtraWidgetDisplayedItemName on WidgetDisplayedItem { +extension ExtraWidgetDisplayedItemView on WidgetDisplayedItem { String getName(BuildContext context) { switch (this) { case WidgetDisplayedItem.random: @@ -264,7 +238,7 @@ extension ExtraWidgetDisplayedItemName on WidgetDisplayedItem { } } -extension ExtraWidgetOpenPageName on WidgetOpenPage { +extension ExtraWidgetOpenPageView on WidgetOpenPage { String getName(BuildContext context) { switch (this) { case WidgetOpenPage.home: diff --git a/lib/view/src/settings/thumbnail_overlay_location_icon.dart b/lib/view/src/settings/thumbnail_overlay_location_icon.dart new file mode 100644 index 000000000..e479cf91f --- /dev/null +++ b/lib/view/src/settings/thumbnail_overlay_location_icon.dart @@ -0,0 +1,27 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraThumbnailOverlayLocationIconView on ThumbnailOverlayLocationIcon { + String getName(BuildContext context) { + switch (this) { + case ThumbnailOverlayLocationIcon.located: + return context.l10n.filterLocatedLabel; + case ThumbnailOverlayLocationIcon.unlocated: + return context.l10n.filterNoLocationLabel; + case ThumbnailOverlayLocationIcon.none: + return context.l10n.settingsDisabled; + } + } + + IconData getIcon(BuildContext context) { + switch (this) { + case ThumbnailOverlayLocationIcon.unlocated: + return AIcons.locationUnlocated; + case ThumbnailOverlayLocationIcon.located: + case ThumbnailOverlayLocationIcon.none: + return AIcons.location; + } + } +} diff --git a/lib/view/src/settings/thumbnail_overlay_tag_icon.dart b/lib/view/src/settings/thumbnail_overlay_tag_icon.dart new file mode 100644 index 000000000..983d18ffe --- /dev/null +++ b/lib/view/src/settings/thumbnail_overlay_tag_icon.dart @@ -0,0 +1,28 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraThumbnailOverlayTagIconView on ThumbnailOverlayTagIcon { + String getName(BuildContext context) { + switch (this) { + case ThumbnailOverlayTagIcon.tagged: + return context.l10n.filterTaggedLabel; + case ThumbnailOverlayTagIcon.untagged: + return context.l10n.filterNoTagLabel; + case ThumbnailOverlayTagIcon.none: + return context.l10n.settingsDisabled; + } + } + + IconData getIcon(BuildContext context) { + switch (this) { + case ThumbnailOverlayTagIcon.tagged: + return AIcons.tag; + case ThumbnailOverlayTagIcon.untagged: + return AIcons.tagUntagged; + case ThumbnailOverlayTagIcon.none: + return AIcons.tag; + } + } +} diff --git a/lib/view/src/source/album.dart b/lib/view/src/source/album.dart new file mode 100644 index 000000000..5706431dc --- /dev/null +++ b/lib/view/src/source/album.dart @@ -0,0 +1,24 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraAlbumTypeView on AlbumType { + String? getName(BuildContext context) { + switch (this) { + case AlbumType.camera: + return context.l10n.albumCamera; + case AlbumType.download: + return context.l10n.albumDownload; + case AlbumType.screenshots: + return context.l10n.albumScreenshots; + case AlbumType.screenRecordings: + return context.l10n.albumScreenRecordings; + case AlbumType.videoCaptures: + return context.l10n.albumVideoCaptures; + case AlbumType.regular: + case AlbumType.vault: + case AlbumType.app: + return null; + } + } +} diff --git a/lib/view/src/source/group.dart b/lib/view/src/source/group.dart new file mode 100644 index 000000000..851b72292 --- /dev/null +++ b/lib/view/src/source/group.dart @@ -0,0 +1,62 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraEntryGroupFactorView on EntryGroupFactor { + String getName(BuildContext context) { + final l10n = context.l10n; + switch (this) { + case EntryGroupFactor.album: + return l10n.collectionGroupAlbum; + case EntryGroupFactor.month: + return l10n.collectionGroupMonth; + case EntryGroupFactor.day: + return l10n.collectionGroupDay; + case EntryGroupFactor.none: + return l10n.collectionGroupNone; + } + } + + IconData get icon { + switch (this) { + case EntryGroupFactor.album: + return AIcons.album; + case EntryGroupFactor.month: + return AIcons.dateByMonth; + case EntryGroupFactor.day: + return AIcons.dateByDay; + case EntryGroupFactor.none: + return AIcons.clear; + } + } +} + +extension ExtraAlbumChipGroupFactorView on AlbumChipGroupFactor { + String getName(BuildContext context) { + final l10n = context.l10n; + switch (this) { + case AlbumChipGroupFactor.importance: + return l10n.albumGroupTier; + case AlbumChipGroupFactor.mimeType: + return l10n.albumGroupType; + case AlbumChipGroupFactor.volume: + return l10n.albumGroupVolume; + case AlbumChipGroupFactor.none: + return l10n.albumGroupNone; + } + } + + IconData get icon { + switch (this) { + case AlbumChipGroupFactor.importance: + return AIcons.important; + case AlbumChipGroupFactor.mimeType: + return AIcons.mimeType; + case AlbumChipGroupFactor.volume: + return AIcons.removableStorage; + case AlbumChipGroupFactor.none: + return AIcons.clear; + } + } +} diff --git a/lib/view/src/source/layout.dart b/lib/view/src/source/layout.dart new file mode 100644 index 000000000..58d3e8161 --- /dev/null +++ b/lib/view/src/source/layout.dart @@ -0,0 +1,29 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraTileLayoutView on TileLayout { + String getName(BuildContext context) { + final l10n = context.l10n; + switch (this) { + case TileLayout.mosaic: + return l10n.tileLayoutMosaic; + case TileLayout.grid: + return l10n.tileLayoutGrid; + case TileLayout.list: + return l10n.tileLayoutList; + } + } + + IconData get icon { + switch (this) { + case TileLayout.mosaic: + return AIcons.layoutMosaic; + case TileLayout.grid: + return AIcons.layoutGrid; + case TileLayout.list: + return AIcons.layoutList; + } + } +} diff --git a/lib/model/source/enums/view.dart b/lib/view/src/source/sort.dart similarity index 51% rename from lib/model/source/enums/view.dart rename to lib/view/src/source/sort.dart index 7f6c50ffd..705d0238f 100644 --- a/lib/model/source/enums/view.dart +++ b/lib/view/src/source/sort.dart @@ -1,9 +1,9 @@ -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -extension ExtraEntrySortFactor on EntrySortFactor { +extension ExtraEntrySortFactorView on EntrySortFactor { String getName(BuildContext context) { final l10n = context.l10n; switch (this) { @@ -46,7 +46,7 @@ extension ExtraEntrySortFactor on EntrySortFactor { } } -extension ExtraChipSortFactor on ChipSortFactor { +extension ExtraChipSortFactorView on ChipSortFactor { String getName(BuildContext context) { final l10n = context.l10n; switch (this) { @@ -87,86 +87,3 @@ extension ExtraChipSortFactor on ChipSortFactor { } } } - -extension ExtraEntryGroupFactor on EntryGroupFactor { - String getName(BuildContext context) { - final l10n = context.l10n; - switch (this) { - case EntryGroupFactor.album: - return l10n.collectionGroupAlbum; - case EntryGroupFactor.month: - return l10n.collectionGroupMonth; - case EntryGroupFactor.day: - return l10n.collectionGroupDay; - case EntryGroupFactor.none: - return l10n.collectionGroupNone; - } - } - - IconData get icon { - switch (this) { - case EntryGroupFactor.album: - return AIcons.album; - case EntryGroupFactor.month: - return AIcons.dateByMonth; - case EntryGroupFactor.day: - return AIcons.dateByDay; - case EntryGroupFactor.none: - return AIcons.clear; - } - } -} - -extension ExtraAlbumChipGroupFactor on AlbumChipGroupFactor { - String getName(BuildContext context) { - final l10n = context.l10n; - switch (this) { - case AlbumChipGroupFactor.importance: - return l10n.albumGroupTier; - case AlbumChipGroupFactor.mimeType: - return l10n.albumGroupType; - case AlbumChipGroupFactor.volume: - return l10n.albumGroupVolume; - case AlbumChipGroupFactor.none: - return l10n.albumGroupNone; - } - } - - IconData get icon { - switch (this) { - case AlbumChipGroupFactor.importance: - return AIcons.important; - case AlbumChipGroupFactor.mimeType: - return AIcons.mimeType; - case AlbumChipGroupFactor.volume: - return AIcons.removableStorage; - case AlbumChipGroupFactor.none: - return AIcons.clear; - } - } -} - -extension ExtraTileLayout on TileLayout { - String getName(BuildContext context) { - final l10n = context.l10n; - switch (this) { - case TileLayout.mosaic: - return l10n.tileLayoutMosaic; - case TileLayout.grid: - return l10n.tileLayoutGrid; - case TileLayout.list: - return l10n.tileLayoutList; - } - } - - IconData get icon { - switch (this) { - case TileLayout.mosaic: - return AIcons.layoutMosaic; - case TileLayout.grid: - return AIcons.layoutGrid; - case TileLayout.list: - return AIcons.layoutList; - } - } -} diff --git a/lib/model/source/source_state.dart b/lib/view/src/source/state.dart similarity index 83% rename from lib/model/source/source_state.dart rename to lib/view/src/source/state.dart index 35d57bd7d..7b23db094 100644 --- a/lib/model/source/source_state.dart +++ b/lib/view/src/source/state.dart @@ -1,7 +1,7 @@ import 'package:aves/l10n/l10n.dart'; -import 'package:aves/model/source/enums/enums.dart'; +import 'package:aves_model/aves_model.dart'; -extension ExtraSourceState on SourceState { +extension ExtraSourceStateView on SourceState { String? getName(AppLocalizations l10n) { switch (this) { case SourceState.loading: diff --git a/lib/model/vaults/enums.dart b/lib/view/src/source/vault.dart similarity index 83% rename from lib/model/vaults/enums.dart rename to lib/view/src/source/vault.dart index 27752a438..e72b42ad9 100644 --- a/lib/model/vaults/enums.dart +++ b/lib/view/src/source/vault.dart @@ -1,9 +1,8 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -enum VaultLockType { system, pattern, pin, password } - -extension ExtraVaultLockType on VaultLockType { +extension ExtraVaultLockTypeView on VaultLockType { String getText(BuildContext context) { switch (this) { case VaultLockType.system: diff --git a/lib/view/src/storage/relative_dir.dart b/lib/view/src/storage/relative_dir.dart new file mode 100644 index 000000000..23a6efcfd --- /dev/null +++ b/lib/view/src/storage/relative_dir.dart @@ -0,0 +1,12 @@ +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraVolumeRelativeDirectoryView on VolumeRelativeDirectory { + String getVolumeDescription(BuildContext context) { + final volume = androidFileUtils.storageVolumes.firstWhereOrNull((volume) => volume.path == volumePath); + return volume?.getDescription(context) ?? volumePath; + } +} diff --git a/lib/view/src/storage/volume.dart b/lib/view/src/storage/volume.dart new file mode 100644 index 000000000..4a77b7ff6 --- /dev/null +++ b/lib/view/src/storage/volume.dart @@ -0,0 +1,15 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraStorageVolumeView on StorageVolume { + String getDescription(BuildContext? context) { + if (description != null) return description!; + // ideally, the context should always be provided, but in some cases (e.g. album comparison), + // this would require numerous additional methods to have the context as argument + // for such a minor benefit: fallback volume description on Android < N + final l10n = context?.l10n; + if (isPrimary) return l10n?.storageVolumeDescriptionFallbackPrimary ?? 'Internal Storage'; + return l10n?.storageVolumeDescriptionFallbackNonPrimary ?? 'SD card'; + } +} diff --git a/lib/model/wallpaper_target.dart b/lib/view/src/wallpaper_target.dart similarity index 81% rename from lib/model/wallpaper_target.dart rename to lib/view/src/wallpaper_target.dart index 344c386eb..597f0bdb4 100644 --- a/lib/model/wallpaper_target.dart +++ b/lib/view/src/wallpaper_target.dart @@ -1,9 +1,8 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; -enum WallpaperTarget { home, lock, homeLock } - -extension ExtraWallpaperTarget on WallpaperTarget { +extension ExtraWallpaperTargetView on WallpaperTarget { String getName(BuildContext context) { switch (this) { case WallpaperTarget.home: diff --git a/lib/view/src/xmp.dart b/lib/view/src/xmp.dart new file mode 100644 index 000000000..e2f185726 --- /dev/null +++ b/lib/view/src/xmp.dart @@ -0,0 +1,67 @@ +import 'package:aves/ref/metadata/xmp.dart'; + +class XmpNamespaceView { + // cf https://exiftool.org/TagNames/XMP.html + static const Map nsTitles = { + XmpNamespaces.acdsee: 'ACDSee', + XmpNamespaces.adsmlat: 'AdsML', + XmpNamespaces.exifAux: 'Exif Aux', + XmpNamespaces.avm: 'Astronomy Visualization', + XmpNamespaces.camera: 'Pix4D Camera', + XmpNamespaces.cc: 'Creative Commons', + XmpNamespaces.crd: 'Camera Raw Defaults', + XmpNamespaces.creatorAtom: 'After Effects', + XmpNamespaces.crs: 'Camera Raw Settings', + XmpNamespaces.crss: 'Camera Raw Saved Settings', + XmpNamespaces.darktable: 'darktable', + XmpNamespaces.dc: 'Dublin Core', + XmpNamespaces.digiKam: 'digiKam', + XmpNamespaces.droneDji: 'DJI Drone', + XmpNamespaces.dwc: 'Darwin Core', + XmpNamespaces.exif: 'Exif', + XmpNamespaces.exifEx: 'Exif Ex', + XmpNamespaces.fstop: 'F-Stop', + XmpNamespaces.gAudio: 'Google Audio', + XmpNamespaces.gCamera: 'Google Camera', + XmpNamespaces.gContainer: 'Google Container', + XmpNamespaces.gCreations: 'Google Creations', + XmpNamespaces.gDepth: 'Google Depth', + XmpNamespaces.gDevice: 'Google Device', + XmpNamespaces.gFocus: 'Google Focus', + XmpNamespaces.gImage: 'Google Image', + XmpNamespaces.gPano: 'Google Panorama', + XmpNamespaces.gSpherical: 'Google Spherical', + XmpNamespaces.gettyImagesGift: 'Getty Images', + XmpNamespaces.gimp210: 'GIMP 2.10', + XmpNamespaces.gimpXmp: 'GIMP', + XmpNamespaces.illustrator: 'Illustrator', + XmpNamespaces.iptc4xmpCore: 'IPTC Core', + XmpNamespaces.iptc4xmpExt: 'IPTC Extension', + XmpNamespaces.lr: 'Lightroom', + XmpNamespaces.mediapro: 'MediaPro', + XmpNamespaces.miCamera: 'Mi Camera', + XmpNamespaces.microsoftPhoto: 'Microsoft Photo 1.0', + XmpNamespaces.mp1: 'Microsoft Photo 1.1', + XmpNamespaces.mp: 'Microsoft Photo 1.2', + XmpNamespaces.mwgrs: 'Regions', + XmpNamespaces.nga: 'National Gallery of Art', + XmpNamespaces.opMedia: 'OnePlus Media', + XmpNamespaces.panorama: 'Panorama', + XmpNamespaces.panoStudio: 'PanoramaStudio', + XmpNamespaces.pdf: 'PDF', + XmpNamespaces.pdfX: 'PDF/X', + XmpNamespaces.photoMechanic: 'Photo Mechanic', + XmpNamespaces.photoshop: 'Photoshop', + XmpNamespaces.plus: 'PLUS', + XmpNamespaces.pmtm: 'Photomatix', + XmpNamespaces.tiff: 'TIFF', + XmpNamespaces.xmp: 'Basic', + XmpNamespaces.xmpBJ: 'Basic Job Ticket', + XmpNamespaces.xmpDM: 'Dynamic Media', + XmpNamespaces.xmpMM: 'Media Management', + XmpNamespaces.xmpNote: 'Note', + XmpNamespaces.xmpRights: 'Rights Management', + XmpNamespaces.xmpTPg: 'Paged-Text', + XmpNamespaces.xperiaCamera: 'Xperia Camera', + }; +} diff --git a/lib/view/view.dart b/lib/view/view.dart new file mode 100644 index 000000000..76eec0d8c --- /dev/null +++ b/lib/view/view.dart @@ -0,0 +1,27 @@ +export 'src/actions/chip.dart'; +export 'src/actions/chip_set.dart'; +export 'src/actions/entry.dart'; +export 'src/actions/entry_set.dart'; +export 'src/actions/map.dart'; +export 'src/actions/map_cluster.dart'; +export 'src/actions/share.dart'; +export 'src/actions/slideshow.dart'; +export 'src/metadata/date_edit_action.dart'; +export 'src/metadata/date_field_source.dart'; +export 'src/metadata/fields.dart'; +export 'src/metadata/length_unit.dart'; +export 'src/metadata/location_edit_action.dart'; +export 'src/metadata/metadata_type.dart'; +export 'src/settings/enums.dart'; +export 'src/settings/thumbnail_overlay_location_icon.dart'; +export 'src/settings/thumbnail_overlay_tag_icon.dart'; +export 'src/source/album.dart'; +export 'src/source/group.dart'; +export 'src/source/layout.dart'; +export 'src/source/sort.dart'; +export 'src/source/state.dart'; +export 'src/source/vault.dart'; +export 'src/storage/relative_dir.dart'; +export 'src/storage/volume.dart'; +export 'src/wallpaper_target.dart'; +export 'src/xmp.dart'; diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index bc4ee72b3..f3db7ad22 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'package:aves/app_mode.dart'; -import 'package:aves/model/actions/entry_set.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/query.dart'; @@ -11,10 +10,9 @@ import 'package:aves/model/selection.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; -import 'package:aves/model/source/enums/view.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/collection/entry_set_action_delegate.dart'; import 'package:aves/widgets/collection/filter_bar.dart'; diff --git a/lib/widgets/collection/collection_grid.dart b/lib/widgets/collection/collection_grid.dart index 28350f70c..23d4c148a 100644 --- a/lib/widgets/collection/collection_grid.dart +++ b/lib/widgets/collection/collection_grid.dart @@ -10,7 +10,6 @@ import 'package:aves/model/selection.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/section_keys.dart'; import 'package:aves/ref/mime_types.dart'; import 'package:aves/theme/durations.dart'; @@ -45,6 +44,7 @@ import 'package:aves/widgets/common/thumbnail/notifications.dart'; import 'package:aves/widgets/common/tile_extent_controller.dart'; import 'package:aves/widgets/navigation/nav_bar/nav_bar.dart'; import 'package:aves/widgets/viewer/entry_viewer_page.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/collection/draggable_thumb_label.dart b/lib/widgets/collection/draggable_thumb_label.dart index 6c5bf4bb6..5dc38ace4 100644 --- a/lib/widgets/collection/draggable_thumb_label.dart +++ b/lib/widgets/collection/draggable_thumb_label.dart @@ -2,11 +2,11 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/filters/rating.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/utils/file_utils.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/grid/draggable_thumb_label.dart'; import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/collection/grid/headers/album.dart b/lib/widgets/collection/grid/headers/album.dart index c8e120f9e..d73692831 100644 --- a/lib/widgets/collection/grid/headers/album.dart +++ b/lib/widgets/collection/grid/headers/album.dart @@ -1,13 +1,13 @@ import 'package:aves/model/covers.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/section_keys.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/grid/header.dart'; import 'package:aves/widgets/common/identity/aves_icons.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; class AlbumSectionHeader extends StatelessWidget { diff --git a/lib/widgets/collection/grid/headers/any.dart b/lib/widgets/collection/grid/headers/any.dart index f3333bda7..c99c0c49d 100644 --- a/lib/widgets/collection/grid/headers/any.dart +++ b/lib/widgets/collection/grid/headers/any.dart @@ -3,12 +3,12 @@ import 'dart:math'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/section_keys.dart'; import 'package:aves/widgets/collection/grid/headers/album.dart'; import 'package:aves/widgets/collection/grid/headers/date.dart'; import 'package:aves/widgets/collection/grid/headers/rating.dart'; import 'package:aves/widgets/common/grid/header.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; class CollectionSectionHeader extends StatelessWidget { diff --git a/lib/widgets/collection/grid/tile.dart b/lib/widgets/collection/grid/tile.dart index 38d5bc5b8..da346a880 100644 --- a/lib/widgets/collection/grid/tile.dart +++ b/lib/widgets/collection/grid/tile.dart @@ -2,13 +2,13 @@ import 'package:aves/app_mode.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/selection.dart'; import 'package:aves/model/source/collection_lens.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/services/intent_service.dart'; import 'package:aves/widgets/collection/grid/list_details.dart'; import 'package:aves/widgets/collection/grid/list_details_theme.dart'; import 'package:aves/widgets/common/grid/scaling.dart'; import 'package:aves/widgets/common/thumbnail/decorated.dart'; import 'package:aves/widgets/common/thumbnail/notifications.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/common/action_controls/quick_choosers/move_button.dart b/lib/widgets/common/action_controls/quick_choosers/move_button.dart index 25bd2e763..0d5ac1b66 100644 --- a/lib/widgets/common/action_controls/quick_choosers/move_button.dart +++ b/lib/widgets/common/action_controls/quick_choosers/move_button.dart @@ -1,8 +1,8 @@ -import 'package:aves/model/actions/entry.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/album_chooser.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/common/button.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/common/menu.dart'; diff --git a/lib/widgets/common/action_controls/quick_choosers/rate_button.dart b/lib/widgets/common/action_controls/quick_choosers/rate_button.dart index f055b44f2..874e2bf83 100644 --- a/lib/widgets/common/action_controls/quick_choosers/rate_button.dart +++ b/lib/widgets/common/action_controls/quick_choosers/rate_button.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/actions/entry.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/common/button.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/rate_chooser.dart'; import 'package:aves_model/aves_model.dart'; diff --git a/lib/widgets/common/action_controls/quick_choosers/share_button.dart b/lib/widgets/common/action_controls/quick_choosers/share_button.dart index 2999777d2..009594358 100644 --- a/lib/widgets/common/action_controls/quick_choosers/share_button.dart +++ b/lib/widgets/common/action_controls/quick_choosers/share_button.dart @@ -1,6 +1,6 @@ -import 'package:aves/model/actions/entry.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/common/button.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/share_chooser.dart'; import 'package:aves_model/aves_model.dart'; diff --git a/lib/widgets/common/action_controls/quick_choosers/share_chooser.dart b/lib/widgets/common/action_controls/quick_choosers/share_chooser.dart index 5b8ce14e0..c412d2d59 100644 --- a/lib/widgets/common/action_controls/quick_choosers/share_chooser.dart +++ b/lib/widgets/common/action_controls/quick_choosers/share_chooser.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:aves/model/actions/share.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/common/menu.dart'; import 'package:aves/widgets/common/basic/popup/menu_row.dart'; import 'package:aves_model/aves_model.dart'; diff --git a/lib/widgets/common/action_controls/quick_choosers/tag_button.dart b/lib/widgets/common/action_controls/quick_choosers/tag_button.dart index 4f1e6c428..565773837 100644 --- a/lib/widgets/common/action_controls/quick_choosers/tag_button.dart +++ b/lib/widgets/common/action_controls/quick_choosers/tag_button.dart @@ -1,8 +1,8 @@ -import 'package:aves/model/actions/entry.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/tag.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/common/button.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/common/menu.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/tag_chooser.dart'; diff --git a/lib/widgets/common/action_mixins/permission_aware.dart b/lib/widgets/common/action_mixins/permission_aware.dart index 2e7d1e331..4709909de 100644 --- a/lib/widgets/common/action_mixins/permission_aware.dart +++ b/lib/widgets/common/action_mixins/permission_aware.dart @@ -1,9 +1,11 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/props.dart'; -import 'package:aves/model/storage/relative_dir.dart'; import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; @@ -25,7 +27,7 @@ mixin PermissionAwareMixin { final uris = [], mimeTypes = []; entries.where((entry) { final dir = entry.directory; - return dir != null && restrictedInaccessibleDirs.contains(VolumeRelativeDirectory.fromPath(dir)); + return dir != null && restrictedInaccessibleDirs.contains(androidFileUtils.relativeDirectoryFromPath(dir)); }).forEach((entry) { uris.add(entry.uri); mimeTypes.add(entry.mimeType); diff --git a/lib/widgets/common/action_mixins/size_aware.dart b/lib/widgets/common/action_mixins/size_aware.dart index bd6b939d5..f8998d308 100644 --- a/lib/widgets/common/action_mixins/size_aware.dart +++ b/lib/widgets/common/action_mixins/size_aware.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'dart:math'; import 'package:aves/model/entry/entry.dart'; -import 'package:aves/model/storage/volume.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/collection_utils.dart'; import 'package:aves/utils/file_utils.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves_model/aves_model.dart'; diff --git a/lib/widgets/common/action_mixins/vault_aware.dart b/lib/widgets/common/action_mixins/vault_aware.dart index 5c6e8e55c..13b4d9ddd 100644 --- a/lib/widgets/common/action_mixins/vault_aware.dart +++ b/lib/widgets/common/action_mixins/vault_aware.dart @@ -1,13 +1,81 @@ import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/vaults/details.dart'; import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/common/services.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/filter_editors/password_dialog.dart'; +import 'package:aves/widgets/dialogs/filter_editors/pattern_dialog.dart'; +import 'package:aves/widgets/dialogs/filter_editors/pin_dialog.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:local_auth/error_codes.dart' as auth_error; +import 'package:local_auth/local_auth.dart'; mixin VaultAwareMixin on FeedbackMixin { + Future _tryUnlock(String dirPath, BuildContext context) async { + if (!vaults.isVault(dirPath) || !vaults.isLocked(dirPath)) return true; + + final details = vaults.detailsForPath(dirPath); + if (details == null) return false; + + bool? confirmed; + switch (details.lockType) { + case VaultLockType.system: + try { + confirmed = await LocalAuthentication().authenticate( + localizedReason: context.l10n.authenticateToUnlockVault, + ); + } on PlatformException catch (e, stack) { + if (e.code != 'auth_in_progress') { + // `auth_in_progress`: `Authentication in progress` + await reportService.recordError(e, stack); + } + } + break; + case VaultLockType.pattern: + final pattern = await showDialog( + context: context, + builder: (context) => const PatternDialog(needConfirmation: false), + routeSettings: const RouteSettings(name: PatternDialog.routeName), + ); + if (pattern != null) { + confirmed = pattern == await securityService.readValue(details.passKey); + } + break; + case VaultLockType.pin: + final pin = await showDialog( + context: context, + builder: (context) => const PinDialog(needConfirmation: false), + routeSettings: const RouteSettings(name: PinDialog.routeName), + ); + if (pin != null) { + confirmed = pin == await securityService.readValue(details.passKey); + } + break; + case VaultLockType.password: + final password = await showDialog( + context: context, + builder: (context) => const PasswordDialog(needConfirmation: false), + routeSettings: const RouteSettings(name: PasswordDialog.routeName), + ); + if (password != null) { + confirmed = password == await securityService.readValue(details.passKey); + } + break; + } + + if (confirmed == null || !confirmed) return false; + + vaults.unlock(dirPath); + return true; + } + Future unlockAlbum(BuildContext context, String dirPath) async { - final success = await vaults.tryUnlock(dirPath, context); + final success = await _tryUnlock(dirPath, context); if (!success) { showFeedback(context, context.l10n.genericFailureFeedback); } @@ -29,4 +97,60 @@ mixin VaultAwareMixin on FeedbackMixin { } void lockFilters(Set filters) => vaults.lock(filters.map((v) => v.album).toSet()); + + Future setVaultPass(BuildContext context, VaultDetails details) async { + switch (details.lockType) { + case VaultLockType.system: + final l10n = context.l10n; + try { + return await LocalAuthentication().authenticate( + localizedReason: l10n.authenticateToConfigureVault, + ); + } on PlatformException catch (e, stack) { + await showDialog( + context: context, + builder: (context) => AvesDialog( + content: Text(e.message ?? l10n.genericFailureFeedback), + actions: const [OkButton()], + ), + routeSettings: const RouteSettings(name: AvesDialog.warningRouteName), + ); + if (e.code != auth_error.notAvailable) { + await reportService.recordError(e, stack); + } + } + break; + case VaultLockType.pattern: + final pattern = await showDialog( + context: context, + builder: (context) => const PatternDialog(needConfirmation: true), + routeSettings: const RouteSettings(name: PatternDialog.routeName), + ); + if (pattern != null) { + return await securityService.writeValue(details.passKey, pattern); + } + break; + case VaultLockType.pin: + final pin = await showDialog( + context: context, + builder: (context) => const PinDialog(needConfirmation: true), + routeSettings: const RouteSettings(name: PinDialog.routeName), + ); + if (pin != null) { + return await securityService.writeValue(details.passKey, pin); + } + break; + case VaultLockType.password: + final password = await showDialog( + context: context, + builder: (context) => const PasswordDialog(needConfirmation: true), + routeSettings: const RouteSettings(name: PasswordDialog.routeName), + ); + if (password != null) { + return await securityService.writeValue(details.passKey, password); + } + break; + } + return false; + } } diff --git a/lib/widgets/common/app_bar/app_bar_subtitle.dart b/lib/widgets/common/app_bar/app_bar_subtitle.dart index 3414e50fa..b0a5c751a 100644 --- a/lib/widgets/common/app_bar/app_bar_subtitle.dart +++ b/lib/widgets/common/app_bar/app_bar_subtitle.dart @@ -1,11 +1,11 @@ import 'dart:ui'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/events.dart'; -import 'package:aves/model/source/source_state.dart'; import 'package:aves/theme/durations.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; class SourceStateAwareAppBarTitle extends StatelessWidget { diff --git a/lib/widgets/common/grid/item_tracker.dart b/lib/widgets/common/grid/item_tracker.dart index 86cf83777..9d657887b 100644 --- a/lib/widgets/common/grid/item_tracker.dart +++ b/lib/widgets/common/grid/item_tracker.dart @@ -2,9 +2,9 @@ import 'dart:async'; import 'dart:math'; import 'package:aves/model/highlight.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/common/grid/scaling.dart b/lib/widgets/common/grid/scaling.dart index ec7c55972..767b86cf9 100644 --- a/lib/widgets/common/grid/scaling.dart +++ b/lib/widgets/common/grid/scaling.dart @@ -1,11 +1,11 @@ import 'package:aves/model/highlight.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/widgets/common/behaviour/eager_scale_gesture_recognizer.dart'; import 'package:aves/widgets/common/grid/sections/fixed/scale_overlay.dart'; import 'package:aves/widgets/common/grid/sections/mosaic/scale_overlay.dart'; import 'package:aves/widgets/common/grid/sections/section_layout_builder.dart'; import 'package:aves/widgets/common/grid/theme.dart'; import 'package:aves/widgets/common/tile_extent_controller.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/common/grid/sections/fixed/scale_grid.dart b/lib/widgets/common/grid/sections/fixed/scale_grid.dart index 9f9d869fd..dc94c5ddc 100644 --- a/lib/widgets/common/grid/sections/fixed/scale_grid.dart +++ b/lib/widgets/common/grid/sections/fixed/scale_grid.dart @@ -1,6 +1,6 @@ import 'dart:ui' as ui; -import 'package:aves/model/source/enums/enums.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; class FixedExtentGridPainter extends CustomPainter { diff --git a/lib/widgets/common/grid/sections/fixed/scale_overlay.dart b/lib/widgets/common/grid/sections/fixed/scale_overlay.dart index 067bc3ffe..93b018aee 100644 --- a/lib/widgets/common/grid/sections/fixed/scale_overlay.dart +++ b/lib/widgets/common/grid/sections/fixed/scale_overlay.dart @@ -1,8 +1,8 @@ -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/utils/colors.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/common/grid/sections/provider.dart b/lib/widgets/common/grid/sections/provider.dart index 1cc6cf077..d8b2eb964 100644 --- a/lib/widgets/common/grid/sections/provider.dart +++ b/lib/widgets/common/grid/sections/provider.dart @@ -1,9 +1,9 @@ -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/section_keys.dart'; import 'package:aves/widgets/common/grid/sections/fixed/section_layout_builder.dart'; import 'package:aves/widgets/common/grid/sections/list_layout.dart'; import 'package:aves/widgets/common/grid/sections/mosaic/section_layout_builder.dart'; import 'package:aves/widgets/common/grid/sections/section_layout_builder.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/common/grid/sections/section_layout_builder.dart b/lib/widgets/common/grid/sections/section_layout_builder.dart index 6b7570d8f..27866181d 100644 --- a/lib/widgets/common/grid/sections/section_layout_builder.dart +++ b/lib/widgets/common/grid/sections/section_layout_builder.dart @@ -1,8 +1,8 @@ -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/section_keys.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/common/grid/sections/list_layout.dart'; import 'package:aves/widgets/common/grid/sections/section_layout.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/common/identity/aves_filter_chip.dart b/lib/widgets/common/identity/aves_filter_chip.dart index eeae6ee49..87809c610 100644 --- a/lib/widgets/common/identity/aves_filter_chip.dart +++ b/lib/widgets/common/identity/aves_filter_chip.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:math'; import 'package:aves/app_mode.dart'; -import 'package:aves/model/actions/chip.dart'; import 'package:aves/model/covers.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/filters.dart'; @@ -13,6 +12,7 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/collection/filter_bar.dart'; import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; import 'package:aves/widgets/common/basic/popup/menu_row.dart'; diff --git a/lib/widgets/common/identity/aves_icons.dart b/lib/widgets/common/identity/aves_icons.dart index d5ac8f60d..022389b7d 100644 --- a/lib/widgets/common/identity/aves_icons.dart +++ b/lib/widgets/common/identity/aves_icons.dart @@ -3,11 +3,11 @@ import 'package:aves/model/covers.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/multipage.dart'; import 'package:aves/model/entry/extensions/props.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/grid/theme.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/common/map/buttons/panel.dart b/lib/widgets/common/map/buttons/panel.dart index 4d57a5974..ecb325cd9 100644 --- a/lib/widgets/common/map/buttons/panel.dart +++ b/lib/widgets/common/map/buttons/panel.dart @@ -1,7 +1,7 @@ -import 'package:aves/model/actions/map.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/map/buttons/button.dart'; import 'package:aves/widgets/common/map/buttons/coordinate_filter.dart'; diff --git a/lib/widgets/common/map/geo_map.dart b/lib/widgets/common/map/geo_map.dart index 348c0d55f..5d008fb20 100644 --- a/lib/widgets/common/map/geo_map.dart +++ b/lib/widgets/common/map/geo_map.dart @@ -6,7 +6,6 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/images.dart'; import 'package:aves/model/entry/extensions/location.dart'; import 'package:aves/model/entry/sort.dart'; -import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/enums/map_style.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/ref/poi.dart'; @@ -14,6 +13,7 @@ import 'package:aves/services/common/services.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/math_utils.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; import 'package:aves/widgets/common/map/attribution.dart'; diff --git a/lib/widgets/common/map/map_action_delegate.dart b/lib/widgets/common/map/map_action_delegate.dart index c4244403a..e108d01bb 100644 --- a/lib/widgets/common/map/map_action_delegate.dart +++ b/lib/widgets/common/map/map_action_delegate.dart @@ -1,6 +1,6 @@ -import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/common/services.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/dialogs/selection_dialogs/common.dart'; import 'package:aves/widgets/dialogs/selection_dialogs/single_selection.dart'; diff --git a/lib/widgets/debug/storage.dart b/lib/widgets/debug/storage.dart index 8ea4ba4dc..7e242fd05 100644 --- a/lib/widgets/debug/storage.dart +++ b/lib/widgets/debug/storage.dart @@ -1,6 +1,7 @@ import 'package:aves/services/common/services.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/file_utils.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/dialogs/convert_entry_dialog.dart b/lib/widgets/dialogs/convert_entry_dialog.dart index b2457d137..5d4235758 100644 --- a/lib/widgets/dialogs/convert_entry_dialog.dart +++ b/lib/widgets/dialogs/convert_entry_dialog.dart @@ -1,6 +1,5 @@ import 'package:aves/model/app/support.dart'; import 'package:aves/model/entry/entry.dart'; -import 'package:aves/model/metadata/enums/length_unit.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/ref/mime_types.dart'; import 'package:aves/services/media/media_edit_service.dart'; @@ -8,6 +7,7 @@ import 'package:aves/theme/durations.dart'; import 'package:aves/theme/text.dart'; import 'package:aves/theme/themes.dart'; import 'package:aves/utils/mime_utils.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/fx/transitions.dart'; diff --git a/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart index c864a7ac0..f46d2c53c 100644 --- a/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart @@ -1,14 +1,12 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/metadata/date_modifier.dart'; -import 'package:aves/model/metadata/enums/date_edit_action.dart'; -import 'package:aves/model/metadata/enums/date_field_source.dart'; -import 'package:aves/model/metadata/fields.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/format.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/theme/themes.dart'; import 'package:aves/utils/time_utils.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; import 'package:aves/widgets/common/basic/wheel.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; diff --git a/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart index ec68556db..4096bd154 100644 --- a/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart @@ -1,7 +1,6 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/location.dart'; import 'package:aves/model/entry/extensions/metadata_edition.dart'; -import 'package:aves/model/metadata/enums/location_edit_action.dart'; import 'package:aves/model/settings/enums/coordinate_format.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; @@ -9,6 +8,7 @@ import 'package:aves/ref/poi.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/theme/themes.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/fx/transitions.dart'; diff --git a/lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart b/lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart index 8effe17ec..b31de3de8 100644 --- a/lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart @@ -1,8 +1,8 @@ -import 'package:aves/model/metadata/enums/metadata_type.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/ref/brand_colors.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/durations.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/basic/text/outlined.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/fx/highlight_decoration.dart'; diff --git a/lib/widgets/dialogs/filter_editors/create_album_dialog.dart b/lib/widgets/dialogs/filter_editors/create_album_dialog.dart index b721a5ae8..c31895d9a 100644 --- a/lib/widgets/dialogs/filter_editors/create_album_dialog.dart +++ b/lib/widgets/dialogs/filter_editors/create_album_dialog.dart @@ -1,11 +1,12 @@ import 'dart:io'; -import 'package:aves/model/storage/volume.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart b/lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart index b09784522..19cc23aa1 100644 --- a/lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart +++ b/lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart @@ -3,14 +3,17 @@ import 'package:aves/model/filters/album.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/vaults/details.dart'; -import 'package:aves/model/vaults/enums.dart'; import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_caption.dart'; import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/selection_dialogs/common.dart'; import 'package:aves/widgets/dialogs/selection_dialogs/single_selection.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -28,7 +31,7 @@ class EditVaultDialog extends StatefulWidget { State createState() => _EditVaultDialogState(); } -class _EditVaultDialogState extends State { +class _EditVaultDialogState extends State with FeedbackMixin, VaultAwareMixin { final TextEditingController _nameController = TextEditingController(); late bool _useBin; late bool _autoLockScreenOff; @@ -179,7 +182,7 @@ class _EditVaultDialogState extends State { useBin: _useBin, lockType: _lockType, ); - if (!await vaults.setPass(context, details)) return; + if (!await setVaultPass(context, details)) return; Navigator.maybeOf(context)?.pop(details); } diff --git a/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart index e7d6dc468..6a74cd192 100644 --- a/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart +++ b/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart @@ -1,16 +1,15 @@ import 'package:aves/app_mode.dart'; -import 'package:aves/model/actions/chip_set.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/selection.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/album.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/vaults/details.dart'; import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; diff --git a/lib/widgets/dialogs/wallpaper_settings_dialog.dart b/lib/widgets/dialogs/wallpaper_settings_dialog.dart index 7a4ed7589..9b3b759ff 100644 --- a/lib/widgets/dialogs/wallpaper_settings_dialog.dart +++ b/lib/widgets/dialogs/wallpaper_settings_dialog.dart @@ -1,8 +1,9 @@ import 'package:aves/model/device.dart'; -import 'package:aves/model/wallpaper_target.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/selection_dialogs/radio_list_tile.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; import 'package:tuple/tuple.dart'; diff --git a/lib/widgets/filter_grids/albums_page.dart b/lib/widgets/filter_grids/albums_page.dart index e651867d8..259fa0728 100644 --- a/lib/widgets/filter_grids/albums_page.dart +++ b/lib/widgets/filter_grids/albums_page.dart @@ -1,3 +1,4 @@ +import 'package:aves/model/apps.dart'; import 'package:aves/model/covers.dart'; import 'package:aves/model/entry/extensions/props.dart'; import 'package:aves/model/filters/album.dart'; @@ -5,15 +6,14 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/album.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/model/apps.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/empty.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/album_set.dart'; import 'package:aves/widgets/filter_grids/common/filter_nav_page.dart'; import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/filter_grids/common/action_delegates/album_set.dart b/lib/widgets/filter_grids/common/action_delegates/album_set.dart index 2ad601e04..3d92768e0 100644 --- a/lib/widgets/filter_grids/common/action_delegates/album_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/album_set.dart @@ -8,17 +8,15 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/highlight.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; -import 'package:aves/model/source/enums/view.dart'; -import 'package:aves/model/storage/relative_dir.dart'; import 'package:aves/model/vaults/details.dart'; import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/services/common/image_op_events.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/services/media/enums.dart'; import 'package:aves/theme/durations.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/action_mixins/entry_storage.dart'; -import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/tile_extent_controller.dart'; import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; @@ -36,7 +34,7 @@ import 'package:flutter/scheduler.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; -class AlbumChipSetActionDelegate extends ChipSetActionDelegate with EntryStorageMixin, VaultAwareMixin { +class AlbumChipSetActionDelegate extends ChipSetActionDelegate with EntryStorageMixin { final Iterable> _items; AlbumChipSetActionDelegate(Iterable> items) : _items = items; @@ -124,7 +122,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate with if (vaults.isVault(dirPath)) return true; // do not allow renaming volume root - final dir = VolumeRelativeDirectory.fromPath(dirPath); + final dir = androidFileUtils.relativeDirectoryFromPath(dirPath); return dir != null && dir.relativeDir.isNotEmpty; case ChipSetAction.hide: return hasSelection; @@ -385,7 +383,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate with final album = filter.album; if (!vaults.isVault(album)) { - final dir = VolumeRelativeDirectory.fromPath(album); + final dir = androidFileUtils.relativeDirectoryFromPath(album); // do not allow renaming volume root if (dir == null || dir.relativeDir.isEmpty) return; diff --git a/lib/widgets/filter_grids/common/action_delegates/chip_set.dart b/lib/widgets/filter_grids/common/action_delegates/chip_set.dart index d85eab05c..111dd9960 100644 --- a/lib/widgets/filter_grids/common/action_delegates/chip_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/chip_set.dart @@ -8,11 +8,10 @@ import 'package:aves/model/selection.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; -import 'package:aves/model/source/enums/view.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/durations.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; import 'package:aves/widgets/common/action_mixins/size_aware.dart'; diff --git a/lib/widgets/filter_grids/common/action_delegates/country_set.dart b/lib/widgets/filter_grids/common/action_delegates/country_set.dart index 7a8c88d97..0f3cc66dc 100644 --- a/lib/widgets/filter_grids/common/action_delegates/country_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/country_set.dart @@ -3,7 +3,6 @@ import 'package:aves/geo/states.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/location.dart'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; import 'package:aves/widgets/filter_grids/countries_page.dart'; diff --git a/lib/widgets/filter_grids/common/action_delegates/place_set.dart b/lib/widgets/filter_grids/common/action_delegates/place_set.dart index 35e5052bb..be9549e60 100644 --- a/lib/widgets/filter_grids/common/action_delegates/place_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/place_set.dart @@ -1,9 +1,9 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/location.dart'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; import 'package:aves/widgets/filter_grids/places_page.dart'; +import 'package:aves_model/aves_model.dart'; class PlaceChipSetActionDelegate extends ChipSetActionDelegate { final Iterable> _items; diff --git a/lib/widgets/filter_grids/common/action_delegates/state_set.dart b/lib/widgets/filter_grids/common/action_delegates/state_set.dart index abe60d978..8fb3d5cf9 100644 --- a/lib/widgets/filter_grids/common/action_delegates/state_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/state_set.dart @@ -1,9 +1,9 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/location.dart'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; import 'package:aves/widgets/filter_grids/states_page.dart'; +import 'package:aves_model/aves_model.dart'; class StateChipSetActionDelegate extends ChipSetActionDelegate { final Iterable> _items; diff --git a/lib/widgets/filter_grids/common/action_delegates/tag_set.dart b/lib/widgets/filter_grids/common/action_delegates/tag_set.dart index e6403fd04..6362f7281 100644 --- a/lib/widgets/filter_grids/common/action_delegates/tag_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/tag_set.dart @@ -1,9 +1,9 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/tag.dart'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; import 'package:aves/widgets/filter_grids/tags_page.dart'; +import 'package:aves_model/aves_model.dart'; class TagChipSetActionDelegate extends ChipSetActionDelegate { final Iterable> _items; diff --git a/lib/widgets/filter_grids/common/app_bar.dart b/lib/widgets/filter_grids/common/app_bar.dart index 30193c64a..7c752c228 100644 --- a/lib/widgets/filter_grids/common/app_bar.dart +++ b/lib/widgets/filter_grids/common/app_bar.dart @@ -1,13 +1,13 @@ import 'dart:async'; import 'package:aves/app_mode.dart'; -import 'package:aves/model/actions/chip_set.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/query.dart'; import 'package:aves/model/selection.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/theme/durations.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/action_controls/togglers/title_search.dart'; import 'package:aves/widgets/common/app_bar/app_bar_subtitle.dart'; import 'package:aves/widgets/common/app_bar/app_bar_title.dart'; diff --git a/lib/widgets/filter_grids/common/draggable_thumb_label.dart b/lib/widgets/filter_grids/common/draggable_thumb_label.dart index 75ace8365..ab0f9941f 100644 --- a/lib/widgets/filter_grids/common/draggable_thumb_label.dart +++ b/lib/widgets/filter_grids/common/draggable_thumb_label.dart @@ -1,9 +1,9 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/utils/file_utils.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/grid/draggable_thumb_label.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index 10ef720f2..168e616f8 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -8,7 +8,6 @@ import 'package:aves/model/selection.dart'; import 'package:aves/model/settings/enums/accessibility_animations.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/durations.dart'; @@ -43,6 +42,7 @@ import 'package:aves/widgets/filter_grids/common/section_layout.dart'; import 'package:aves/widgets/navigation/drawer/app_drawer.dart'; import 'package:aves/widgets/navigation/nav_bar/nav_bar.dart'; import 'package:aves/widgets/navigation/tv_rail.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; diff --git a/lib/widgets/filter_grids/common/filter_nav_page.dart b/lib/widgets/filter_grids/common/filter_nav_page.dart index c8fde49e0..7f235c29f 100644 --- a/lib/widgets/filter_grids/common/filter_nav_page.dart +++ b/lib/widgets/filter_grids/common/filter_nav_page.dart @@ -1,6 +1,5 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/utils/time_utils.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/common/providers/selection_provider.dart'; @@ -8,6 +7,7 @@ import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart' import 'package:aves/widgets/filter_grids/common/app_bar.dart'; import 'package:aves/widgets/filter_grids/common/filter_grid_page.dart'; import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; class FilterNavigationPage> extends StatefulWidget { diff --git a/lib/widgets/filter_grids/common/filter_tile.dart b/lib/widgets/filter_grids/common/filter_tile.dart index 5322e6f53..4ac473b8c 100644 --- a/lib/widgets/filter_grids/common/filter_tile.dart +++ b/lib/widgets/filter_grids/common/filter_tile.dart @@ -4,7 +4,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/selection.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; @@ -15,6 +14,7 @@ import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/filter_grids/common/covered_filter_chip.dart'; import 'package:aves/widgets/filter_grids/common/filter_chip_grid_decorator.dart'; import 'package:aves/widgets/filter_grids/common/list_details.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/filter_grids/common/section_keys.dart b/lib/widgets/filter_grids/common/section_keys.dart index b6b3f236e..abca16740 100644 --- a/lib/widgets/filter_grids/common/section_keys.dart +++ b/lib/widgets/filter_grids/common/section_keys.dart @@ -1,8 +1,9 @@ import 'package:aves/model/source/section_keys.dart'; -import 'package:aves/model/storage/volume.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/filter_grids/common/enums.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/filter_grids/countries_page.dart b/lib/widgets/filter_grids/countries_page.dart index c44d4b4f6..dcaf5e879 100644 --- a/lib/widgets/filter_grids/countries_page.dart +++ b/lib/widgets/filter_grids/countries_page.dart @@ -2,7 +2,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/location.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/location/country.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -10,6 +9,7 @@ import 'package:aves/widgets/common/identity/empty.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/country_set.dart'; import 'package:aves/widgets/filter_grids/common/filter_nav_page.dart'; import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/filter_grids/places_page.dart b/lib/widgets/filter_grids/places_page.dart index 5c75843cb..e29dc1c97 100644 --- a/lib/widgets/filter_grids/places_page.dart +++ b/lib/widgets/filter_grids/places_page.dart @@ -2,7 +2,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/location.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/location/place.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -10,6 +9,7 @@ import 'package:aves/widgets/common/identity/empty.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/place_set.dart'; import 'package:aves/widgets/filter_grids/common/filter_nav_page.dart'; import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/filter_grids/states_page.dart b/lib/widgets/filter_grids/states_page.dart index c213518e0..03c4a7dd6 100644 --- a/lib/widgets/filter_grids/states_page.dart +++ b/lib/widgets/filter_grids/states_page.dart @@ -3,7 +3,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/location.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/location/place.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -11,6 +10,7 @@ import 'package:aves/widgets/common/identity/empty.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/state_set.dart'; import 'package:aves/widgets/filter_grids/common/filter_nav_page.dart'; import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/filter_grids/tags_page.dart b/lib/widgets/filter_grids/tags_page.dart index 23520b47f..f34d44ed1 100644 --- a/lib/widgets/filter_grids/tags_page.dart +++ b/lib/widgets/filter_grids/tags_page.dart @@ -2,7 +2,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/tag.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/tag.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -10,6 +9,7 @@ import 'package:aves/widgets/common/identity/empty.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/tag_set.dart'; import 'package:aves/widgets/filter_grids/common/filter_nav_page.dart'; import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index 7171b4239..f4cbd7dbb 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -11,7 +11,6 @@ import 'package:aves/model/settings/enums/home_page.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/services/analysis_service.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/services/global_search.dart'; diff --git a/lib/widgets/map/map_page.dart b/lib/widgets/map/map_page.dart index 972cacf82..63a463d09 100644 --- a/lib/widgets/map/map_page.dart +++ b/lib/widgets/map/map_page.dart @@ -1,8 +1,6 @@ import 'dart:async'; import 'package:aves/app_mode.dart'; -import 'package:aves/model/actions/map.dart'; -import 'package:aves/model/actions/map_cluster.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/location.dart'; import 'package:aves/model/filters/coordinate.dart'; @@ -15,6 +13,7 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/tag.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/collection/entry_set_action_delegate.dart'; import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; diff --git a/lib/widgets/navigation/drawer/app_drawer.dart b/lib/widgets/navigation/drawer/app_drawer.dart index 12131803a..8bb449524 100644 --- a/lib/widgets/navigation/drawer/app_drawer.dart +++ b/lib/widgets/navigation/drawer/app_drawer.dart @@ -6,7 +6,6 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/album.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/source/location/country.dart'; import 'package:aves/model/source/location/place.dart'; import 'package:aves/model/source/tag.dart'; @@ -27,6 +26,7 @@ import 'package:aves/widgets/navigation/drawer/collection_nav_tile.dart'; import 'package:aves/widgets/navigation/drawer/page_nav_tile.dart'; import 'package:aves/widgets/navigation/drawer/tile.dart'; import 'package:aves/widgets/settings/settings_page.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/settings/accessibility/accessibility.dart b/lib/widgets/settings/accessibility/accessibility.dart index 19dc92b5a..f7f558f88 100644 --- a/lib/widgets/settings/accessibility/accessibility.dart +++ b/lib/widgets/settings/accessibility/accessibility.dart @@ -1,9 +1,9 @@ import 'dart:async'; -import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/accessibility/time_to_take_action.dart'; import 'package:aves/widgets/settings/common/tile_leading.dart'; diff --git a/lib/widgets/settings/accessibility/time_to_take_action.dart b/lib/widgets/settings/accessibility/time_to_take_action.dart index c240fb3c8..34455b658 100644 --- a/lib/widgets/settings/accessibility/time_to_take_action.dart +++ b/lib/widgets/settings/accessibility/time_to_take_action.dart @@ -1,6 +1,6 @@ -import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/accessibility_service.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; import 'package:aves_model/aves_model.dart'; diff --git a/lib/widgets/settings/display/display.dart b/lib/widgets/settings/display/display.dart index 09663721f..87b0fc0f3 100644 --- a/lib/widgets/settings/display/display.dart +++ b/lib/widgets/settings/display/display.dart @@ -1,10 +1,10 @@ import 'dart:async'; import 'package:aves/model/device.dart'; -import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/settings/common/tile_leading.dart'; diff --git a/lib/widgets/settings/home_widget_settings_page.dart b/lib/widgets/settings/home_widget_settings_page.dart index 2f2a71edf..a2e49fe95 100644 --- a/lib/widgets/settings/home_widget_settings_page.dart +++ b/lib/widgets/settings/home_widget_settings_page.dart @@ -1,10 +1,10 @@ import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/enums/widget_shape.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/widget_service.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/basic/color_indicator.dart'; import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; diff --git a/lib/widgets/settings/language/language.dart b/lib/widgets/settings/language/language.dart index b2cf08cac..be642a582 100644 --- a/lib/widgets/settings/language/language.dart +++ b/lib/widgets/settings/language/language.dart @@ -1,11 +1,11 @@ import 'dart:async'; import 'package:aves/model/settings/enums/coordinate_format.dart'; -import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/ref/poi.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/tile_leading.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; diff --git a/lib/widgets/settings/navigation/navigation.dart b/lib/widgets/settings/navigation/navigation.dart index bf5df0ede..e81cbd76a 100644 --- a/lib/widgets/settings/navigation/navigation.dart +++ b/lib/widgets/settings/navigation/navigation.dart @@ -1,9 +1,9 @@ import 'dart:async'; -import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/tile_leading.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; diff --git a/lib/widgets/settings/privacy/file_picker/crumb_line.dart b/lib/widgets/settings/privacy/file_picker/crumb_line.dart index 13eecba73..30cdfdfa6 100644 --- a/lib/widgets/settings/privacy/file_picker/crumb_line.dart +++ b/lib/widgets/settings/privacy/file_picker/crumb_line.dart @@ -1,6 +1,7 @@ -import 'package:aves/model/storage/relative_dir.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; class CrumbLine extends StatefulWidget { diff --git a/lib/widgets/settings/privacy/file_picker/file_picker_page.dart b/lib/widgets/settings/privacy/file_picker/file_picker_page.dart index c42741cf8..6d193c6cc 100644 --- a/lib/widgets/settings/privacy/file_picker/file_picker_page.dart +++ b/lib/widgets/settings/privacy/file_picker/file_picker_page.dart @@ -1,12 +1,11 @@ import 'dart:io'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/model/storage/relative_dir.dart'; -import 'package:aves/model/storage/volume.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; import 'package:aves/widgets/common/basic/popup/menu_row.dart'; import 'package:aves/widgets/common/basic/scaffold.dart'; @@ -14,6 +13,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; import 'package:aves/widgets/common/identity/empty.dart'; import 'package:aves/widgets/settings/privacy/file_picker/crumb_line.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -193,7 +193,7 @@ class _FilePickerPageState extends State { } void _goTo(String path) { - _directory = VolumeRelativeDirectory.fromPath(path)!; + _directory = androidFileUtils.relativeDirectoryFromPath(path)!; _contents = null; final contents = []; Directory(currentDirectoryPath).list().listen((event) { diff --git a/lib/widgets/settings/screen_saver_settings_page.dart b/lib/widgets/settings/screen_saver_settings_page.dart index 13af2f3a8..ca356f93d 100644 --- a/lib/widgets/settings/screen_saver_settings_page.dart +++ b/lib/widgets/settings/screen_saver_settings_page.dart @@ -1,6 +1,6 @@ import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/collection_tile.dart'; diff --git a/lib/widgets/settings/thumbnails/collection_actions_editor_page.dart b/lib/widgets/settings/thumbnails/collection_actions_editor_page.dart index c9b9380bb..551612110 100644 --- a/lib/widgets/settings/thumbnails/collection_actions_editor_page.dart +++ b/lib/widgets/settings/thumbnails/collection_actions_editor_page.dart @@ -1,5 +1,5 @@ -import 'package:aves/model/actions/entry_set.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/quick_actions/editor_page.dart'; diff --git a/lib/widgets/settings/thumbnails/overlay.dart b/lib/widgets/settings/thumbnails/overlay.dart index a59b5642d..3f8be2e1d 100644 --- a/lib/widgets/settings/thumbnails/overlay.dart +++ b/lib/widgets/settings/thumbnails/overlay.dart @@ -1,10 +1,8 @@ -import 'package:aves/model/settings/enums/l10n.dart'; -import 'package:aves/model/settings/enums/thumbnail_overlay_location_icon.dart'; -import 'package:aves/model/settings/enums/thumbnail_overlay_tag_icon.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_icons.dart'; diff --git a/lib/widgets/settings/video/controls.dart b/lib/widgets/settings/video/controls.dart index 38e817394..509284435 100644 --- a/lib/widgets/settings/video/controls.dart +++ b/lib/widgets/settings/video/controls.dart @@ -1,5 +1,5 @@ -import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; diff --git a/lib/widgets/settings/video/subtitle_theme.dart b/lib/widgets/settings/video/subtitle_theme.dart index b07308032..4d7857736 100644 --- a/lib/widgets/settings/video/subtitle_theme.dart +++ b/lib/widgets/settings/video/subtitle_theme.dart @@ -1,5 +1,5 @@ -import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/basic/list_tiles/color.dart'; import 'package:aves/widgets/common/basic/list_tiles/slider.dart'; import 'package:aves/widgets/common/basic/scaffold.dart'; diff --git a/lib/widgets/settings/video/video.dart b/lib/widgets/settings/video/video.dart index fb0bb3b74..0ac8dae08 100644 --- a/lib/widgets/settings/video/video.dart +++ b/lib/widgets/settings/video/video.dart @@ -2,10 +2,10 @@ import 'dart:async'; import 'package:aves/model/device.dart'; import 'package:aves/model/filters/mime.dart'; -import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/tile_leading.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; diff --git a/lib/widgets/settings/viewer/slideshow.dart b/lib/widgets/settings/viewer/slideshow.dart index b09a4f251..7a9294d92 100644 --- a/lib/widgets/settings/viewer/slideshow.dart +++ b/lib/widgets/settings/viewer/slideshow.dart @@ -1,5 +1,5 @@ -import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; diff --git a/lib/widgets/settings/viewer/viewer_actions_editor.dart b/lib/widgets/settings/viewer/viewer_actions_editor.dart index 3d5727e64..912c13173 100644 --- a/lib/widgets/settings/viewer/viewer_actions_editor.dart +++ b/lib/widgets/settings/viewer/viewer_actions_editor.dart @@ -1,5 +1,5 @@ -import 'package:aves/model/actions/entry.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/quick_actions/editor_page.dart'; import 'package:aves_model/aves_model.dart'; diff --git a/lib/widgets/viewer/info/basic_section.dart b/lib/widgets/viewer/info/basic_section.dart index eeab5624c..db32c6994 100644 --- a/lib/widgets/viewer/info/basic_section.dart +++ b/lib/widgets/viewer/info/basic_section.dart @@ -1,6 +1,5 @@ import 'package:aves/app_mode.dart'; import 'package:aves/image_providers/app_icon_image_provider.dart'; -import 'package:aves/model/actions/entry.dart'; import 'package:aves/model/apps.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/favourites.dart'; @@ -20,6 +19,7 @@ import 'package:aves/services/common/services.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/format.dart'; import 'package:aves/utils/file_utils.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/rate_button.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/tag_button.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; diff --git a/lib/widgets/viewer/info/info_app_bar.dart b/lib/widgets/viewer/info/info_app_bar.dart index 19aebb448..69f2b910e 100644 --- a/lib/widgets/viewer/info/info_app_bar.dart +++ b/lib/widgets/viewer/info/info_app_bar.dart @@ -1,5 +1,4 @@ import 'package:aves/app_mode.dart'; -import 'package:aves/model/actions/entry.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/props.dart'; import 'package:aves/model/selection.dart'; @@ -7,6 +6,7 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/app_bar/app_bar_title.dart'; import 'package:aves/widgets/common/app_bar/sliver_app_bar_title.dart'; import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; diff --git a/lib/widgets/viewer/info/metadata/geotiff.dart b/lib/widgets/viewer/info/metadata/geotiff.dart index 3fdb84fca..fb647b987 100644 --- a/lib/widgets/viewer/info/metadata/geotiff.dart +++ b/lib/widgets/viewer/info/metadata/geotiff.dart @@ -1,4 +1,4 @@ -import 'package:aves/ref/geotiff.dart'; +import 'package:aves/ref/metadata/geotiff.dart'; class GeoTiffDirectory { // TODO TLAD [geotiff] avoid string-based match diff --git a/lib/widgets/viewer/info/metadata/xmp_namespaces.dart b/lib/widgets/viewer/info/metadata/xmp_namespaces.dart index 568bf3baa..bb99034b6 100644 --- a/lib/widgets/viewer/info/metadata/xmp_namespaces.dart +++ b/lib/widgets/viewer/info/metadata/xmp_namespaces.dart @@ -1,7 +1,9 @@ import 'package:aves/ref/brand_colors.dart'; +import 'package:aves/ref/metadata/xmp.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/utils/string_utils.dart'; import 'package:aves/utils/xmp_utils.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/identity/highlight_title.dart'; import 'package:aves/widgets/viewer/info/common.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_card.dart'; @@ -37,54 +39,54 @@ class XmpNamespace extends Equatable { factory XmpNamespace.create(Map schemaRegistryPrefixes, String nsPrefix, Map rawProps) { final nsUri = schemaRegistryPrefixes[nsPrefix] ?? ''; switch (nsUri) { - case Namespaces.creatorAtom: + case XmpNamespaces.creatorAtom: return XmpCreatorAtom(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.crs: + case XmpNamespaces.crs: return XmpCrsNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.darktable: + case XmpNamespaces.darktable: return XmpDarktableNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.dwc: + case XmpNamespaces.dwc: return XmpDwcNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.exif: + case XmpNamespaces.exif: return XmpExifNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.gAudio: + case XmpNamespaces.gAudio: return XmpGAudioNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.gCamera: + case XmpNamespaces.gCamera: return XmpGCameraNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.gContainer: + case XmpNamespaces.gContainer: return XmpGContainer(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.gDepth: + case XmpNamespaces.gDepth: return XmpGDepthNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.gDevice: + case XmpNamespaces.gDevice: return XmpGDeviceNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.gImage: + case XmpNamespaces.gImage: return XmpGImageNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.iptc4xmpCore: + case XmpNamespaces.iptc4xmpCore: return XmpIptcCoreNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.iptc4xmpExt: + case XmpNamespaces.iptc4xmpExt: return XmpIptc4xmpExtNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.mwgrs: + case XmpNamespaces.mwgrs: return XmpMgwRegionsNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.mp: + case XmpNamespaces.mp: return XmpMPNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.photoshop: + case XmpNamespaces.photoshop: return XmpPhotoshopNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.plus: + case XmpNamespaces.plus: return XmpPlusNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.tiff: + case XmpNamespaces.tiff: return XmpTiffNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.xmp: + case XmpNamespaces.xmp: return XmpBasicNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.xmpMM: + case XmpNamespaces.xmpMM: return XmpMMNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); - case Namespaces.xperiaCamera: + case XmpNamespaces.xperiaCamera: return XmpXperiaCameraNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); default: return XmpNamespace(nsUri: nsUri, schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); } } - String get displayTitle => Namespaces.nsTitles[nsUri] ?? (nsPrefix.isEmpty ? nsUri : '${nsPrefix.substring(0, nsPrefix.length - 1)} ($nsUri)'); + String get displayTitle => XmpNamespaceView.nsTitles[nsUri] ?? (nsPrefix.isEmpty ? nsUri : '${nsPrefix.substring(0, nsPrefix.length - 1)} ($nsUri)'); List buildNamespaceSection(BuildContext context) { final props = rawProps.entries diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart b/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart index cae67a6d6..15e987d00 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart @@ -1,8 +1,8 @@ -import 'package:aves/utils/xmp_utils.dart'; +import 'package:aves/ref/metadata/xmp.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; class XmpCrsNamespace extends XmpNamespace { - XmpCrsNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.crs); + XmpCrsNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.crs); @override late final List cards = [ diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/exif.dart b/lib/widgets/viewer/info/metadata/xmp_ns/exif.dart index d0778f570..bbbf6771e 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/exif.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/exif.dart @@ -1,10 +1,10 @@ -import 'package:aves/ref/exif.dart'; -import 'package:aves/utils/xmp_utils.dart'; +import 'package:aves/ref/metadata/exif.dart'; +import 'package:aves/ref/metadata/xmp.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; // cf https://github.com/adobe/xmp-docs/blob/master/XMPNamespaces/exif.md class XmpExifNamespace extends XmpNamespace { - XmpExifNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.exif); + XmpExifNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.exif); @override String formatValue(XmpProp prop) { diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/google.dart b/lib/widgets/viewer/info/metadata/xmp_ns/google.dart index 5b0834a13..fca1e0d8c 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/google.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/google.dart @@ -1,4 +1,4 @@ -import 'package:aves/utils/xmp_utils.dart'; +import 'package:aves/ref/metadata/xmp.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/viewer/info/common.dart'; import 'package:aves/widgets/viewer/info/embedded/notifications.dart'; @@ -57,7 +57,7 @@ abstract class XmpGoogleNamespace extends XmpNamespace { } class XmpGAudioNamespace extends XmpGoogleNamespace { - XmpGAudioNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.gAudio); + XmpGAudioNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.gAudio); @override List> get dataProps => [ @@ -66,7 +66,7 @@ class XmpGAudioNamespace extends XmpGoogleNamespace { } class XmpGCameraNamespace extends XmpGoogleNamespace { - XmpGCameraNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.gCamera); + XmpGCameraNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.gCamera); @override List> get dataProps => [ @@ -75,7 +75,7 @@ class XmpGCameraNamespace extends XmpGoogleNamespace { } class XmpGContainer extends XmpNamespace { - XmpGContainer({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.gContainer); + XmpGContainer({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.gContainer); @override late final List cards = [ @@ -84,7 +84,7 @@ class XmpGContainer extends XmpNamespace { } class XmpGDepthNamespace extends XmpGoogleNamespace { - XmpGDepthNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.gDepth); + XmpGDepthNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.gDepth); @override List> get dataProps => [ @@ -98,10 +98,10 @@ class XmpGDeviceNamespace extends XmpNamespace { late final String _containerNsPrefix; late final String _itemNsPrefix; - XmpGDeviceNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.gDevice) { - _cameraNsPrefix = XmpNamespace.prefixForUri(schemaRegistryPrefixes, Namespaces.gDeviceCamera); - _containerNsPrefix = XmpNamespace.prefixForUri(schemaRegistryPrefixes, Namespaces.gDeviceContainer); - _itemNsPrefix = XmpNamespace.prefixForUri(schemaRegistryPrefixes, Namespaces.gDeviceItem); + XmpGDeviceNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.gDevice) { + _cameraNsPrefix = XmpNamespace.prefixForUri(schemaRegistryPrefixes, XmpNamespaces.gDeviceCamera); + _containerNsPrefix = XmpNamespace.prefixForUri(schemaRegistryPrefixes, XmpNamespaces.gDeviceContainer); + _itemNsPrefix = XmpNamespace.prefixForUri(schemaRegistryPrefixes, XmpNamespaces.gDeviceItem); final mimePattern = RegExp(nsPrefix + r'Container/' + _containerNsPrefix + r'Directory\[(\d+)\]/' + _itemNsPrefix + r'Mime'); final originalProps = rawProps.entries.toList(); @@ -153,7 +153,7 @@ class XmpGDeviceNamespace extends XmpNamespace { } class XmpGImageNamespace extends XmpGoogleNamespace { - XmpGImageNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.gImage); + XmpGImageNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.gImage); @override List> get dataProps => [ diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart b/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart index 77c0530c3..168d92ddb 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart @@ -1,8 +1,8 @@ -import 'package:aves/utils/xmp_utils.dart'; +import 'package:aves/ref/metadata/xmp.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; class XmpCreatorAtom extends XmpNamespace { - XmpCreatorAtom({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.creatorAtom); + XmpCreatorAtom({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.creatorAtom); @override late final List cards = [ @@ -11,7 +11,7 @@ class XmpCreatorAtom extends XmpNamespace { } class XmpDarktableNamespace extends XmpNamespace { - XmpDarktableNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.darktable); + XmpDarktableNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.darktable); @override late final List cards = [ @@ -20,7 +20,7 @@ class XmpDarktableNamespace extends XmpNamespace { } class XmpDwcNamespace extends XmpNamespace { - XmpDwcNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.dwc); + XmpDwcNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.dwc); @override late final List cards = [ @@ -37,7 +37,7 @@ class XmpDwcNamespace extends XmpNamespace { } class XmpIptcCoreNamespace extends XmpNamespace { - XmpIptcCoreNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.iptc4xmpCore); + XmpIptcCoreNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.iptc4xmpCore); @override late final List cards = [ @@ -46,7 +46,7 @@ class XmpIptcCoreNamespace extends XmpNamespace { } class XmpIptc4xmpExtNamespace extends XmpNamespace { - XmpIptc4xmpExtNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.iptc4xmpExt); + XmpIptc4xmpExtNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.iptc4xmpExt); @override late final List cards = [ @@ -55,7 +55,7 @@ class XmpIptc4xmpExtNamespace extends XmpNamespace { } class XmpMPNamespace extends XmpNamespace { - XmpMPNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.mp); + XmpMPNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.mp); @override late final List cards = [ @@ -65,7 +65,7 @@ class XmpMPNamespace extends XmpNamespace { // cf www.metadataworkinggroup.org/pdf/mwg_guidance.pdf (down, as of 2021/02/15) class XmpMgwRegionsNamespace extends XmpNamespace { - XmpMgwRegionsNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.mwgrs); + XmpMgwRegionsNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.mwgrs); @override late final List cards = [ @@ -75,7 +75,7 @@ class XmpMgwRegionsNamespace extends XmpNamespace { } class XmpPlusNamespace extends XmpNamespace { - XmpPlusNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.plus); + XmpPlusNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.plus); @override late final List cards = [ @@ -86,7 +86,7 @@ class XmpPlusNamespace extends XmpNamespace { } class XmpMMNamespace extends XmpNamespace { - XmpMMNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.xmpMM); + XmpMMNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.xmpMM); @override late final List cards = [ @@ -104,7 +104,7 @@ class XmpMMNamespace extends XmpNamespace { } class XmpXperiaCameraNamespace extends XmpNamespace { - XmpXperiaCameraNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.xperiaCamera); + XmpXperiaCameraNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.xperiaCamera); @override late final List cards = [ diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart b/lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart index da01fd4f3..5449a896f 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart @@ -1,9 +1,9 @@ -import 'package:aves/utils/xmp_utils.dart'; +import 'package:aves/ref/metadata/xmp.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; // cf https://github.com/adobe/xmp-docs/blob/master/XMPNamespaces/photoshop.md class XmpPhotoshopNamespace extends XmpNamespace { - XmpPhotoshopNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.photoshop); + XmpPhotoshopNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.photoshop); @override late final List cards = [ diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart b/lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart index 5ff5ed4eb..b67df3ac6 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart @@ -1,10 +1,10 @@ -import 'package:aves/ref/exif.dart'; -import 'package:aves/utils/xmp_utils.dart'; +import 'package:aves/ref/metadata/exif.dart'; +import 'package:aves/ref/metadata/xmp.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; // cf https://github.com/adobe/xmp-docs/blob/master/XMPNamespaces/tiff.md class XmpTiffNamespace extends XmpNamespace { - XmpTiffNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.tiff); + XmpTiffNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.tiff); @override String formatValue(XmpProp prop) { diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart b/lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart index 78e874750..6bdf34d26 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart @@ -1,12 +1,12 @@ import 'package:aves/ref/mime_types.dart'; -import 'package:aves/utils/xmp_utils.dart'; +import 'package:aves/ref/metadata/xmp.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/viewer/info/common.dart'; import 'package:aves/widgets/viewer/info/embedded/notifications.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; class XmpBasicNamespace extends XmpNamespace { - XmpBasicNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: Namespaces.xmp); + XmpBasicNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.xmp); @override late final List cards = [ @@ -19,9 +19,9 @@ class XmpBasicNamespace extends XmpNamespace { linkText: (context) => context.l10n.viewerInfoOpenLinkText, onTap: (context) => OpenEmbeddedDataNotification.xmp( props: [ - const [Namespaces.xmp, 'Thumbnails'], + const [XmpNamespaces.xmp, 'Thumbnails'], index, - const [Namespaces.xmpGImg, 'image'], + const [XmpNamespaces.xmpGImg, 'image'], ], mimeType: MimeTypes.jpeg, ).dispatch(context), diff --git a/lib/widgets/viewer/overlay/slideshow_buttons.dart b/lib/widgets/viewer/overlay/slideshow_buttons.dart index e9b909ba7..bb42659a2 100644 --- a/lib/widgets/viewer/overlay/slideshow_buttons.dart +++ b/lib/widgets/viewer/overlay/slideshow_buttons.dart @@ -1,5 +1,5 @@ -import 'package:aves/model/actions/slideshow.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; import 'package:aves/widgets/viewer/controls/intents.dart'; diff --git a/lib/widgets/viewer/overlay/video/controls.dart b/lib/widgets/viewer/overlay/video/controls.dart index 1462714c4..e3f41e9ce 100644 --- a/lib/widgets/viewer/overlay/video/controls.dart +++ b/lib/widgets/viewer/overlay/video/controls.dart @@ -1,6 +1,6 @@ -import 'package:aves/model/actions/entry.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/action_controls/togglers/play.dart'; import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; import 'package:aves_model/aves_model.dart'; diff --git a/lib/widgets/viewer/overlay/video/video.dart b/lib/widgets/viewer/overlay/video/video.dart index b61778e96..5272fa414 100644 --- a/lib/widgets/viewer/overlay/video/video.dart +++ b/lib/widgets/viewer/overlay/video/video.dart @@ -1,7 +1,7 @@ import 'dart:async'; -import 'package:aves/model/actions/entry.dart'; import 'package:aves/model/entry/entry.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; import 'package:aves/widgets/viewer/overlay/video/controls.dart'; import 'package:aves/widgets/viewer/overlay/video/progress_bar.dart'; diff --git a/lib/widgets/viewer/overlay/viewer_buttons.dart b/lib/widgets/viewer/overlay/viewer_buttons.dart index 7ec33de15..fbb31c322 100644 --- a/lib/widgets/viewer/overlay/viewer_buttons.dart +++ b/lib/widgets/viewer/overlay/viewer_buttons.dart @@ -1,7 +1,6 @@ import 'dart:math'; import 'package:aves/app_mode.dart'; -import 'package:aves/model/actions/entry.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/multipage.dart'; import 'package:aves/model/entry/extensions/props.dart'; @@ -9,6 +8,7 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/move_button.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/rate_button.dart'; import 'package:aves/widgets/common/action_controls/quick_choosers/share_button.dart'; diff --git a/lib/widgets/viewer/overlay/wallpaper_buttons.dart b/lib/widgets/viewer/overlay/wallpaper_buttons.dart index 3d949f033..2ff880700 100644 --- a/lib/widgets/viewer/overlay/wallpaper_buttons.dart +++ b/lib/widgets/viewer/overlay/wallpaper_buttons.dart @@ -5,7 +5,7 @@ import 'dart:ui' as ui; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/images.dart'; import 'package:aves/model/entry/extensions/props.dart'; -import 'package:aves/model/wallpaper_target.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:aves/services/wallpaper_service.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; diff --git a/lib/widgets/viewer/visual/entry_page_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart index 79f91230f..30bf70574 100644 --- a/lib/widgets/viewer/visual/entry_page_view.dart +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'package:aves/app_mode.dart'; -import 'package:aves/model/actions/entry.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/props.dart'; import 'package:aves/model/settings/enums/accessibility_animations.dart'; @@ -9,6 +8,7 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/services/media/media_session_service.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/basic/insets.dart'; import 'package:aves/widgets/viewer/controls/controller.dart'; diff --git a/plugins/aves_model/lib/aves_model.dart b/plugins/aves_model/lib/aves_model.dart index 3af8b82eb..f03a09657 100644 --- a/plugins/aves_model/lib/aves_model.dart +++ b/plugins/aves_model/lib/aves_model.dart @@ -12,6 +12,13 @@ export 'src/actions/share.dart'; export 'src/actions/slideshow.dart'; export 'src/entry/base.dart'; export 'src/metadata/enums.dart'; +export 'src/metadata/fields.dart'; export 'src/settings/enums.dart'; +export 'src/source/album.dart'; +export 'src/source/enums.dart'; +export 'src/source/vault.dart'; +export 'src/storage/relative_dir.dart'; +export 'src/storage/volume.dart'; export 'src/video/keys.dart'; export 'src/video/stream_types.dart'; +export 'src/wallpaper_target.dart'; diff --git a/plugins/aves_model/lib/src/metadata/enums.dart b/plugins/aves_model/lib/src/metadata/enums.dart index ad1641fae..7e933d5b2 100644 --- a/plugins/aves_model/lib/src/metadata/enums.dart +++ b/plugins/aves_model/lib/src/metadata/enums.dart @@ -46,3 +46,25 @@ enum MetadataType { // XMP: https://en.wikipedia.org/wiki/Extensible_Metadata_Platform xmp, } + +class MetadataTypes { + static const main = { + MetadataType.exif, + MetadataType.xmp, + }; + + static const common = { + MetadataType.exif, + MetadataType.xmp, + MetadataType.comment, + MetadataType.iccProfile, + MetadataType.iptc, + MetadataType.photoshopIrb, + }; + + static const jpeg = { + MetadataType.jfif, + MetadataType.jpegAdobe, + MetadataType.jpegDucky, + }; +} diff --git a/plugins/aves_model/lib/src/metadata/fields.dart b/plugins/aves_model/lib/src/metadata/fields.dart new file mode 100644 index 000000000..29c7ca15b --- /dev/null +++ b/plugins/aves_model/lib/src/metadata/fields.dart @@ -0,0 +1,80 @@ +enum MetadataField { + exifDate, + exifDateOriginal, + exifDateDigitized, + exifGpsAltitude, + exifGpsAltitudeRef, + exifGpsAreaInformation, + exifGpsDatestamp, + exifGpsDestBearing, + exifGpsDestBearingRef, + exifGpsDestDistance, + exifGpsDestDistanceRef, + exifGpsDestLatitude, + exifGpsDestLatitudeRef, + exifGpsDestLongitude, + exifGpsDestLongitudeRef, + exifGpsDifferential, + exifGpsDOP, + exifGpsHPositioningError, + exifGpsImgDirection, + exifGpsImgDirectionRef, + exifGpsLatitude, + exifGpsLatitudeRef, + exifGpsLongitude, + exifGpsLongitudeRef, + exifGpsMapDatum, + exifGpsMeasureMode, + exifGpsProcessingMethod, + exifGpsSatellites, + exifGpsSpeed, + exifGpsSpeedRef, + exifGpsStatus, + exifGpsTimestamp, + exifGpsTrack, + exifGpsTrackRef, + exifGpsVersionId, + exifImageDescription, + exifUserComment, + mp4GpsCoordinates, + mp4RotationDegrees, + mp4Xmp, + xmpXmpCreateDate, +} + +class MetadataFields { + static const Set exifGpsFields = { + MetadataField.exifGpsAltitude, + MetadataField.exifGpsAltitudeRef, + MetadataField.exifGpsAreaInformation, + MetadataField.exifGpsDatestamp, + MetadataField.exifGpsDestBearing, + MetadataField.exifGpsDestBearingRef, + MetadataField.exifGpsDestDistance, + MetadataField.exifGpsDestDistanceRef, + MetadataField.exifGpsDestLatitude, + MetadataField.exifGpsDestLatitudeRef, + MetadataField.exifGpsDestLongitude, + MetadataField.exifGpsDestLongitudeRef, + MetadataField.exifGpsDifferential, + MetadataField.exifGpsDOP, + MetadataField.exifGpsHPositioningError, + MetadataField.exifGpsImgDirection, + MetadataField.exifGpsImgDirectionRef, + MetadataField.exifGpsLatitude, + MetadataField.exifGpsLatitudeRef, + MetadataField.exifGpsLongitude, + MetadataField.exifGpsLongitudeRef, + MetadataField.exifGpsMapDatum, + MetadataField.exifGpsMeasureMode, + MetadataField.exifGpsProcessingMethod, + MetadataField.exifGpsSatellites, + MetadataField.exifGpsSpeed, + MetadataField.exifGpsSpeedRef, + MetadataField.exifGpsStatus, + MetadataField.exifGpsTimestamp, + MetadataField.exifGpsTrack, + MetadataField.exifGpsTrackRef, + MetadataField.exifGpsVersionId, + }; +} diff --git a/plugins/aves_model/lib/src/source/album.dart b/plugins/aves_model/lib/src/source/album.dart new file mode 100644 index 000000000..1520e8b3f --- /dev/null +++ b/plugins/aves_model/lib/src/source/album.dart @@ -0,0 +1,10 @@ +enum AlbumType { + regular, + vault, + app, + camera, + download, + screenRecordings, + screenshots, + videoCaptures, +} diff --git a/lib/model/source/enums/enums.dart b/plugins/aves_model/lib/src/source/enums.dart similarity index 73% rename from lib/model/source/enums/enums.dart rename to plugins/aves_model/lib/src/source/enums.dart index e856f30f7..de1b1faef 100644 --- a/lib/model/source/enums/enums.dart +++ b/plugins/aves_model/lib/src/source/enums.dart @@ -9,14 +9,3 @@ enum EntrySortFactor { date, name, rating, size } enum EntryGroupFactor { none, album, month, day } enum TileLayout { mosaic, grid, list } - -enum AlbumType { - regular, - vault, - app, - camera, - download, - screenRecordings, - screenshots, - videoCaptures, -} diff --git a/plugins/aves_model/lib/src/source/vault.dart b/plugins/aves_model/lib/src/source/vault.dart new file mode 100644 index 000000000..b56094861 --- /dev/null +++ b/plugins/aves_model/lib/src/source/vault.dart @@ -0,0 +1 @@ +enum VaultLockType { system, pattern, pin, password } diff --git a/plugins/aves_model/lib/src/storage/relative_dir.dart b/plugins/aves_model/lib/src/storage/relative_dir.dart new file mode 100644 index 000000000..393178f25 --- /dev/null +++ b/plugins/aves_model/lib/src/storage/relative_dir.dart @@ -0,0 +1,29 @@ +import 'package:equatable/equatable.dart'; +import 'package:meta/meta.dart'; + +@immutable +class VolumeRelativeDirectory extends Equatable { + final String volumePath, relativeDir; + + @override + List get props => [volumePath, relativeDir]; + + String get dirPath => '$volumePath$relativeDir'; + + const VolumeRelativeDirectory({ + required this.volumePath, + required this.relativeDir, + }); + + static VolumeRelativeDirectory fromMap(Map map) { + return VolumeRelativeDirectory( + volumePath: map['volumePath'] ?? '', + relativeDir: map['relativeDir'] ?? '', + ); + } + + Map toMap() => { + 'volumePath': volumePath, + 'relativeDir': relativeDir, + }; +} diff --git a/plugins/aves_model/lib/src/storage/volume.dart b/plugins/aves_model/lib/src/storage/volume.dart new file mode 100644 index 000000000..ff6df3dd8 --- /dev/null +++ b/plugins/aves_model/lib/src/storage/volume.dart @@ -0,0 +1,31 @@ +import 'package:equatable/equatable.dart'; +import 'package:meta/meta.dart'; + +@immutable +class StorageVolume extends Equatable { + final String? description; + final String path, state; + final bool isPrimary, isRemovable; + + @override + List get props => [description, path, state, isPrimary, isRemovable]; + + const StorageVolume({ + required this.description, + required this.isPrimary, + required this.isRemovable, + required this.path, + required this.state, + }); + + factory StorageVolume.fromMap(Map map) { + final isPrimary = map['isPrimary'] ?? false; + return StorageVolume( + description: map['description'], + isPrimary: isPrimary, + isRemovable: map['isRemovable'] ?? false, + path: map['path'] ?? '', + state: map['state'] ?? '', + ); + } +} diff --git a/plugins/aves_model/lib/src/wallpaper_target.dart b/plugins/aves_model/lib/src/wallpaper_target.dart new file mode 100644 index 000000000..210a363c0 --- /dev/null +++ b/plugins/aves_model/lib/src/wallpaper_target.dart @@ -0,0 +1 @@ +enum WallpaperTarget { home, lock, homeLock } diff --git a/plugins/aves_model/pubspec.lock b/plugins/aves_model/pubspec.lock index 6e38c33fc..41f11e800 100644 --- a/plugins/aves_model/pubspec.lock +++ b/plugins/aves_model/pubspec.lock @@ -17,6 +17,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.17.0" + equatable: + dependency: "direct main" + description: + name: equatable + sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + url: "https://pub.dev" + source: hosted + version: "2.0.5" flutter: dependency: "direct main" description: flutter @@ -55,7 +63,7 @@ packages: source: hosted version: "0.2.0" meta: - dependency: transitive + dependency: "direct main" description: name: meta sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" diff --git a/plugins/aves_model/pubspec.yaml b/plugins/aves_model/pubspec.yaml index 440c3befc..914e259db 100644 --- a/plugins/aves_model/pubspec.yaml +++ b/plugins/aves_model/pubspec.yaml @@ -8,6 +8,8 @@ environment: dependencies: flutter: sdk: flutter + equatable: + meta: dev_dependencies: flutter_lints: diff --git a/plugins/aves_video/pubspec.lock b/plugins/aves_video/pubspec.lock index 3902a0a45..1e86a4ad9 100644 --- a/plugins/aves_video/pubspec.lock +++ b/plugins/aves_video/pubspec.lock @@ -24,6 +24,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.17.0" + equatable: + dependency: transitive + description: + name: equatable + sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + url: "https://pub.dev" + source: hosted + version: "2.0.5" flutter: dependency: "direct main" description: flutter diff --git a/pubspec.lock b/pubspec.lock index 4225be180..af697d73b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -910,10 +910,10 @@ packages: dependency: "direct main" description: name: pdf - sha256: "6cd57e8e6d052bd1078f18e0dc7cd6701fad6288231c1ce99d66ef5034d14e61" + sha256: "586d3debf5432e5377044754032cfa53ab45e9abf371d4865e9ad5019570e246" url: "https://pub.dev" source: hosted - version: "3.9.0" + version: "3.10.1" percent_indicator: dependency: "direct main" description: @@ -1022,10 +1022,10 @@ packages: dependency: "direct main" description: name: printing - sha256: fe654363cd0114b50a0815b24e96957c7e9a60eb4e3b7ccfe71cf3f2b7114cb2 + sha256: c5c19dd852e95aa140141df13fa304f079a20c4a14a66de5275a0f811240aeec url: "https://pub.dev" source: hosted - version: "5.10.1" + version: "5.10.3" process: dependency: transitive description: diff --git a/test/fake/storage_service.dart b/test/fake/storage_service.dart index 428caa5be..6c90bdb55 100644 --- a/test/fake/storage_service.dart +++ b/test/fake/storage_service.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/storage/volume.dart'; +import 'package:aves_model/aves_model.dart'; import 'package:aves/services/storage_service.dart'; import 'package:flutter/foundation.dart'; import 'package:test/fake.dart'; diff --git a/test/utils/xmp_utils_test.dart b/test/utils/xmp_utils_test.dart index 84197b9c1..0374f1467 100644 --- a/test/utils/xmp_utils_test.dart +++ b/test/utils/xmp_utils_test.dart @@ -1,4 +1,5 @@ import 'package:aves/model/entry/extensions/metadata_edition.dart'; +import 'package:aves/ref/metadata/xmp.dart'; import 'package:aves/utils/xmp_utils.dart'; import 'package:test/test.dart'; import 'package:xml/xml.dart'; @@ -16,9 +17,9 @@ void main() { List _getDescriptions(String xmpString) { final xmpDoc = XmlDocument.parse(xmpString); final root = xmpDoc.rootElement; - final rdf = root.getElement(XMP.rdfRoot, namespace: Namespaces.rdf); + final rdf = root.getElement(XmpElements.rdfRoot, namespace: XmpNamespaces.rdf); return rdf!.children.where((node) { - return node is XmlElement && node.name.local == XMP.rdfDescription && node.name.namespaceUri == Namespaces.rdf; + return node is XmlElement && node.name.local == XmpElements.rdfDescription && node.name.namespaceUri == XmpNamespaces.rdf; }).toList(); } @@ -133,9 +134,9 @@ void main() { '''; test('Get string', () async { - expect(XMP.getString(_getDescriptions(inRatingAttribute), XMP.xmpRating, namespace: Namespaces.xmp), '5'); - expect(XMP.getString(_getDescriptions(inRatingElement), XMP.xmpRating, namespace: Namespaces.xmp), '5'); - expect(XMP.getString(_getDescriptions(inSubjects), XMP.xmpRating, namespace: Namespaces.xmp), null); + expect(XMP.getString(_getDescriptions(inRatingAttribute), XmpElements.xmpRating, namespace: XmpNamespaces.xmp), '5'); + expect(XMP.getString(_getDescriptions(inRatingElement), XmpElements.xmpRating, namespace: XmpNamespaces.xmp), '5'); + expect(XMP.getString(_getDescriptions(inSubjects), XmpElements.xmpRating, namespace: XmpNamespaces.xmp), null); }); test('Set tags without existing XMP', () async { diff --git a/test_driver/driver_screenshots.dart b/test_driver/driver_screenshots.dart index 65d9730e3..12a9c1939 100644 --- a/test_driver/driver_screenshots.dart +++ b/test_driver/driver_screenshots.dart @@ -2,7 +2,6 @@ import 'package:aves/main_play.dart' as app; import 'package:aves/model/filters/favourite.dart'; import 'package:aves/model/settings/defaults.dart'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/filter_grids/countries_page.dart'; import 'package:aves_map/aves_map.dart'; diff --git a/test_driver/driver_shaders.dart b/test_driver/driver_shaders.dart index 082295da8..5c84a6e0b 100644 --- a/test_driver/driver_shaders.dart +++ b/test_driver/driver_shaders.dart @@ -3,7 +3,6 @@ import 'dart:ui'; import 'package:aves/main_play.dart' as app; import 'package:aves/model/settings/defaults.dart'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/model/source/enums/enums.dart'; import 'package:aves_map/src/style.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter_driver/driver_extension.dart';