diff --git a/lib/image_providers/uri_image_provider.dart b/lib/image_providers/full_image_provider.dart similarity index 87% rename from lib/image_providers/uri_image_provider.dart rename to lib/image_providers/full_image_provider.dart index e7ae98af9..782ac9180 100644 --- a/lib/image_providers/uri_image_provider.dart +++ b/lib/image_providers/full_image_provider.dart @@ -10,7 +10,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; @immutable -class UriImage extends ImageProvider with EquatableMixin { +class FullImage extends ImageProvider with EquatableMixin { final String uri, mimeType; final int? pageId, rotationDegrees, sizeBytes; final bool isFlipped, isAnimated; @@ -19,7 +19,7 @@ class UriImage extends ImageProvider with EquatableMixin { @override List get props => [uri, pageId, rotationDegrees, isFlipped, isAnimated, scale]; - const UriImage({ + const FullImage({ required this.uri, required this.mimeType, required this.pageId, @@ -31,12 +31,12 @@ class UriImage extends ImageProvider with EquatableMixin { }); @override - Future obtainKey(ImageConfiguration configuration) { - return SynchronousFuture(this); + Future obtainKey(ImageConfiguration configuration) { + return SynchronousFuture(this); } @override - ImageStreamCompleter loadImage(UriImage key, ImageDecoderCallback decode) { + ImageStreamCompleter loadImage(FullImage key, ImageDecoderCallback decode) { final chunkEvents = StreamController(); return MultiFrameImageStreamCompleter( @@ -59,11 +59,11 @@ class UriImage extends ImageProvider with EquatableMixin { case MimeTypes.svg: return false; default: - return !isAnimated; + return !isAnimated && !MimeTypes.isVideo(mimeType); } } - Future _loadAsync(UriImage key, ImageDecoderCallback decode, StreamController chunkEvents) async { + Future _loadAsync(FullImage key, ImageDecoderCallback decode, StreamController chunkEvents) async { assert(key == this); final request = ImageRequest( diff --git a/lib/model/entry/cache.dart b/lib/model/entry/cache.dart index dd5ca41c8..ecb32d75b 100644 --- a/lib/model/entry/cache.dart +++ b/lib/model/entry/cache.dart @@ -1,7 +1,7 @@ import 'dart:async'; +import 'package:aves/image_providers/full_image_provider.dart'; import 'package:aves/image_providers/thumbnail_provider.dart'; -import 'package:aves/image_providers/uri_image_provider.dart'; import 'package:flutter/foundation.dart'; class EntryCache { @@ -30,7 +30,7 @@ class EntryCache { int? pageId; // evict fullscreen image - await UriImage( + await FullImage( uri: uri, mimeType: mimeType, pageId: pageId, diff --git a/lib/model/entry/extensions/images.dart b/lib/model/entry/extensions/images.dart index 1ee6f49fa..88d09adf2 100644 --- a/lib/model/entry/extensions/images.dart +++ b/lib/model/entry/extensions/images.dart @@ -1,8 +1,8 @@ import 'dart:math'; +import 'package:aves/image_providers/full_image_provider.dart'; 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/entry/cache.dart'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/utils/math_utils.dart'; @@ -49,7 +49,7 @@ extension ExtraAvesEntryImages on AvesEntry { )); } - UriImage get uriImage => UriImage( + FullImage get fullImage => FullImage( uri: uri, mimeType: mimeType, pageId: pageId, diff --git a/lib/model/media/geotiff.dart b/lib/model/media/geotiff.dart index d549cd29d..ad036aefb 100644 --- a/lib/model/media/geotiff.dart +++ b/lib/model/media/geotiff.dart @@ -157,7 +157,7 @@ class MappedGeoTiff with MapOverlay { String get id => entry.uri; @override - ImageProvider get imageProvider => entry.uriImage; + ImageProvider get imageProvider => entry.fullImage; @override bool get canOverlay => center != null; diff --git a/lib/services/media/media_fetch_service.dart b/lib/services/media/media_fetch_service.dart index 6f05eaf38..438e2d07c 100644 --- a/lib/services/media/media_fetch_service.dart +++ b/lib/services/media/media_fetch_service.dart @@ -9,6 +9,7 @@ import 'package:aves/services/common/output_buffer.dart'; import 'package:aves/services/common/service_policy.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/services/media/byte_receiving_codec.dart'; +import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:streams_channel/streams_channel.dart'; @@ -328,7 +329,7 @@ class PlatformMediaFetchService implements MediaFetchService { } @immutable -class ImageRequest { +class ImageRequest extends Equatable { final String uri; final String mimeType; final int? rotationDegrees; @@ -338,14 +339,17 @@ class ImageRequest { final int? sizeBytes; final BytesReceivedCallback? onBytesReceived; + @override + List get props => [uri, mimeType, rotationDegrees, isFlipped, isAnimated, pageId, sizeBytes, onBytesReceived]; + const ImageRequest( - this.uri, - this.mimeType, { - required this.rotationDegrees, - required this.isFlipped, - required this.isAnimated, - required this.pageId, - required this.sizeBytes, - this.onBytesReceived, - }); + this.uri, + this.mimeType, { + required this.rotationDegrees, + required this.isFlipped, + required this.isAnimated, + required this.pageId, + required this.sizeBytes, + this.onBytesReceived, + }); } diff --git a/lib/widgets/viewer/action/printer.dart b/lib/widgets/viewer/action/printer.dart index 87178cb0a..b53777854 100644 --- a/lib/widgets/viewer/action/printer.dart +++ b/lib/widgets/viewer/action/printer.dart @@ -118,7 +118,7 @@ class EntryPrinter with FeedbackMixin { } } else { return pdf.Image( - await flutterImageProvider(entry.uriImage), + await flutterImageProvider(entry.fullImage), fit: _fit, ); } diff --git a/lib/widgets/viewer/overlay/wallpaper_buttons.dart b/lib/widgets/viewer/overlay/wallpaper_buttons.dart index 3964b9d31..7575c1235 100644 --- a/lib/widgets/viewer/overlay/wallpaper_buttons.dart +++ b/lib/widgets/viewer/overlay/wallpaper_buttons.dart @@ -172,7 +172,7 @@ class WallpaperButtons extends StatelessWidget with FeedbackMixin { } else { // provider image is already rotated, but not cropped needCrop = true; - provider = entry.uriImage; + provider = entry.fullImage; } } if (provider == null) return null; diff --git a/lib/widgets/viewer/panorama_page.dart b/lib/widgets/viewer/panorama_page.dart index 2a1da0ae4..3cab04229 100644 --- a/lib/widgets/viewer/panorama_page.dart +++ b/lib/widgets/viewer/panorama_page.dart @@ -90,7 +90,7 @@ class _PanoramaPageState extends State { } }, child: Image( - image: entry.uriImage, + image: entry.fullImage, ), ), Positioned( diff --git a/lib/widgets/viewer/visual/raster.dart b/lib/widgets/viewer/visual/raster.dart index dda605a3c..3352e498d 100644 --- a/lib/widgets/viewer/visual/raster.dart +++ b/lib/widgets/viewer/visual/raster.dart @@ -63,7 +63,7 @@ class _RasterImageViewState extends State { region: fullImageRegion, ); } else { - return entry.uriImage; + return entry.fullImage; } } diff --git a/lib/widgets/viewer/visual/video/cover.dart b/lib/widgets/viewer/visual/video/cover.dart index ae7da3a51..e7df3d585 100644 --- a/lib/widgets/viewer/visual/video/cover.dart +++ b/lib/widgets/viewer/visual/video/cover.dart @@ -58,7 +58,7 @@ class _VideoCoverState extends State { Size get videoDisplaySize => widget.videoDisplaySize; // use the high res photo as cover for the video part of a motion photo - ImageProvider get videoCoverUriImage => (mainEntry.isMotionPhoto ? mainEntry : entry).uriImage; + ImageProvider get videoCoverUriImage => (mainEntry.isMotionPhoto ? mainEntry : entry).fullImage; @override void initState() {