This commit is contained in:
Thibault Deckers 2021-01-21 12:20:31 +09:00
parent c9fa903309
commit c252ce7828
82 changed files with 325 additions and 325 deletions

View file

@ -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<String>("mimeType") // MIME type is optional
val uri = call.argument<String>("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)
})
}

View file

@ -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)

View file

@ -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

View file

@ -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)

View file

@ -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 {

View file

@ -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) {

View file

@ -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<AvesImageEntry>, callback: ImageOpCallback) {
open suspend fun moveMultiple(context: Context, copy: Boolean, destinationDir: String, entries: List<AvesEntry>, callback: ImageOpCallback) {
callback.onFailure(UnsupportedOperationException())
}

View file

@ -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<AvesImageEntry>,
entries: List<AvesEntry>,
callback: ImageOpCallback,
) {
val destinationDirDocFile = createDirectoryIfAbsent(context, destinationDir)

View file

@ -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<String> 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);
}

View file

@ -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) {

View file

@ -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<void> add(Iterable<ImageEntry> entries) async {
Future<void> add(Iterable<AvesEntry> entries) async {
final newRows = entries.map(_entryToRow);
await metadataDb.addFavourites(newRows);
_rows.addAll(newRows);
changeNotifier.notifyListeners();
}
Future<void> remove(Iterable<ImageEntry> entries) async {
Future<void> remove(Iterable<AvesEntry> entries) async {
final removedRows = entries.map(_entryToRow);
await metadataDb.removeFavourites(removedRows);
removedRows.forEach(_rows.remove);
changeNotifier.notifyListeners();
}
Future<void> move(int oldContentId, ImageEntry entry) async {
Future<void> move(int oldContentId, AvesEntry entry) async {
final oldRow = _rows.firstWhere((row) => row.contentId == oldContentId, orElse: () => null);
if (oldRow != null) {
_rows.remove(oldRow);

View file

@ -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;

View file

@ -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';

View file

@ -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<CollectionFilter> {
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<CollectionFilter> {
// TODO TLAD replace this by adding getters to CollectionFilter, with cached entry/count coming from Source
class FilterGridItem<T extends CollectionFilter> {
final T filter;
final ImageEntry entry;
final AvesEntry entry;
const FilterGridItem(this.filter, this.entry);

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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<List<ImageEntry>> loadEntries() async {
Future<List<AvesEntry>> 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<void> saveEntries(Iterable<ImageEntry> entries) async {
Future<void> saveEntries(Iterable<AvesEntry> 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<void> updateEntryId(int oldId, ImageEntry entry) async {
Future<void> 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,

View file

@ -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({

View file

@ -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<String, ImageEntry> getAlbumEntries() {
Map<String, AvesEntry> getAlbumEntries() {
final entries = sortedEntriesForFilterList;
final regularAlbums = <String>[], appAlbums = <String>[], specialAlbums = <String>[];
for (var album in sortedAlbums) {

View file

@ -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<ImageEntry> _filteredEntries;
List<AvesEntry> _filteredEntries;
List<StreamSubscription> _subscriptions = [];
Map<SectionKey, List<ImageEntry>> sections = Map.unmodifiable({});
Map<SectionKey, List<AvesEntry>> 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<ImageEntry> _sortedEntries;
List<AvesEntry> _sortedEntries;
List<ImageEntry> get sortedEntries {
List<AvesEntry> 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<ImageEntry, EntryAlbumSectionKey>(_filteredEntries, (entry) => EntryAlbumSectionKey(entry.directory));
sections = groupBy<AvesEntry, EntryAlbumSectionKey>(_filteredEntries, (entry) => EntryAlbumSectionKey(entry.directory));
break;
case EntryGroupFactor.month:
sections = groupBy<ImageEntry, EntryDateSectionKey>(_filteredEntries, (entry) => EntryDateSectionKey(entry.monthTaken));
sections = groupBy<AvesEntry, EntryDateSectionKey>(_filteredEntries, (entry) => EntryDateSectionKey(entry.monthTaken));
break;
case EntryGroupFactor.day:
sections = groupBy<ImageEntry, EntryDateSectionKey>(_filteredEntries, (entry) => EntryDateSectionKey(entry.dayTaken));
sections = groupBy<AvesEntry, EntryDateSectionKey>(_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<ImageEntry, EntryAlbumSectionKey>(_filteredEntries, (entry) => EntryAlbumSectionKey(entry.directory));
sections = SplayTreeMap<EntryAlbumSectionKey, List<ImageEntry>>.of(byAlbum, (a, b) => source.compareAlbumsByName(a.folderPath, b.folderPath));
final byAlbum = groupBy<AvesEntry, EntryAlbumSectionKey>(_filteredEntries, (entry) => EntryAlbumSectionKey(entry.directory));
sections = SplayTreeMap<EntryAlbumSectionKey, List<AvesEntry>>.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<ImageEntry> entries) {
void onEntryRemoved(Iterable<AvesEntry> 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<ImageEntry> _selection = {};
final Set<AvesEntry> _selection = {};
Set<ImageEntry> get selection => _selection;
Set<AvesEntry> get selection => _selection;
bool isSelected(Iterable<ImageEntry> entries) => entries.every(selection.contains);
bool isSelected(Iterable<AvesEntry> entries) => entries.every(selection.contains);
void addToSelection(Iterable<ImageEntry> entries) {
void addToSelection(Iterable<AvesEntry> entries) {
_selection.addAll(entries);
selectionChangeNotifier.notifyListeners();
}
void removeFromSelection(Iterable<ImageEntry> entries) {
void removeFromSelection(Iterable<AvesEntry> 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();

View file

@ -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<ImageEntry> _rawEntries = [];
final List<AvesEntry> _rawEntries = [];
List<ImageEntry> get rawEntries => List.unmodifiable(_rawEntries);
List<AvesEntry> get rawEntries => List.unmodifiable(_rawEntries);
final EventBus _eventBus = EventBus();
EventBus get eventBus => _eventBus;
List<ImageEntry> get sortedEntriesForFilterList;
List<AvesEntry> get sortedEntriesForFilterList;
final Map<CollectionFilter, int> _filterEntryCountMap = {};
@ -39,7 +39,7 @@ mixin SourceBase {
abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagMixin {
@override
List<ImageEntry> get sortedEntriesForFilterList => CollectionLens(
List<AvesEntry> 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<ImageEntry> entries) {
void addAll(Iterable<AvesEntry> 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<ImageEntry> entries) {
void removeEntries(List<AvesEntry> 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<void> moveEntry(ImageEntry entry, Map newFields) async {
Future<void> 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<ImageEntry> selection,
@required Set<AvesEntry> selection,
@required bool copy,
@required String destinationAlbum,
@required Iterable<MoveOpEvent> movedOps,
@ -117,7 +117,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM
if (movedOps.isEmpty) return;
final fromAlbums = <String>{};
final movedEntries = <ImageEntry>[];
final movedEntries = <AvesEntry>[];
if (copy) {
movedOps.forEach((movedOp) {
final sourceUri = movedOp.uri;
@ -166,25 +166,25 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM
Future<void> refresh();
Future<void> refreshMetadata(Set<ImageEntry> entries);
Future<void> refreshMetadata(Set<AvesEntry> entries);
}
enum SourceState { loading, cataloguing, locating, ready }
class EntryAddedEvent {
final ImageEntry entry;
final AvesEntry entry;
const EntryAddedEvent([this.entry]);
}
class EntryRemovedEvent {
final Iterable<ImageEntry> entries;
final Iterable<AvesEntry> entries;
const EntryRemovedEvent(this.entries);
}
class EntryMovedEvent {
final Iterable<ImageEntry> entries;
final Iterable<AvesEntry> entries;
const EntryMovedEvent(this.entries);
}

View file

@ -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<void> locateEntries() async {
// final stopwatch = Stopwatch()..start();
final byLocated = groupBy<ImageEntry, bool>(rawEntries.where((entry) => entry.hasGps), (entry) => entry.isLocated);
final byLocated = groupBy<AvesEntry, bool>(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 = <AddressDetails>[];
await Future.forEach<ImageEntry>(todo, (entry) async {
await Future.forEach<AvesEntry>(todo, (entry) async {
final latLng = approximateLatLng(entry);
if (knownLocations.containsKey(latLng)) {
entry.addressDetails = knownLocations[latLng]?.copyWith(contentId: entry.contentId);

View file

@ -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 = <ImageEntry>[], pendingNewEntries = <ImageEntry>[];
final allNewEntries = <AvesEntry>[], pendingNewEntries = <AvesEntry>[];
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<void> refreshMetadata(Set<ImageEntry> entries) {
Future<void> refreshMetadata(Set<AvesEntry> entries) {
final contentIds = entries.map((entry) => entry.contentId).toSet();
metadataDb.removeIds(contentIds, updateFavourites: false);
return refresh();

View file

@ -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 = <CatalogMetadata>[];
await Future.forEach<ImageEntry>(todo, (entry) async {
await Future.forEach<AvesEntry>(todo, (entry) async {
await entry.catalog(background: true);
if (entry.isCatalogued) {
newMetadata.add(entry.catalogMetadata);

View file

@ -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<bool> shareEntries(Iterable<ImageEntry> entries) async {
static Future<bool> shareEntries(Iterable<AvesEntry> 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<ImageEntry, String>(entries, (e) => e.mimeTypeAnySubtype).map((k, v) => MapEntry(k, v.map((e) => e.uri).toList()));
final urisByMimeType = groupBy<AvesEntry, String>(entries, (e) => e.mimeTypeAnySubtype).map((k, v) => MapEntry(k, v.map((e) => e.uri).toList()));
try {
return await platform.invokeMethod('share', <String, dynamic>{
'title': 'Share via:',

View file

@ -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<Map> getBitmapFactoryInfo(ImageEntry entry) async {
static Future<Map> getBitmapFactoryInfo(AvesEntry entry) async {
try {
// return map with all data available when decoding image bounds with `BitmapFactory`
final result = await platform.invokeMethod('getBitmapFactoryInfo', <String, dynamic>{
@ -39,7 +39,7 @@ class AndroidDebugService {
return {};
}
static Future<Map> getContentResolverMetadata(ImageEntry entry) async {
static Future<Map> getContentResolverMetadata(AvesEntry entry) async {
try {
// return map with all data available from the content resolver
final result = await platform.invokeMethod('getContentResolverMetadata', <String, dynamic>{
@ -53,7 +53,7 @@ class AndroidDebugService {
return {};
}
static Future<Map> getExifInterfaceMetadata(ImageEntry entry) async {
static Future<Map> getExifInterfaceMetadata(AvesEntry entry) async {
try {
// return map with all data available from the `ExifInterface` library
final result = await platform.invokeMethod('getExifInterfaceMetadata', <String, dynamic>{
@ -68,7 +68,7 @@ class AndroidDebugService {
return {};
}
static Future<Map> getMediaMetadataRetrieverMetadata(ImageEntry entry) async {
static Future<Map> getMediaMetadataRetrieverMetadata(AvesEntry entry) async {
try {
// return map with all data available from `MediaMetadataRetriever`
final result = await platform.invokeMethod('getMediaMetadataRetrieverMetadata', <String, dynamic>{
@ -81,7 +81,7 @@ class AndroidDebugService {
return {};
}
static Future<Map> getMetadataExtractorSummary(ImageEntry entry) async {
static Future<Map> 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', <String, dynamic>{
@ -96,7 +96,7 @@ class AndroidDebugService {
return {};
}
static Future<Map> getTiffStructure(ImageEntry entry) async {
static Future<Map> getTiffStructure(AvesEntry entry) async {
if (entry.mimeType != MimeTypes.tiff) return {};
try {

View file

@ -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<void> pin(String label, ImageEntry entry, Set<CollectionFilter> filters) async {
static Future<void> pin(String label, AvesEntry entry, Set<CollectionFilter> filters) async {
Uint8List iconBytes;
if (entry != null) {
final size = entry.isVideo ? 0.0 : 256.0;

View file

@ -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<String, dynamic> _toPlatformEntryMap(ImageEntry entry) {
static Map<String, dynamic> _toPlatformEntryMap(AvesEntry entry) {
return {
'uri': entry.uri,
'path': entry.path,
@ -32,13 +32,13 @@ class ImageFileService {
}
// knownEntries: map of contentId -> dateModifiedSecs
static Stream<ImageEntry> getImageEntries(Map<int, int> knownEntries) {
static Stream<AvesEntry> getEntries(Map<int, int> knownEntries) {
try {
return mediaStoreChannel.receiveBroadcastStream(<String, dynamic>{
'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<ImageEntry> getImageEntry(String uri, String mimeType) async {
debugPrint('getImageEntry for uri=$uri, mimeType=$mimeType');
static Future<AvesEntry> getEntry(String uri, String mimeType) async {
debugPrint('getEntry for uri=$uri, mimeType=$mimeType');
try {
final result = await platform.invokeMethod('getImageEntry', <String, dynamic>{
final result = await platform.invokeMethod('getEntry', <String, dynamic>{
'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<T> resumeLoading<T>(Object taskKey) => servicePolicy.resume<T>(taskKey);
static Stream<ImageOpEvent> delete(Iterable<ImageEntry> entries) {
static Stream<ImageOpEvent> delete(Iterable<AvesEntry> entries) {
try {
return opChannel.receiveBroadcastStream(<String, dynamic>{
'op': 'delete',
@ -236,7 +236,7 @@ class ImageFileService {
}
}
static Stream<MoveOpEvent> move(Iterable<ImageEntry> entries, {@required bool copy, @required String destinationAlbum}) {
static Stream<MoveOpEvent> move(Iterable<AvesEntry> entries, {@required bool copy, @required String destinationAlbum}) {
try {
return opChannel.receiveBroadcastStream(<String, dynamic>{
'op': 'move',
@ -250,7 +250,7 @@ class ImageFileService {
}
}
static Future<Map> rename(ImageEntry entry, String newName) async {
static Future<Map> rename(AvesEntry entry, String newName) async {
try {
// return map with: 'contentId' 'path' 'title' 'uri' (all optional)
final result = await platform.invokeMethod('rename', <String, dynamic>{
@ -264,7 +264,7 @@ class ImageFileService {
return {};
}
static Future<Map> rotate(ImageEntry entry, {@required bool clockwise}) async {
static Future<Map> rotate(AvesEntry entry, {@required bool clockwise}) async {
try {
// return map with: 'rotationDegrees' 'isFlipped'
final result = await platform.invokeMethod('rotate', <String, dynamic>{
@ -278,7 +278,7 @@ class ImageFileService {
return {};
}
static Future<Map> flip(ImageEntry entry) async {
static Future<Map> flip(AvesEntry entry) async {
try {
// return map with: 'rotationDegrees' 'isFlipped'
final result = await platform.invokeMethod('flip', <String, dynamic>{

View file

@ -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<Key, Value>> (map of directories, each directory being a map of metadata label and value description)
static Future<Map> getAllMetadata(ImageEntry entry) async {
static Future<Map> getAllMetadata(AvesEntry entry) async {
if (entry.isSvg) return null;
try {
@ -28,7 +28,7 @@ class MetadataService {
return {};
}
static Future<CatalogMetadata> getCatalogMetadata(ImageEntry entry, {bool background = false}) async {
static Future<CatalogMetadata> getCatalogMetadata(AvesEntry entry, {bool background = false}) async {
if (entry.isSvg) return null;
Future<CatalogMetadata> call() async {
@ -65,7 +65,7 @@ class MetadataService {
: call();
}
static Future<OverlayMetadata> getOverlayMetadata(ImageEntry entry) async {
static Future<OverlayMetadata> getOverlayMetadata(AvesEntry entry) async {
if (entry.isSvg) return null;
try {
@ -82,7 +82,7 @@ class MetadataService {
return null;
}
static Future<MultiPageInfo> getMultiPageInfo(ImageEntry entry) async {
static Future<MultiPageInfo> getMultiPageInfo(AvesEntry entry) async {
try {
final result = await platform.invokeMethod('getMultiPageInfo', <String, dynamic>{
'mimeType': entry.mimeType,
@ -95,7 +95,7 @@ class MetadataService {
return null;
}
static Future<PanoramaInfo> getPanoramaInfo(ImageEntry entry) async {
static Future<PanoramaInfo> 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<List<Uint8List>> getExifThumbnails(ImageEntry entry) async {
static Future<List<Uint8List>> getExifThumbnails(AvesEntry entry) async {
try {
final result = await platform.invokeMethod('getExifThumbnails', <String, dynamic>{
'mimeType': entry.mimeType,
@ -138,7 +138,7 @@ class MetadataService {
return [];
}
static Future<Map> extractXmpDataProp(ImageEntry entry, String propPath, String propMimeType) async {
static Future<Map> extractXmpDataProp(AvesEntry entry, String propPath, String propMimeType) async {
try {
final result = await platform.invokeMethod('extractXmpDataProp', <String, dynamic>{
'mimeType': entry.mimeType,

View file

@ -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<Size> getSize(ImageEntry entry) async {
static Future<Size> getSize(AvesEntry entry) async {
try {
final data = await ImageFileService.getSvg(entry.uri, entry.mimeType);
@ -48,7 +48,7 @@ class SvgMetadataService {
return null;
}
static Future<Map<String, Map<String, String>>> getAllMetadata(ImageEntry entry) async {
static Future<Map<String, Map<String, String>>> getAllMetadata(AvesEntry entry) async {
String formatKey(String key) {
switch (key) {
case 'desc':

View file

@ -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<ImageEntry> get selection => collection.selection;
Set<AvesEntry> get selection => collection.selection;
EntrySetActionDelegate({
@required this.collection,

View file

@ -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<ImageEntry> {
class SectionedEntryListLayoutProvider extends SectionedListLayoutProvider<AvesEntry> {
final CollectionLens collection;
const SectionedEntryListLayoutProvider({
@ -14,7 +14,7 @@ class SectionedEntryListLayoutProvider extends SectionedListLayoutProvider<Image
@required double scrollableWidth,
@required int columnCount,
@required double tileExtent,
@required Widget Function(ImageEntry entry) tileBuilder,
@required Widget Function(AvesEntry entry) tileBuilder,
@required Widget child,
}) : super(
scrollableWidth: scrollableWidth,
@ -28,7 +28,7 @@ class SectionedEntryListLayoutProvider extends SectionedListLayoutProvider<Image
bool get showHeaders => collection.showHeaders;
@override
Map<SectionKey, List<ImageEntry>> get sections => collection.sections;
Map<SectionKey, List<AvesEntry>> get sections => collection.sections;
@override
double getHeaderExtent(BuildContext context, SectionKey sectionKey) {

View file

@ -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<GridSelectionGestureDetec
CollectionLens get collection => widget.collection;
List<ImageEntry> get entries => collection.sortedEntries;
List<AvesEntry> get entries => collection.sortedEntries;
ScrollController get scrollController => widget.scrollController;
@ -131,12 +131,12 @@ class _GridSelectionGestureDetectorState extends State<GridSelectionGestureDetec
}
}
ImageEntry _getEntryAt(Offset localPosition) {
AvesEntry _getEntryAt(Offset localPosition) {
// as of Flutter v1.22.5, `hitTest` on the `ScrollView` render object works fine when it is static,
// but when it is scrolling (through controller animation), result is incomplete and children are missing,
// so we use custom layout computation instead to find the entry.
final offset = Offset(0, scrollController.offset - appBarHeight) + localPosition;
final sectionedListLayout = context.read<SectionedListLayout<ImageEntry>>();
final sectionedListLayout = context.read<SectionedListLayout<AvesEntry>>();
return sectionedListLayout.getItemAt(offset);
}

View file

@ -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<bool> isScrollingNotifier;

View file

@ -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<bool> isScrollingNotifier;

View file

@ -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;

View file

@ -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<ThumbnailHighlightOverlay> {
final ValueNotifier<bool> _highlightedNotifier = ValueNotifier(false);
ImageEntry get entry => widget.entry;
AvesEntry get entry => widget.entry;
@override
Widget build(BuildContext context) {

View file

@ -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<bool> isScrollingNotifier;
@ -29,7 +29,7 @@ class RasterImageThumbnail extends StatefulWidget {
class _RasterImageThumbnailState extends State<RasterImageThumbnail> {
ThumbnailProvider _fastThumbnailProvider, _sizedThumbnailProvider;
ImageEntry get entry => widget.entry;
AvesEntry get entry => widget.entry;
double get extent => widget.extent;

View file

@ -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;

View file

@ -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<ImageEntry>(
final scaler = GridScaleGestureDetector<AvesEntry>(
tileExtentManager: tileExtentManager,
scrollableKey: _scrollableKey,
appBarHeightNotifier: _appBarHeightNotifier,
@ -106,7 +106,7 @@ class ThumbnailCollection extends StatelessWidget {
highlightable: false,
),
getScaledItemTileRect: (context, entry) {
final sectionedListLayout = context.read<SectionedListLayout<ImageEntry>>();
final sectionedListLayout = context.read<SectionedListLayout<AvesEntry>>();
return sectionedListLayout.getTileRect(entry) ?? Rect.zero;
},
onScaled: (entry) => Provider.of<HighlightInfo>(context, listen: false).add(entry),
@ -225,7 +225,7 @@ class _CollectionScrollViewState extends State<CollectionScrollView> {
child: _buildEmptyCollectionPlaceholder(collection),
hasScrollBody: false,
)
: SectionedListSliver<ImageEntry>(),
: SectionedListSliver<AvesEntry>(),
BottomPaddingSliver(),
],
);

View file

@ -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<T extends ImageOpEvent>({
@required BuildContext context,
@required Set<ImageEntry> selection,
@required Set<AvesEntry> selection,
@required Stream<T> opStream,
@required void Function(Set<T> processed) onDone,
}) {

View file

@ -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<bool> checkStoragePermission(BuildContext context, Set<ImageEntry> entries) {
Future<bool> checkStoragePermission(BuildContext context, Set<AvesEntry> entries) {
return checkStoragePermissionForAlbums(context, entries.where((e) => e.path != null).map((e) => e.directory).toSet());
}

View file

@ -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<bool> checkFreeSpaceForMove(BuildContext context, Set<ImageEntry> selection, String destinationAlbum, bool copy) async {
Future<bool> checkFreeSpaceForMove(BuildContext context, Set<AvesEntry> 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<ImageEntry, StorageVolume>(selection, (entry) => androidFileUtils.getStorageVolume(entry.path));
final byVolume = groupBy<AvesEntry, StorageVolume>(selection, (entry) => androidFileUtils.getStorageVolume(entry.path));
final otherVolumes = byVolume.keys.where((volume) => volume != destinationVolume);
final fromOtherVolumes = otherVolumes.fold<int>(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

View file

@ -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;

View file

@ -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<AppDebugPage> {
List<ImageEntry> get entries => widget.source.rawEntries;
List<AvesEntry> get entries => widget.source.rawEntries;
static OverlayEntry _taskQueueOverlayEntry;

View file

@ -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<DebugAppDatabaseSection> with AutomaticKeepAliveClientMixin {
Future<int> _dbFileSizeLoader;
Future<List<ImageEntry>> _dbEntryLoader;
Future<List<AvesEntry>> _dbEntryLoader;
Future<List<DateMetadata>> _dbDateLoader;
Future<List<CatalogMetadata>> _dbMetadataLoader;
Future<List<AddressDetails>> _dbAddressLoader;

View file

@ -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<RenameEntryDialog> {
final TextEditingController _nameController = TextEditingController();
final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false);
ImageEntry get entry => widget.entry;
AvesEntry get entry => widget.entry;
@override
void initState() {

View file

@ -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;

View file

@ -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<HomePage> {
MediaStoreSource _mediaStore;
ImageEntry _viewerEntry;
AvesEntry _viewerEntry;
String _shortcutRouteName;
List<String> _shortcutFilters;
@ -108,8 +108,8 @@ class _HomePageState extends State<HomePage> {
unawaited(Navigator.pushReplacement(context, _getRedirectRoute()));
}
Future<ImageEntry> _initViewerEntry({@required String uri, @required String mimeType}) async {
final entry = await ImageFileService.getImageEntry(uri, mimeType);
Future<AvesEntry> _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();

View file

@ -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<String, int> entryCountPerCountry = {}, entryCountPerPlace = {}, entryCountPerTag = {};
List<ImageEntry> get entries => parentCollection?.sortedEntries ?? source.rawEntries;
List<AvesEntry> 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<ImageEntry, String>(entries, (entry) => entry.mimeType).map<String, int>((k, v) => MapEntry(k, v.length));
final byMimeTypes = groupBy<AvesEntry, String>(entries, (entry) => entry.mimeType).map<String, int>((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(

View file

@ -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<DbTab> {
Future<DateMetadata> _dbDateLoader;
Future<ImageEntry> _dbEntryLoader;
Future<AvesEntry> _dbEntryLoader;
Future<CatalogMetadata> _dbMetadataLoader;
Future<AddressDetails> _dbAddressLoader;
ImageEntry get entry => widget.entry;
AvesEntry get entry => widget.entry;
@override
void initState() {
@ -60,7 +60,7 @@ class _DbTabState extends State<DbTab> {
},
),
SizedBox(height: 16),
FutureBuilder<ImageEntry>(
FutureBuilder<AvesEntry>(
future: _dbEntryLoader,
builder: (context, snapshot) {
if (snapshot.hasError) return Text(snapshot.error.toString());

View file

@ -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<MetadataTab> {
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() {

View file

@ -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});

View file

@ -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<void> _flip(BuildContext context, ImageEntry entry) async {
Future<void> _flip(BuildContext context, AvesEntry entry) async {
if (!await checkStoragePermission(context, {entry})) return;
final success = await entry.flip();
if (!success) showFeedback(context, 'Failed');
}
Future<void> _rotate(BuildContext context, ImageEntry entry, {@required bool clockwise}) async {
Future<void> _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<void> _showDeleteDialog(BuildContext context, ImageEntry entry) async {
Future<void> _showDeleteDialog(BuildContext context, AvesEntry entry) async {
final confirmed = await showDialog<bool>(
context: context,
builder: (context) {
@ -140,7 +140,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin {
}
}
Future<void> _showRenameDialog(BuildContext context, ImageEntry entry) async {
Future<void> _showRenameDialog(BuildContext context, AvesEntry entry) async {
final newName = await showDialog<String>(
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(

View file

@ -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<MultiEntryScroller> with AutomaticKeepAliveClientMixin {
List<ImageEntry> get entries => widget.collection.sortedEntries;
List<AvesEntry> get entries => widget.collection.sortedEntries;
@override
Widget build(BuildContext context) {
@ -80,7 +80,7 @@ class _MultiEntryScrollerState extends State<MultiEntryScroller> with AutomaticK
);
}
Widget _buildViewer(ImageEntry entry, {MultiPageInfo multiPageInfo, int page}) {
Widget _buildViewer(AvesEntry entry, {MultiPageInfo multiPageInfo, int page}) {
return Selector<MediaQueryData, Size>(
selector: (c, mq) => mq.size,
builder: (c, mqSize, child) {
@ -99,7 +99,7 @@ class _MultiEntryScrollerState extends State<MultiEntryScroller> 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<MultiEntryScroller> with AutomaticK
}
class SingleEntryScroller extends StatefulWidget {
final ImageEntry entry;
final AvesEntry entry;
final VoidCallback onTap;
final List<Tuple2<String, IjkMediaController>> videoControllers;
final List<Tuple2<String, MultiPageController>> multiPageControllers;
@ -125,7 +125,7 @@ class SingleEntryScroller extends StatefulWidget {
}
class _SingleEntryScrollerState extends State<SingleEntryScroller> 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<SingleEntryScroller> with Automati
);
}
MultiPageController _getMultiPageController(ImageEntry entry) {
MultiPageController _getMultiPageController(AvesEntry entry) {
return widget.multiPageControllers.firstWhere((kv) => kv.item1 == entry.uri, orElse: () => null)?.item2;
}

View file

@ -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,

View file

@ -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<EntryViewerStack> with SingleTickerProviderStateMixin, WidgetsBindingObserver {
final ValueNotifier<ImageEntry> _entryNotifier = ValueNotifier(null);
final ValueNotifier<AvesEntry> _entryNotifier = ValueNotifier(null);
int _currentHorizontalPage;
ValueNotifier<int> _currentVerticalPage;
PageController _horizontalPager, _verticalPager;
@ -63,7 +63,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with SingleTickerPr
bool get hasCollection => collection != null;
List<ImageEntry> get entries => hasCollection ? collection.sortedEntries : [widget.initialEntry];
List<AvesEntry> get entries => hasCollection ? collection.sortedEntries : [widget.initialEntry];
static const int transitionPage = 0;
@ -199,7 +199,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with SingleTickerPr
}
Widget _buildTopOverlay() {
final child = ValueListenableBuilder<ImageEntry>(
final child = ValueListenableBuilder<AvesEntry>(
valueListenable: _entryNotifier,
builder: (context, entry, child) {
if (entry == null) return SizedBox.shrink();
@ -232,7 +232,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with SingleTickerPr
}
Widget _buildBottomOverlay() {
Widget bottomOverlay = ValueListenableBuilder<ImageEntry>(
Widget bottomOverlay = ValueListenableBuilder<AvesEntry>(
valueListenable: _entryNotifier,
builder: (context, entry, child) {
if (entry == null) return SizedBox.shrink();
@ -312,7 +312,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> 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<EntryViewerStack> with SingleTickerPr
class ViewerVerticalPageView extends StatefulWidget {
final CollectionLens collection;
final ValueNotifier<ImageEntry> entryNotifier;
final ValueNotifier<AvesEntry> entryNotifier;
final List<Tuple2<String, IjkMediaController>> videoControllers;
final List<Tuple2<String, MultiPageController>> multiPageControllers;
final PageController horizontalPager, verticalPager;
@ -507,13 +507,13 @@ class ViewerVerticalPageView extends StatefulWidget {
class _ViewerVerticalPageViewState extends State<ViewerVerticalPageView> {
final ValueNotifier<Color> _backgroundColorNotifier = ValueNotifier(Colors.black);
final ValueNotifier<bool> _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() {

View file

@ -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;

View file

@ -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<Map<String, MetadataDirectory>> metadataNotifier;
final VoidCallback onBackPressed;

View file

@ -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<ImageEntry> entryNotifier;
final ValueNotifier<AvesEntry> entryNotifier;
final ValueNotifier<bool> visibleNotifier;
const InfoPage({
@ -34,7 +34,7 @@ class _InfoPageState extends State<InfoPage> {
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<InfoPage> {
child: Selector<MediaQueryData, double>(
selector: (c, mq) => mq.size.width,
builder: (c, mqWidth, child) {
return ValueListenableBuilder<ImageEntry>(
return ValueListenableBuilder<AvesEntry>(
valueListenable: widget.entryNotifier,
builder: (context, entry, child) {
return entry != null
@ -107,7 +107,7 @@ class _InfoPageState extends State<InfoPage> {
class _InfoPageContent extends StatefulWidget {
final CollectionLens collection;
final ImageEntry entry;
final AvesEntry entry;
final ValueNotifier<bool> 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) {

View file

@ -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<Map<String, MetadataDirectory>> metadataNotifier;
Map<String, MetadataDirectory> get metadata => metadataNotifier.value;

View file

@ -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<bool> visibleNotifier;
final FilterCallback onFilter;
@ -43,7 +43,7 @@ class _LocationSectionState extends State<LocationSection> 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<LocationSection> 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<String> _addressLineLoader;
ImageEntry get entry => widget.entry;
AvesEntry get entry => widget.entry;
@override
void initState() {

View file

@ -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;

View file

@ -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<String> expandedDirectoryNotifier;

View file

@ -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<bool> visibleNotifier;
final ValueNotifier<Map<String, MetadataDirectory>> metadataNotifier;
@ -31,7 +31,7 @@ class _MetadataSectionSliverState extends State<MetadataSectionSliver> with Auto
final ValueNotifier<String> _loadedMetadataUri = ValueNotifier(null);
final ValueNotifier<String> _expandedDirectoryNotifier = ValueNotifier(null);
ImageEntry get entry => widget.entry;
AvesEntry get entry => widget.entry;
bool get isVisible => widget.visibleNotifier.value;

View file

@ -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<MetadataThumbnails> {
Future<List<Uint8List>> _loader;
ImageEntry get entry => widget.entry;
AvesEntry get entry => widget.entry;
String get uri => entry.uri;

View file

@ -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<String, String> tags;
final ValueNotifier<String> expandedNotifier;
final bool initiallyExpanded;
@ -39,7 +39,7 @@ class XmpDirTile extends StatefulWidget {
}
class _XmpDirTileState extends State<XmpDirTile> 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<XmpDirTile> with FeedbackMixin {
return;
}
final embedEntry = ImageEntry.fromMap(fields);
final embedEntry = AvesEntry.fromMap(fields);
unawaited(Navigator.push(
context,
TransparentMaterialPageRoute(

View file

@ -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<MultiPageInfo> info;
final ValueNotifier<int> pageNotifier = ValueNotifier(0);
MultiPageController(ImageEntry entry) : info = MetadataService.getMultiPageInfo(entry);
MultiPageController(AvesEntry entry) : info = MetadataService.getMultiPageInfo(entry);
int get page => pageNotifier.value;

View file

@ -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<ImageEntry> entries;
final List<AvesEntry> entries;
final int index;
final bool showPosition;
final EdgeInsets viewInsets, viewPadding;
@ -42,10 +42,10 @@ class ViewerBottomOverlay extends StatefulWidget {
class _ViewerBottomOverlayState extends State<ViewerBottomOverlay> {
Future<OverlayMetadata> _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({

View file

@ -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<ViewState> viewStateNotifier;
final MultiPageController multiPageController;
final Size size;

View file

@ -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<MultiPageOverlay> {
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<MultiPageOverlay> {
);
}
Widget _buildPageThumbnail(ImageEntry entry) {
Widget _buildPageThumbnail(AvesEntry entry) {
Widget child = RasterImageThumbnail(
entry: entry,
extent: extent,

View file

@ -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<double> scale;
const PanoramaOverlay({

View file

@ -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<double> scale;
final EdgeInsets viewInsets, viewPadding;
final Function(EntryAction value) onActionSelected;
@ -135,7 +135,7 @@ class _TopOverlayRow extends StatelessWidget {
final List<EntryAction> inAppActions;
final List<EntryAction> externalAppActions;
final Animation<double> 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;

View file

@ -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<double> scale;
@ -37,7 +37,7 @@ class _VideoControlOverlayState extends State<VideoControlOverlay> 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<double> get scale => widget.scale;

View file

@ -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<PanoramaPage> {
final ValueNotifier<bool> _overlayVisible = ValueNotifier(true);
final ValueNotifier<SensorControl> _sensorControl = ValueNotifier(SensorControl.None);
ImageEntry get entry => widget.entry;
AvesEntry get entry => widget.entry;
PanoramaInfo get info => widget.info;

View file

@ -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<pdf.Widget> _buildPageImage(ImageEntry entry) async {
Future<pdf.Widget> _buildPageImage(AvesEntry entry) async {
if (entry.isSvg) {
final bytes = await ImageFileService.getSvg(entry.uri, entry.mimeType);
if (bytes != null && bytes.isNotEmpty) {

View file

@ -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<EntryPageView> {
final ValueNotifier<ViewState> _viewStateNotifier = ValueNotifier(ViewState.zero);
final List<StreamSubscription> _subscriptions = [];
ImageEntry get entry => widget.entry;
AvesEntry get entry => widget.entry;
Size get viewportSize => widget.viewportSize;

View file

@ -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<ViewState> viewStateNotifier;
final ImageErrorWidgetBuilder errorBuilder;
@ -39,7 +39,7 @@ class _RasterImageViewState extends State<RasterImageView> {
ImageStreamListener _fullImageListener;
final ValueNotifier<bool> _fullImageLoaded = ValueNotifier(false);
ImageEntry get entry => widget.entry;
AvesEntry get entry => widget.entry;
ValueNotifier<ViewState> get viewStateNotifier => widget.viewStateNotifier;
@ -323,7 +323,7 @@ class _RasterImageViewState extends State<RasterImageView> {
}
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<RegionTile> {
RegionProvider _provider;
ImageEntry get entry => widget.entry;
AvesEntry get entry => widget.entry;
@override
void initState() {

View file

@ -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<VideoView> {
final List<StreamSubscription> _subscriptions = [];
ImageEntry get entry => widget.entry;
AvesEntry get entry => widget.entry;
IjkMediaController get controller => widget.controller;