diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/ImageFileHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/ImageFileHandler.kt index de0ee5245..82edbd66c 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/ImageFileHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/ImageFileHandler.kt @@ -27,7 +27,7 @@ class ImageFileHandler(private val activity: Activity) : MethodCallHandler { override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { "getObsoleteEntries" -> GlobalScope.launch(Dispatchers.IO) { getObsoleteEntries(call, Coresult(result)) } - "getImageEntry" -> GlobalScope.launch(Dispatchers.IO) { getImageEntry(call, Coresult(result)) } + "getEntry" -> GlobalScope.launch(Dispatchers.IO) { getEntry(call, Coresult(result)) } "getThumbnail" -> GlobalScope.launch(Dispatchers.IO) { getThumbnail(call, Coresult(result)) } "getRegion" -> GlobalScope.launch(Dispatchers.IO) { getRegion(call, Coresult(result)) } "clearSizedThumbnailDiskCache" -> { @@ -119,23 +119,23 @@ class ImageFileHandler(private val activity: Activity) : MethodCallHandler { } } - private suspend fun getImageEntry(call: MethodCall, result: MethodChannel.Result) { + private suspend fun getEntry(call: MethodCall, result: MethodChannel.Result) { val mimeType = call.argument("mimeType") // MIME type is optional val uri = call.argument("uri")?.let { Uri.parse(it) } if (uri == null) { - result.error("getImageEntry-args", "failed because of missing arguments", null) + result.error("getEntry-args", "failed because of missing arguments", null) return } val provider = getProvider(uri) if (provider == null) { - result.error("getImageEntry-provider", "failed to find provider for uri=$uri", null) + result.error("getEntry-provider", "failed to find provider for uri=$uri", null) return } provider.fetchSingle(activity, uri, mimeType, object : ImageOpCallback { override fun onSuccess(fields: FieldMap) = result.success(fields) - override fun onFailure(throwable: Throwable) = result.error("getImageEntry-failure", "failed to get entry for uri=$uri", throwable.message) + override fun onFailure(throwable: Throwable) = result.error("getEntry-failure", "failed to get entry for uri=$uri", throwable.message) }) } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageOpStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageOpStreamHandler.kt index 503fad11e..de45c8817 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageOpStreamHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageOpStreamHandler.kt @@ -5,7 +5,7 @@ import android.net.Uri import android.os.Handler import android.os.Looper import android.util.Log -import deckers.thibault.aves.model.AvesImageEntry +import deckers.thibault.aves.model.AvesEntry import deckers.thibault.aves.model.provider.FieldMap import deckers.thibault.aves.model.provider.ImageProvider.ImageOpCallback import deckers.thibault.aves.model.provider.ImageProviderFactory.getProvider @@ -102,7 +102,7 @@ class ImageOpStreamHandler(private val context: Context, private val arguments: } destinationDir = StorageUtils.ensureTrailingSeparator(destinationDir) - val entries = entryMapList.map(::AvesImageEntry) + val entries = entryMapList.map(::AvesEntry) provider.moveMultiple(context, copy, destinationDir, entries, object : ImageOpCallback { override fun onSuccess(fields: FieldMap) = success(fields) override fun onFailure(throwable: Throwable) = error("move-failure", "failed to move entries", throwable) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesImageEntry.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt similarity index 91% rename from android/app/src/main/kotlin/deckers/thibault/aves/model/AvesImageEntry.kt rename to android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt index 06adb5d03..e942c2722 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesImageEntry.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt @@ -3,7 +3,7 @@ package deckers.thibault.aves.model import android.net.Uri import deckers.thibault.aves.model.provider.FieldMap -class AvesImageEntry(map: FieldMap) { +class AvesEntry(map: FieldMap) { val uri: Uri = Uri.parse(map["uri"] as String) // content or file URI val path = map["path"] as String? // best effort to get local path val mimeType = map["mimeType"] as String diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceImageEntry.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceEntry.kt similarity index 99% rename from android/app/src/main/kotlin/deckers/thibault/aves/model/SourceImageEntry.kt rename to android/app/src/main/kotlin/deckers/thibault/aves/model/SourceEntry.kt index 2e963ae6a..a482087ac 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceImageEntry.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceEntry.kt @@ -31,7 +31,7 @@ import deckers.thibault.aves.utils.StorageUtils import org.beyka.tiffbitmapfactory.TiffBitmapFactory import java.io.IOException -class SourceImageEntry { +class SourceEntry { val uri: Uri // content or file URI var path: String? = null // best effort to get local path private val sourceMimeType: String @@ -119,7 +119,7 @@ class SourceImageEntry { // metadata retrieval // expects entry with: uri, mimeType // finds: width, height, orientation/rotation, date, title, duration - fun fillPreCatalogMetadata(context: Context): SourceImageEntry { + fun fillPreCatalogMetadata(context: Context): SourceEntry { if (isSvg) return this if (isVideo) { fillVideoByMediaMetadataRetriever(context) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ContentImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ContentImageProvider.kt index 006e61e2f..96b49e980 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ContentImageProvider.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ContentImageProvider.kt @@ -3,7 +3,7 @@ package deckers.thibault.aves.model.provider import android.content.Context import android.net.Uri import android.provider.MediaStore -import deckers.thibault.aves.model.SourceImageEntry +import deckers.thibault.aves.model.SourceEntry internal class ContentImageProvider : ImageProvider() { override suspend fun fetchSingle(context: Context, uri: Uri, mimeType: String?, callback: ImageOpCallback) { @@ -28,7 +28,7 @@ internal class ContentImageProvider : ImageProvider() { return } - val entry = SourceImageEntry(map).fillPreCatalogMetadata(context) + val entry = SourceEntry(map).fillPreCatalogMetadata(context) if (entry.isSized || entry.isSvg) { callback.onSuccess(entry.toMap()) } else { diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/FileImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/FileImageProvider.kt index f47adb072..7a08724bf 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/FileImageProvider.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/FileImageProvider.kt @@ -2,7 +2,7 @@ package deckers.thibault.aves.model.provider import android.content.Context import android.net.Uri -import deckers.thibault.aves.model.SourceImageEntry +import deckers.thibault.aves.model.SourceEntry import java.io.File internal class FileImageProvider : ImageProvider() { @@ -12,7 +12,7 @@ internal class FileImageProvider : ImageProvider() { return } - val entry = SourceImageEntry(uri, mimeType) + val entry = SourceEntry(uri, mimeType) val path = uri.path if (path != null) { diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt index 8814ee5c7..fd8421607 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt @@ -8,7 +8,7 @@ import android.provider.MediaStore import android.util.Log import androidx.exifinterface.media.ExifInterface import com.commonsware.cwac.document.DocumentFileCompat -import deckers.thibault.aves.model.AvesImageEntry +import deckers.thibault.aves.model.AvesEntry import deckers.thibault.aves.model.ExifOrientationOp import deckers.thibault.aves.utils.LogUtils import deckers.thibault.aves.utils.MimeTypes.isImage @@ -32,7 +32,7 @@ abstract class ImageProvider { throw UnsupportedOperationException() } - open suspend fun moveMultiple(context: Context, copy: Boolean, destinationDir: String, entries: List, callback: ImageOpCallback) { + open suspend fun moveMultiple(context: Context, copy: Boolean, destinationDir: String, entries: List, callback: ImageOpCallback) { callback.onFailure(UnsupportedOperationException()) } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt index 7329453a0..f06b5ea04 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt @@ -8,8 +8,8 @@ import android.os.Build import android.provider.MediaStore import android.util.Log import com.commonsware.cwac.document.DocumentFileCompat -import deckers.thibault.aves.model.AvesImageEntry -import deckers.thibault.aves.model.SourceImageEntry +import deckers.thibault.aves.model.AvesEntry +import deckers.thibault.aves.model.SourceEntry import deckers.thibault.aves.utils.LogUtils import deckers.thibault.aves.utils.MimeTypes import deckers.thibault.aves.utils.MimeTypes.isImage @@ -158,7 +158,7 @@ class MediaStoreImageProvider : ImageProvider() { // missing some attributes such as width, height, orientation. // Also, the reported size of raw images is inconsistent across devices // and Android versions (sometimes the raw size, sometimes the decoded size). - val entry = SourceImageEntry(entryMap).fillPreCatalogMetadata(context) + val entry = SourceEntry(entryMap).fillPreCatalogMetadata(context) entryMap = entry.toMap() } @@ -203,7 +203,7 @@ class MediaStoreImageProvider : ImageProvider() { context: Context, copy: Boolean, destinationDir: String, - entries: List, + entries: List, callback: ImageOpCallback, ) { val destinationDirDocFile = createDirectoryIfAbsent(context, destinationDir) diff --git a/lib/model/image_entry.dart b/lib/model/entry.dart similarity index 98% rename from lib/model/image_entry.dart rename to lib/model/entry.dart index 121be5731..6d3588236 100644 --- a/lib/model/image_entry.dart +++ b/lib/model/entry.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:aves/model/entry_cache.dart'; import 'package:aves/model/favourite_repo.dart'; -import 'package:aves/model/image_metadata.dart'; +import 'package:aves/model/metadata.dart'; import 'package:aves/model/metadata_db.dart'; import 'package:aves/model/multipage.dart'; import 'package:aves/services/image_file_service.dart'; @@ -21,7 +21,7 @@ import 'package:path/path.dart' as ppath; import '../ref/mime_types.dart'; -class ImageEntry { +class AvesEntry { String uri; String _path, _directory, _filename, _extension; int page, contentId; @@ -45,7 +45,7 @@ class ImageEntry { // TODO TLAD make it dynamic if it depends on OS/lib versions static const List undecodable = [MimeTypes.crw, MimeTypes.psd]; - ImageEntry({ + AvesEntry({ this.uri, String path, this.contentId, @@ -69,14 +69,14 @@ class ImageEntry { bool get canHaveAlpha => MimeTypes.alphaImages.contains(mimeType); - ImageEntry copyWith({ + AvesEntry copyWith({ @required String uri, @required String path, @required int contentId, @required int dateModifiedSecs, }) { final copyContentId = contentId ?? this.contentId; - final copied = ImageEntry( + final copied = AvesEntry( uri: uri ?? uri, path: path ?? this.path, contentId: copyContentId, @@ -96,7 +96,7 @@ class ImageEntry { return copied; } - ImageEntry getPageEntry({ + AvesEntry getPageEntry({ @required MultiPageInfo multiPageInfo, @required int page, }) { @@ -126,8 +126,8 @@ class ImageEntry { } // from DB or platform source entry - factory ImageEntry.fromMap(Map map) { - return ImageEntry( + factory AvesEntry.fromMap(Map map) { + return AvesEntry( uri: map['uri'] as String, path: map['path'] as String, contentId: map['contentId'] as int, @@ -619,7 +619,7 @@ class ImageEntry { // compare by: // 1) title ascending // 2) extension ascending - static int compareByName(ImageEntry a, ImageEntry b) { + static int compareByName(AvesEntry a, AvesEntry b) { final c = compareAsciiUpperCase(a.bestTitle, b.bestTitle); return c != 0 ? c : compareAsciiUpperCase(a.extension, b.extension); } @@ -627,7 +627,7 @@ class ImageEntry { // compare by: // 1) size descending // 2) name ascending - static int compareBySize(ImageEntry a, ImageEntry b) { + static int compareBySize(AvesEntry a, AvesEntry b) { final c = b.sizeBytes.compareTo(a.sizeBytes); return c != 0 ? c : compareByName(a, b); } @@ -637,7 +637,7 @@ class ImageEntry { // compare by: // 1) date descending // 2) name ascending - static int compareByDate(ImageEntry a, ImageEntry b) { + static int compareByDate(AvesEntry a, AvesEntry b) { final c = (b.bestDate ?? _epoch).compareTo(a.bestDate ?? _epoch); return c != 0 ? c : compareByName(a, b); } diff --git a/lib/model/entry_images.dart b/lib/model/entry_images.dart index 74214c382..85bd93828 100644 --- a/lib/model/entry_images.dart +++ b/lib/model/entry_images.dart @@ -4,11 +4,11 @@ import 'dart:ui'; import 'package:aves/image_providers/region_provider.dart'; import 'package:aves/image_providers/thumbnail_provider.dart'; import 'package:aves/image_providers/uri_image_provider.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; -extension ExtraAvesEntry on ImageEntry { +extension ExtraAvesEntry on AvesEntry { ThumbnailProvider getThumbnail({double extent = 0}) => ThumbnailProvider(_getThumbnailProviderKey(extent)); ThumbnailProviderKey _getThumbnailProviderKey(double extent) { diff --git a/lib/model/favourite_repo.dart b/lib/model/favourite_repo.dart index d138de273..78daf8883 100644 --- a/lib/model/favourite_repo.dart +++ b/lib/model/favourite_repo.dart @@ -1,5 +1,5 @@ -import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/image_metadata.dart'; +import 'package:aves/model/entry.dart'; +import 'package:aves/model/metadata.dart'; import 'package:aves/model/metadata_db.dart'; import 'package:aves/utils/change_notifier.dart'; @@ -18,25 +18,25 @@ class FavouriteRepo { int get count => _rows.length; - bool isFavourite(ImageEntry entry) => _rows.any((row) => row.contentId == entry.contentId); + bool isFavourite(AvesEntry entry) => _rows.any((row) => row.contentId == entry.contentId); - FavouriteRow _entryToRow(ImageEntry entry) => FavouriteRow(contentId: entry.contentId, path: entry.path); + FavouriteRow _entryToRow(AvesEntry entry) => FavouriteRow(contentId: entry.contentId, path: entry.path); - Future add(Iterable entries) async { + Future add(Iterable entries) async { final newRows = entries.map(_entryToRow); await metadataDb.addFavourites(newRows); _rows.addAll(newRows); changeNotifier.notifyListeners(); } - Future remove(Iterable entries) async { + Future remove(Iterable entries) async { final removedRows = entries.map(_entryToRow); await metadataDb.removeFavourites(removedRows); removedRows.forEach(_rows.remove); changeNotifier.notifyListeners(); } - Future move(int oldContentId, ImageEntry entry) async { + Future move(int oldContentId, AvesEntry entry) async { final oldRow = _rows.firstWhere((row) => row.contentId == oldContentId, orElse: () => null); if (oldRow != null) { _rows.remove(oldRow); diff --git a/lib/model/filters/album.dart b/lib/model/filters/album.dart index 82f3bcc56..1ab6ce062 100644 --- a/lib/model/filters/album.dart +++ b/lib/model/filters/album.dart @@ -1,6 +1,6 @@ import 'package:aves/image_providers/app_icon_image_provider.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/common/identity/aves_icons.dart'; @@ -33,7 +33,7 @@ class AlbumFilter extends CollectionFilter { }; @override - bool filter(ImageEntry entry) => entry.directory == album; + bool filter(AvesEntry entry) => entry.directory == album; @override String get label => uniqueName ?? album.split(separator).last; diff --git a/lib/model/filters/favourite.dart b/lib/model/filters/favourite.dart index d4e9716c1..c64326959 100644 --- a/lib/model/filters/favourite.dart +++ b/lib/model/filters/favourite.dart @@ -1,5 +1,5 @@ +import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -13,7 +13,7 @@ class FavouriteFilter extends CollectionFilter { }; @override - bool filter(ImageEntry entry) => entry.isFavourite; + bool filter(AvesEntry entry) => entry.isFavourite; @override String get label => 'Favourite'; diff --git a/lib/model/filters/filters.dart b/lib/model/filters/filters.dart index e70f39dd8..a3e985302 100644 --- a/lib/model/filters/filters.dart +++ b/lib/model/filters/filters.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/favourite.dart'; import 'package:aves/model/filters/location.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/filters/query.dart'; import 'package:aves/model/filters/tag.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:aves/utils/color_utils.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; @@ -49,7 +49,7 @@ abstract class CollectionFilter implements Comparable { String toJson() => jsonEncode(toMap()); - bool filter(ImageEntry entry); + bool filter(AvesEntry entry); bool get isUnique => true; @@ -78,7 +78,7 @@ abstract class CollectionFilter implements Comparable { // TODO TLAD replace this by adding getters to CollectionFilter, with cached entry/count coming from Source class FilterGridItem { final T filter; - final ImageEntry entry; + final AvesEntry entry; const FilterGridItem(this.filter, this.entry); diff --git a/lib/model/filters/location.dart b/lib/model/filters/location.dart index cf46da1b2..c702cf2c4 100644 --- a/lib/model/filters/location.dart +++ b/lib/model/filters/location.dart @@ -1,5 +1,5 @@ +import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; @@ -35,7 +35,7 @@ class LocationFilter extends CollectionFilter { String get countryNameAndCode => '$_location$locationSeparator$_countryCode'; @override - bool filter(ImageEntry entry) => _location.isEmpty ? !entry.isLocated : entry.isLocated && ((level == LocationLevel.country && entry.addressDetails.countryCode == _countryCode) || (level == LocationLevel.place && entry.addressDetails.place == _location)); + bool filter(AvesEntry entry) => _location.isEmpty ? !entry.isLocated : entry.isLocated && ((level == LocationLevel.country && entry.addressDetails.countryCode == _countryCode) || (level == LocationLevel.place && entry.addressDetails.place == _location)); @override String get label => _location.isEmpty ? emptyLabel : _location; diff --git a/lib/model/filters/mime.dart b/lib/model/filters/mime.dart index 2b3342140..5944c27df 100644 --- a/lib/model/filters/mime.dart +++ b/lib/model/filters/mime.dart @@ -1,5 +1,5 @@ import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/mime_utils.dart'; import 'package:flutter/foundation.dart'; @@ -15,7 +15,7 @@ class MimeFilter extends CollectionFilter { static const geotiff = 'aves/geotiff'; // subset of `image/tiff` final String mime; - bool Function(ImageEntry) _filter; + bool Function(AvesEntry) _filter; String _label; IconData _icon; @@ -67,7 +67,7 @@ class MimeFilter extends CollectionFilter { }; @override - bool filter(ImageEntry entry) => _filter(entry); + bool filter(AvesEntry entry) => _filter(entry); @override String get label => _label; diff --git a/lib/model/filters/query.dart b/lib/model/filters/query.dart index bb880cb2f..33fe221e4 100644 --- a/lib/model/filters/query.dart +++ b/lib/model/filters/query.dart @@ -1,5 +1,5 @@ +import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -12,7 +12,7 @@ class QueryFilter extends CollectionFilter { final String query; final bool colorful; - bool Function(ImageEntry) _filter; + bool Function(AvesEntry) _filter; QueryFilter(this.query, {this.colorful = true}) { var upQuery = query.toUpperCase(); @@ -44,7 +44,7 @@ class QueryFilter extends CollectionFilter { }; @override - bool filter(ImageEntry entry) => _filter(entry); + bool filter(AvesEntry entry) => _filter(entry); @override bool get isUnique => false; diff --git a/lib/model/filters/tag.dart b/lib/model/filters/tag.dart index ff9e94611..5d21f0b7f 100644 --- a/lib/model/filters/tag.dart +++ b/lib/model/filters/tag.dart @@ -1,5 +1,5 @@ +import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; @@ -24,7 +24,7 @@ class TagFilter extends CollectionFilter { }; @override - bool filter(ImageEntry entry) => tag.isEmpty ? entry.xmpSubjects.isEmpty : entry.xmpSubjects.contains(tag); + bool filter(AvesEntry entry) => tag.isEmpty ? entry.xmpSubjects.isEmpty : entry.xmpSubjects.contains(tag); @override bool get isUnique => false; diff --git a/lib/model/image_metadata.dart b/lib/model/metadata.dart similarity index 100% rename from lib/model/image_metadata.dart rename to lib/model/metadata.dart diff --git a/lib/model/metadata_db.dart b/lib/model/metadata_db.dart index 48a8b5a3b..3630f5a27 100644 --- a/lib/model/metadata_db.dart +++ b/lib/model/metadata_db.dart @@ -1,7 +1,7 @@ import 'dart:io'; -import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/image_metadata.dart'; +import 'package:aves/model/entry.dart'; +import 'package:aves/model/metadata.dart'; import 'package:aves/model/metadata_db_upgrade.dart'; import 'package:flutter/foundation.dart'; import 'package:path/path.dart'; @@ -116,16 +116,16 @@ class MetadataDb { debugPrint('$runtimeType clearEntries deleted $count entries'); } - Future> loadEntries() async { + Future> loadEntries() async { final stopwatch = Stopwatch()..start(); final db = await _database; final maps = await db.query(entryTable); - final entries = maps.map((map) => ImageEntry.fromMap(map)).toList(); + final entries = maps.map((map) => AvesEntry.fromMap(map)).toList(); debugPrint('$runtimeType loadEntries complete in ${stopwatch.elapsed.inMilliseconds}ms for ${entries.length} entries'); return entries; } - Future saveEntries(Iterable entries) async { + Future saveEntries(Iterable entries) async { if (entries == null || entries.isEmpty) return; final stopwatch = Stopwatch()..start(); final db = await _database; @@ -135,7 +135,7 @@ class MetadataDb { debugPrint('$runtimeType saveEntries complete in ${stopwatch.elapsed.inMilliseconds}ms for ${entries.length} entries'); } - Future updateEntryId(int oldId, ImageEntry entry) async { + Future updateEntryId(int oldId, AvesEntry entry) async { final db = await _database; final batch = db.batch(); batch.delete(entryTable, where: 'contentId = ?', whereArgs: [oldId]); @@ -143,7 +143,7 @@ class MetadataDb { await batch.commit(noResult: true); } - void _batchInsertEntry(Batch batch, ImageEntry entry) { + void _batchInsertEntry(Batch batch, AvesEntry entry) { if (entry == null) return; batch.insert( entryTable, diff --git a/lib/model/multipage.dart b/lib/model/multipage.dart index 45af27276..e61bc0f8a 100644 --- a/lib/model/multipage.dart +++ b/lib/model/multipage.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:flutter/foundation.dart'; class MultiPageInfo { @@ -50,7 +50,7 @@ class SinglePageInfo { String toString() => '$runtimeType#${shortHash(this)}{mimeType=$mimeType, width=$width, height=$height, trackId=$trackId, durationMillis=$durationMillis}'; } -class AvesPageEntry extends ImageEntry { +class AvesPageEntry extends AvesEntry { final SinglePageInfo pageInfo; AvesPageEntry({ diff --git a/lib/model/source/album.dart b/lib/model/source/album.dart index 0dce9f30f..b50aa3777 100644 --- a/lib/model/source/album.dart +++ b/lib/model/source/album.dart @@ -1,5 +1,5 @@ +import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/album.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/utils/android_file_utils.dart'; @@ -50,7 +50,7 @@ mixin AlbumMixin on SourceBase { } } - Map getAlbumEntries() { + Map getAlbumEntries() { final entries = sortedEntriesForFilterList; final regularAlbums = [], appAlbums = [], specialAlbums = []; for (var album in sortedAlbums) { diff --git a/lib/model/source/collection_lens.dart b/lib/model/source/collection_lens.dart index f56893da9..de6e12bf7 100644 --- a/lib/model/source/collection_lens.dart +++ b/lib/model/source/collection_lens.dart @@ -1,9 +1,9 @@ import 'dart:async'; import 'dart:collection'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/section_keys.dart'; import 'package:aves/model/source/tag.dart'; @@ -20,10 +20,10 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel EntrySortFactor sortFactor; final AChangeNotifier filterChangeNotifier = AChangeNotifier(); - List _filteredEntries; + List _filteredEntries; List _subscriptions = []; - Map> sections = Map.unmodifiable({}); + Map> sections = Map.unmodifiable({}); CollectionLens({ @required this.source, @@ -63,9 +63,9 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel int get entryCount => _filteredEntries.length; // sorted as displayed to the user, i.e. sorted then grouped, not an absolute order on all entries - List _sortedEntries; + List _sortedEntries; - List get sortedEntries { + List get sortedEntries { _sortedEntries ??= List.of(sections.entries.expand((e) => e.value)); return _sortedEntries; } @@ -82,7 +82,7 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel return true; } - Object heroTag(ImageEntry entry) => '$hashCode${entry.uri}'; + Object heroTag(AvesEntry entry) => '$hashCode${entry.uri}'; void addFilter(CollectionFilter filter) { if (filter == null || filters.contains(filter)) return; @@ -123,13 +123,13 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel void _applySort() { switch (sortFactor) { case EntrySortFactor.date: - _filteredEntries.sort(ImageEntry.compareByDate); + _filteredEntries.sort(AvesEntry.compareByDate); break; case EntrySortFactor.size: - _filteredEntries.sort(ImageEntry.compareBySize); + _filteredEntries.sort(AvesEntry.compareBySize); break; case EntrySortFactor.name: - _filteredEntries.sort(ImageEntry.compareByName); + _filteredEntries.sort(AvesEntry.compareByName); break; } } @@ -139,13 +139,13 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel case EntrySortFactor.date: switch (groupFactor) { case EntryGroupFactor.album: - sections = groupBy(_filteredEntries, (entry) => EntryAlbumSectionKey(entry.directory)); + sections = groupBy(_filteredEntries, (entry) => EntryAlbumSectionKey(entry.directory)); break; case EntryGroupFactor.month: - sections = groupBy(_filteredEntries, (entry) => EntryDateSectionKey(entry.monthTaken)); + sections = groupBy(_filteredEntries, (entry) => EntryDateSectionKey(entry.monthTaken)); break; case EntryGroupFactor.day: - sections = groupBy(_filteredEntries, (entry) => EntryDateSectionKey(entry.dayTaken)); + sections = groupBy(_filteredEntries, (entry) => EntryDateSectionKey(entry.dayTaken)); break; case EntryGroupFactor.none: sections = Map.fromEntries([ @@ -160,8 +160,8 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel ]); break; case EntrySortFactor.name: - final byAlbum = groupBy(_filteredEntries, (entry) => EntryAlbumSectionKey(entry.directory)); - sections = SplayTreeMap>.of(byAlbum, (a, b) => source.compareAlbumsByName(a.folderPath, b.folderPath)); + final byAlbum = groupBy(_filteredEntries, (entry) => EntryAlbumSectionKey(entry.directory)); + sections = SplayTreeMap>.of(byAlbum, (a, b) => source.compareAlbumsByName(a.folderPath, b.folderPath)); break; } sections = Map.unmodifiable(sections); @@ -177,7 +177,7 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel _applyGroup(); } - void onEntryRemoved(Iterable entries) { + void onEntryRemoved(Iterable entries) { // we should remove obsolete entries and sections // but do not apply sort/group // as section order change would surprise the user while browsing @@ -207,18 +207,18 @@ mixin CollectionActivityMixin { mixin CollectionSelectionMixin on CollectionActivityMixin { final AChangeNotifier selectionChangeNotifier = AChangeNotifier(); - final Set _selection = {}; + final Set _selection = {}; - Set get selection => _selection; + Set get selection => _selection; - bool isSelected(Iterable entries) => entries.every(selection.contains); + bool isSelected(Iterable entries) => entries.every(selection.contains); - void addToSelection(Iterable entries) { + void addToSelection(Iterable entries) { _selection.addAll(entries); selectionChangeNotifier.notifyListeners(); } - void removeFromSelection(Iterable entries) { + void removeFromSelection(Iterable entries) { _selection.removeAll(entries); selectionChangeNotifier.notifyListeners(); } @@ -228,7 +228,7 @@ mixin CollectionSelectionMixin on CollectionActivityMixin { selectionChangeNotifier.notifyListeners(); } - void toggleSelection(ImageEntry entry) { + void toggleSelection(AvesEntry entry) { if (_selection.isEmpty) select(); if (!_selection.remove(entry)) _selection.add(entry); selectionChangeNotifier.notifyListeners(); diff --git a/lib/model/source/collection_source.dart b/lib/model/source/collection_source.dart index d3e669e18..da2e48710 100644 --- a/lib/model/source/collection_source.dart +++ b/lib/model/source/collection_source.dart @@ -2,8 +2,8 @@ import 'dart:async'; import 'package:aves/model/favourite_repo.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/image_metadata.dart'; +import 'package:aves/model/entry.dart'; +import 'package:aves/model/metadata.dart'; import 'package:aves/model/metadata_db.dart'; import 'package:aves/model/source/album.dart'; import 'package:aves/model/source/collection_lens.dart'; @@ -16,15 +16,15 @@ import 'package:flutter/foundation.dart'; import 'enums.dart'; mixin SourceBase { - final List _rawEntries = []; + final List _rawEntries = []; - List get rawEntries => List.unmodifiable(_rawEntries); + List get rawEntries => List.unmodifiable(_rawEntries); final EventBus _eventBus = EventBus(); EventBus get eventBus => _eventBus; - List get sortedEntriesForFilterList; + List get sortedEntriesForFilterList; final Map _filterEntryCountMap = {}; @@ -39,7 +39,7 @@ mixin SourceBase { abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagMixin { @override - List get sortedEntriesForFilterList => CollectionLens( + List get sortedEntriesForFilterList => CollectionLens( source: this, groupFactor: EntryGroupFactor.none, sortFactor: EntrySortFactor.date, @@ -55,7 +55,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM debugPrint('$runtimeType loadDates complete in ${stopwatch.elapsed.inMilliseconds}ms for ${_savedDates.length} entries'); } - void addAll(Iterable entries) { + void addAll(Iterable entries) { if (_rawEntries.isNotEmpty) { final newContentIds = entries.map((entry) => entry.contentId).toList(); _rawEntries.removeWhere((entry) => newContentIds.contains(entry.contentId)); @@ -70,7 +70,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM eventBus.fire(EntryAddedEvent()); } - void removeEntries(List entries) { + void removeEntries(List entries) { entries.forEach((entry) => entry.removeFromFavourites()); _rawEntries.removeWhere(entries.contains); cleanEmptyAlbums(entries.map((entry) => entry.directory).toSet()); @@ -91,7 +91,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM // `dateModifiedSecs` changes when moving entries to another directory, // but it does not change when renaming the containing directory - Future moveEntry(ImageEntry entry, Map newFields) async { + Future moveEntry(AvesEntry entry, Map newFields) async { final oldContentId = entry.contentId; final newContentId = newFields['contentId'] as int; final newDateModifiedSecs = newFields['dateModifiedSecs'] as int; @@ -109,7 +109,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM } void updateAfterMove({ - @required Set selection, + @required Set selection, @required bool copy, @required String destinationAlbum, @required Iterable movedOps, @@ -117,7 +117,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM if (movedOps.isEmpty) return; final fromAlbums = {}; - final movedEntries = []; + final movedEntries = []; if (copy) { movedOps.forEach((movedOp) { final sourceUri = movedOp.uri; @@ -166,25 +166,25 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM Future refresh(); - Future refreshMetadata(Set entries); + Future refreshMetadata(Set entries); } enum SourceState { loading, cataloguing, locating, ready } class EntryAddedEvent { - final ImageEntry entry; + final AvesEntry entry; const EntryAddedEvent([this.entry]); } class EntryRemovedEvent { - final Iterable entries; + final Iterable entries; const EntryRemovedEvent(this.entries); } class EntryMovedEvent { - final Iterable entries; + final Iterable entries; const EntryMovedEvent(this.entries); } diff --git a/lib/model/source/location.dart b/lib/model/source/location.dart index 6312bffeb..16de86443 100644 --- a/lib/model/source/location.dart +++ b/lib/model/source/location.dart @@ -1,8 +1,8 @@ import 'dart:math'; import 'package:aves/model/filters/location.dart'; -import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/image_metadata.dart'; +import 'package:aves/model/entry.dart'; +import 'package:aves/model/metadata.dart'; import 'package:aves/model/metadata_db.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:collection/collection.dart'; @@ -28,7 +28,7 @@ mixin LocationMixin on SourceBase { Future locateEntries() async { // final stopwatch = Stopwatch()..start(); - final byLocated = groupBy(rawEntries.where((entry) => entry.hasGps), (entry) => entry.isLocated); + final byLocated = groupBy(rawEntries.where((entry) => entry.hasGps), (entry) => entry.isLocated); final todo = byLocated[false] ?? []; if (todo.isEmpty) return; @@ -42,7 +42,7 @@ mixin LocationMixin on SourceBase { // - 652 calls (22%) when approximating to 2 decimal places (~1km - town or village) // cf https://en.wikipedia.org/wiki/Decimal_degrees#Precision final latLngFactor = pow(10, 2); - Tuple2 approximateLatLng(ImageEntry entry) { + Tuple2 approximateLatLng(AvesEntry entry) { final lat = entry.catalogMetadata?.latitude; final lng = entry.catalogMetadata?.longitude; if (lat == null || lng == null) return null; @@ -57,7 +57,7 @@ mixin LocationMixin on SourceBase { setProgress(done: progressDone, total: progressTotal); final newAddresses = []; - await Future.forEach(todo, (entry) async { + await Future.forEach(todo, (entry) async { final latLng = approximateLatLng(entry); if (knownLocations.containsKey(latLng)) { entry.addressDetails = knownLocations[latLng]?.copyWith(contentId: entry.contentId); diff --git a/lib/model/source/media_store_source.dart b/lib/model/source/media_store_source.dart index c0afae1aa..611db5974 100644 --- a/lib/model/source/media_store_source.dart +++ b/lib/model/source/media_store_source.dart @@ -1,7 +1,7 @@ import 'dart:math'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/favourite_repo.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:aves/model/metadata_db.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; @@ -55,14 +55,14 @@ class MediaStoreSource extends CollectionSource { // fetch new entries var refreshCount = 10; const refreshCountMax = 1000; - final allNewEntries = [], pendingNewEntries = []; + final allNewEntries = [], pendingNewEntries = []; void addPendingEntries() { allNewEntries.addAll(pendingNewEntries); addAll(pendingNewEntries); pendingNewEntries.clear(); } - ImageFileService.getImageEntries(knownEntryMap).listen( + ImageFileService.getEntries(knownEntryMap).listen( (entry) { pendingNewEntries.add(entry); if (pendingNewEntries.length >= refreshCount) { @@ -96,7 +96,7 @@ class MediaStoreSource extends CollectionSource { } @override - Future refreshMetadata(Set entries) { + Future refreshMetadata(Set entries) { final contentIds = entries.map((entry) => entry.contentId).toSet(); metadataDb.removeIds(contentIds, updateFavourites: false); return refresh(); diff --git a/lib/model/source/tag.dart b/lib/model/source/tag.dart index 55a1053ca..d5b1ca3c0 100644 --- a/lib/model/source/tag.dart +++ b/lib/model/source/tag.dart @@ -1,5 +1,5 @@ -import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/image_metadata.dart'; +import 'package:aves/model/entry.dart'; +import 'package:aves/model/metadata.dart'; import 'package:aves/model/metadata_db.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:collection/collection.dart'; @@ -31,7 +31,7 @@ mixin TagMixin on SourceBase { setProgress(done: progressDone, total: progressTotal); final newMetadata = []; - await Future.forEach(todo, (entry) async { + await Future.forEach(todo, (entry) async { await entry.catalog(background: true); if (entry.isCatalogued) { newMetadata.add(entry.catalogMetadata); diff --git a/lib/services/android_app_service.dart b/lib/services/android_app_service.dart index 016cffb27..4f6b6750c 100644 --- a/lib/services/android_app_service.dart +++ b/lib/services/android_app_service.dart @@ -1,6 +1,6 @@ import 'dart:typed_data'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; @@ -81,10 +81,10 @@ class AndroidAppService { return false; } - static Future shareEntries(Iterable entries) async { + static Future shareEntries(Iterable entries) async { // loosen mime type to a generic one, so we can share with badly defined apps // e.g. Google Lens declares receiving "image/jpeg" only, but it can actually handle more formats - final urisByMimeType = groupBy(entries, (e) => e.mimeTypeAnySubtype).map((k, v) => MapEntry(k, v.map((e) => e.uri).toList())); + final urisByMimeType = groupBy(entries, (e) => e.mimeTypeAnySubtype).map((k, v) => MapEntry(k, v.map((e) => e.uri).toList())); try { return await platform.invokeMethod('share', { 'title': 'Share via:', diff --git a/lib/services/android_debug_service.dart b/lib/services/android_debug_service.dart index 31392df08..3815c5df8 100644 --- a/lib/services/android_debug_service.dart +++ b/lib/services/android_debug_service.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/ref/mime_types.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; @@ -26,7 +26,7 @@ class AndroidDebugService { return {}; } - static Future getBitmapFactoryInfo(ImageEntry entry) async { + static Future getBitmapFactoryInfo(AvesEntry entry) async { try { // return map with all data available when decoding image bounds with `BitmapFactory` final result = await platform.invokeMethod('getBitmapFactoryInfo', { @@ -39,7 +39,7 @@ class AndroidDebugService { return {}; } - static Future getContentResolverMetadata(ImageEntry entry) async { + static Future getContentResolverMetadata(AvesEntry entry) async { try { // return map with all data available from the content resolver final result = await platform.invokeMethod('getContentResolverMetadata', { @@ -53,7 +53,7 @@ class AndroidDebugService { return {}; } - static Future getExifInterfaceMetadata(ImageEntry entry) async { + static Future getExifInterfaceMetadata(AvesEntry entry) async { try { // return map with all data available from the `ExifInterface` library final result = await platform.invokeMethod('getExifInterfaceMetadata', { @@ -68,7 +68,7 @@ class AndroidDebugService { return {}; } - static Future getMediaMetadataRetrieverMetadata(ImageEntry entry) async { + static Future getMediaMetadataRetrieverMetadata(AvesEntry entry) async { try { // return map with all data available from `MediaMetadataRetriever` final result = await platform.invokeMethod('getMediaMetadataRetrieverMetadata', { @@ -81,7 +81,7 @@ class AndroidDebugService { return {}; } - static Future getMetadataExtractorSummary(ImageEntry entry) async { + static Future getMetadataExtractorSummary(AvesEntry entry) async { try { // return map with the mime type and tag count for each directory found by `metadata-extractor` final result = await platform.invokeMethod('getMetadataExtractorSummary', { @@ -96,7 +96,7 @@ class AndroidDebugService { return {}; } - static Future getTiffStructure(ImageEntry entry) async { + static Future getTiffStructure(AvesEntry entry) async { if (entry.mimeType != MimeTypes.tiff) return {}; try { diff --git a/lib/services/app_shortcut_service.dart b/lib/services/app_shortcut_service.dart index 6e0bf158a..a358b5413 100644 --- a/lib/services/app_shortcut_service.dart +++ b/lib/services/app_shortcut_service.dart @@ -1,7 +1,7 @@ import 'dart:typed_data'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:aves/services/image_file_service.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; @@ -26,7 +26,7 @@ class AppShortcutService { return false; } - static Future pin(String label, ImageEntry entry, Set filters) async { + static Future pin(String label, AvesEntry entry, Set filters) async { Uint8List iconBytes; if (entry != null) { final size = entry.isVideo ? 0.0 : 256.0; diff --git a/lib/services/image_file_service.dart b/lib/services/image_file_service.dart index 80cd3fc37..af68d8bd9 100644 --- a/lib/services/image_file_service.dart +++ b/lib/services/image_file_service.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'dart:math'; import 'dart:typed_data'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/ref/mime_types.dart'; import 'package:aves/services/service_policy.dart'; import 'package:flutter/foundation.dart'; @@ -18,7 +18,7 @@ class ImageFileService { static final StreamsChannel opChannel = StreamsChannel('deckers.thibault/aves/imageopstream'); static const double thumbnailDefaultSize = 64.0; - static Map _toPlatformEntryMap(ImageEntry entry) { + static Map _toPlatformEntryMap(AvesEntry entry) { return { 'uri': entry.uri, 'path': entry.path, @@ -32,13 +32,13 @@ class ImageFileService { } // knownEntries: map of contentId -> dateModifiedSecs - static Stream getImageEntries(Map knownEntries) { + static Stream getEntries(Map knownEntries) { try { return mediaStoreChannel.receiveBroadcastStream({ 'knownEntries': knownEntries, - }).map((event) => ImageEntry.fromMap(event)); + }).map((event) => AvesEntry.fromMap(event)); } on PlatformException catch (e) { - debugPrint('getImageEntries failed with code=${e.code}, exception=${e.message}, details=${e.details}'); + debugPrint('getEntries failed with code=${e.code}, exception=${e.message}, details=${e.details}'); return Stream.error(e); } } @@ -55,16 +55,16 @@ class ImageFileService { return []; } - static Future getImageEntry(String uri, String mimeType) async { - debugPrint('getImageEntry for uri=$uri, mimeType=$mimeType'); + static Future getEntry(String uri, String mimeType) async { + debugPrint('getEntry for uri=$uri, mimeType=$mimeType'); try { - final result = await platform.invokeMethod('getImageEntry', { + final result = await platform.invokeMethod('getEntry', { 'uri': uri, 'mimeType': mimeType, }) as Map; - return ImageEntry.fromMap(result); + return AvesEntry.fromMap(result); } on PlatformException catch (e) { - debugPrint('getImageEntry failed with code=${e.code}, exception=${e.message}, details=${e.details}'); + debugPrint('getEntry failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return null; } @@ -224,7 +224,7 @@ class ImageFileService { static Future resumeLoading(Object taskKey) => servicePolicy.resume(taskKey); - static Stream delete(Iterable entries) { + static Stream delete(Iterable entries) { try { return opChannel.receiveBroadcastStream({ 'op': 'delete', @@ -236,7 +236,7 @@ class ImageFileService { } } - static Stream move(Iterable entries, {@required bool copy, @required String destinationAlbum}) { + static Stream move(Iterable entries, {@required bool copy, @required String destinationAlbum}) { try { return opChannel.receiveBroadcastStream({ 'op': 'move', @@ -250,7 +250,7 @@ class ImageFileService { } } - static Future rename(ImageEntry entry, String newName) async { + static Future rename(AvesEntry entry, String newName) async { try { // return map with: 'contentId' 'path' 'title' 'uri' (all optional) final result = await platform.invokeMethod('rename', { @@ -264,7 +264,7 @@ class ImageFileService { return {}; } - static Future rotate(ImageEntry entry, {@required bool clockwise}) async { + static Future rotate(AvesEntry entry, {@required bool clockwise}) async { try { // return map with: 'rotationDegrees' 'isFlipped' final result = await platform.invokeMethod('rotate', { @@ -278,7 +278,7 @@ class ImageFileService { return {}; } - static Future flip(ImageEntry entry) async { + static Future flip(AvesEntry entry) async { try { // return map with: 'rotationDegrees' 'isFlipped' final result = await platform.invokeMethod('flip', { diff --git a/lib/services/metadata_service.dart b/lib/services/metadata_service.dart index 9a53587c6..bb058efda 100644 --- a/lib/services/metadata_service.dart +++ b/lib/services/metadata_service.dart @@ -1,7 +1,7 @@ import 'dart:typed_data'; -import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/image_metadata.dart'; +import 'package:aves/model/entry.dart'; +import 'package:aves/model/metadata.dart'; import 'package:aves/model/multipage.dart'; import 'package:aves/model/panorama.dart'; import 'package:aves/services/service_policy.dart'; @@ -12,7 +12,7 @@ class MetadataService { static const platform = MethodChannel('deckers.thibault/aves/metadata'); // return Map> (map of directories, each directory being a map of metadata label and value description) - static Future getAllMetadata(ImageEntry entry) async { + static Future getAllMetadata(AvesEntry entry) async { if (entry.isSvg) return null; try { @@ -28,7 +28,7 @@ class MetadataService { return {}; } - static Future getCatalogMetadata(ImageEntry entry, {bool background = false}) async { + static Future getCatalogMetadata(AvesEntry entry, {bool background = false}) async { if (entry.isSvg) return null; Future call() async { @@ -65,7 +65,7 @@ class MetadataService { : call(); } - static Future getOverlayMetadata(ImageEntry entry) async { + static Future getOverlayMetadata(AvesEntry entry) async { if (entry.isSvg) return null; try { @@ -82,7 +82,7 @@ class MetadataService { return null; } - static Future getMultiPageInfo(ImageEntry entry) async { + static Future getMultiPageInfo(AvesEntry entry) async { try { final result = await platform.invokeMethod('getMultiPageInfo', { 'mimeType': entry.mimeType, @@ -95,7 +95,7 @@ class MetadataService { return null; } - static Future getPanoramaInfo(ImageEntry entry) async { + static Future getPanoramaInfo(AvesEntry entry) async { try { // return map with values for: // 'croppedAreaLeft' (int), 'croppedAreaTop' (int), 'croppedAreaWidth' (int), 'croppedAreaHeight' (int), @@ -124,7 +124,7 @@ class MetadataService { return []; } - static Future> getExifThumbnails(ImageEntry entry) async { + static Future> getExifThumbnails(AvesEntry entry) async { try { final result = await platform.invokeMethod('getExifThumbnails', { 'mimeType': entry.mimeType, @@ -138,7 +138,7 @@ class MetadataService { return []; } - static Future extractXmpDataProp(ImageEntry entry, String propPath, String propMimeType) async { + static Future extractXmpDataProp(AvesEntry entry, String propPath, String propMimeType) async { try { final result = await platform.invokeMethod('extractXmpDataProp', { 'mimeType': entry.mimeType, diff --git a/lib/services/svg_metadata_service.dart b/lib/services/svg_metadata_service.dart index 1152a74d9..b5823e7ff 100644 --- a/lib/services/svg_metadata_service.dart +++ b/lib/services/svg_metadata_service.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/services/image_file_service.dart'; import 'package:aves/utils/string_utils.dart'; import 'package:flutter/foundation.dart'; @@ -15,7 +15,7 @@ class SvgMetadataService { static const _textElements = ['title', 'desc']; static const _metadataElement = 'metadata'; - static Future getSize(ImageEntry entry) async { + static Future getSize(AvesEntry entry) async { try { final data = await ImageFileService.getSvg(entry.uri, entry.mimeType); @@ -48,7 +48,7 @@ class SvgMetadataService { return null; } - static Future>> getAllMetadata(ImageEntry entry) async { + static Future>> getAllMetadata(AvesEntry entry) async { String formatKey(String key) { switch (key) { case 'desc': diff --git a/lib/widgets/collection/entry_set_action_delegate.dart b/lib/widgets/collection/entry_set_action_delegate.dart index 2d132398d..b1f83b45a 100644 --- a/lib/widgets/collection/entry_set_action_delegate.dart +++ b/lib/widgets/collection/entry_set_action_delegate.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:aves/model/actions/collection_actions.dart'; import 'package:aves/model/actions/entry_actions.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/services/android_app_service.dart'; @@ -22,7 +22,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware CollectionSource get source => collection.source; - Set get selection => collection.selection; + Set get selection => collection.selection; EntrySetActionDelegate({ @required this.collection, diff --git a/lib/widgets/collection/grid/section_layout.dart b/lib/widgets/collection/grid/section_layout.dart index 3dad0d735..c481e2ce1 100644 --- a/lib/widgets/collection/grid/section_layout.dart +++ b/lib/widgets/collection/grid/section_layout.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/section_keys.dart'; import 'package:aves/widgets/collection/grid/headers/any.dart'; @@ -6,7 +6,7 @@ import 'package:aves/widgets/common/grid/section_layout.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -class SectionedEntryListLayoutProvider extends SectionedListLayoutProvider { +class SectionedEntryListLayoutProvider extends SectionedListLayoutProvider { final CollectionLens collection; const SectionedEntryListLayoutProvider({ @@ -14,7 +14,7 @@ class SectionedEntryListLayoutProvider extends SectionedListLayoutProvider collection.showHeaders; @override - Map> get sections => collection.sections; + Map> get sections => collection.sections; @override double getHeaderExtent(BuildContext context, SectionKey sectionKey) { diff --git a/lib/widgets/collection/grid/selector.dart b/lib/widgets/collection/grid/selector.dart index 513a7beeb..be1f48d66 100644 --- a/lib/widgets/collection/grid/selector.dart +++ b/lib/widgets/collection/grid/selector.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:math'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/utils/math_utils.dart'; import 'package:aves/widgets/common/extensions/media_query.dart'; @@ -39,7 +39,7 @@ class _GridSelectionGestureDetectorState extends State widget.collection; - List get entries => collection.sortedEntries; + List get entries => collection.sortedEntries; ScrollController get scrollController => widget.scrollController; @@ -131,12 +131,12 @@ class _GridSelectionGestureDetectorState extends State>(); + final sectionedListLayout = context.read>(); return sectionedListLayout.getItemAt(offset); } diff --git a/lib/widgets/collection/grid/thumbnail.dart b/lib/widgets/collection/grid/thumbnail.dart index 64866df0b..c6b6a4d75 100644 --- a/lib/widgets/collection/grid/thumbnail.dart +++ b/lib/widgets/collection/grid/thumbnail.dart @@ -1,5 +1,5 @@ import 'package:aves/main.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/services/viewer_service.dart'; import 'package:aves/widgets/collection/thumbnail/decorated.dart'; @@ -10,7 +10,7 @@ import 'package:flutter/material.dart'; class InteractiveThumbnail extends StatelessWidget { final CollectionLens collection; - final ImageEntry entry; + final AvesEntry entry; final double tileExtent; final ValueNotifier isScrollingNotifier; diff --git a/lib/widgets/collection/thumbnail/decorated.dart b/lib/widgets/collection/thumbnail/decorated.dart index 724000503..40720893f 100644 --- a/lib/widgets/collection/thumbnail/decorated.dart +++ b/lib/widgets/collection/thumbnail/decorated.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/widgets/collection/thumbnail/overlay.dart'; import 'package:aves/widgets/collection/thumbnail/raster.dart'; @@ -6,7 +6,7 @@ import 'package:aves/widgets/collection/thumbnail/vector.dart'; import 'package:flutter/material.dart'; class DecoratedThumbnail extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final double extent; final CollectionLens collection; final ValueNotifier isScrollingNotifier; diff --git a/lib/widgets/collection/thumbnail/error.dart b/lib/widgets/collection/thumbnail/error.dart index f66274fde..6b531adeb 100644 --- a/lib/widgets/collection/thumbnail/error.dart +++ b/lib/widgets/collection/thumbnail/error.dart @@ -1,9 +1,9 @@ -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/utils/mime_utils.dart'; import 'package:flutter/material.dart'; class ErrorThumbnail extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final double extent; final String tooltip; diff --git a/lib/widgets/collection/thumbnail/overlay.dart b/lib/widgets/collection/thumbnail/overlay.dart index 771faf505..4858f28b3 100644 --- a/lib/widgets/collection/thumbnail/overlay.dart +++ b/lib/widgets/collection/thumbnail/overlay.dart @@ -1,7 +1,7 @@ import 'dart:math'; import 'package:aves/model/highlight.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/enums.dart'; @@ -14,7 +14,7 @@ import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; class ThumbnailEntryOverlay extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final double extent; const ThumbnailEntryOverlay({ @@ -61,7 +61,7 @@ class ThumbnailEntryOverlay extends StatelessWidget { } class ThumbnailSelectionOverlay extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final double extent; const ThumbnailSelectionOverlay({ @@ -121,7 +121,7 @@ class ThumbnailSelectionOverlay extends StatelessWidget { } class ThumbnailHighlightOverlay extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; final double extent; const ThumbnailHighlightOverlay({ @@ -137,7 +137,7 @@ class ThumbnailHighlightOverlay extends StatefulWidget { class _ThumbnailHighlightOverlayState extends State { final ValueNotifier _highlightedNotifier = ValueNotifier(false); - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; @override Widget build(BuildContext context) { diff --git a/lib/widgets/collection/thumbnail/raster.dart b/lib/widgets/collection/thumbnail/raster.dart index 8ab298158..d0cfe0d24 100644 --- a/lib/widgets/collection/thumbnail/raster.dart +++ b/lib/widgets/collection/thumbnail/raster.dart @@ -1,13 +1,13 @@ import 'package:aves/image_providers/thumbnail_provider.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_images.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/collection/thumbnail/error.dart'; import 'package:aves/widgets/common/fx/transition_image.dart'; import 'package:flutter/material.dart'; class RasterImageThumbnail extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; final double extent; final int page; final ValueNotifier isScrollingNotifier; @@ -29,7 +29,7 @@ class RasterImageThumbnail extends StatefulWidget { class _RasterImageThumbnailState extends State { ThumbnailProvider _fastThumbnailProvider, _sizedThumbnailProvider; - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; double get extent => widget.extent; diff --git a/lib/widgets/collection/thumbnail/vector.dart b/lib/widgets/collection/thumbnail/vector.dart index 5561f587b..1c58c72ee 100644 --- a/lib/widgets/collection/thumbnail/vector.dart +++ b/lib/widgets/collection/thumbnail/vector.dart @@ -1,5 +1,5 @@ import 'package:aves/image_providers/uri_picture_provider.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/settings/entry_background.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/widgets/common/fx/checkered_decoration.dart'; @@ -8,7 +8,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:provider/provider.dart'; class VectorImageThumbnail extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final double extent; final Object heroTag; diff --git a/lib/widgets/collection/thumbnail_collection.dart b/lib/widgets/collection/thumbnail_collection.dart index 57b086c66..aa2c848c9 100644 --- a/lib/widgets/collection/thumbnail_collection.dart +++ b/lib/widgets/collection/thumbnail_collection.dart @@ -4,7 +4,7 @@ import 'package:aves/main.dart'; import 'package:aves/model/filters/favourite.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/highlight.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/ref/mime_types.dart'; @@ -82,7 +82,7 @@ class ThumbnailCollection extends StatelessWidget { ), ); - final scaler = GridScaleGestureDetector( + final scaler = GridScaleGestureDetector( tileExtentManager: tileExtentManager, scrollableKey: _scrollableKey, appBarHeightNotifier: _appBarHeightNotifier, @@ -106,7 +106,7 @@ class ThumbnailCollection extends StatelessWidget { highlightable: false, ), getScaledItemTileRect: (context, entry) { - final sectionedListLayout = context.read>(); + final sectionedListLayout = context.read>(); return sectionedListLayout.getTileRect(entry) ?? Rect.zero; }, onScaled: (entry) => Provider.of(context, listen: false).add(entry), @@ -225,7 +225,7 @@ class _CollectionScrollViewState extends State { child: _buildEmptyCollectionPlaceholder(collection), hasScrollBody: false, ) - : SectionedListSliver(), + : SectionedListSliver(), BottomPaddingSliver(), ], ); diff --git a/lib/widgets/common/action_mixins/feedback.dart b/lib/widgets/common/action_mixins/feedback.dart index ae69e3a7b..45e02fbed 100644 --- a/lib/widgets/common/action_mixins/feedback.dart +++ b/lib/widgets/common/action_mixins/feedback.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/services/image_file_service.dart'; import 'package:aves/theme/durations.dart'; import 'package:flushbar/flushbar.dart'; @@ -31,7 +31,7 @@ mixin FeedbackMixin { void showOpReport({ @required BuildContext context, - @required Set selection, + @required Set selection, @required Stream opStream, @required void Function(Set processed) onDone, }) { diff --git a/lib/widgets/common/action_mixins/permission_aware.dart b/lib/widgets/common/action_mixins/permission_aware.dart index 58b896830..5d3ac5255 100644 --- a/lib/widgets/common/action_mixins/permission_aware.dart +++ b/lib/widgets/common/action_mixins/permission_aware.dart @@ -1,10 +1,10 @@ -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/services/android_file_service.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:flutter/material.dart'; mixin PermissionAwareMixin { - Future checkStoragePermission(BuildContext context, Set entries) { + Future checkStoragePermission(BuildContext context, Set entries) { return checkStoragePermissionForAlbums(context, entries.where((e) => e.path != null).map((e) => e.directory).toSet()); } diff --git a/lib/widgets/common/action_mixins/size_aware.dart b/lib/widgets/common/action_mixins/size_aware.dart index d3d7bd18c..73ef17084 100644 --- a/lib/widgets/common/action_mixins/size_aware.dart +++ b/lib/widgets/common/action_mixins/size_aware.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:math'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/services/android_file_service.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/file_utils.dart'; @@ -11,7 +11,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; mixin SizeAwareMixin { - Future checkFreeSpaceForMove(BuildContext context, Set selection, String destinationAlbum, bool copy) async { + Future checkFreeSpaceForMove(BuildContext context, Set selection, String destinationAlbum, bool copy) async { final destinationVolume = androidFileUtils.getStorageVolume(destinationAlbum); final free = await AndroidFileService.getFreeSpace(destinationVolume); int needed; @@ -20,7 +20,7 @@ mixin SizeAwareMixin { needed = selection.fold(0, sumSize); } else { // when moving, we only need space for the entries that are not already on the destination volume - final byVolume = groupBy(selection, (entry) => androidFileUtils.getStorageVolume(entry.path)); + final byVolume = groupBy(selection, (entry) => androidFileUtils.getStorageVolume(entry.path)); final otherVolumes = byVolume.keys.where((volume) => volume != destinationVolume); final fromOtherVolumes = otherVolumes.fold(0, (sum, volume) => sum + byVolume[volume].fold(0, sumSize)); // and we need at least as much space as the largest entry because individual entries are copied then deleted diff --git a/lib/widgets/common/identity/aves_icons.dart b/lib/widgets/common/identity/aves_icons.dart index adbf3fa8e..4fd080246 100644 --- a/lib/widgets/common/identity/aves_icons.dart +++ b/lib/widgets/common/identity/aves_icons.dart @@ -1,7 +1,7 @@ import 'dart:ui'; import 'package:aves/image_providers/app_icon_image_provider.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/constants.dart'; @@ -9,7 +9,7 @@ import 'package:decorated_icon/decorated_icon.dart'; import 'package:flutter/material.dart'; class VideoIcon extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final double iconSize; final bool showDuration; diff --git a/lib/widgets/debug/app_debug_page.dart b/lib/widgets/debug/app_debug_page.dart index 09626c721..4d560ceb8 100644 --- a/lib/widgets/debug/app_debug_page.dart +++ b/lib/widgets/debug/app_debug_page.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; @@ -26,7 +26,7 @@ class AppDebugPage extends StatefulWidget { } class _AppDebugPageState extends State { - List get entries => widget.source.rawEntries; + List get entries => widget.source.rawEntries; static OverlayEntry _taskQueueOverlayEntry; diff --git a/lib/widgets/debug/database.dart b/lib/widgets/debug/database.dart index bcf80693b..1e261e43f 100644 --- a/lib/widgets/debug/database.dart +++ b/lib/widgets/debug/database.dart @@ -1,6 +1,6 @@ +import 'package:aves/model/entry.dart'; import 'package:aves/model/favourite_repo.dart'; -import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/image_metadata.dart'; +import 'package:aves/model/metadata.dart'; import 'package:aves/model/metadata_db.dart'; import 'package:aves/utils/file_utils.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; @@ -13,7 +13,7 @@ class DebugAppDatabaseSection extends StatefulWidget { class _DebugAppDatabaseSectionState extends State with AutomaticKeepAliveClientMixin { Future _dbFileSizeLoader; - Future> _dbEntryLoader; + Future> _dbEntryLoader; Future> _dbDateLoader; Future> _dbMetadataLoader; Future> _dbAddressLoader; diff --git a/lib/widgets/dialogs/rename_entry_dialog.dart b/lib/widgets/dialogs/rename_entry_dialog.dart index b28e25730..d73410ba9 100644 --- a/lib/widgets/dialogs/rename_entry_dialog.dart +++ b/lib/widgets/dialogs/rename_entry_dialog.dart @@ -1,13 +1,13 @@ import 'dart:io'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:flutter/material.dart'; import 'package:path/path.dart' as path; import 'aves_dialog.dart'; class RenameEntryDialog extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; const RenameEntryDialog(this.entry); @@ -19,7 +19,7 @@ class _RenameEntryDialogState extends State { final TextEditingController _nameController = TextEditingController(); final ValueNotifier _isValidNotifier = ValueNotifier(false); - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; @override void initState() { diff --git a/lib/widgets/filter_grids/common/decorated_filter_chip.dart b/lib/widgets/filter_grids/common/decorated_filter_chip.dart index 5842967ee..1801a2454 100644 --- a/lib/widgets/filter_grids/common/decorated_filter_chip.dart +++ b/lib/widgets/filter_grids/common/decorated_filter_chip.dart @@ -3,7 +3,7 @@ import 'dart:ui'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; @@ -20,7 +20,7 @@ import 'package:flutter/material.dart'; class DecoratedFilterChip extends StatelessWidget { final CollectionSource source; final CollectionFilter filter; - final ImageEntry entry; + final AvesEntry entry; final double extent; final bool pinned, highlightable; final FilterCallback onTap; diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index d75f9c6dd..5d56a05b5 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -1,6 +1,6 @@ import 'package:aves/main.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:aves/model/settings/home_page.dart'; import 'package:aves/model/settings/screen_on.dart'; import 'package:aves/model/settings/settings.dart'; @@ -35,7 +35,7 @@ class HomePage extends StatefulWidget { class _HomePageState extends State { MediaStoreSource _mediaStore; - ImageEntry _viewerEntry; + AvesEntry _viewerEntry; String _shortcutRouteName; List _shortcutFilters; @@ -108,8 +108,8 @@ class _HomePageState extends State { unawaited(Navigator.pushReplacement(context, _getRedirectRoute())); } - Future _initViewerEntry({@required String uri, @required String mimeType}) async { - final entry = await ImageFileService.getImageEntry(uri, mimeType); + Future _initViewerEntry({@required String uri, @required String mimeType}) async { + final entry = await ImageFileService.getEntry(uri, mimeType); if (entry != null) { // cataloguing is essential for geolocation and video rotation await entry.catalog(); diff --git a/lib/widgets/stats/stats.dart b/lib/widgets/stats/stats.dart index 2907bcb96..0292f1a0a 100644 --- a/lib/widgets/stats/stats.dart +++ b/lib/widgets/stats/stats.dart @@ -4,7 +4,7 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/location.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/filters/tag.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; @@ -30,7 +30,7 @@ class StatsPage extends StatelessWidget { final CollectionLens parentCollection; final Map entryCountPerCountry = {}, entryCountPerPlace = {}, entryCountPerTag = {}; - List get entries => parentCollection?.sortedEntries ?? source.rawEntries; + List get entries => parentCollection?.sortedEntries ?? source.rawEntries; static const mimeDonutMinWidth = 124.0; @@ -66,7 +66,7 @@ class StatsPage extends StatelessWidget { text: 'No images', ); } else { - final byMimeTypes = groupBy(entries, (entry) => entry.mimeType).map((k, v) => MapEntry(k, v.length)); + final byMimeTypes = groupBy(entries, (entry) => entry.mimeType).map((k, v) => MapEntry(k, v.length)); final imagesByMimeTypes = Map.fromEntries(byMimeTypes.entries.where((kv) => kv.key.startsWith('image/'))); final videoByMimeTypes = Map.fromEntries(byMimeTypes.entries.where((kv) => kv.key.startsWith('video/'))); final mimeDonuts = Wrap( diff --git a/lib/widgets/viewer/debug/db.dart b/lib/widgets/viewer/debug/db.dart index 641ee2709..ad5df9358 100644 --- a/lib/widgets/viewer/debug/db.dart +++ b/lib/widgets/viewer/debug/db.dart @@ -1,11 +1,11 @@ -import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/image_metadata.dart'; +import 'package:aves/model/entry.dart'; +import 'package:aves/model/metadata.dart'; import 'package:aves/model/metadata_db.dart'; import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; class DbTab extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; const DbTab({@required this.entry}); @@ -15,11 +15,11 @@ class DbTab extends StatefulWidget { class _DbTabState extends State { Future _dbDateLoader; - Future _dbEntryLoader; + Future _dbEntryLoader; Future _dbMetadataLoader; Future _dbAddressLoader; - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; @override void initState() { @@ -60,7 +60,7 @@ class _DbTabState extends State { }, ), SizedBox(height: 16), - FutureBuilder( + FutureBuilder( future: _dbEntryLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); diff --git a/lib/widgets/viewer/debug/metadata.dart b/lib/widgets/viewer/debug/metadata.dart index 075cde487..63bb3b178 100644 --- a/lib/widgets/viewer/debug/metadata.dart +++ b/lib/widgets/viewer/debug/metadata.dart @@ -1,7 +1,7 @@ import 'dart:collection'; import 'dart:typed_data'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/ref/mime_types.dart'; import 'package:aves/services/android_debug_service.dart'; import 'package:aves/utils/constants.dart'; @@ -10,7 +10,7 @@ import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; class MetadataTab extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; const MetadataTab({@required this.entry}); @@ -25,7 +25,7 @@ class _MetadataTabState extends State { static const secondTimestampKeys = ['date_added', 'date_modified', 'date_expires', 'isPlayed']; static const millisecondTimestampKeys = ['datetaken', 'datetime']; - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; @override void initState() { diff --git a/lib/widgets/viewer/debug_page.dart b/lib/widgets/viewer/debug_page.dart index 768a2883c..c18f3d9a2 100644 --- a/lib/widgets/viewer/debug_page.dart +++ b/lib/widgets/viewer/debug_page.dart @@ -1,7 +1,7 @@ import 'package:aves/image_providers/uri_picture_provider.dart'; import 'package:aves/main.dart'; import 'package:aves/model/entry_images.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/viewer/debug/db.dart'; import 'package:aves/widgets/viewer/debug/metadata.dart'; @@ -13,7 +13,7 @@ import 'package:tuple/tuple.dart'; class ViewerDebugPage extends StatelessWidget { static const routeName = '/viewer/debug'; - final ImageEntry entry; + final AvesEntry entry; const ViewerDebugPage({@required this.entry}); diff --git a/lib/widgets/viewer/entry_action_delegate.dart b/lib/widgets/viewer/entry_action_delegate.dart index 8aea86ac8..b2f298c8b 100644 --- a/lib/widgets/viewer/entry_action_delegate.dart +++ b/lib/widgets/viewer/entry_action_delegate.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:aves/model/actions/entry_actions.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/services/android_app_service.dart'; import 'package:aves/services/image_file_service.dart'; @@ -28,7 +28,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin { bool get hasCollection => collection != null; - void onActionSelected(BuildContext context, ImageEntry entry, EntryAction action) { + void onActionSelected(BuildContext context, AvesEntry entry, EntryAction action) { switch (action) { case EntryAction.toggleFavourite: entry.toggleFavourite(); @@ -88,21 +88,21 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin { } } - Future _flip(BuildContext context, ImageEntry entry) async { + Future _flip(BuildContext context, AvesEntry entry) async { if (!await checkStoragePermission(context, {entry})) return; final success = await entry.flip(); if (!success) showFeedback(context, 'Failed'); } - Future _rotate(BuildContext context, ImageEntry entry, {@required bool clockwise}) async { + Future _rotate(BuildContext context, AvesEntry entry, {@required bool clockwise}) async { if (!await checkStoragePermission(context, {entry})) return; final success = await entry.rotate(clockwise: clockwise); if (!success) showFeedback(context, 'Failed'); } - Future _showDeleteDialog(BuildContext context, ImageEntry entry) async { + Future _showDeleteDialog(BuildContext context, AvesEntry entry) async { final confirmed = await showDialog( context: context, builder: (context) { @@ -140,7 +140,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin { } } - Future _showRenameDialog(BuildContext context, ImageEntry entry) async { + Future _showRenameDialog(BuildContext context, AvesEntry entry) async { final newName = await showDialog( context: context, builder: (context) => RenameEntryDialog(entry), @@ -152,7 +152,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin { showFeedback(context, await entry.rename(newName) ? 'Done!' : 'Failed'); } - void _goToSourceViewer(BuildContext context, ImageEntry entry) { + void _goToSourceViewer(BuildContext context, AvesEntry entry) { Navigator.push( context, MaterialPageRoute( @@ -164,7 +164,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin { ); } - void _goToDebug(BuildContext context, ImageEntry entry) { + void _goToDebug(BuildContext context, AvesEntry entry) { Navigator.push( context, MaterialPageRoute( diff --git a/lib/widgets/viewer/entry_scroller.dart b/lib/widgets/viewer/entry_scroller.dart index baa4bee88..d4ec97c0e 100644 --- a/lib/widgets/viewer/entry_scroller.dart +++ b/lib/widgets/viewer/entry_scroller.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/multipage.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/widgets/common/magnifier/pan/gesture_detector_scope.dart'; @@ -34,7 +34,7 @@ class MultiEntryScroller extends StatefulWidget { } class _MultiEntryScrollerState extends State with AutomaticKeepAliveClientMixin { - List get entries => widget.collection.sortedEntries; + List get entries => widget.collection.sortedEntries; @override Widget build(BuildContext context) { @@ -80,7 +80,7 @@ class _MultiEntryScrollerState extends State with AutomaticK ); } - Widget _buildViewer(ImageEntry entry, {MultiPageInfo multiPageInfo, int page}) { + Widget _buildViewer(AvesEntry entry, {MultiPageInfo multiPageInfo, int page}) { return Selector( selector: (c, mq) => mq.size, builder: (c, mqSize, child) { @@ -99,7 +99,7 @@ class _MultiEntryScrollerState extends State with AutomaticK ); } - MultiPageController _getMultiPageController(ImageEntry entry) { + MultiPageController _getMultiPageController(AvesEntry entry) { return widget.multiPageControllers.firstWhere((kv) => kv.item1 == entry.uri, orElse: () => null)?.item2; } @@ -108,7 +108,7 @@ class _MultiEntryScrollerState extends State with AutomaticK } class SingleEntryScroller extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; final VoidCallback onTap; final List> videoControllers; final List> multiPageControllers; @@ -125,7 +125,7 @@ class SingleEntryScroller extends StatefulWidget { } class _SingleEntryScrollerState extends State with AutomaticKeepAliveClientMixin { - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; @override Widget build(BuildContext context) { @@ -173,7 +173,7 @@ class _SingleEntryScrollerState extends State with Automati ); } - MultiPageController _getMultiPageController(ImageEntry entry) { + MultiPageController _getMultiPageController(AvesEntry entry) { return widget.multiPageControllers.firstWhere((kv) => kv.item1 == entry.uri, orElse: () => null)?.item2; } diff --git a/lib/widgets/viewer/entry_viewer_page.dart b/lib/widgets/viewer/entry_viewer_page.dart index 65d35279b..5ee08cdd0 100644 --- a/lib/widgets/viewer/entry_viewer_page.dart +++ b/lib/widgets/viewer/entry_viewer_page.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:aves/widgets/viewer/entry_viewer_stack.dart'; @@ -8,7 +8,7 @@ class MultiEntryViewerPage extends AnimatedWidget { static const routeName = '/viewer'; final CollectionLens collection; - final ImageEntry initialEntry; + final AvesEntry initialEntry; const MultiEntryViewerPage({ Key key, @@ -34,7 +34,7 @@ class MultiEntryViewerPage extends AnimatedWidget { class SingleEntryViewerPage extends StatelessWidget { static const routeName = '/viewer'; - final ImageEntry entry; + final AvesEntry entry; const SingleEntryViewerPage({ Key key, diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index 584f3d6c4..4ff471002 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -1,7 +1,7 @@ import 'dart:math'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/settings/screen_on.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; @@ -31,7 +31,7 @@ import 'package:tuple/tuple.dart'; class EntryViewerStack extends StatefulWidget { final CollectionLens collection; - final ImageEntry initialEntry; + final AvesEntry initialEntry; const EntryViewerStack({ Key key, @@ -44,7 +44,7 @@ class EntryViewerStack extends StatefulWidget { } class _EntryViewerStackState extends State with SingleTickerProviderStateMixin, WidgetsBindingObserver { - final ValueNotifier _entryNotifier = ValueNotifier(null); + final ValueNotifier _entryNotifier = ValueNotifier(null); int _currentHorizontalPage; ValueNotifier _currentVerticalPage; PageController _horizontalPager, _verticalPager; @@ -63,7 +63,7 @@ class _EntryViewerStackState extends State with SingleTickerPr bool get hasCollection => collection != null; - List get entries => hasCollection ? collection.sortedEntries : [widget.initialEntry]; + List get entries => hasCollection ? collection.sortedEntries : [widget.initialEntry]; static const int transitionPage = 0; @@ -199,7 +199,7 @@ class _EntryViewerStackState extends State with SingleTickerPr } Widget _buildTopOverlay() { - final child = ValueListenableBuilder( + final child = ValueListenableBuilder( valueListenable: _entryNotifier, builder: (context, entry, child) { if (entry == null) return SizedBox.shrink(); @@ -232,7 +232,7 @@ class _EntryViewerStackState extends State with SingleTickerPr } Widget _buildBottomOverlay() { - Widget bottomOverlay = ValueListenableBuilder( + Widget bottomOverlay = ValueListenableBuilder( valueListenable: _entryNotifier, builder: (context, entry, child) { if (entry == null) return SizedBox.shrink(); @@ -312,7 +312,7 @@ class _EntryViewerStackState extends State with SingleTickerPr return bottomOverlay; } - MultiPageController _getMultiPageController(ImageEntry entry) { + MultiPageController _getMultiPageController(AvesEntry entry) { return entry.isMultipage ? _multiPageControllers.firstWhere((kv) => kv.item1 == entry.uri, orElse: () => null)?.item2 : null; } @@ -478,7 +478,7 @@ class _EntryViewerStackState extends State with SingleTickerPr class ViewerVerticalPageView extends StatefulWidget { final CollectionLens collection; - final ValueNotifier entryNotifier; + final ValueNotifier entryNotifier; final List> videoControllers; final List> multiPageControllers; final PageController horizontalPager, verticalPager; @@ -507,13 +507,13 @@ class ViewerVerticalPageView extends StatefulWidget { class _ViewerVerticalPageViewState extends State { final ValueNotifier _backgroundColorNotifier = ValueNotifier(Colors.black); final ValueNotifier _infoPageVisibleNotifier = ValueNotifier(false); - ImageEntry _oldEntry; + AvesEntry _oldEntry; CollectionLens get collection => widget.collection; bool get hasCollection => collection != null; - ImageEntry get entry => widget.entryNotifier.value; + AvesEntry get entry => widget.entryNotifier.value; @override void initState() { diff --git a/lib/widgets/viewer/info/basic_section.dart b/lib/widgets/viewer/info/basic_section.dart index db19c30c4..26cedfa6a 100644 --- a/lib/widgets/viewer/info/basic_section.dart +++ b/lib/widgets/viewer/info/basic_section.dart @@ -3,7 +3,7 @@ import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/favourite.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/filters/tag.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/ref/mime_types.dart'; import 'package:aves/utils/constants.dart'; @@ -15,7 +15,7 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; class BasicSection extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final CollectionLens collection; final FilterCallback onFilter; diff --git a/lib/widgets/viewer/info/info_app_bar.dart b/lib/widgets/viewer/info/info_app_bar.dart index df0eee399..34e2aebe2 100644 --- a/lib/widgets/viewer/info/info_app_bar.dart +++ b/lib/widgets/viewer/info/info_app_bar.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/app_bar_title.dart'; import 'package:aves/widgets/viewer/info/info_search.dart'; @@ -6,7 +6,7 @@ import 'package:aves/widgets/viewer/info/metadata/metadata_section.dart'; import 'package:flutter/material.dart'; class InfoAppBar extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final ValueNotifier> metadataNotifier; final VoidCallback onBackPressed; diff --git a/lib/widgets/viewer/info/info_page.dart b/lib/widgets/viewer/info/info_page.dart index fae51760e..87b9afe34 100644 --- a/lib/widgets/viewer/info/info_page.dart +++ b/lib/widgets/viewer/info/info_page.dart @@ -1,5 +1,5 @@ import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/common/basic/insets.dart'; @@ -14,7 +14,7 @@ import 'package:provider/provider.dart'; class InfoPage extends StatefulWidget { final CollectionLens collection; - final ValueNotifier entryNotifier; + final ValueNotifier entryNotifier; final ValueNotifier visibleNotifier; const InfoPage({ @@ -34,7 +34,7 @@ class _InfoPageState extends State { CollectionLens get collection => widget.collection; - ImageEntry get entry => widget.entryNotifier.value; + AvesEntry get entry => widget.entryNotifier.value; @override Widget build(BuildContext context) { @@ -48,7 +48,7 @@ class _InfoPageState extends State { child: Selector( selector: (c, mq) => mq.size.width, builder: (c, mqWidth, child) { - return ValueListenableBuilder( + return ValueListenableBuilder( valueListenable: widget.entryNotifier, builder: (context, entry, child) { return entry != null @@ -107,7 +107,7 @@ class _InfoPageState extends State { class _InfoPageContent extends StatefulWidget { final CollectionLens collection; - final ImageEntry entry; + final AvesEntry entry; final ValueNotifier visibleNotifier; final ScrollController scrollController; final bool split; @@ -134,7 +134,7 @@ class _InfoPageContentState extends State<_InfoPageContent> { CollectionLens get collection => widget.collection; - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; @override Widget build(BuildContext context) { diff --git a/lib/widgets/viewer/info/info_search.dart b/lib/widgets/viewer/info/info_search.dart index 0e12b4276..04744e277 100644 --- a/lib/widgets/viewer/info/info_search.dart +++ b/lib/widgets/viewer/info/info_search.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/collection/empty.dart'; import 'package:aves/widgets/viewer/info/metadata/metadata_dir_tile.dart'; @@ -7,7 +7,7 @@ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; class InfoSearchDelegate extends SearchDelegate { - final ImageEntry entry; + final AvesEntry entry; final ValueNotifier> metadataNotifier; Map get metadata => metadataNotifier.value; diff --git a/lib/widgets/viewer/info/location_section.dart b/lib/widgets/viewer/info/location_section.dart index 128bdf262..bbf521cc2 100644 --- a/lib/widgets/viewer/info/location_section.dart +++ b/lib/widgets/viewer/info/location_section.dart @@ -1,5 +1,5 @@ import 'package:aves/model/filters/location.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/settings/coordinate_format.dart'; import 'package:aves/model/settings/map_style.dart'; import 'package:aves/model/settings/settings.dart'; @@ -17,7 +17,7 @@ import 'package:tuple/tuple.dart'; class LocationSection extends StatefulWidget { final CollectionLens collection; - final ImageEntry entry; + final AvesEntry entry; final bool showTitle; final ValueNotifier visibleNotifier; final FilterCallback onFilter; @@ -43,7 +43,7 @@ class _LocationSectionState extends State with TickerProviderSt CollectionLens get collection => widget.collection; - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; @override void initState() { @@ -158,7 +158,7 @@ class _LocationSectionState extends State with TickerProviderSt } class _AddressInfoGroup extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; const _AddressInfoGroup({@required this.entry}); @@ -169,7 +169,7 @@ class _AddressInfoGroup extends StatefulWidget { class _AddressInfoGroupState extends State<_AddressInfoGroup> { Future _addressLineLoader; - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; @override void initState() { diff --git a/lib/widgets/viewer/info/maps/marker.dart b/lib/widgets/viewer/info/maps/marker.dart index 0cd8bc006..c40806c22 100644 --- a/lib/widgets/viewer/info/maps/marker.dart +++ b/lib/widgets/viewer/info/maps/marker.dart @@ -1,14 +1,14 @@ import 'dart:typed_data'; import 'dart:ui' as ui; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/widgets/collection/thumbnail/raster.dart'; import 'package:aves/widgets/collection/thumbnail/vector.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; class ImageMarker extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final double extent; final Size pointerSize; diff --git a/lib/widgets/viewer/info/metadata/metadata_dir_tile.dart b/lib/widgets/viewer/info/metadata/metadata_dir_tile.dart index e84a655d6..3bc2f74b6 100644 --- a/lib/widgets/viewer/info/metadata/metadata_dir_tile.dart +++ b/lib/widgets/viewer/info/metadata/metadata_dir_tile.dart @@ -1,6 +1,6 @@ import 'dart:collection'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/ref/brand_colors.dart'; import 'package:aves/services/svg_metadata_service.dart'; import 'package:aves/theme/icons.dart'; @@ -16,7 +16,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; class MetadataDirTile extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final String title; final MetadataDirectory dir; final ValueNotifier expandedDirectoryNotifier; diff --git a/lib/widgets/viewer/info/metadata/metadata_section.dart b/lib/widgets/viewer/info/metadata/metadata_section.dart index 6cba39d94..d148be209 100644 --- a/lib/widgets/viewer/info/metadata/metadata_section.dart +++ b/lib/widgets/viewer/info/metadata/metadata_section.dart @@ -1,6 +1,6 @@ import 'dart:collection'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/services/metadata_service.dart'; import 'package:aves/services/svg_metadata_service.dart'; import 'package:aves/theme/durations.dart'; @@ -13,7 +13,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; class MetadataSectionSliver extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; final ValueNotifier visibleNotifier; final ValueNotifier> metadataNotifier; @@ -31,7 +31,7 @@ class _MetadataSectionSliverState extends State with Auto final ValueNotifier _loadedMetadataUri = ValueNotifier(null); final ValueNotifier _expandedDirectoryNotifier = ValueNotifier(null); - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; bool get isVisible => widget.visibleNotifier.value; diff --git a/lib/widgets/viewer/info/metadata/metadata_thumbnail.dart b/lib/widgets/viewer/info/metadata/metadata_thumbnail.dart index 7072ac53e..646bf9736 100644 --- a/lib/widgets/viewer/info/metadata/metadata_thumbnail.dart +++ b/lib/widgets/viewer/info/metadata/metadata_thumbnail.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:typed_data'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/services/metadata_service.dart'; import 'package:flutter/material.dart'; @@ -9,7 +9,7 @@ enum MetadataThumbnailSource { embedded, exif } class MetadataThumbnails extends StatefulWidget { final MetadataThumbnailSource source; - final ImageEntry entry; + final AvesEntry entry; const MetadataThumbnails({ Key key, @@ -24,7 +24,7 @@ class MetadataThumbnails extends StatefulWidget { class _MetadataThumbnailsState extends State { Future> _loader; - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; String get uri => entry.uri; diff --git a/lib/widgets/viewer/info/metadata/xmp_tile.dart b/lib/widgets/viewer/info/metadata/xmp_tile.dart index cbd1c5c1a..62098f1f3 100644 --- a/lib/widgets/viewer/info/metadata/xmp_tile.dart +++ b/lib/widgets/viewer/info/metadata/xmp_tile.dart @@ -1,6 +1,6 @@ import 'dart:collection'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/ref/mime_types.dart'; import 'package:aves/ref/xmp.dart'; import 'package:aves/services/android_app_service.dart'; @@ -22,7 +22,7 @@ import 'package:flutter/material.dart'; import 'package:pedantic/pedantic.dart'; class XmpDirTile extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; final SplayTreeMap tags; final ValueNotifier expandedNotifier; final bool initiallyExpanded; @@ -39,7 +39,7 @@ class XmpDirTile extends StatefulWidget { } class _XmpDirTileState extends State with FeedbackMixin { - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; @override Widget build(BuildContext context) { @@ -123,7 +123,7 @@ class _XmpDirTileState extends State with FeedbackMixin { return; } - final embedEntry = ImageEntry.fromMap(fields); + final embedEntry = AvesEntry.fromMap(fields); unawaited(Navigator.push( context, TransparentMaterialPageRoute( diff --git a/lib/widgets/viewer/multipage.dart b/lib/widgets/viewer/multipage.dart index 004ff7a49..7bc74b9ac 100644 --- a/lib/widgets/viewer/multipage.dart +++ b/lib/widgets/viewer/multipage.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/multipage.dart'; import 'package:aves/services/metadata_service.dart'; import 'package:flutter/foundation.dart'; @@ -10,7 +10,7 @@ class MultiPageController extends ChangeNotifier { final Future info; final ValueNotifier pageNotifier = ValueNotifier(0); - MultiPageController(ImageEntry entry) : info = MetadataService.getMultiPageInfo(entry); + MultiPageController(AvesEntry entry) : info = MetadataService.getMultiPageInfo(entry); int get page => pageNotifier.value; diff --git a/lib/widgets/viewer/overlay/bottom.dart b/lib/widgets/viewer/overlay/bottom.dart index d6ba71003..24e7bd2fe 100644 --- a/lib/widgets/viewer/overlay/bottom.dart +++ b/lib/widgets/viewer/overlay/bottom.dart @@ -1,7 +1,7 @@ import 'dart:math'; -import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/image_metadata.dart'; +import 'package:aves/model/entry.dart'; +import 'package:aves/model/metadata.dart'; import 'package:aves/model/multipage.dart'; import 'package:aves/model/settings/coordinate_format.dart'; import 'package:aves/model/settings/settings.dart'; @@ -20,7 +20,7 @@ import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; class ViewerBottomOverlay extends StatefulWidget { - final List entries; + final List entries; final int index; final bool showPosition; final EdgeInsets viewInsets, viewPadding; @@ -42,10 +42,10 @@ class ViewerBottomOverlay extends StatefulWidget { class _ViewerBottomOverlayState extends State { Future _detailLoader; - ImageEntry _lastEntry; + AvesEntry _lastEntry; OverlayMetadata _lastDetails; - ImageEntry get entry { + AvesEntry get entry { final entries = widget.entries; final index = widget.index; return index < entries.length ? entries[index] : null; @@ -138,7 +138,7 @@ const double _interRowPadding = 2.0; const double _subRowMinWidth = 300.0; class _BottomOverlayContent extends AnimatedWidget { - final ImageEntry mainEntry, entry; + final AvesEntry mainEntry, entry; final MultiPageInfo multiPageInfo; final int page; final OverlayMetadata details; @@ -302,7 +302,7 @@ class _BottomOverlayContent extends AnimatedWidget { } class _LocationRow extends AnimatedWidget { - final ImageEntry entry; + final AvesEntry entry; _LocationRow({ Key key, @@ -328,7 +328,7 @@ class _LocationRow extends AnimatedWidget { } class _PositionTitleRow extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final String collectionPosition; final MultiPageController multiPageController; @@ -369,7 +369,7 @@ class _PositionTitleRow extends StatelessWidget { } class _DateRow extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final MultiPageController multiPageController; const _DateRow({ diff --git a/lib/widgets/viewer/overlay/minimap.dart b/lib/widgets/viewer/overlay/minimap.dart index 0e1a3a808..657aff590 100644 --- a/lib/widgets/viewer/overlay/minimap.dart +++ b/lib/widgets/viewer/overlay/minimap.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/multipage.dart'; import 'package:aves/widgets/viewer/multipage.dart'; import 'package:aves/widgets/viewer/visual/state.dart'; @@ -8,7 +8,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; class Minimap extends StatelessWidget { - final ImageEntry mainEntry; + final AvesEntry mainEntry; final ValueNotifier viewStateNotifier; final MultiPageController multiPageController; final Size size; diff --git a/lib/widgets/viewer/overlay/multipage.dart b/lib/widgets/viewer/overlay/multipage.dart index a3ae822d6..b7ac56f15 100644 --- a/lib/widgets/viewer/overlay/multipage.dart +++ b/lib/widgets/viewer/overlay/multipage.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/multipage.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/collection/thumbnail/overlay.dart'; @@ -10,7 +10,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; class MultiPageOverlay extends StatefulWidget { - final ImageEntry mainEntry; + final AvesEntry mainEntry; final MultiPageController controller; final double availableWidth; @@ -34,7 +34,7 @@ class _MultiPageOverlayState extends State { static const double extent = 48; static const double separatorWidth = 2; - ImageEntry get mainEntry => widget.mainEntry; + AvesEntry get mainEntry => widget.mainEntry; MultiPageController get controller => widget.controller; @@ -162,7 +162,7 @@ class _MultiPageOverlayState extends State { ); } - Widget _buildPageThumbnail(ImageEntry entry) { + Widget _buildPageThumbnail(AvesEntry entry) { Widget child = RasterImageThumbnail( entry: entry, extent: extent, diff --git a/lib/widgets/viewer/overlay/panorama.dart b/lib/widgets/viewer/overlay/panorama.dart index 9356a8206..0d142edeb 100644 --- a/lib/widgets/viewer/overlay/panorama.dart +++ b/lib/widgets/viewer/overlay/panorama.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/services/metadata_service.dart'; import 'package:aves/widgets/viewer/overlay/common.dart'; import 'package:aves/widgets/viewer/panorama_page.dart'; @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; import 'package:pedantic/pedantic.dart'; class PanoramaOverlay extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final Animation scale; const PanoramaOverlay({ diff --git a/lib/widgets/viewer/overlay/top.dart b/lib/widgets/viewer/overlay/top.dart index 22815ea56..e2a026346 100644 --- a/lib/widgets/viewer/overlay/top.dart +++ b/lib/widgets/viewer/overlay/top.dart @@ -2,7 +2,7 @@ import 'dart:math'; import 'package:aves/model/actions/entry_actions.dart'; import 'package:aves/model/favourite_repo.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; @@ -19,7 +19,7 @@ import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; class ViewerTopOverlay extends StatelessWidget { - final ImageEntry entry; + final AvesEntry entry; final Animation scale; final EdgeInsets viewInsets, viewPadding; final Function(EntryAction value) onActionSelected; @@ -135,7 +135,7 @@ class _TopOverlayRow extends StatelessWidget { final List inAppActions; final List externalAppActions; final Animation scale; - final ImageEntry entry; + final AvesEntry entry; final Function(EntryAction value) onActionSelected; const _TopOverlayRow({ @@ -299,7 +299,7 @@ class _TopOverlayRow extends StatelessWidget { } class _FavouriteToggler extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; final bool isMenuItem; final VoidCallback onPressed; diff --git a/lib/widgets/viewer/overlay/video.dart b/lib/widgets/viewer/overlay/video.dart index 1d3b287b5..3b0951e9f 100644 --- a/lib/widgets/viewer/overlay/video.dart +++ b/lib/widgets/viewer/overlay/video.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/services/android_app_service.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; @@ -12,7 +12,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_ijkplayer/flutter_ijkplayer.dart'; class VideoControlOverlay extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; final IjkMediaController controller; final Animation scale; @@ -37,7 +37,7 @@ class _VideoControlOverlayState extends State with SingleTi // video info is not refreshed by default, so we use a timer to do so Timer _progressTimer; - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; Animation get scale => widget.scale; diff --git a/lib/widgets/viewer/panorama_page.dart b/lib/widgets/viewer/panorama_page.dart index 31eeea732..979971d58 100644 --- a/lib/widgets/viewer/panorama_page.dart +++ b/lib/widgets/viewer/panorama_page.dart @@ -1,5 +1,5 @@ import 'package:aves/model/entry_images.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/panorama.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/basic/insets.dart'; @@ -15,7 +15,7 @@ import 'package:provider/provider.dart'; class PanoramaPage extends StatefulWidget { static const routeName = '/viewer/panorama'; - final ImageEntry entry; + final AvesEntry entry; final PanoramaInfo info; const PanoramaPage({ @@ -31,7 +31,7 @@ class _PanoramaPageState extends State { final ValueNotifier _overlayVisible = ValueNotifier(true); final ValueNotifier _sensorControl = ValueNotifier(SensorControl.None); - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; PanoramaInfo get info => widget.info; diff --git a/lib/widgets/viewer/printer.dart b/lib/widgets/viewer/printer.dart index c43028cfd..d3ab1a35c 100644 --- a/lib/widgets/viewer/printer.dart +++ b/lib/widgets/viewer/printer.dart @@ -1,7 +1,7 @@ import 'dart:convert'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_images.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:aves/services/image_file_service.dart'; import 'package:aves/services/metadata_service.dart'; import 'package:pdf/widgets.dart' as pdf; @@ -9,7 +9,7 @@ import 'package:pedantic/pedantic.dart'; import 'package:printing/printing.dart'; class EntryPrinter { - final ImageEntry entry; + final AvesEntry entry; const EntryPrinter(this.entry); @@ -58,7 +58,7 @@ class EntryPrinter { return pages; } - Future _buildPageImage(ImageEntry entry) async { + Future _buildPageImage(AvesEntry entry) async { if (entry.isSvg) { final bytes = await ImageFileService.getSvg(entry.uri, entry.mimeType); if (bytes != null && bytes.isNotEmpty) { diff --git a/lib/widgets/viewer/visual/entry_page_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart index 2e376a374..fcc8f4e70 100644 --- a/lib/widgets/viewer/visual/entry_page_view.dart +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:aves/image_providers/uri_picture_provider.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/multipage.dart'; import 'package:aves/model/settings/entry_background.dart'; import 'package:aves/model/settings/settings.dart'; @@ -23,7 +23,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:tuple/tuple.dart'; class EntryPageView extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; final MultiPageInfo multiPageInfo; final int page; final Size viewportSize; @@ -36,7 +36,7 @@ class EntryPageView extends StatefulWidget { EntryPageView({ Key key, - ImageEntry mainEntry, + AvesEntry mainEntry, this.multiPageInfo, this.page, this.viewportSize, @@ -56,7 +56,7 @@ class _EntryPageViewState extends State { final ValueNotifier _viewStateNotifier = ValueNotifier(ViewState.zero); final List _subscriptions = []; - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; Size get viewportSize => widget.viewportSize; diff --git a/lib/widgets/viewer/visual/raster.dart b/lib/widgets/viewer/visual/raster.dart index 36124bcef..3bc3153e7 100644 --- a/lib/widgets/viewer/visual/raster.dart +++ b/lib/widgets/viewer/visual/raster.dart @@ -2,7 +2,7 @@ import 'dart:math'; import 'package:aves/image_providers/region_provider.dart'; import 'package:aves/model/entry_images.dart'; -import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/settings/entry_background.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/utils/math_utils.dart'; @@ -15,7 +15,7 @@ import 'package:flutter/material.dart'; import 'package:tuple/tuple.dart'; class RasterImageView extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; final ValueNotifier viewStateNotifier; final ImageErrorWidgetBuilder errorBuilder; @@ -39,7 +39,7 @@ class _RasterImageViewState extends State { ImageStreamListener _fullImageListener; final ValueNotifier _fullImageLoaded = ValueNotifier(false); - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; ValueNotifier get viewStateNotifier => widget.viewStateNotifier; @@ -323,7 +323,7 @@ class _RasterImageViewState extends State { } class RegionTile extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; // `tileRect` uses Flutter view coordinates // `regionRect` uses the raw image pixel coordinates @@ -354,7 +354,7 @@ class RegionTile extends StatefulWidget { class _RegionTileState extends State { RegionProvider _provider; - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; @override void initState() { diff --git a/lib/widgets/viewer/visual/video.dart b/lib/widgets/viewer/visual/video.dart index 28e5937e4..4cb1066a8 100644 --- a/lib/widgets/viewer/visual/video.dart +++ b/lib/widgets/viewer/visual/video.dart @@ -1,13 +1,13 @@ import 'dart:async'; import 'dart:ui'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_images.dart'; -import 'package:aves/model/image_entry.dart'; import 'package:flutter/material.dart'; import 'package:flutter_ijkplayer/flutter_ijkplayer.dart'; class VideoView extends StatefulWidget { - final ImageEntry entry; + final AvesEntry entry; final IjkMediaController controller; const VideoView({ @@ -23,7 +23,7 @@ class VideoView extends StatefulWidget { class _VideoViewState extends State { final List _subscriptions = []; - ImageEntry get entry => widget.entry; + AvesEntry get entry => widget.entry; IjkMediaController get controller => widget.controller;